From dfc1aa2fd0ccb8398b00bb0ad1d63a3c991e8026 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 23 Aug 2024 15:40:29 +0800 Subject: [PATCH 001/140] converted src/helpers/*.js to .ts --- package-lock.json | 19 +-- package.json | 5 +- .../{check_balance.js => check_balance.ts} | 22 ++-- src/helpers/config.js | 97 ---------------- src/helpers/config.ts | 97 ++++++++++++++++ src/helpers/index.ts | 0 src/helpers/{unwrap_sol.js => unwrap_sol.ts} | 10 +- src/helpers/{util.js => util.ts} | 51 ++++----- src/helpers/{wrap_sol.js => wrap_sol.ts} | 20 ++-- tsconfig.json | 108 ++++++++++++++++++ 10 files changed, 264 insertions(+), 165 deletions(-) rename src/helpers/{check_balance.js => check_balance.ts} (80%) delete mode 100644 src/helpers/config.js create mode 100644 src/helpers/config.ts create mode 100644 src/helpers/index.ts rename src/helpers/{unwrap_sol.js => unwrap_sol.ts} (82%) rename src/helpers/{util.js => util.ts} (87%) rename src/helpers/{wrap_sol.js => wrap_sol.ts} (78%) create mode 100644 tsconfig.json diff --git a/package-lock.json b/package-lock.json index bfc3471..9dd54af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "solana-memecoin-cli", + "name": "solana-trading-cli", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "solana-memecoin-cli", + "name": "solana-trading-cli", "version": "1.0.0", "license": "ISC", "dependencies": { @@ -31,7 +31,7 @@ "@raydium-io/raydium-sdk-v2": "^0.1.23-alpha", "@rollup/plugin-json": "^6.1.0", "@solana/spl-token": "^0.4.0", - "@solana/web3.js": "^1.95.3", + "@solana/web3.js": "^1.89.1", "axios": "^1.6.8", "bigint-buffer": "^1.1.5", "bip39": "^3.1.0", @@ -47,9 +47,10 @@ "pino-pretty": "^10.3.1", "pino-std-serializers": "^6.2.2", "pumpdotfun-sdk": "^1.3.2", - "random-js": "^2.1.0", - "rpc-websockets": "^7.11.2", - "ws": "^8.18.0" + "random-js": "^2.1.0" + }, + "devDependencies": { + "typescript": "^5.5.4" } }, "node_modules/@aptos-labs/aptos-cli": { @@ -14223,9 +14224,9 @@ } }, "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index 33ac18d..ccecd15 100644 --- a/package.json +++ b/package.json @@ -51,5 +51,8 @@ "pino-std-serializers": "^6.2.2", "pumpdotfun-sdk": "^1.3.2", "random-js": "^2.1.0" + }, + "devDependencies": { + "typescript": "^5.5.4" } -} \ No newline at end of file +} diff --git a/src/helpers/check_balance.js b/src/helpers/check_balance.ts similarity index 80% rename from src/helpers/check_balance.js rename to src/helpers/check_balance.ts index 2368c6d..e54d8e9 100644 --- a/src/helpers/check_balance.js +++ b/src/helpers/check_balance.ts @@ -1,19 +1,18 @@ -const { Connection, LAMPORTS_PER_SOL, PublicKey } = require("@solana/web3.js"); -const { +import { Connection, LAMPORTS_PER_SOL, PublicKey } from "@solana/web3.js"; +import { getDomainKeySync, NameRegistryState, -} = require("@bonfida/spl-name-service"); -const { main_endpoint, dev_endpoint } = require("./config"); -const connectionDev = new Connection(dev_endpoint, "confirmed"); +} from "@bonfida/spl-name-service"; +import { main_endpoint } from "./config"; const connectionMain = new Connection(main_endpoint); -const { getAssociatedTokenAddressSync } = require("@solana/spl-token"); +import { getAssociatedTokenAddressSync } from "@solana/spl-token"; /** * Retrieves the public key associated with a given .sol domain. * @param {string} domain - The .sol domain to retrieve the public key for. * @returns {Promise} The public key associated with the domain. */ -async function getPublicKeyFromSOLDomain(domain) { +export async function getPublicKeyFromSOLDomain(domain:string) { // check if the domain is a .sol domain // the last four characters should be ".sol" if (!domain.endsWith(".sol")) { @@ -35,7 +34,7 @@ async function getPublicKeyFromSOLDomain(domain) { * @param {object} connection - The connection object for interacting with the Solana network. * @returns {Promise} - A promise that resolves when the balance is checked. */ -async function checkBalanceByAddress(address, connection) { +export async function checkBalanceByAddress(address:string, connection:Connection) { // check if the address is valid // check the domain name of the address @@ -62,7 +61,7 @@ async function checkBalanceByAddress(address, connection) { * @returns {Promise} The balance of the SPL token. * @throws {Error} If no balance is found. */ -async function getSPLTokenBalance(connection, tokenAccount, payerPubKey) { +export async function getSPLTokenBalance(connection:Connection, tokenAccount:PublicKey, payerPubKey:PublicKey) { const address = getAssociatedTokenAddressSync(tokenAccount, payerPubKey); const info = await connection.getTokenAccountBalance(address); if (info.value.uiAmount == null) throw new Error("No balance found"); @@ -74,10 +73,10 @@ async function getSPLTokenBalance(connection, tokenAccount, payerPubKey) { * @param {object} connection - The connection object for interacting with the Solana network. * @returns {Promise} - A promise that resolves once the balance is checked. */ -async function checkBalanceByDomain(domain, connection) { +export async function checkBalanceByDomain(domain:string, connection:Connection) { // get the public key from the domain - const owner = await getPublicKeyFromSOLDomain(domain); + const owner:any = await getPublicKeyFromSOLDomain(domain); const balanceInLamports = await connection.getBalance(new PublicKey(owner)); const balanceInSOL = balanceInLamports / LAMPORTS_PER_SOL; @@ -85,4 +84,3 @@ async function checkBalanceByDomain(domain, connection) { `💰 Finished! The balance for the wallet at domain ${domain} is ${balanceInSOL}!` ); } -module.exports = { checkBalanceByAddress, getSPLTokenBalance }; diff --git a/src/helpers/config.js b/src/helpers/config.js deleted file mode 100644 index 9c8f933..0000000 --- a/src/helpers/config.js +++ /dev/null @@ -1,97 +0,0 @@ -const { - Currency, - Token, - ENDPOINT, - MAINNET_PROGRAM_ID, - RAYDIUM_MAINNET, - TxVersion, - LOOKUP_TABLE_CACHE, - TOKEN_PROGRAM_ID, -} = require("@raydium-io/raydium-sdk"); -const { Connection, Keypair, PublicKey } = require("@solana/web3.js"); -const fs = require("fs"); -const dotenv = require("dotenv"); -const bs58 = require("bs58"); -const path = require("path"); -// default path: /Users/{your_user_name}/Desktop/Solana-Memecoin-CLI/src/helpers/.env -// please specify your own .env path -const envPath = path.join(__dirname, ".env"); -dotenv.config({ - path: envPath, // fill in your .env path -}); -function loadKeypairFromFile(filename) { - const secret = fs.readFileSync(filename, { encoding: "utf8" }); - return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(secret))); -} -const jito_fee = process.env.JITO_FEE; // 0.00009 SOL -const shyft_api_key = process.env.SHYFT_API_KEY; // your shyft api key -const wallet = Keypair.fromSecretKey(bs58.decode(process.env.PRIVATE_KEY)); // your wallet -const private_key = process.env.PRIVATE_KEY; // your private key -const dev_endpoint = process.env.DEVNET_ENDPOINT; // devnet endpoint, if you use devnet -const main_endpoint = process.env.MAINNET_ENDPOINT; // mainnet endpoint -const bloXRoute_auth_header = process.env.BLOXROUTE_AUTH_HEADER; -const bloXroute_fee = process.env.BLOXROUTE_FEE; // 0.001 SOL -// const second_main_endpoint = process.env.SECOND_MAINNET_ENDPOINT; // if you use copy trade program, second mainnet endpoint -// const RPC_Websocket_endpoint = process.env.WS_ENDPOINT; -// const second_RPC_Websocket_endpoint = process.env.SECOND_WS_ENDPOINT; // if you use copy trade program -// const stop_lost = process.env.STOP_LOST; // percentage of stop lost, if you use copy trade program -// const take_profit = process.env.TAKE_PROFIT; // percentage of take profit, if you use copy trade program -const smart_money_wallet = process.env.SMART_MONEY_WALLET; // if you use copy trade program -const connection = new Connection(main_endpoint, "confirmed"); // mainnet connection -//const connection = new Connection(main_endpoint, { // if you use copy trade program -// wsEndpoint: RPC_Websocket_endpoint, -// commitment: "confirmed", -//}); -//const second_connection = new Connection(second_main_endpoint, { // if you use copy trade program -// wsEndpoint: second_RPC_Websocket_endpoint, -// commitment: "confirmed", -//}); -const dev_connection = new Connection(dev_endpoint, "confirmed"); // devnet connection - -const PROGRAMIDS = MAINNET_PROGRAM_ID; // raydium mainnet program address - -const RAYDIUM_MAINNET_API = RAYDIUM_MAINNET; // raydium mainnet program's api - -const makeTxVersion = TxVersion.V0; // LEGACY -const _ENDPOINT = ENDPOINT; // raydium mainnet program's base api path -const addLookupTableInfo = LOOKUP_TABLE_CACHE; // only mainnet. other = undefined - -const DEFAULT_TOKEN = { - SOL: new Currency(9, "SOL", "SOL"), - WSOL: new Token( - TOKEN_PROGRAM_ID, - new PublicKey("So11111111111111111111111111111111111111112"), - 9, - "WSOL", - "WSOL" - ), - USDC: new Token( - TOKEN_PROGRAM_ID, - new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), - 6, - "USDC", - "USDC" - ), -}; - -module.exports = { - wallet, - dev_connection, - dev_endpoint, - main_endpoint, - connection, - TOKEN_PROGRAM_ID, - RAYDIUM_MAINNET, - RAYDIUM_MAINNET_API, - PROGRAMIDS, - makeTxVersion, - DEFAULT_TOKEN, - addLookupTableInfo, - _ENDPOINT, - shyft_api_key, - jito_fee, - smart_money_wallet, - bloXRoute_auth_header, - private_key, - bloXroute_fee, -}; diff --git a/src/helpers/config.ts b/src/helpers/config.ts new file mode 100644 index 0000000..e1efc4f --- /dev/null +++ b/src/helpers/config.ts @@ -0,0 +1,97 @@ +import { + Currency, + Token, + ENDPOINT, + MAINNET_PROGRAM_ID, + RAYDIUM_MAINNET, + TxVersion, + LOOKUP_TABLE_CACHE, + TOKEN_PROGRAM_ID, +} from "@raydium-io/raydium-sdk"; +import { Connection, Keypair, PublicKey } from "@solana/web3.js"; +import fs from "fs"; +import dotenv from "dotenv"; +import bs58 from "bs58"; +import path from "path"; +// default path: /Users/{your_user_name}/Desktop/Solana-Memecoin-CLI/src/helpers/.env +// please specify your own .env path +const envPath = path.join(__dirname, ".env"); +dotenv.config({ + path: envPath, // fill in your .env path +}); +export function loadKeypairFromFile(filename:string) { + const secret = fs.readFileSync(filename, { encoding: "utf8" }); + return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(secret))); +} +export const jito_fee = process.env.JITO_FEE; // 0.00009 SOL +export const shyft_api_key = process.env.SHYFT_API_KEY; // your shyft api key +export const wallet = Keypair.fromSecretKey(bs58.decode(process.env.PRIVATE_KEY || "")); // your wallet +export const private_key = process.env.PRIVATE_KEY; // your private key +export const dev_endpoint = process.env.DEVNET_ENDPOINT||""; // devnet endpoint, if you use devnet +export const main_endpoint = process.env.MAINNET_ENDPOINT||""; // mainnet endpoint +export const bloXRoute_auth_header = process.env.BLOXROUTE_AUTH_HEADER; +export const bloXroute_fee = process.env.BLOXROUTE_FEE; // 0.001 SOL +// const second_main_endpoint = process.env.SECOND_MAINNET_ENDPOINT; // if you use copy trade program, second mainnet endpoint +// const RPC_Websocket_endpoint = process.env.WS_ENDPOINT; +// const second_RPC_Websocket_endpoint = process.env.SECOND_WS_ENDPOINT; // if you use copy trade program +// const stop_lost = process.env.STOP_LOST; // percentage of stop lost, if you use copy trade program +// const take_profit = process.env.TAKE_PROFIT; // percentage of take profit, if you use copy trade program +export const smart_money_wallet = process.env.SMART_MONEY_WALLET; // if you use copy trade program +export const connection = new Connection(main_endpoint, "confirmed"); // mainnet connection +//const connection = new Connection(main_endpoint, { // if you use copy trade program +// wsEndpoint: RPC_Websocket_endpoint, +// commitment: "confirmed", +//}); +//const second_connection = new Connection(second_main_endpoint, { // if you use copy trade program +// wsEndpoint: second_RPC_Websocket_endpoint, +// commitment: "confirmed", +//}); +export const dev_connection = new Connection(dev_endpoint, "confirmed"); // devnet connection + +export const PROGRAMIDS = MAINNET_PROGRAM_ID; // raydium mainnet program address + +export const RAYDIUM_MAINNET_API = RAYDIUM_MAINNET; // raydium mainnet program's api + +export const makeTxVersion = TxVersion.V0; // LEGACY +export const _ENDPOINT = ENDPOINT; // raydium mainnet program's base api path +export const addLookupTableInfo = LOOKUP_TABLE_CACHE; // only mainnet. other = undefined + +export const DEFAULT_TOKEN = { + SOL: new Currency(9, "SOL", "SOL"), + WSOL: new Token( + TOKEN_PROGRAM_ID, + new PublicKey("So11111111111111111111111111111111111111112"), + 9, + "WSOL", + "WSOL" + ), + USDC: new Token( + TOKEN_PROGRAM_ID, + new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + 6, + "USDC", + "USDC" + ), +}; + +// module.exports = { +// wallet, +// dev_connection, +// dev_endpoint, +// main_endpoint, +// connection, +// TOKEN_PROGRAM_ID, +// RAYDIUM_MAINNET, +// RAYDIUM_MAINNET_API, +// PROGRAMIDS, +// makeTxVersion, +// DEFAULT_TOKEN, +// addLookupTableInfo, +// _ENDPOINT, +// shyft_api_key, +// jito_fee, +// smart_money_wallet, +// bloXRoute_auth_header, +// private_key, +// bloXroute_fee, +// }; diff --git a/src/helpers/index.ts b/src/helpers/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/helpers/unwrap_sol.js b/src/helpers/unwrap_sol.ts similarity index 82% rename from src/helpers/unwrap_sol.js rename to src/helpers/unwrap_sol.ts index 0ea12e4..1fe496c 100644 --- a/src/helpers/unwrap_sol.js +++ b/src/helpers/unwrap_sol.ts @@ -1,7 +1,7 @@ -const { NATIVE_MINT, getOrCreateAssociatedTokenAccount, createCloseAccountInstruction } = require("@solana/spl-token"); -const { wallet, connection } = require("./config"); -const { Transaction, LAMPORTS_PER_SOL, sendAndConfirmTransaction } = require("@solana/web3.js"); -const { program } = require("commander"); +import { NATIVE_MINT, getOrCreateAssociatedTokenAccount, createCloseAccountInstruction } from "@solana/spl-token"; +import { wallet, connection } from "./config"; +import { Transaction, LAMPORTS_PER_SOL, sendAndConfirmTransaction } from "@solana/web3.js"; +import { program } from "commander"; program .option("-h, --help", "display help for command") .action((options) => { @@ -13,7 +13,7 @@ program } }); program.parse(); -async function unwrapSol(){ +export async function unwrapSol(){ // wSol ATA const wSolAta = await getOrCreateAssociatedTokenAccount(connection, wallet, NATIVE_MINT, wallet.publicKey); diff --git a/src/helpers/util.js b/src/helpers/util.ts similarity index 87% rename from src/helpers/util.js rename to src/helpers/util.ts index dfa037a..f55d920 100644 --- a/src/helpers/util.js +++ b/src/helpers/util.ts @@ -1,18 +1,18 @@ -const { +import { TOKEN_PROGRAM_ID, SPL_ACCOUNT_LAYOUT, buildSimpleTransaction, -} = require("@raydium-io/raydium-sdk"); -const { PublicKey, VersionedTransaction, Keypair } = require("@solana/web3.js"); -const { +} from "@raydium-io/raydium-sdk"; +import { PublicKey, VersionedTransaction, Keypair } from "@solana/web3.js"; +import { addLookupTableInfo, connection, makeTxVersion, wallet, -} = require("./config.js"); -const { Metaplex } = require("@metaplex-foundation/js"); -const fs = require("fs"); -const { +} from "./config.js"; +import { Metaplex } from "@metaplex-foundation/js"; +import fs from "fs"; +import { Connection, LAMPORTS_PER_SOL, SystemProgram, @@ -20,15 +20,15 @@ const { TransactionMessage, Transaction, ComputeBudgetProgram, -} = require("@solana/web3.js"); +} from "@solana/web3.js"; /** * Retrieves the number of decimals for a given mint address. * @param {PublicKey} mintAddress - The address of the mint. * @returns {Promise} The number of decimals. */ -async function getDecimals(mintAddress) { - const info = await connection.getParsedAccountInfo(mintAddress); +export async function getDecimals(mintAddress:PublicKey) { + const info:any = await connection.getParsedAccountInfo(mintAddress); const result = (info.value?.data).parsed.info.decimals || 0; return result; } @@ -37,7 +37,7 @@ async function getDecimals(mintAddress) { * @param {string} address - The address of the token. * @returns {Promise<{ tokenName: string, tokenSymbol: string }>} The token metadata, including the token name and symbol. */ -async function getTokenMetadata(address) { +export async function getTokenMetadata(address:string) { const metaplex = Metaplex.make(connection); const mintAddress = new PublicKey(address); @@ -69,7 +69,7 @@ async function getTokenMetadata(address) { * @param {TransactionSendOptions} options - The options for sending the transactions. * @returns {Promise>} - A promise that resolves to an array of transaction IDs. */ -async function sendTx(connection, payer, txs, options) { +export async function sendTx(connection:Connection, payer:Keypair, txs:any, options:any) { const txids = []; try { for (const iTx of txs) { @@ -96,7 +96,7 @@ async function sendTx(connection, payer, txs, options) { * @param {Wallet} localwallet - The wallet object. * @returns {Array} An array of token account objects. */ -async function getWalletTokenAccount(localconnection, localwallet) { +export async function getWalletTokenAccount(localconnection:Connection, localwallet:PublicKey) { const walletTokenAccount = await localconnection.getTokenAccountsByOwner( localwallet, { @@ -116,7 +116,7 @@ async function getWalletTokenAccount(localconnection, localwallet) { * @param {Object} options - The options for the transaction. * @returns {Promise} - A promise that resolves with the result of the transaction. */ -async function buildAndSendTx(innerSimpleV0Transaction, options) { +export async function buildAndSendTx(innerSimpleV0Transaction:any, options:any) { try { const recentBlockhash = await connection.getLatestBlockhash("confirmed"); const priority_fee_arr = [ @@ -155,7 +155,7 @@ async function buildAndSendTx(innerSimpleV0Transaction, options) { * @param {number} ms - The duration to sleep in milliseconds. * @returns {Promise} - A promise that resolves after the specified duration. */ -async function sleepTime(ms) { +export async function sleepTime(ms:any) { console.log(new Date().toLocaleString(), "sleepTime", ms); return new Promise((resolve) => setTimeout(resolve, ms)); } @@ -168,7 +168,7 @@ async function sleepTime(ms) { * @param {string} filepath - The path to the file where the keypair is stored or will be stored. * @returns {Promise} The loaded or newly created keypair. */ -async function loadOrCreateKeypair_wallet(filepath) { +export async function loadOrCreateKeypair_wallet(filepath:string) { try { const keypairString = fs.readFileSync(filepath, { encoding: "utf8" }); return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(keypairString))); @@ -182,7 +182,7 @@ async function loadOrCreateKeypair_wallet(filepath) { return newKeypair; } } -async function isBlockhashExpired(lastValidBlockHeight) { +export async function isBlockhashExpired(lastValidBlockHeight:number) { let currentBlockHeight = await connection.getBlockHeight("finalized"); console.log(" "); console.log("Current Block height: ", currentBlockHeight); @@ -199,10 +199,10 @@ async function isBlockhashExpired(lastValidBlockHeight) { return currentBlockHeight > lastValidBlockHeight - 150; } -const sleep = (ms) => { +export const sleep = (ms:number) => { return new Promise((resolve) => setTimeout(resolve, ms)); }; -async function checkTx(txId) { +export async function checkTx(txId:string) { const blockhashResponse = await connection.getLatestBlockhashAndContext( "finalized" ); @@ -242,14 +242,3 @@ async function checkTx(txId) { await sleep(2500); } } - -module.exports = { - getDecimals, - getTokenMetadata, - getWalletTokenAccount, - sendTx, - buildAndSendTx, - sleepTime, - loadOrCreateKeypair_wallet, - checkTx, -}; diff --git a/src/helpers/wrap_sol.js b/src/helpers/wrap_sol.ts similarity index 78% rename from src/helpers/wrap_sol.js rename to src/helpers/wrap_sol.ts index 4d47204..001509c 100644 --- a/src/helpers/wrap_sol.js +++ b/src/helpers/wrap_sol.ts @@ -1,13 +1,13 @@ -const { NATIVE_MINT, getOrCreateAssociatedTokenAccount, createSyncNativeInstruction, } = require("@solana/spl-token"); -const { wallet, connection } = require("./config"); -const { Transaction, SystemProgram, LAMPORTS_PER_SOL, sendAndConfirmTransaction } = require("@solana/web3.js"); -const {getSPLTokenBalance} = require("./check_balance") -const { program } = require("commander"); +import { NATIVE_MINT, getOrCreateAssociatedTokenAccount, createSyncNativeInstruction, } from "@solana/spl-token"; +import { wallet, connection } from "./config"; +import { Transaction, SystemProgram, LAMPORTS_PER_SOL, sendAndConfirmTransaction } from "@solana/web3.js"; +import {getSPLTokenBalance} from "./check_balance"; +import { program } from "commander"; let wrap_size = 0; program .option("-s, --size ", "size of sol to wrap") .option("-h, --help", "display help for command") - .action((options) => { + .action((options:any) => { if (options.help) { console.log( "node wrap_sol.js --size " @@ -23,8 +23,8 @@ program } }); program.parse(); -async function wrap_sol( - amount +export async function wrap_sol( + amount:number ){ // wSol ATA const wSolAta = await getOrCreateAssociatedTokenAccount(connection, wallet, NATIVE_MINT, wallet.publicKey); @@ -62,12 +62,12 @@ async function wrap_sol( return txSignature; } -async function check_wsol_balance(wSolAta){ +export async function check_wsol_balance(wSolAta:any){ const wsolBalance = await getSPLTokenBalance(connection, NATIVE_MINT, wallet.publicKey); console.log(`new wsol balance: ${wsolBalance}`); } -async function main(){ +export async function main(){ await wrap_sol(wrap_size); } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8bb6097 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,108 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} From 6b2070ce28a82fd3fd10cfad329ca835dd65ebcf Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 23 Aug 2024 16:10:43 +0800 Subject: [PATCH 002/140] convert src/jupiter/*.js & src/Transactions/*.js to .ts --- .../bundled_launcher/{index.js => index.ts} | 0 ...cutor.js => bloXroute_tips_tx_executor.ts} | 36 +++++++------- ...x_executor.js => jito_tips_tx_executor.ts} | 30 ++++++------ ...e_tx_executor.js => simple_tx_executor.ts} | 0 src/helpers/index.ts | 5 ++ src/jupiter/{dca.js => dca.ts} | 0 src/jupiter/index.ts | 3 ++ .../{limit_order.js => limit_order.ts} | 0 .../swap/{buy-helper.js => buy-helper.ts} | 19 ++++---- .../swap/{sell-helper.js => sell-helper.ts} | 19 ++++---- .../swap/{swap-helper.js => swap-helper.ts} | 48 ++++++++----------- 11 files changed, 79 insertions(+), 81 deletions(-) rename src/Memecoin_dev/bundled_launcher/{index.js => index.ts} (100%) rename src/Transactions/{bloXroute_tips_tx_executor.js => bloXroute_tips_tx_executor.ts} (75%) rename src/Transactions/{jito_tips_tx_executor.js => jito_tips_tx_executor.ts} (88%) rename src/Transactions/{simple_tx_executor.js => simple_tx_executor.ts} (100%) rename src/jupiter/{dca.js => dca.ts} (100%) create mode 100644 src/jupiter/index.ts rename src/jupiter/{limit_order.js => limit_order.ts} (100%) rename src/jupiter/swap/{buy-helper.js => buy-helper.ts} (66%) rename src/jupiter/swap/{sell-helper.js => sell-helper.ts} (66%) rename src/jupiter/swap/{swap-helper.js => swap-helper.ts} (82%) diff --git a/src/Memecoin_dev/bundled_launcher/index.js b/src/Memecoin_dev/bundled_launcher/index.ts similarity index 100% rename from src/Memecoin_dev/bundled_launcher/index.js rename to src/Memecoin_dev/bundled_launcher/index.ts diff --git a/src/Transactions/bloXroute_tips_tx_executor.js b/src/Transactions/bloXroute_tips_tx_executor.ts similarity index 75% rename from src/Transactions/bloXroute_tips_tx_executor.js rename to src/Transactions/bloXroute_tips_tx_executor.ts index f8df2e5..5b5a21e 100644 --- a/src/Transactions/bloXroute_tips_tx_executor.js +++ b/src/Transactions/bloXroute_tips_tx_executor.ts @@ -1,28 +1,28 @@ -const { +import { createTraderAPIMemoInstruction, HttpProvider, MAINNET_API_UK_HTTP, MAINNET_API_NY_HTTP, -} = require("@bloxroute/solana-trader-client-ts"); -const { private_key, bloXRoute_auth_header, bloXroute_fee } = require("../helpers/config"); -const { +} from "@bloxroute/solana-trader-client-ts"; +import { private_key, bloXRoute_auth_header, bloXroute_fee } from "../helpers/config"; +import { Connection, LAMPORTS_PER_SOL, PublicKey, Keypair, SystemProgram, -} = require("@solana/web3.js"); -const base58 = require("bs58"); -const { Transaction } = require("@solana/web3.js"); +} from "@solana/web3.js"; +import base58 from "bs58"; +import { Transaction } from "@solana/web3.js"; const TRADER_API_TIP_WALLET = "HWEoBxYs7ssKuudEjzjmpfJVX7Dvi7wescFsVx2L5yoY"; const provider = new HttpProvider( - bloXRoute_auth_header, + bloXRoute_auth_header||"", private_key, MAINNET_API_UK_HTTP // or MAINNET_API_NY_HTTP ); -async function CreateTraderAPITipTransaction( - senderAddress, - tipAmountInLamports +export async function CreateTraderAPITipTransaction( + senderAddress:any, + tipAmountInLamports:any ) { const tipAddress = new PublicKey(TRADER_API_TIP_WALLET); return new Transaction().add( @@ -33,35 +33,37 @@ async function CreateTraderAPITipTransaction( }) ); } -async function bloXroute_executeAndConfirm(transaction, signers) { +export async function bloXroute_executeAndConfirm(transaction:any, signers:any) { const memo = createTraderAPIMemoInstruction( "Powered by bloXroute Trader Api" ); // why not use empty string? see https://docs.bloxroute.com/solana/trader-api-v2/achieve-best-performance-for-landing-a-transaction - const wallet = Keypair.fromSecretKey(base58.decode(private_key)); + const wallet = Keypair.fromSecretKey(base58.decode(private_key||"")); const recentBlockhash = await provider.getRecentBlockHash({}); let tx = new Transaction({ recentBlockhash: recentBlockhash.blockHash, feePayer: wallet.publicKey, }); + const fee:number = parseFloat(bloXroute_fee||"0.001"); tx.add(transaction); tx.add(memo); tx.add( await CreateTraderAPITipTransaction( wallet.publicKey, - bloXroute_fee * LAMPORTS_PER_SOL + (fee) * LAMPORTS_PER_SOL ) ); // why 0.001 SOL? tx.sign(wallet); const serializeTxBytes = tx.serialize(); const buffTx = Buffer.from(serializeTxBytes); - const encodedTx = buffTx.toString("base64"); + const encodedTx:any = buffTx.toString("base64"); console.log("Submitting transaction to bloXroute..."); - const response = await provider.postSubmit({ + const request:any= { transaction: { content: encodedTx, isCleanup: false }, frontRunningProtection: false, useStakedRPCs: true, // comment this line if you don't want to directly send txn to current blockleader - }); + } + const response = await provider.postSubmit(request); /** * For better performance, * you could include a high enough tip and set useStakedRPCs to True diff --git a/src/Transactions/jito_tips_tx_executor.js b/src/Transactions/jito_tips_tx_executor.ts similarity index 88% rename from src/Transactions/jito_tips_tx_executor.js rename to src/Transactions/jito_tips_tx_executor.ts index 6347fc6..ec51fe9 100644 --- a/src/Transactions/jito_tips_tx_executor.js +++ b/src/Transactions/jito_tips_tx_executor.ts @@ -1,4 +1,4 @@ -const { +import { BlockhashWithExpiryBlockHeight, Keypair, PublicKey, @@ -6,11 +6,11 @@ const { Connection, TransactionMessage, VersionedTransaction, -} = require("@solana/web3.js"); -const axios = require("axios"); -const bs58 = require("bs58"); -const { Currency, CurrencyAmount } = require("@raydium-io/raydium-sdk"); -const { connection } = require("../helpers/config"); +} from "@solana/web3.js"; +import axios from "axios"; +import bs58 from "bs58"; +import { Currency, CurrencyAmount } from "@raydium-io/raydium-sdk"; +import { connection } from "../helpers/config"; const jito_Validators = [ "DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh", "ADuUkR4vqLUMWXxW9gh6D6L8pMSawimctcNZ5pGwDcEt", @@ -21,7 +21,8 @@ const jito_Validators = [ "DttWaMuVvTiduZRnguLF7jNxTgiMBZ1hyAumKUiL2KRL", "96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5", ]; -const endpoints = [ // TODO: Choose a jito endpoint which is closest to your location, and uncomment others +const endpoints = [ + // TODO: Choose a jito endpoint which is closest to your location, and uncomment others "https://mainnet.block-engine.jito.wtf/api/v1/bundles", "https://amsterdam.mainnet.block-engine.jito.wtf/api/v1/bundles", "https://frankfurt.mainnet.block-engine.jito.wtf/api/v1/bundles", @@ -33,7 +34,7 @@ const endpoints = [ // TODO: Choose a jito endpoint which is closest to your loc * Generates a random validator from the list of jito_Validators. * @returns {PublicKey} A new PublicKey representing the random validator. */ -async function getRandomValidator() { +export async function getRandomValidator() { const res = jito_Validators[Math.floor(Math.random() * jito_Validators.length)]; return new PublicKey(res); @@ -46,11 +47,11 @@ async function getRandomValidator() { * @param {number} jitofee - The fee for the Jito transaction. * @returns {Promise<{ confirmed: boolean, signature: string | null }>} - A promise that resolves to an object containing the confirmation status and the transaction signature. */ -async function jito_executeAndConfirm( - transaction, - payer, - lastestBlockhash, - jitofee +export async function jito_executeAndConfirm( + transaction: any, + payer: Keypair, + lastestBlockhash: any, + jitofee: any ) { console.log("Executing transaction (jito)..."); const jito_validator_wallet = await getRandomValidator(); @@ -114,7 +115,7 @@ async function jito_executeAndConfirm( * @param {object} latestBlockhash - The latest blockhash information. * @returns {object} - An object containing the confirmation status and the transaction signature. */ -async function jito_confirm(signature, latestBlockhash) { +export async function jito_confirm(signature: any, latestBlockhash: any) { console.log("Confirming the jito transaction..."); const confirmation = await connection.confirmTransaction( { @@ -127,4 +128,3 @@ async function jito_confirm(signature, latestBlockhash) { return { confirmed: !confirmation.value.err, signature }; } -module.exports = { jito_executeAndConfirm }; diff --git a/src/Transactions/simple_tx_executor.js b/src/Transactions/simple_tx_executor.ts similarity index 100% rename from src/Transactions/simple_tx_executor.js rename to src/Transactions/simple_tx_executor.ts diff --git a/src/helpers/index.ts b/src/helpers/index.ts index e69de29..b6b2146 100644 --- a/src/helpers/index.ts +++ b/src/helpers/index.ts @@ -0,0 +1,5 @@ +export * from "./config"; +export * from "./util"; +export * from "./unwrap_sol"; +export * from "./check_balance"; +export * from "./wrap_sol"; \ No newline at end of file diff --git a/src/jupiter/dca.js b/src/jupiter/dca.ts similarity index 100% rename from src/jupiter/dca.js rename to src/jupiter/dca.ts diff --git a/src/jupiter/index.ts b/src/jupiter/index.ts new file mode 100644 index 0000000..06a050f --- /dev/null +++ b/src/jupiter/index.ts @@ -0,0 +1,3 @@ +export * from "./swap/swap-helper"; +export * from "./swap/buy-helper"; +export * from "./swap/sell-helper"; \ No newline at end of file diff --git a/src/jupiter/limit_order.js b/src/jupiter/limit_order.ts similarity index 100% rename from src/jupiter/limit_order.js rename to src/jupiter/limit_order.ts diff --git a/src/jupiter/swap/buy-helper.js b/src/jupiter/swap/buy-helper.ts similarity index 66% rename from src/jupiter/swap/buy-helper.js rename to src/jupiter/swap/buy-helper.ts index 749e052..8328c48 100644 --- a/src/jupiter/swap/buy-helper.js +++ b/src/jupiter/swap/buy-helper.ts @@ -1,7 +1,7 @@ -const swap_helper = require("./swap-helper"); -const { PublicKey } = require("@solana/web3.js"); -const { wallet } = require("../../helpers/config"); -const { getDecimals } = require("../../helpers/util"); +import {getQuote, getSwapTransaction, convertToInteger, finalizeTransaction} from "./swap-helper"; +import { PublicKey } from "@solana/web3.js"; +import { wallet } from "../../helpers/config"; +import { getDecimals } from "../../helpers/util"; const wsol = "So11111111111111111111111111111111111111112"; /** @@ -13,13 +13,13 @@ const wsol = "So11111111111111111111111111111111111111112"; * @returns {Promise} - A promise that resolves when the buy operation is completed. * @throws {Error} - If an error occurs during the buy operation. */ -async function buy(tokenToBuy, amountTokenOut, slippage) { +export async function buy(tokenToBuy:string, amountTokenOut:number, slippage:any) { try { - const convertedAmountOfTokenOut = await swap_helper.convertToInteger( + const convertedAmountOfTokenOut = await convertToInteger( amountTokenOut, 9 ); - const quoteResponse = await swap_helper.getQuote( + const quoteResponse = await getQuote( wsol, tokenToBuy, convertedAmountOfTokenOut, @@ -27,12 +27,12 @@ async function buy(tokenToBuy, amountTokenOut, slippage) { ); console.log(quoteResponse); const wallet_PubKey = wallet.publicKey.toBase58(); - const swapTransaction = await swap_helper.getSwapTransaction( + const swapTransaction = await getSwapTransaction( quoteResponse, wallet_PubKey ); const { confirmed, signature } = - await swap_helper.finalizeTransaction(swapTransaction); + await finalizeTransaction(swapTransaction); if (confirmed) { console.log("http://solscan.io/tx/" + signature); } else { @@ -45,4 +45,3 @@ async function buy(tokenToBuy, amountTokenOut, slippage) { } } -module.exports = { buy }; diff --git a/src/jupiter/swap/sell-helper.js b/src/jupiter/swap/sell-helper.ts similarity index 66% rename from src/jupiter/swap/sell-helper.js rename to src/jupiter/swap/sell-helper.ts index 1e4d946..d480f2a 100644 --- a/src/jupiter/swap/sell-helper.js +++ b/src/jupiter/swap/sell-helper.ts @@ -1,7 +1,7 @@ -const swap_helper = require("./swap-helper"); -const { PublicKey } = require("@solana/web3.js"); -const { wallet } = require("../../helpers/config"); -const { getDecimals } = require("../../helpers/util"); +import {convertToInteger, getQuote, getSwapTransaction, finalizeTransaction} from "./swap-helper"; +import { PublicKey } from "@solana/web3.js"; +import { wallet } from "../../helpers/config"; +import { getDecimals } from "../../helpers/util"; const wsol = "So11111111111111111111111111111111111111112"; /** @@ -11,27 +11,27 @@ const wsol = "So11111111111111111111111111111111111111112"; * @param {number} slippage - The slippage tolerance percentage. * @returns {Promise} - A promise that resolves when the sell operation is completed. */ -async function sell(tokenToSell, amountOfTokenToSell, slippage) { +export async function sell(tokenToSell:string, amountOfTokenToSell:number, slippage:any) { try { const decimals = await getDecimals(new PublicKey(tokenToSell)); console.log(decimals); - const convertedAmountOfTokenOut = await swap_helper.convertToInteger( + const convertedAmountOfTokenOut = await convertToInteger( amountOfTokenToSell, decimals ); console.log(convertedAmountOfTokenOut); - const quoteResponse = await swap_helper.getQuote( + const quoteResponse = await getQuote( tokenToSell, wsol, convertedAmountOfTokenOut, slippage ); const wallet_PubKey = wallet.publicKey.toBase58(); - const swapTransaction = await swap_helper.getSwapTransaction( + const swapTransaction = await getSwapTransaction( quoteResponse, wallet_PubKey ); - const { confirmed, signature } = await swap_helper.finalizeTransaction( + const { confirmed, signature } = await finalizeTransaction( swapTransaction ); if (confirmed) { @@ -46,4 +46,3 @@ async function sell(tokenToSell, amountOfTokenToSell, slippage) { } } -module.exports = { sell }; diff --git a/src/jupiter/swap/swap-helper.js b/src/jupiter/swap/swap-helper.ts similarity index 82% rename from src/jupiter/swap/swap-helper.js rename to src/jupiter/swap/swap-helper.ts index b87e83a..3d18778 100644 --- a/src/jupiter/swap/swap-helper.js +++ b/src/jupiter/swap/swap-helper.ts @@ -1,10 +1,10 @@ -const { VersionedTransaction, PublicKey } = require("@solana/web3.js"); -const fetch = require("cross-fetch"); -const { connection, wallet, jito_fee } = require("../../helpers/config"); -const { +import { VersionedTransaction, PublicKey } from "@solana/web3.js"; +import fetch from "cross-fetch"; +import { connection, wallet, jito_fee } from "../../helpers/config"; +import { jito_executeAndConfirm, -} = require("../../Transactions/jito_tips_tx_executor"); -const { getDecimals } = require("../../helpers/util"); +} from "../../Transactions/jito_tips_tx_executor"; +import { getDecimals } from "../../helpers/util"; /** * Retrieves a quote for swapping tokens. * @@ -14,11 +14,11 @@ const { getDecimals } = require("../../helpers/util"); * @param {number} slippage - The allowed slippage in basis points. * @returns {Promise} - The quote object containing swap details. */ -async function getQuote( - tokenToSell, - tokenToBuy, - convertedAmountOfTokenOut, - slippage +export async function getQuote( + tokenToSell:string, + tokenToBuy:string, + convertedAmountOfTokenOut:number, + slippage:any ) { const url = `https://quote-api.jup.ag/v6/quote?inputMint=${tokenToSell}&outputMint=${tokenToBuy}&amount=${convertedAmountOfTokenOut}&slippageBps=${slippage}`; const response = await fetch(url); @@ -33,7 +33,7 @@ async function getQuote( * @returns {Promise} - The swap transaction. * @throws {Error} - If an error occurs during the process. */ -async function getSwapTransaction(quoteResponse, wallet_pubKey) { +export async function getSwapTransaction(quoteResponse:any, wallet_pubKey:string) { try { let body = null; body = { @@ -42,9 +42,6 @@ async function getSwapTransaction(quoteResponse, wallet_pubKey) { wrapAndUnwrapSol: true, dynamicComputeUnitLimit: true, // allow dynamic compute limit instead of max 1,400,000 prioritizationFeeLamports: 4211970, // prioritization fee - prioritizationFeeLamports: { - autoMultiplier: 2, - }, }; const resp = await fetch("https://quote-api.jup.ag/v6/swap", { method: "POST", @@ -55,7 +52,7 @@ async function getSwapTransaction(quoteResponse, wallet_pubKey) { }); const swapResponse = await resp.json(); return swapResponse.swapTransaction; - } catch (error) { + } catch (error:any) { throw new Error(error); } } @@ -65,7 +62,7 @@ async function getSwapTransaction(quoteResponse, wallet_pubKey) { * @param {number} decimals - The number of decimal places. * @returns {Promise} The converted integer value. */ -async function convertToInteger(amount, decimals) { +export async function convertToInteger(amount:number, decimals:number) { return Math.floor(amount * 10 ** decimals); } @@ -75,7 +72,7 @@ async function convertToInteger(amount, decimals) { * @returns {Promise<{ confirmed: boolean, signature: string }>} - A promise that resolves to an object containing the confirmation status and transaction signature. * @throws {Error} - If an error occurs during the transaction finalization process. */ -async function finalizeTransaction(swapTransaction) { +export async function finalizeTransaction(swapTransaction:any) { try { let confirmed = null, signature = null; @@ -86,7 +83,7 @@ async function finalizeTransaction(swapTransaction) { transaction.sign([wallet]); const latestBlockhash = await connection.getLatestBlockhash("processed"); - res = await jito_executeAndConfirm( + const res = await jito_executeAndConfirm( transaction, wallet, latestBlockhash, @@ -95,7 +92,7 @@ async function finalizeTransaction(swapTransaction) { confirmed = res.confirmed; signature = res.signature; return { confirmed, signature }; - } catch (error) { + } catch (error:any) { throw new Error(error); } return { confirmed: false, signature: null }; @@ -109,7 +106,7 @@ async function finalizeTransaction(swapTransaction) { * @param {number} slippage - The allowed slippage percentage. * @returns {Promise} - A promise that resolves when the swap transaction is completed. */ -async function swap(tokenToSell, tokenToBuy, amountTokenOut, slippage) { +export async function swap(tokenToSell:string, tokenToBuy:string, amountTokenOut:number, slippage:any) { try { const decimals = await getDecimals(new PublicKey(tokenToSell)); const convertedAmountOfTokenOut = await convertToInteger( @@ -138,11 +135,4 @@ async function swap(tokenToSell, tokenToBuy, amountTokenOut, slippage) { } catch (error) { console.error(error); } -} -module.exports = { - getQuote, - getSwapTransaction, - finalizeTransaction, - convertToInteger, - swap, -}; +} \ No newline at end of file From 67ced21957e1215e81d1b340998e0b016f10650e Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 23 Aug 2024 16:36:11 +0800 Subject: [PATCH 003/140] converted src/Token/*.js to .ts --- src/Token/{burn.js => burn.ts} | 36 ++--- src/Token/{create.js => create.ts} | 142 +++++++++--------- src/Token/index.ts | 2 + ...evoke_authority.js => revoke_authority.ts} | 31 ++-- .../{createAndMint.js => createAndMint.ts} | 14 +- ...{connect-testnet.js => connect-testnet.ts} | 14 +- 6 files changed, 119 insertions(+), 120 deletions(-) rename src/Token/{burn.js => burn.ts} (85%) rename src/Token/{create.js => create.ts} (87%) create mode 100644 src/Token/index.ts rename src/Token/{revoke_authority.js => revoke_authority.ts} (82%) rename src/Token/zk-compression/compressed-token/{createAndMint.js => createAndMint.ts} (83%) rename src/Token/zk-compression/{connect-testnet.js => connect-testnet.ts} (57%) diff --git a/src/Token/burn.js b/src/Token/burn.ts similarity index 85% rename from src/Token/burn.js rename to src/Token/burn.ts index 69d2f4e..0bcc08d 100644 --- a/src/Token/burn.js +++ b/src/Token/burn.ts @@ -1,28 +1,28 @@ -const fs = require("fs"); -const { +import fs from "fs"; +import { Connection, PublicKey, Keypair, TransactionMessage, VersionedTransaction, -} = require("@solana/web3.js"); -const { program } = require("commander"); -const { +} from "@solana/web3.js"; +import { program } from "commander"; +import { getAccount, getMint, getAssociatedTokenAddress, createBurnCheckedInstruction, -} = require("@solana/spl-token"); -const { connection, dev_connection } = require("../helpers/config"); -const { wallet } = require("../helpers/config"); +} from "@solana/spl-token"; +import { connection, dev_connection } from "../helpers/config"; +import { wallet } from "../helpers/config"; let payer_keypair_path = null, - token_address = null, - percentage = null, + token_address:any = null, + percentage:any = null, decimals = null, cluster = null, payerKeypair = null, - newConnection = null; + newConnection:any = null; program .option("--payer ", "Specify the path to the secret key") .option("--token_address ", "Specify the token address") @@ -58,7 +58,7 @@ if (cluster === "devnet") { * @param {string} filepath - The path to the keypair file. * @returns {Uint8Array} - The loaded or created keypair. */ -function loadOrCreateKeypair(filepath) { +export function loadOrCreateKeypair(filepath:string) { try { const keypairStringArr = fs.readFileSync(filepath, { encoding: "utf8", @@ -73,10 +73,10 @@ function loadOrCreateKeypair(filepath) { } /** * Retrieves the token balance for a given token account. - * @param {string} tokenAccount - The token account address. + * @param {PublicKey} tokenAccount - The token account address. * @returns {number} The token balance. */ -async function getTokenBalance(tokenAccount) { +export async function getTokenBalance(tokenAccount:PublicKey) { const info = await getAccount(newConnection, tokenAccount); // token account right here const amount = Number(info.amount); const mint = await getMint(newConnection, info.mint); @@ -87,21 +87,21 @@ async function getTokenBalance(tokenAccount) { /** * Retrieves the decimal value of a token. - * @param {string} tokenAddress - The address of the token. + * @param {PublicKey} tokenAddress - The address of the token. * @returns {Promise} The decimal value of the token. */ -async function getTokenDecimal(tokenAddress) { +export async function getTokenDecimal(tokenAddress:PublicKey) { const mint = await getMint(newConnection, tokenAddress); return mint.decimals; } /** * Burns a specified percentage of tokens from a given token address. - * @param {string} tokenAddress - The address of the token to burn. + * @param {PublicKey} tokenAddress - The address of the token to burn. * @param {object} payer - The payer's public key and associated token address. * @param {number} percentage - The percentage of tokens to burn. * @returns {Promise} - A promise that resolves when the burning process is complete. */ -async function burnToken(tokenAddress, payer, percentage) { +export async function burnToken(tokenAddress:PublicKey, payer:Keypair, percentage:number) { try { decimals = await getTokenDecimal(tokenAddress); console.log("Decimals: ", decimals); diff --git a/src/Token/create.js b/src/Token/create.ts similarity index 87% rename from src/Token/create.js rename to src/Token/create.ts index a777006..8d0255d 100644 --- a/src/Token/create.js +++ b/src/Token/create.ts @@ -1,50 +1,50 @@ -const { +import { percentAmount, generateSigner, signerIdentity, createSignerFromKeypair, Umi, generatedSignerPayer, -} = require("@metaplex-foundation/umi"); -const { +} from "@metaplex-foundation/umi"; +import { TokenStandard, createAndMint, -} = require("@metaplex-foundation/mpl-token-metadata"); -const { +} from "@metaplex-foundation/mpl-token-metadata"; +import { Metaplex, keypairIdentity, toMetaplexFile, irysStorage, -} = require("@metaplex-foundation/js"); -const { createUmi } = require("@metaplex-foundation/umi-bundle-defaults"); -const { mplCandyMachine } = require("@metaplex-foundation/mpl-candy-machine"); -const { AuthorityType, setAuthority } = require("@solana/spl-token"); -const bs58 = require("bs58"); -const fs = require("fs"); -const { PublicKey, Keypair } = require("@solana/web3.js"); -const { program } = require("commander"); -const { +} from "@metaplex-foundation/js"; +import { createUmi } from "@metaplex-foundation/umi-bundle-defaults"; +import { mplCandyMachine } from "@metaplex-foundation/mpl-candy-machine"; +import { AuthorityType, setAuthority } from "@solana/spl-token"; +import bs58 from "bs58"; +import fs from "fs"; +import { PublicKey, Keypair } from "@solana/web3.js"; +import { program } from "commander"; +import { main_endpoint, dev_connection, dev_endpoint, connection, wallet, -} = require("../helpers/config"); +} from "../helpers/config"; // info -let payer_keypair_path = null, - symbol = null, - token_name = null, - mintkeypair_path = null, - supply = null, - decimals = null, - metadata_path = null, - image_path = null, - cluster = null, - priority_fee = null, - file_type = null, - newConnection = null, - endpoint = null; +let payer_keypair_path: any = null, + symbol: any = null, + token_name: any = null, + mintkeypair_path:any = null, + supply:any = null, + decimals:any = null, + metadata_path:any = null, + image_path:any = null, + cluster:any = null, + priority_fee:any = null, + file_type:any = null, + newConnection:any = null, + endpoint:any = null; // handle the input value from the user's command line here program @@ -98,7 +98,6 @@ program supply = options.supply; decimals = options.decimals; metadata_path = options.metadata; - image = options.image; cluster = options.cluster; priority_fee = options.priority; file_type = options.file_type; @@ -134,8 +133,8 @@ if (!mintkeypair_path) { } else { mintSecret = loadOrCreateKeypair(mintkeypair_path); } -let payerSecret = null, - PayerWallet = null; +let payerSecret:any = null, + PayerWallet:any = null; // create the Umi object const umi = createUmi(endpoint); //Replace with your RPC Endpoint @@ -169,7 +168,7 @@ umi.use(mplCandyMachine()); * @returns {Keypair} - The loaded or newly created keypair. * @throws {Error} - If there is an error reading or writing the keypair file. */ -async function loadOrCreateKeypair_wallet(filepath) { +async function loadOrCreateKeypair_wallet(filepath:string) { try { const keypairString = fs.readFileSync(filepath, { encoding: "utf8" }); return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(keypairString))); @@ -188,7 +187,7 @@ async function loadOrCreateKeypair_wallet(filepath) { * @param {string} filepath - The path to the keypair file. * @returns {Uint8Array} - The loaded or created keypair. */ -function loadOrCreateKeypair(filepath) { +function loadOrCreateKeypair(filepath:string) { try { const keypairStringArr = fs.readFileSync(filepath, { encoding: "utf8", @@ -208,7 +207,7 @@ function loadOrCreateKeypair(filepath) { * @param {string} owner - The owner address. * @returns {Promise} - A promise that resolves when the freeze authority is disabled. */ -async function revokeFreeze(mint, payer, owner) { +export async function revokeFreeze(mint:any, payer:any, owner:any) { console.log("Disabling the freeze authority..."); await setAuthority( newConnection, @@ -229,7 +228,7 @@ async function revokeFreeze(mint, payer, owner) { * @param {string} owner - The owner address. * @returns {Promise} - A promise that resolves when the mint authority is revoked. */ -async function revokeMint(mint, payer, owner) { +export async function revokeMint(mint:any, payer:any, owner:any) { console.log("Disabling the mint authority..."); await setAuthority( newConnection, @@ -248,7 +247,7 @@ async function revokeMint(mint, payer, owner) { * @param {string} walletPath - The path to the wallet. * @returns {Promise} The Metaplex instance. */ -async function getMetaplex(walletPath) { +export async function getMetaplex(walletPath:string) { let WALLET = null; if (walletPath === null) WALLET = wallet; else WALLET = await loadOrCreateKeypair_wallet(walletPath); @@ -276,15 +275,15 @@ async function getMetaplex(walletPath) { * @param {Metaplex} METAPLEX - The Metaplex instance used for uploading metadata. * @returns {Promise} - The URI of the uploaded metadata. */ -async function uploadMetadata( - imgUri, - imgType, - nftName, - symbol, - description, - website, - twitter, - telegram, +export async function uploadMetadata( + imgUri:any, + imgType:any, + nftName:any, + symbol:any, + description:any, + website:any, + twitter:any, + telegram:any, METAPLEX = Metaplex.make(newConnection) ) { const uri = await METAPLEX.nfts().uploadMetadata({ @@ -318,9 +317,9 @@ async function uploadMetadata( * @param {Metaplex} METAPLEX - The Metaplex instance. * @returns {Promise} The image URI. */ -async function uploadImage( - filePath, - fileName, +export async function uploadImage( + filePath:any, + fileName:any, METAPLEX = Metaplex.make(newConnection) ) { const imgBuffer = fs.readFileSync(filePath); @@ -346,20 +345,20 @@ async function uploadImage( * @param {object} mintSigner - The mint signer object. * @returns {Promise} A promise that resolves when the meme token is created. */ -async function createMeme( - name, - symbol, - filetype, - description, - website, - twitter, - telegram, - ownerWallet, - max_supply, - decimals, - imgURI, - uri, - mintSigner +export async function createMeme( + name:any, + symbol:any, + filetype:any, + description:any, + website:any, + twitter:any, + telegram:any, + ownerWallet:any, + max_supply:any, + decimals:any, + imgURI:any, + uri:any, + mintSigner:any ) { const CONFIG = { uploadPath: image_path, @@ -448,15 +447,15 @@ async function createMeme( * @param {number} decimals - The number of decimals for the token. * @returns {Promise} - A promise that resolves when the token is successfully minted. */ -async function mint_token( - umi, - mint, - name, - symbol, - uri, - owner, - amount, - decimals +export async function mint_token( + umi:any, + mint:any, + name:any, + symbol:any, + uri:any, + owner:any, + amount:any, + decimals:any ) { try { console.log(`minting token ${name}, CA: ${mint.publicKey}`); @@ -502,4 +501,3 @@ async function main() { } main(); -module.exports = { loadOrCreateKeypair }; diff --git a/src/Token/index.ts b/src/Token/index.ts new file mode 100644 index 0000000..bd81272 --- /dev/null +++ b/src/Token/index.ts @@ -0,0 +1,2 @@ +export * from "./burn"; +export * from "./create"; \ No newline at end of file diff --git a/src/Token/revoke_authority.js b/src/Token/revoke_authority.ts similarity index 82% rename from src/Token/revoke_authority.js rename to src/Token/revoke_authority.ts index 3dab772..5311394 100644 --- a/src/Token/revoke_authority.js +++ b/src/Token/revoke_authority.ts @@ -1,17 +1,18 @@ -const { AuthorityType, setAuthority } = require("@solana/spl-token"); -const bs58 = require("bs58"); -const fs = require("fs"); -const { Connection, PublicKey, Keypair } = require("@solana/web3.js"); -const { program } = require("commander"); -const { connection, dev_connection } = require("../helpers/config"); -const { loadOrCreateKeypair_wallet } = require("../helpers/util"); -const { wallet } = require("../helpers/config"); +import { AuthorityType, setAuthority } from "@solana/spl-token"; +import bs58 from "bs58" ; +import fs from "fs"; +import { Connection, PublicKey, Keypair } from "@solana/web3.js"; +import { program } from "commander"; +import { connection, dev_connection } from "../helpers/config"; +import { loadOrCreateKeypair_wallet } from "../helpers/util"; +import { wallet } from "../helpers/config"; -let newConnection = null; -let payer_keypair_path = null, - token_address = null, +let newConnection:any = null; +let payer_keypair_path:any = null, + token_address:any = null, mint = false, - freeze = false; + freeze = false, + cluster:any = null; program .option("--payer ", "Specify the path to the secret key") .option("--token_address ", "Specify the token address") @@ -59,7 +60,7 @@ program.parse(); * @param {string} owner - The owner address. * @returns {Promise} - A promise that resolves when the mint authority is revoked. */ -async function revokeMint(mint, payer, owner) { +export async function revokeMint(mint:any, payer:any, owner:any) { console.log("Disabling the mint authority..."); await setAuthority( newConnection, @@ -81,7 +82,7 @@ async function revokeMint(mint, payer, owner) { * @param {string} owner - The owner address. * @returns {Promise} - A promise that resolves when the freeze authority is disabled. */ -async function revokeFreeze(mint, payer, owner) { +export async function revokeFreeze(mint:any, payer:any, owner:any) { console.log("Disabling the freeze authority..."); await setAuthority( newConnection, @@ -103,7 +104,7 @@ async function revokeFreeze(mint, payer, owner) { * @function revokeAuthority * @returns {Promise} */ -async function revokeAuthority() { +export async function revokeAuthority() { // let payer_wallet = null; // if (payer_keypair !== null) { // payer_wallet = await loadOrCreateKeypair_wallet(payer_keypair); diff --git a/src/Token/zk-compression/compressed-token/createAndMint.js b/src/Token/zk-compression/compressed-token/createAndMint.ts similarity index 83% rename from src/Token/zk-compression/compressed-token/createAndMint.js rename to src/Token/zk-compression/compressed-token/createAndMint.ts index 8e60457..06e38c3 100644 --- a/src/Token/zk-compression/compressed-token/createAndMint.js +++ b/src/Token/zk-compression/compressed-token/createAndMint.ts @@ -1,24 +1,22 @@ -const { +import { LightSystemProgram, Rpc, confirmTx, createRpc, -} = require("@lightprotocol/stateless.js"); -const { +} from "@lightprotocol/stateless.js"; +import { createMint, mintTo, transfer, - compressToken, -} = require("@lightprotocol/compressed-token"); -const { Keypair } = require("@solana/web3.js"); -const { req } = require("pino-std-serializers"); +} from "@lightprotocol/compressed-token"; +import { Keypair } from "@solana/web3.js"; const payer = Keypair.generate(); const tokenRecipient = Keypair.generate(); const connection = createRpc(); -async function main() { +export async function main() { console.log("Payer: ", payer.publicKey.toBase58()); console.log("Token recipient: ", tokenRecipient.publicKey.toBase58()); await confirmTx( diff --git a/src/Token/zk-compression/connect-testnet.js b/src/Token/zk-compression/connect-testnet.ts similarity index 57% rename from src/Token/zk-compression/connect-testnet.js rename to src/Token/zk-compression/connect-testnet.ts index 510bc9b..8790c72 100644 --- a/src/Token/zk-compression/connect-testnet.js +++ b/src/Token/zk-compression/connect-testnet.ts @@ -1,5 +1,5 @@ -const stateless = require("@lightprotocol/stateless.js"); -const connection = stateless.createRpc( +import stateless from "@lightprotocol/stateless.js"; +const newConnection:any = stateless.createRpc( "https://zk-testnet.helius.dev:8899", // rpc "https://zk-testnet.helius.dev:8784", // zk compression rpc "https://zk-testnet.helius.dev:3001" // prover @@ -9,17 +9,17 @@ const connection = stateless.createRpc( * Main function that retrieves various information from the Solana network. * @returns {Promise} A promise that resolves when the function completes. */ -async function main() { - let slot = await connection.getSlot(); +export async function main() { + let slot = await newConnection.getSlot(); console.log("Slot: ", slot); - let health = await connection.getIndexerHealth(slot); + let health = await newConnection.getIndexerHealth(slot); console.log("health: ", health); - let leaderSchedule = await connection.getLeaderSchedule(); + let leaderSchedule = await newConnection.getLeaderSchedule(); console.log("Current leader schedule: ", leaderSchedule); - let latestNonVotingSig = await connection.getLatestNonVotingSignatures(); + let latestNonVotingSig = await newConnection.getLatestNonVotingSignatures(); console.log(latestNonVotingSig); } main(); From c29063f152d5417815d97415293f685890f89d12 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 23 Aug 2024 17:43:03 +0800 Subject: [PATCH 004/140] converted src/raydium/*.js to .ts --- .../dex/meteora/{buy.js => buy.ts} | 0 .../meteora/{constants.js => constants.ts} | 0 .../meteora/{fetch-pool.js => fetch-pool.ts} | 0 .../{fetch-price.js => fetch-price.ts} | 0 .../dex/meteora/{idl.js => idl.ts} | 0 .../dex/meteora/{index.js => index.ts} | 0 .../dex/meteora/{sell.js => sell.ts} | 0 .../dex/meteora/{swap.js => swap.ts} | 0 src/Trading_dev/dex/orca/{buy.js => buy.ts} | 0 .../dex/orca/{fetch-pool.js => fetch-pool.ts} | 0 .../dex/orca/{index.js => index.ts} | 0 src/Trading_dev/dex/orca/{sell.js => sell.ts} | 0 src/Trading_dev/dex/orca/{swap.js => swap.ts} | 0 .../copy_trading/{copy-buy.js => copy-buy.ts} | 0 .../{copy-sell.js => copy-sell.ts} | 0 .../{copy-trade.js => copy-trade.ts} | 0 .../{stop-loss.js => stop-loss.ts} | 0 .../{take-profit.js => take-profit.ts} | 0 src/Transactions/simple_tx_executor.ts | 13 +- src/raydium/Pool/{add_pool.js => add_pool.ts} | 59 ++- .../Pool/{create_pool.js => create_pool.ts} | 0 .../Pool/{fetch_pool.js => fetch_pool.ts} | 15 +- ...matAmmKeysById.js => formatAmmKeysById.ts} | 13 +- src/raydium/Pool/query_pool.js | 377 ------------------ .../Pool/{remove_pool.js => remove_pool.ts} | 73 ++-- src/raydium/Pool/{swap.js => swap.ts} | 93 +++-- src/raydium/{buy.js => buy.ts} | 19 +- src/raydium/{buy_helper.js => buy_helper.ts} | 18 +- src/raydium/constants.js | 5 - src/raydium/constants.ts | 3 + .../{fetch-price.js => fetch-price.ts} | 24 +- src/raydium/raydium_config.js | 33 -- src/raydium/raydium_config.ts | 25 ++ src/raydium/{sell.js => sell.ts} | 21 +- .../{sell_helper.js => sell_helper.ts} | 8 +- .../token-filters/{lp-burn.js => lp-burn.ts} | 24 +- .../{maker-count.js => maker-count.ts} | 0 .../{marketcap.js => marketcap.ts} | 25 +- .../{pool-sol.js => pool-sol.ts} | 15 +- .../{tx-count.js => tx-count.ts} | 0 .../token-filters/{volume.js => volume.ts} | 12 +- 41 files changed, 230 insertions(+), 645 deletions(-) rename src/Trading_dev/dex/meteora/{buy.js => buy.ts} (100%) rename src/Trading_dev/dex/meteora/{constants.js => constants.ts} (100%) rename src/Trading_dev/dex/meteora/{fetch-pool.js => fetch-pool.ts} (100%) rename src/Trading_dev/dex/meteora/{fetch-price.js => fetch-price.ts} (100%) rename src/Trading_dev/dex/meteora/{idl.js => idl.ts} (100%) rename src/Trading_dev/dex/meteora/{index.js => index.ts} (100%) rename src/Trading_dev/dex/meteora/{sell.js => sell.ts} (100%) rename src/Trading_dev/dex/meteora/{swap.js => swap.ts} (100%) rename src/Trading_dev/dex/orca/{buy.js => buy.ts} (100%) rename src/Trading_dev/dex/orca/{fetch-pool.js => fetch-pool.ts} (100%) rename src/Trading_dev/dex/orca/{index.js => index.ts} (100%) rename src/Trading_dev/dex/orca/{sell.js => sell.ts} (100%) rename src/Trading_dev/dex/orca/{swap.js => swap.ts} (100%) rename src/Trading_dev/memecoin_trading_strategies/copy_trading/{copy-buy.js => copy-buy.ts} (100%) rename src/Trading_dev/memecoin_trading_strategies/copy_trading/{copy-sell.js => copy-sell.ts} (100%) rename src/Trading_dev/memecoin_trading_strategies/copy_trading/{copy-trade.js => copy-trade.ts} (100%) rename src/Trading_dev/memecoin_trading_strategies/{stop-loss.js => stop-loss.ts} (100%) rename src/Trading_dev/memecoin_trading_strategies/{take-profit.js => take-profit.ts} (100%) rename src/raydium/Pool/{add_pool.js => add_pool.ts} (82%) rename src/raydium/Pool/{create_pool.js => create_pool.ts} (100%) rename src/raydium/Pool/{fetch_pool.js => fetch_pool.ts} (84%) rename src/raydium/Pool/{formatAmmKeysById.js => formatAmmKeysById.ts} (93%) delete mode 100644 src/raydium/Pool/query_pool.js rename src/raydium/Pool/{remove_pool.js => remove_pool.ts} (77%) rename src/raydium/Pool/{swap.js => swap.ts} (86%) rename src/raydium/{buy.js => buy.ts} (80%) rename src/raydium/{buy_helper.js => buy_helper.ts} (67%) delete mode 100644 src/raydium/constants.js create mode 100644 src/raydium/constants.ts rename src/raydium/{fetch-price.js => fetch-price.ts} (85%) delete mode 100644 src/raydium/raydium_config.js create mode 100644 src/raydium/raydium_config.ts rename src/raydium/{sell.js => sell.ts} (79%) rename src/raydium/{sell_helper.js => sell_helper.ts} (68%) rename src/raydium/token-filters/{lp-burn.js => lp-burn.ts} (53%) rename src/raydium/token-filters/{maker-count.js => maker-count.ts} (100%) rename src/raydium/token-filters/{marketcap.js => marketcap.ts} (78%) rename src/raydium/token-filters/{pool-sol.js => pool-sol.ts} (82%) rename src/raydium/token-filters/{tx-count.js => tx-count.ts} (100%) rename src/raydium/token-filters/{volume.js => volume.ts} (88%) diff --git a/src/Trading_dev/dex/meteora/buy.js b/src/Trading_dev/dex/meteora/buy.ts similarity index 100% rename from src/Trading_dev/dex/meteora/buy.js rename to src/Trading_dev/dex/meteora/buy.ts diff --git a/src/Trading_dev/dex/meteora/constants.js b/src/Trading_dev/dex/meteora/constants.ts similarity index 100% rename from src/Trading_dev/dex/meteora/constants.js rename to src/Trading_dev/dex/meteora/constants.ts diff --git a/src/Trading_dev/dex/meteora/fetch-pool.js b/src/Trading_dev/dex/meteora/fetch-pool.ts similarity index 100% rename from src/Trading_dev/dex/meteora/fetch-pool.js rename to src/Trading_dev/dex/meteora/fetch-pool.ts diff --git a/src/Trading_dev/dex/meteora/fetch-price.js b/src/Trading_dev/dex/meteora/fetch-price.ts similarity index 100% rename from src/Trading_dev/dex/meteora/fetch-price.js rename to src/Trading_dev/dex/meteora/fetch-price.ts diff --git a/src/Trading_dev/dex/meteora/idl.js b/src/Trading_dev/dex/meteora/idl.ts similarity index 100% rename from src/Trading_dev/dex/meteora/idl.js rename to src/Trading_dev/dex/meteora/idl.ts diff --git a/src/Trading_dev/dex/meteora/index.js b/src/Trading_dev/dex/meteora/index.ts similarity index 100% rename from src/Trading_dev/dex/meteora/index.js rename to src/Trading_dev/dex/meteora/index.ts diff --git a/src/Trading_dev/dex/meteora/sell.js b/src/Trading_dev/dex/meteora/sell.ts similarity index 100% rename from src/Trading_dev/dex/meteora/sell.js rename to src/Trading_dev/dex/meteora/sell.ts diff --git a/src/Trading_dev/dex/meteora/swap.js b/src/Trading_dev/dex/meteora/swap.ts similarity index 100% rename from src/Trading_dev/dex/meteora/swap.js rename to src/Trading_dev/dex/meteora/swap.ts diff --git a/src/Trading_dev/dex/orca/buy.js b/src/Trading_dev/dex/orca/buy.ts similarity index 100% rename from src/Trading_dev/dex/orca/buy.js rename to src/Trading_dev/dex/orca/buy.ts diff --git a/src/Trading_dev/dex/orca/fetch-pool.js b/src/Trading_dev/dex/orca/fetch-pool.ts similarity index 100% rename from src/Trading_dev/dex/orca/fetch-pool.js rename to src/Trading_dev/dex/orca/fetch-pool.ts diff --git a/src/Trading_dev/dex/orca/index.js b/src/Trading_dev/dex/orca/index.ts similarity index 100% rename from src/Trading_dev/dex/orca/index.js rename to src/Trading_dev/dex/orca/index.ts diff --git a/src/Trading_dev/dex/orca/sell.js b/src/Trading_dev/dex/orca/sell.ts similarity index 100% rename from src/Trading_dev/dex/orca/sell.js rename to src/Trading_dev/dex/orca/sell.ts diff --git a/src/Trading_dev/dex/orca/swap.js b/src/Trading_dev/dex/orca/swap.ts similarity index 100% rename from src/Trading_dev/dex/orca/swap.js rename to src/Trading_dev/dex/orca/swap.ts diff --git a/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-buy.js b/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-buy.ts similarity index 100% rename from src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-buy.js rename to src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-buy.ts diff --git a/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-sell.js b/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-sell.ts similarity index 100% rename from src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-sell.js rename to src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-sell.ts diff --git a/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-trade.js b/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-trade.ts similarity index 100% rename from src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-trade.js rename to src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-trade.ts diff --git a/src/Trading_dev/memecoin_trading_strategies/stop-loss.js b/src/Trading_dev/memecoin_trading_strategies/stop-loss.ts similarity index 100% rename from src/Trading_dev/memecoin_trading_strategies/stop-loss.js rename to src/Trading_dev/memecoin_trading_strategies/stop-loss.ts diff --git a/src/Trading_dev/memecoin_trading_strategies/take-profit.js b/src/Trading_dev/memecoin_trading_strategies/take-profit.ts similarity index 100% rename from src/Trading_dev/memecoin_trading_strategies/take-profit.js rename to src/Trading_dev/memecoin_trading_strategies/take-profit.ts diff --git a/src/Transactions/simple_tx_executor.ts b/src/Transactions/simple_tx_executor.ts index 5300f7c..7817336 100644 --- a/src/Transactions/simple_tx_executor.ts +++ b/src/Transactions/simple_tx_executor.ts @@ -1,11 +1,11 @@ -const { +import { BlockhashWithExpiryBlockHeight, Connection, Keypair, Transaction, VersionedTransaction, -} = require("@solana/web3.js"); -const { connection } = require("../helpers/config.js"); +} from "@solana/web3.js"; +import { connection } from "../helpers/config.js"; /** * Executes a transaction and confirms it on the Solana blockchain. @@ -14,21 +14,21 @@ const { connection } = require("../helpers/config.js"); * @param {string} lastestBlockhash - The latest blockhash of the Solana blockchain. * @returns {Promise} - A promise that resolves to true if the transaction is confirmed, false otherwise. */ -async function simple_executeAndConfirm(transaction, payer, lastestBlockhash) { +export async function simple_executeAndConfirm(transaction:any, payer:any, lastestBlockhash:any) { console.log("Executing transaction..."); const signature = await simple_execute(transaction); console.log("Transaction executed. Confirming transaction..."); return simple_confirm(signature, lastestBlockhash); } -async function simple_execute(transaction) { +async function simple_execute(transaction:any) { return connection.sendRawTransaction(transaction.serialize(), { skipPreflight: true, maxRetries: 0, }); } -async function simple_confirm(signature, latestBlockhash) { +async function simple_confirm(signature:any, latestBlockhash:any) { const confirmation = await connection.confirmTransaction( { signature, @@ -40,4 +40,3 @@ async function simple_confirm(signature, latestBlockhash) { return { confirmed: !confirmation.value.err, signature }; } -module.exports = { simple_executeAndConfirm }; diff --git a/src/raydium/Pool/add_pool.js b/src/raydium/Pool/add_pool.ts similarity index 82% rename from src/raydium/Pool/add_pool.js rename to src/raydium/Pool/add_pool.ts index 0074501..8807cad 100644 --- a/src/raydium/Pool/add_pool.js +++ b/src/raydium/Pool/add_pool.ts @@ -1,40 +1,40 @@ -const assert = require("assert"); -const { +import assert from "assert"; +import { jsonInfo2PoolKeys, Liquidity, Token, TOKEN_PROGRAM_ID, TokenAmount, Percent, -} = require("@raydium-io/raydium-sdk"); -const { PublicKey, Keypair } = require("@solana/web3.js"); -//const { getPoolId, getPoolIdByPair } = require("./query_pool.js"); -const {fetchAMMPoolId} = require("./fetch_pool.js") -const Decimal = require("decimal.js"); +} from "@raydium-io/raydium-sdk"; +import { PublicKey, Keypair } from "@solana/web3.js"; +//import { getPoolId, getPoolIdByPair } from("./query_pool.js"); +import {fetchAMMPoolId} from "./fetch_pool"; +import Decimal from "decimal.js"; -const { +import { connection, DEFAULT_TOKEN, makeTxVersion, dev_connection, wallet, -} = require("../helpers/config.js"); -const { formatAmmKeysById_pool } = require("./formatAmmKeysById.js"); -const { +} from "../../helpers/config"; +import { formatAmmKeysById_pool } from "./formatAmmKeysById"; +import { buildAndSendTx, getWalletTokenAccount, loadOrCreateKeypair_wallet, getDecimals, getTokenMetadata, checkTx, -} = require("../helpers/util.js"); +} from "../../helpers/util"; const BN = require("bn.js"); -const { program } = require("commander"); +import { program } from "commander"; -let payer_keypair = null, - token_address = null, - pool_id = null, - sol = null, +let payer_keypair:any = null, + token_address:any = null, + pool_id:any = null, + sol:any = null, cluster = null, priority_fee = null, connection_sol = connection; @@ -84,14 +84,14 @@ program.parse(); * @param {string} input.walletTokenAccounts - The token accounts of the wallet. * @returns {Object} - The transaction IDs and the amount of another currency. */ -async function ammAddLiquidity(input) { +export async function ammAddLiquidity(input:any) { try { const targetPoolInfo = await formatAmmKeysById_pool(input.targetPool); assert(targetPoolInfo, "cannot find the target pool"); // -------- step 1: compute another amount -------- - const poolKeys = jsonInfo2PoolKeys(targetPoolInfo); + const poolKeys:any = jsonInfo2PoolKeys(targetPoolInfo); const extraPoolInfo = await Liquidity.fetchInfo({ connection, poolKeys, @@ -113,7 +113,7 @@ async function ammAddLiquidity(input) { }); // -------- step 2: make instructions -------- - const addLiquidityInstructionResponse = + const addLiquidityInstructionResponse:any = await Liquidity.makeAddLiquidityInstructionSimple({ connection, poolKeys, @@ -134,18 +134,13 @@ async function ammAddLiquidity(input) { return { txids: await buildAndSendTx( - addLiquidityInstructionResponse.innerTransactions + addLiquidityInstructionResponse.innerTransactions, + null ), anotherAmount, }; } catch (e) { console.log(e); - return { - txids: await buildAndSendTx( - addLiquidityInstructionResponse.innerTransactions - ), - anotherAmount, - }; } } /** @@ -153,12 +148,12 @@ async function ammAddLiquidity(input) { * @param {Object} input - The input parameters for adding liquidity. * @returns {Promise} - A promise that resolves when the liquidity is added. */ -async function ammAddLiquidityHelper(input) { - const { txids, amount } = await ammAddLiquidity(input); - console.log("txids:", txids); - const response = await checkTx(txids[0]); +export async function ammAddLiquidityHelper(input:any) { + const res:any = await ammAddLiquidity(input); + console.log("txids:", res?.txids); + const response = await checkTx(res?.txids[0]); if (response) { - console.log(`https://explorer.solana.com/tx/${txids}?cluster=mainnet`); + console.log(`https://explorer.solana.com/tx/${res?.txids}?cluster=mainnet`); } else { console.log("Transaction failed"); console.log("trying to send the transaction again"); diff --git a/src/raydium/Pool/create_pool.js b/src/raydium/Pool/create_pool.ts similarity index 100% rename from src/raydium/Pool/create_pool.js rename to src/raydium/Pool/create_pool.ts diff --git a/src/raydium/Pool/fetch_pool.js b/src/raydium/Pool/fetch_pool.ts similarity index 84% rename from src/raydium/Pool/fetch_pool.js rename to src/raydium/Pool/fetch_pool.ts index 36018ad..4fbdba5 100644 --- a/src/raydium/Pool/fetch_pool.js +++ b/src/raydium/Pool/fetch_pool.ts @@ -1,8 +1,8 @@ -const { initSdk } = require("../raydium_config.js"); -const { wsol } = require("../constants.js"); +import { initSdk } from "../raydium_config"; +import { wsol } from "../constants"; let sdkCache = { sdk: null, expiry: 0 }; -async function fetchAMMPoolId(tokenAddress) { - let raydium = null; +export async function fetchAMMPoolId(tokenAddress:string) { + let raydium:any = null; if (sdkCache.sdk) { raydium = sdkCache.sdk; } else { @@ -25,8 +25,8 @@ async function fetchAMMPoolId(tokenAddress) { return ""; // return empty string if no AMM pool ID is found } -async function fetchAMMPoolIdByMintPair(mint1, mint2) { - let raydium = null; +export async function fetchAMMPoolIdByMintPair(mint1:string, mint2:string) { + let raydium:any = null; if (sdkCache.sdk) { raydium = sdkCache.sdk; } else { @@ -48,7 +48,7 @@ async function fetchAMMPoolIdByMintPair(mint1, mint2) { console.log("No AMM pool ID found for the given mint pair"); return ""; // return empty string if no AMM pool ID is found } -async function fetchLPToken(tokenAddress) { +export async function fetchLPToken(tokenAddress:string) { try { const poolId = await fetchAMMPoolId(tokenAddress); let response = await ( @@ -73,4 +73,3 @@ async function fetchLPToken(tokenAddress) { } //fetchLPToken("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP"); -module.exports = { fetchAMMPoolId, fetchAMMPoolIdByMintPair, fetchLPToken }; diff --git a/src/raydium/Pool/formatAmmKeysById.js b/src/raydium/Pool/formatAmmKeysById.ts similarity index 93% rename from src/raydium/Pool/formatAmmKeysById.js rename to src/raydium/Pool/formatAmmKeysById.ts index da16b12..1a2636f 100644 --- a/src/raydium/Pool/formatAmmKeysById.js +++ b/src/raydium/Pool/formatAmmKeysById.ts @@ -1,4 +1,4 @@ -const { +import { LIQUIDITY_STATE_LAYOUT_V4, MARKET_STATE_LAYOUT_V3, SPL_MINT_LAYOUT, @@ -8,14 +8,14 @@ const { LiquidityStateV4, publicKey, struct, -} = require("@raydium-io/raydium-sdk"); -const { PublicKey } = require("@solana/web3.js"); +} from "@raydium-io/raydium-sdk"; +import { PublicKey } from "@solana/web3.js"; const MINIMAL_MARKET_STATE_LAYOUT_V3 = struct([ publicKey("eventQueue"), publicKey("bids"), publicKey("asks"), ]); -const { connection } = require("../../helpers/config"); +import { connection } from "../../helpers/config"; // Promise /** @@ -24,7 +24,7 @@ const { connection } = require("../../helpers/config"); * @returns {Object} - The formatted AMM keys. * @throws {Error} - If there is an error retrieving the account information. */ -async function formatAmmKeysById_swap(id) { +export async function formatAmmKeysById_swap(id:PublicKey) { const account = await connection.getAccountInfo(id); if (account === null) throw Error(" get id info error "); const info = LIQUIDITY_STATE_LAYOUT_V4.decode(account.data); @@ -84,7 +84,7 @@ async function formatAmmKeysById_swap(id) { }; } -async function formatAmmKeysById_pool(id) { +export async function formatAmmKeysById_pool(id:PublicKey) { const account = await connection.getAccountInfo(id); if (account === null) throw Error(" get id info error "); const info = LIQUIDITY_STATE_LAYOUT_V4.decode(account.data); @@ -134,4 +134,3 @@ async function formatAmmKeysById_pool(id) { }; } -module.exports = { formatAmmKeysById_swap, formatAmmKeysById_pool }; diff --git a/src/raydium/Pool/query_pool.js b/src/raydium/Pool/query_pool.js deleted file mode 100644 index 281e64b..0000000 --- a/src/raydium/Pool/query_pool.js +++ /dev/null @@ -1,377 +0,0 @@ -const { Connection, PublicKey } = require("@solana/web3.js"); -const { OpenOrders } = require("@project-serum/serum"); -const { gql, GraphQLClient } = require("graphql-request"); -const { shyft_api_key } = require("../../helpers/config"); -const {Liquidity} = require("@raydium-io/raydium-sdk"); -const { token } = require("@metaplex-foundation/js"); -const {getDecimals} = require( - "../../helpers/util" -) -const graphQLEndpoint = `https://programs.shyft.to/v0/graphql/?api_key=${shyft_api_key}`; -const rpcEndpoint = `https://rpc.shyft.to/?api_key=${shyft_api_key}`; - - - -async function generateV4PoolInfo(tokenAddress) { - // RAY-USDC - const poolInfo = Liquidity.getAssociatedPoolKeys({ - version: 4, - marketVersion: 3, - baseMint: new PublicKey('So11111111111111111111111111111111111111112'), - quoteMint: new PublicKey(tokenAddress), - baseDecimals: await getDecimals(new PublicKey(tokenAddress)), - quoteDecimals: 9, - programId: new PublicKey('675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8'), - - marketId: new PublicKey('DZjbn4XC8qoHKikZqzmhemykVzmossoayV9ffbsUqxVj'), - marketProgramId: new PublicKey('srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX'), - }) - console.log(poolInfo) - return { poolInfo } -} - -async function howToUse() { - generateV4PoolInfo().then(({ poolInfo }) => { - console.log('poolInfo: ', poolInfo) - }) -} -const graphQLClient = new GraphQLClient(graphQLEndpoint, { - method: `POST`, - jsonSerializer: { - parse: JSON.parse, - stringify: JSON.stringify, - }, -}); -// Get Pools By Token Address -/** - * Queries the liquidity pool by token. - * @param {string} token - The token to query the liquidity pool for. - * @returns {Promise} - The response object containing the liquidity pool information. - */ -async function queryLpByToken(token) { - // Get all proposalsV2 accounts - const query = gql` - query MyQuery( - $where: Raydium_LiquidityPoolv4_bool_exp - $order_by: [Raydium_LiquidityPoolv4_order_by!] - ) { - Raydium_LiquidityPoolv4(where: $where, order_by: $order_by) { - _updatedAt - amountWaveRatio - baseDecimal - baseLotSize - baseMint - baseNeedTakePnl - baseTotalPnl - baseVault - depth - lpMint - lpReserve - lpVault - marketId - marketProgramId - maxOrder - maxPriceMultiplier - minPriceMultiplier - minSeparateDenominator - minSeparateNumerator - minSize - nonce - openOrders - orderbookToInitTime - owner - pnlDenominator - pnlNumerator - poolOpenTime - punishCoinAmount - punishPcAmount - quoteDecimal - quoteLotSize - quoteMint - quoteNeedTakePnl - quoteTotalPnl - quoteVault - resetFlag - state - status - swapBase2QuoteFee - swapBaseInAmount - swapBaseOutAmount - swapFeeDenominator - swapFeeNumerator - swapQuote2BaseFee - swapQuoteInAmount - swapQuoteOutAmount - systemDecimalValue - targetOrders - tradeFeeDenominator - tradeFeeNumerator - volMaxCutRatio - withdrawQueue - pubkey - } - } - `; - - const variables = { - where: { - baseMint: { - _eq: token, - }, - }, - order_by: [ - { - lpReserve: "desc", - }, - ], - }; - - const response = await graphQLClient.request(query, variables); - return response; -} -// Get Token Supply Percentage In Pool -/** - * Queries a liquidity pool by address. - * @param {string} address - The address of the liquidity pool. - * @returns {Promise} - The result of the GraphQL query. - */ -async function queryLpByAddress(address) { - // We only fetch fields necessary for us - const query = gql` - query MyQuery($where: Raydium_LiquidityPoolv4_bool_exp) { - Raydium_LiquidityPoolv4( - where: {pubkey: {_eq: ${JSON.stringify(address)}}} - ) { - baseDecimal - baseMint - baseNeedTakePnl - baseVault - marketId - marketProgramId - openOrders - quoteDecimal - quoteMint - quoteNeedTakePnl - quoteVault - } -}`; - - return await graphQLClient.request(query); -} - -//We have to check how much tokens are present in openbook market as well -/** - * Parses the pool information and calculates various metrics related to the pool. - * @param {Object} poolInfo - The pool information object. - * @returns {Promise} - A promise that resolves once the pool information is parsed. - */ -async function parsePoolInfo(poolInfo) { - const OPENBOOK_PROGRAM_ID = new PublicKey( - "srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX" - ); - - //to load openOorders from openbook - const connection = new Connection(rpcEndpoint, "confirmed"); - - const openOrders = await OpenOrders.load( - connection, - new PublicKey(poolInfo.openOrders), - OPENBOOK_PROGRAM_ID - ); - - const baseDecimal = 10 ** poolInfo.baseDecimal; // e.g. 10 ^ 6 - const quoteDecimal = 10 ** poolInfo.quoteDecimal; - console.log("baseToken: ", poolInfo.baseMint); - console.log("quoteToken: ", poolInfo.quoteMint); - - const baseTokenAmount = await connection.getTokenAccountBalance( - new PublicKey(poolInfo.baseVault) - ); - const quoteTokenAmount = await connection.getTokenAccountBalance( - new PublicKey(poolInfo.quoteVault) - ); - - const basePnl = poolInfo.baseNeedTakePnl / baseDecimal; - const quotePnl = poolInfo.quoteNeedTakePnl / quoteDecimal; - - const openOrdersBaseTokenTotal = openOrders.baseTokenTotal / baseDecimal; - const openOrdersQuoteTokenTotal = openOrders.quoteTokenTotal / quoteDecimal; - - const base = - (baseTokenAmount.value?.uiAmount || 0) + openOrdersBaseTokenTotal - basePnl; - //You can do the same for quote tokens also. This doesnt work for SOL. - const quote = - (quoteTokenAmount.value?.uiAmount || 0) + - openOrdersQuoteTokenTotal - - quotePnl; - - //We get the current token supply through RPC and find the percentage - const baseSupply = await connection.getTokenSupply( - new PublicKey(poolInfo.baseMint) - ); - console.log(`Total Base tokens: ${baseSupply.value.uiAmount}`); - console.log(`Base tokens in Pool: ${base}`); - console.log( - `Pecentage of total base tokens in Pool: ${ - (base / baseSupply?.value?.uiAmount) * 100 - } %` - ); -} - -// Sort Liquidity Pools -/** - * Queries the liquidity pool for a given pair of tokens. - * @param {string} tokenOne - The first token of the pair. - * @param {string} tokenTwo - The second token of the pair. - * @returns {Promise} - The response object containing the liquidity pool data. - */ -async function queryLpPair(tokenOne, tokenTwo) { - const query = gql` - query MyQuery( - $where: Raydium_LiquidityPoolv4_bool_exp - $order_by: [Raydium_LiquidityPoolv4_order_by!] - ) { - Raydium_LiquidityPoolv4(where: $where, order_by: $order_by) { - amountWaveRatio - baseDecimal - baseLotSize - baseMint - baseNeedTakePnl - baseTotalPnl - baseVault - depth - lpMint - lpReserve - lpVault - marketId - marketProgramId - maxOrder - maxPriceMultiplier - minPriceMultiplier - minSeparateDenominator - minSeparateNumerator - minSize - nonce - openOrders - orderbookToInitTime - owner - pnlDenominator - pnlNumerator - poolOpenTime - punishCoinAmount - punishPcAmount - quoteDecimal - quoteLotSize - quoteMint - quoteNeedTakePnl - quoteTotalPnl - quoteVault - resetFlag - state - status - swapBase2QuoteFee - swapBaseInAmount - swapBaseOutAmount - swapFeeDenominator - swapFeeNumerator - swapQuote2BaseFee - swapQuoteInAmount - swapQuoteOutAmount - systemDecimalValue - targetOrders - tradeFeeDenominator - tradeFeeNumerator - volMaxCutRatio - withdrawQueue - pubkey - } - } - `; - - const variables = { - where: { - baseMint: { - _eq: tokenOne, - }, - quoteMint: { - _eq: tokenTwo, - }, - }, - order_by: [ - { - lpReserve: "desc", - }, - ], - }; - - const response = await graphQLClient.request(query, variables); - return response; -} -/** - * Retrieves the pool ID associated with the given token. - * @param {string} token - The token to query the pool ID for. - * @returns {Promise} The pool ID if found, or null if no pool is found. - */ -async function getPoolId(token) { - const poolId = await queryLpByToken(token); - if (poolId.Raydium_LiquidityPoolv4.length === 0) { - console.log(`Cannot find any liquidity pool related to ${token}`); - return null; - } - - return poolId.Raydium_LiquidityPoolv4[0].pubkey; -} - -/** - * Retrieves the pool ID for a given base token. - * @param {string} baseToken - The base token. - * @returns {string|null} - The pool ID if found, otherwise null. - */ -async function getPoolIdByPair(baseToken) { - // token/SOL pair - const quoteToken = "So11111111111111111111111111111111111111112"; - const poolId = await queryLpPair(baseToken, quoteToken); - if (poolId.Raydium_LiquidityPoolv4.length === 0) { - console.log( - `Cannot find any liquidity pool related to ${baseToken}/${quoteToken}` - ); - console.log(`It may be a token launched on pump.fun, we try to find ${quoteToken}/${baseToken}`) - const poolIdByPair = await queryLpPair(quoteToken, baseToken); - if (poolIdByPair.Raydium_LiquidityPoolv4.length === 0) { - console.log( - `Cannot find any liquidity pool related to ${quoteToken}/${baseToken}` - ); - throw new Error(`Cannot find any liquidity pool related to ${quoteToken}`); - return null; - }else{ - return poolIdByPair.Raydium_LiquidityPoolv4[0].pubkey; - } - return null; - } - return poolId.Raydium_LiquidityPoolv4[0].pubkey; -} -async function main() { - // getting the pool address for npch - //const poolId = await getPoolIdByPair("token_address") - //console.log(poolId) - // get token supply by token address - // const poolInfo: any = await queryLpByAddress('TOKEN_ADDRESS'); - // await parsePoolInfo(poolInfo.Raydium_LiquidityPoolv4[0]); - // get the pair of liquidity pool of two tokens - // like sol/slerf - // const poolIdByPair = await getPoolIdByPair( - // 'TOKEN_ADDRESS', - // 'So11111111111111111111111111111111111111112', - // ); - // console.log(poolIdByPair); - -} -//main().catch(console.error); -module.exports = { - getPoolIdByPair, - queryLpByToken, - queryLpByAddress, - parsePoolInfo, - queryLpPair, - getPoolId, -}; diff --git a/src/raydium/Pool/remove_pool.js b/src/raydium/Pool/remove_pool.ts similarity index 77% rename from src/raydium/Pool/remove_pool.js rename to src/raydium/Pool/remove_pool.ts index 11077e2..10285e5 100644 --- a/src/raydium/Pool/remove_pool.js +++ b/src/raydium/Pool/remove_pool.ts @@ -1,49 +1,49 @@ -const assert = require("assert"); +import assert from "assert"; -const { +import { jsonInfo2PoolKeys, Liquidity, LiquidityPoolKeys, TokenAmount, Token, TOKEN_PROGRAM_ID, -} = require("@raydium-io/raydium-sdk"); +} from "@raydium-io/raydium-sdk"; -const { Keypair, PublicKey } = require("@solana/web3.js"); -const { Decimal } = require("decimal.js"); -const { +import { Keypair, PublicKey } from "@solana/web3.js"; +import { Decimal } from "decimal.js"; +import { connection, DEFAULT_TOKEN, makeTxVersion, wallet, dev_connection, -} = require("../../helpers/config.js"); -const { +} from "../../helpers/config"; +import { formatAmmKeysById_pool, formatAmmKeysById_swap, -} = require("./formatAmmKeysById.js"); -const { +} from "./formatAmmKeysById"; +import { buildAndSendTx, getWalletTokenAccount, loadOrCreateKeypair_wallet, checkTx, -} = require("../../helpers/util.js"); -// const { +} from "../../helpers/util"; +// import { // getPoolId, // getPoolIdByPair, // queryLpByToken, // queryLpPair, -// } = require("./query_pool.js"); -const { fetchAMMPoolId, fetchLPToken} = require("./fetch_pool.js") -const { getSPLTokenBalance } = require("../helpers/check_balance.js"); -const { getDecimals, getTokenMetadata } = require("../helpers/util.js"); -const { BN } = require("@project-serum/anchor"); -const { program } = require("commander"); +// } from("./query_pool.js"); +import { fetchAMMPoolId, fetchLPToken} from "./fetch_pool"; +import { getSPLTokenBalance } from "../../helpers/check_balance"; +import { getDecimals, getTokenMetadata } from "../../helpers/util"; +import { BN } from "@project-serum/anchor"; +import { program } from "commander"; -let payer_keypair = null, - tokenAddress = null, - percentage = null, - cluster = null; +let payer_keypair:any = null, + tokenAddress:any = null, + percentage:any = null, + cluster:any = null; program .option("--payer ", "Specify the path to the secret key") .option("--token_address ", "Specify the token address") @@ -83,14 +83,14 @@ program.parse(); * @param {number} makeTxVersion - The transaction version. * @returns {Object} - The transaction IDs. */ -async function ammRemoveLiquidity(input) { +export async function ammRemoveLiquidity(input:any) { try { // -------- pre-action: fetch basic info -------- const targetPoolInfo = await formatAmmKeysById_pool(input.targetPool); assert(targetPoolInfo, "cannot find the target pool"); // -------- step 1: make instructions -------- - const poolKeys = jsonInfo2PoolKeys(targetPoolInfo); + const poolKeys:any = jsonInfo2PoolKeys(targetPoolInfo); const removeLiquidityInstructionResponse = await Liquidity.makeRemoveLiquidityInstructionSimple({ connection, @@ -114,14 +114,6 @@ async function ammRemoveLiquidity(input) { }; } catch (err) { console.log(err); - return { - txids: await buildAndSendTx( - removeLiquidityInstructionResponse.innerTransactions, - { - preflightCommitment: "confirmed", - } - ), - }; } } @@ -130,11 +122,10 @@ async function ammRemoveLiquidity(input) { * @param {string} tokenAddress - The token address. * @returns {string} - The LP token address. */ -async function findLPTokenAddress(tokenAddress) { - const response = await fetchLPToken(tokenAddress); +export async function findLPTokenAddress(tokenAddress:string) { + const response:any = await fetchLPToken(tokenAddress); console.log(response); - console.log(response.Raydium_LiquidityPoolv4[0].lpMint); - return response.Raydium_LiquidityPoolv4[0].lpMint; + return response; } /** @@ -142,12 +133,12 @@ async function findLPTokenAddress(tokenAddress) { * @param {Object} input - The input parameters for removing liquidity. * @returns {Promise} - A promise that resolves when the liquidity is removed. */ -async function ammRemoveLiquidityHelper(input) { - const { txids } = await ammRemoveLiquidity(input); - console.log("txids:", txids); - const response = await checkTx(txids[0]); +export async function ammRemoveLiquidityHelper(input:any) { + const res:any = await ammRemoveLiquidity(input); + console.log("txids:", res?.txids); + const response = await checkTx(res?.txids[0]); if (response) { - console.log(`https://explorer.solana.com/tx/${txids}?cluster=mainnet`); + console.log(`https://explorer.solana.com/tx/${res.txids}?cluster=mainnet`); } else { console.log("Transaction failed"); console.log("trying to send the transaction again"); diff --git a/src/raydium/Pool/swap.js b/src/raydium/Pool/swap.ts similarity index 86% rename from src/raydium/Pool/swap.js rename to src/raydium/Pool/swap.ts index 8d91e75..ee07dbd 100644 --- a/src/raydium/Pool/swap.js +++ b/src/raydium/Pool/swap.ts @@ -1,24 +1,24 @@ -const assert = require("assert"); +import assert from "assert"; -const { +import { Liquidity, Percent, Token, TOKEN_PROGRAM_ID, TokenAmount, -} = require("@raydium-io/raydium-sdk"); -const { +} from "@raydium-io/raydium-sdk"; +import { PublicKey, TransactionMessage, ComputeBudgetProgram, VersionedTransaction, LAMPORTS_PER_SOL, Transaction, -} = require("@solana/web3.js"); -const { Decimal } = require("decimal.js"); -const { BN } = require("@project-serum/anchor"); -const { getSPLTokenBalance } = require("../../helpers/check_balance.js"); -const { +} from "@solana/web3.js"; +import { Decimal } from "decimal.js"; +import { BN } from "@project-serum/anchor"; +import { getSPLTokenBalance } from "../../helpers/check_balance"; +import { connection, DEFAULT_TOKEN, makeTxVersion, @@ -26,30 +26,29 @@ const { _ENDPOINT, wallet, jito_fee, -} = require("../../helpers/config.js"); -const { +} from "../../helpers/config"; +import { getDecimals, getTokenMetadata, checkTx, -} = require("../../helpers/util.js"); -//const { getPoolId, getPoolIdByPair } = require("./query_pool.js"); -const { fetchAMMPoolId } = require("./fetch_pool.js"); -const { +} from "../../helpers/util"; +import { fetchAMMPoolId } from "./fetch_pool"; +import { getAssociatedTokenAddress, getAssociatedTokenAddressSync, createAssociatedTokenAccountIdempotentInstruction, createCloseAccountInstruction, -} = require("@solana/spl-token"); -const { mint } = require("@metaplex-foundation/mpl-candy-machine"); -const { formatAmmKeysById_swap } = require("./formatAmmKeysById.js"); -const { +} from "@solana/spl-token"; +import { formatAmmKeysById_swap } from "./formatAmmKeysById"; +import { simple_executeAndConfirm, -} = require("../../Transactions/simple_tx_executor.js"); -const { +} from "../../Transactions/simple_tx_executor"; +import { jito_executeAndConfirm, -} = require("../../Transactions/jito_tips_tx_executor.js"); -const {bloXroute_executeAndConfirm} = require("../../Transactions/bloXroute_tips_tx_executor.js") -let tokenToPoolIdMap = {}; +} from "../../Transactions/jito_tips_tx_executor"; +import {bloXroute_executeAndConfirm} from "../../Transactions/bloXroute_tips_tx_executor"; +import { Keypair } from "@solana/web3.js"; +let tokenToPoolIdMap:any = {}; /** * Performs a swap transaction using an Automated Market Maker (AMM) pool. @@ -64,10 +63,10 @@ let tokenToPoolIdMap = {}; * @param {string} input.side - The side of the swap transaction (e.g., "buy"). * @returns {Object} - The transaction ID if successful, otherwise null. */ -async function swapOnlyAmm(input) { +async function swapOnlyAmm(input:any) { // -------- pre-action: get pool info --------\ - const poolKeys = await formatAmmKeysById_swap( + const poolKeys:any = await formatAmmKeysById_swap( new PublicKey(input.targetPool) ); assert(poolKeys, "cannot find the target pool"); @@ -148,7 +147,7 @@ async function swapOnlyAmm(input) { console.log("jito fee transaction failed"); console.log(`Retry attempt ${attempts}`); } - } catch (e) { + } catch (e:any) { console.log(e); if (e.signature) { return { txid: e.signature }; @@ -160,8 +159,8 @@ async function swapOnlyAmm(input) { console.log("Transaction failed after maximum retry attempts"); return { txid: null }; } -async function swapOnlyAmmUsingBloXRoute(input) { - const poolKeys = await formatAmmKeysById_swap( +async function swapOnlyAmmUsingBloXRoute(input:any) { + const poolKeys:any = await formatAmmKeysById_swap( new PublicKey(input.targetPool) ); assert(poolKeys, "cannot find the target pool"); @@ -221,8 +220,8 @@ async function swapOnlyAmmUsingBloXRoute(input) { * @param {number} sol_per_order - The price of SOL per order. * @returns {Promise<{ confirmed: boolean, txid: string }>} The confirmation status and transaction ID. */ -async function swapForVolume(tokenAddr, sol_per_order) { - const buy_instruction = await swap( +export async function swapForVolume(tokenAddr:string, sol_per_order:number) { + const buy_instruction:any = await swap( "buy", tokenAddr, sol_per_order, @@ -230,7 +229,7 @@ async function swapForVolume(tokenAddr, sol_per_order) { wallet, "volume" ); - const sell_instruction = await swap( + const sell_instruction:any = await swap( "sell", tokenAddr, -1, @@ -265,10 +264,10 @@ async function swapForVolume(tokenAddr, sol_per_order) { let signature = null, confirmed = null; try { - const res = simple_executeAndConfirm(transaction, wallet, latestBlockhash); + const res:any = simple_executeAndConfirm(transaction, wallet, latestBlockhash); signature = res.signature; confirmed = res.confirmed; - } catch (e) { + } catch (e:any) { console.log(e); return { confirmed: confirmed, txid: e.signature }; } @@ -280,10 +279,10 @@ async function swapForVolume(tokenAddr, sol_per_order) { * @param {Object} input - The input object containing the necessary parameters for the swap. * @returns {Promise} - A promise that resolves when the swap is completed. */ -async function swapOnlyAmmHelper(input) { - const { txid } = await swapOnlyAmm(input); - console.log("txids:", txid); - const response = await checkTx(txid); +async function swapOnlyAmmHelper(input:any) { + const res:any = await swapOnlyAmm(input); + console.log("txids:", res.txid); + const response = await checkTx(res.txid); if (response) { if (input.side === "buy") { console.log( @@ -294,7 +293,7 @@ async function swapOnlyAmmHelper(input) { `https://dexscreener.com/solana/${input.targetPool}?maker=${wallet.publicKey}` ); } - console.log(`https://solscan.io/tx/${txid}?cluster=mainnet`); + console.log(`https://solscan.io/tx/${res.txid}?cluster=mainnet`); } else { console.log("Transaction failed"); } @@ -309,13 +308,13 @@ async function swapOnlyAmmHelper(input) { * @param {object} payer_wallet - The payer's wallet object. * @returns {Promise} - A promise that resolves when the swap operation is completed. */ -async function swap( - side, - tokenAddr, - buy_AmountOfSol, - sell_PercentageOfToken, - payer_wallet, - usage +export async function swap( + side:string, + tokenAddr:string, + buy_AmountOfSol:number, + sell_PercentageOfToken:number, + payer_wallet:Keypair, + usage:string ) { const tokenAddress = tokenAddr; const tokenAccount = new PublicKey(tokenAddress); @@ -426,5 +425,3 @@ async function swap( //swapOnlyAmmUsingBloXRoute(input); // using bloXroute } } - -module.exports = { swap, swapForVolume }; diff --git a/src/raydium/buy.js b/src/raydium/buy.ts similarity index 80% rename from src/raydium/buy.js rename to src/raydium/buy.ts index a9811a2..fafbb02 100644 --- a/src/raydium/buy.js +++ b/src/raydium/buy.ts @@ -1,12 +1,13 @@ -const { swap } = require("./Pool/swap.js"); -const { program } = require("commander"); -const { loadOrCreateKeypair_wallet } = require("../helpers/util.js"); -const { wallet } = require("../helpers/config.js"); +import { swap } from "./Pool/swap"; +import { program } from "commander"; +import { loadOrCreateKeypair_wallet } from "../helpers/util"; +import { wallet } from "../helpers/config"; +import { Keypair } from "@solana/web3.js"; -let payer_keypair = null, - token_address = null, - sol = null, - cluster = null; +let payer_keypair:any = null, + token_address:any = null, + sol:any = null, + cluster:any = null; program .option("--payer ", "Specify the path to the secret key") .option("--token_address ", "Specify the token address") @@ -42,7 +43,7 @@ program.parse(); * @param {string} payer - The payer's keypair for the transaction. * @returns {Promise} - A promise that resolves when the swap is completed. */ -async function buy(side, address, no_of_sol, payer) { +async function buy(side:string, address:string, no_of_sol:number, payer:Keypair) { let payer_wallet = null; if (payer_keypair !== null) { payer_wallet = await loadOrCreateKeypair_wallet(payer_keypair); diff --git a/src/raydium/buy_helper.js b/src/raydium/buy_helper.ts similarity index 67% rename from src/raydium/buy_helper.js rename to src/raydium/buy_helper.ts index 82c5f2f..854ba9a 100644 --- a/src/raydium/buy_helper.js +++ b/src/raydium/buy_helper.ts @@ -1,5 +1,5 @@ -const { Keypair } = require("@solana/web3.js"); -const { swap } = require("./Pool/swap"); +import { Keypair } from "@solana/web3.js"; +import { swap } from "./Pool/swap"; /** * Buys a specified amount of a token using a amount of sol. * @@ -9,15 +9,15 @@ const { swap } = require("./Pool/swap"); * @param {Keypair} payer - The payer of the transaction. * @returns {Promise} - A promise that resolves when the trade is completed. */ -async function buy(side, address, no_of_sol, payer) { +export async function buy(side:string, address:string, no_of_sol:number, payer:Keypair) { await swap(side, address, no_of_sol, -1, payer, "trade"); } -async function get_buy_transaction( - side, - tokenAddr, - buy_AmountOfSol, - payer_wallet +export async function get_buy_transaction( + side:string, + tokenAddr:string, + buy_AmountOfSol:number, + payer_wallet:Keypair ) { const innerTransaction = await swap( side, @@ -29,5 +29,3 @@ async function get_buy_transaction( ); return innerTransaction; } - -module.exports = { buy, get_buy_transaction }; diff --git a/src/raydium/constants.js b/src/raydium/constants.js deleted file mode 100644 index 9ace8e5..0000000 --- a/src/raydium/constants.js +++ /dev/null @@ -1,5 +0,0 @@ -const wsol = "So11111111111111111111111111111111111111112"; -const usdc = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; -const usdt = "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"; // USDT - -module.exports = {wsol, usdc, usdt} \ No newline at end of file diff --git a/src/raydium/constants.ts b/src/raydium/constants.ts new file mode 100644 index 0000000..bbd67fc --- /dev/null +++ b/src/raydium/constants.ts @@ -0,0 +1,3 @@ +export const wsol = "So11111111111111111111111111111111111111112"; +export const usdc = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; +export const usdt = "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"; // USDT diff --git a/src/raydium/fetch-price.js b/src/raydium/fetch-price.ts similarity index 85% rename from src/raydium/fetch-price.js rename to src/raydium/fetch-price.ts index fdfe368..0427efd 100644 --- a/src/raydium/fetch-price.js +++ b/src/raydium/fetch-price.ts @@ -1,14 +1,14 @@ -const { initSdk } = require("./raydium_config"); -const {fetchAMMPoolId} = require("./Pool/fetch_pool"); -const Decimal = require("decimal.js"); -const {wsol} = require("./constants"); +import { initSdk } from "./raydium_config"; +import {fetchAMMPoolId} from "./Pool/fetch_pool"; +import Decimal from "decimal.js"; +import {wsol} from "./constants"; let sdkCache = { sdk: null, expiry: 0 }; -async function getCurrentPriceInSOL( - tokenAddress +export async function getCurrentPriceInSOL( + tokenAddress:string ) { try { // Check if poolId is already set - let raydium = null; + let raydium:any = null; if (sdkCache.sdk) { raydium = sdkCache.sdk; } else { @@ -56,9 +56,9 @@ async function getCurrentPriceInSOL( console.log(`Error when getting current price of ${tokenAddress} `, e); } } -async function getCurrentSolPrice(){ +export async function getCurrentSolPrice(){ try{ - let raydium = null + let raydium:any = null if(sdkCache.sdk){ raydium = sdkCache.sdk; } @@ -80,7 +80,7 @@ async function getCurrentSolPrice(){ } -async function getCurrentPriceInUSD(tokenAddress){ +export async function getCurrentPriceInUSD(tokenAddress:string){ const priceInSOL = await getCurrentPriceInSOL(tokenAddress); const solPrice = await getCurrentSolPrice(); return priceInSOL * solPrice; @@ -92,6 +92,4 @@ async function main(){ // console.log(await getCurrentSolPrice()); console.log(await getCurrentPriceInUSD("4MBEqrtgabZ9G5EmKm7XTrcknZ1nWg3TrvFHZMrENgrd")); } -main(); - -module.exports = {getCurrentPriceInSOL, getCurrentSolPrice, getCurrentPriceInUSD}; \ No newline at end of file +//main(); diff --git a/src/raydium/raydium_config.js b/src/raydium/raydium_config.js deleted file mode 100644 index 13e0e55..0000000 --- a/src/raydium/raydium_config.js +++ /dev/null @@ -1,33 +0,0 @@ -const { - Raydium, - TxVersion, - parseTokenAccountResp, -} = require("@raydium-io/raydium-sdk-v2"); -const { TOKEN_PROGRAM_ID } = require("@solana/spl-token"); -const { - wallet, - connection, - second_connection, - third_connection, -} = require("../helpers/config"); - -const txVersion = TxVersion.V0; -const cluster = "mainnet"; -let raydium = Raydium | null; - -const initSdk = async (params) => { - if (raydium) return raydium; - - raydium = await Raydium.load({ - wallet, - connection, - cluster, - disableFeatureCheck: true, - disableLoadToken: !params?.loadToken, - blockhashCommitment: "finalized", - }); - - return raydium; -}; - -module.exports = { initSdk }; diff --git a/src/raydium/raydium_config.ts b/src/raydium/raydium_config.ts new file mode 100644 index 0000000..7dce53d --- /dev/null +++ b/src/raydium/raydium_config.ts @@ -0,0 +1,25 @@ +import { + Raydium, + TxVersion, + parseTokenAccountResp, +} from "@raydium-io/raydium-sdk-v2"; +import { TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import { + wallet, + connection, +} from "../helpers/config"; + +const txVersion = TxVersion.V0; +const cluster = "mainnet"; +export const initSdk = async () => { + const raydium = await Raydium.load({ + owner: wallet, + connection: connection, + cluster: cluster, + disableFeatureCheck: true, + disableLoadToken: false, + blockhashCommitment: "confirmed", + }); + return raydium; +}; + diff --git a/src/raydium/sell.js b/src/raydium/sell.ts similarity index 79% rename from src/raydium/sell.js rename to src/raydium/sell.ts index 30b5c9e..eb59dae 100644 --- a/src/raydium/sell.js +++ b/src/raydium/sell.ts @@ -1,11 +1,12 @@ -const { swap } = require("./Pool/swap.js"); -const { program } = require("commander"); -const { loadOrCreateKeypair_wallet } = require("../helpers/util.js"); -const { wallet } = require("../helpers/config.js"); +import { swap } from "./Pool/swap"; +import { program } from "commander"; +import { loadOrCreateKeypair_wallet } from "../helpers/util"; +import { wallet } from "../helpers/config"; +import { Keypair } from "@solana/web3.js"; -let payer_keypair = null, - token_address = null, - percentage = null, +let payer_keypair:any = null, + token_address:any = null, + percentage:any = null, cluster = null; program .option("--payer ", "Specify the path to the secret key") @@ -13,7 +14,7 @@ program .option("--percentage ", "Specify the percentage") .option("--cluster ", "Specify the cluster") .option("-h, --help", "display help for command") - .action((options) => { + .action((options:any) => { if (options.help) { console.log( "node sell --payer --token_address --percentage --cluster " @@ -42,10 +43,10 @@ program.parse(); * @param {string} payer - The payer address for the transaction. * @returns {Promise} - A promise that resolves when the swap transaction is completed. */ -async function sell(side, address, sell_percentage, payer) { +export async function sell(side:string, address:string, sell_percentage:number, payer:Keypair) { await swap(side, address, -1, sell_percentage, payer, "trade"); } -async function main() { +export async function main() { let payer_wallet = null; if (payer_keypair !== null) { payer_wallet = await loadOrCreateKeypair_wallet(payer_keypair); // specified wallet by user in command diff --git a/src/raydium/sell_helper.js b/src/raydium/sell_helper.ts similarity index 68% rename from src/raydium/sell_helper.js rename to src/raydium/sell_helper.ts index 4d54967..59b8306 100644 --- a/src/raydium/sell_helper.js +++ b/src/raydium/sell_helper.ts @@ -1,4 +1,5 @@ -const { swap } = require("./Pool/swap"); +import { Keypair } from "@solana/web3.js"; +import { swap } from "./Pool/swap"; /** * Sells a specified percentage of a token. @@ -8,10 +9,10 @@ const { swap } = require("./Pool/swap"); * @param {string} payer - The payer of the transaction. * @returns {Promise} - A promise that resolves when the sell operation is complete. */ -async function sell(side, address, sell_percentage, payer) { +export async function sell(side:string, address:string, sell_percentage:number, payer:Keypair) { await swap(side, address, -1, sell_percentage, payer, "trade"); } -async function get_sell_transaction(side, tokenAddr, payer_wallet) { +export async function get_sell_transaction(side:string, tokenAddr:string, payer_wallet:Keypair) { const innerTransaction = await swap( side, tokenAddr, @@ -22,4 +23,3 @@ async function get_sell_transaction(side, tokenAddr, payer_wallet) { ); return innerTransaction; } -module.exports = { sell, get_sell_transaction }; diff --git a/src/raydium/token-filters/lp-burn.js b/src/raydium/token-filters/lp-burn.ts similarity index 53% rename from src/raydium/token-filters/lp-burn.js rename to src/raydium/token-filters/lp-burn.ts index 5e91971..dd51b92 100644 --- a/src/raydium/token-filters/lp-burn.js +++ b/src/raydium/token-filters/lp-burn.ts @@ -1,14 +1,13 @@ -const { initSdk } = require("../raydium_config"); -const Decimal = require("decimal.js"); -const { wsol } = require("../constants"); -const { connection } = require("../../helpers/config"); -const { PublicKey } = require("@solana/web3.js"); -const { fetchAMMPoolId } = require("../Pool/fetch_pool"); -const { getDecimals } = require("../../helpers/util"); +import { initSdk } from "../raydium_config"; +import Decimal from "decimal.js"; +import { connection } from "../../helpers/config"; +import { PublicKey } from "@solana/web3.js"; +import { fetchAMMPoolId } from "../Pool/fetch_pool"; +import { getDecimals } from "../../helpers/util"; let sdkCache = { sdk: null, expiry: 0 }; -async function getLPBurnPercentage(tokenAddress) { +export async function getLPBurnPercentage(tokenAddress:string) { try { - let raydium = null; + let raydium:any = null; if (sdkCache.sdk) { raydium = sdkCache.sdk; } else { @@ -20,10 +19,10 @@ async function getLPBurnPercentage(tokenAddress) { const poolInfo = res[poolId]; const lpDecimals = await getDecimals(poolInfo.lpMint); const lpMint = poolInfo.lpMint.toString(); - const lpReserve = new Decimal(poolInfo.lpReserve.toString()).div( + const lpReserve:any = new Decimal(poolInfo.lpReserve.toString()).div( new Decimal(10).pow(lpDecimals) ); - const lpCurrentSupply = await connection.getTokenSupply( + const lpCurrentSupply:any = await connection.getTokenSupply( new PublicKey(lpMint) ); @@ -35,6 +34,5 @@ async function getLPBurnPercentage(tokenAddress) { console.log("Error getting current SOL in pool: ", e); } } -getLPBurnPercentage("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP"); +//getLPBurnPercentage("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP"); -module.exports = { getLPBurnPercentage }; diff --git a/src/raydium/token-filters/maker-count.js b/src/raydium/token-filters/maker-count.ts similarity index 100% rename from src/raydium/token-filters/maker-count.js rename to src/raydium/token-filters/maker-count.ts diff --git a/src/raydium/token-filters/marketcap.js b/src/raydium/token-filters/marketcap.ts similarity index 78% rename from src/raydium/token-filters/marketcap.js rename to src/raydium/token-filters/marketcap.ts index 96dd639..72c1254 100644 --- a/src/raydium/token-filters/marketcap.js +++ b/src/raydium/token-filters/marketcap.ts @@ -1,13 +1,13 @@ -const { initSdk } = require("../raydium_config"); -const Decimal = require("decimal.js"); -const { fetchAMMPoolId } = require("../Pool/fetch_pool"); -const { wsol } = require("../constants"); -const { connection } = require("../../helpers/config"); -const { PublicKey } = require("@solana/web3.js"); +import { initSdk } from "../raydium_config"; +import Decimal from "decimal.js"; +import { fetchAMMPoolId } from "../Pool/fetch_pool"; +import { wsol } from "../constants"; +import { connection } from "../../helpers/config"; +import { PublicKey } from "@solana/web3.js"; let sdkCache = { sdk: null, expiry: 0 }; -async function getCurrentSolPrice() { +export async function getCurrentSolPrice() { try { - let raydium = null; + let raydium:any = null; if (sdkCache.sdk) { raydium = sdkCache.sdk; } else { @@ -22,9 +22,9 @@ async function getCurrentSolPrice() { console.log("Error getting current SOL price: ", e); } } -async function getCurrentMarketCap(tokenAddress) { +export async function getCurrentMarketCap(tokenAddress:string) { try { - let raydium = null; + let raydium:any = null; if (sdkCache.sdk) { raydium = sdkCache.sdk; } else { @@ -63,10 +63,10 @@ async function getCurrentMarketCap(tokenAddress) { priceInSOL = poolInfo.poolPrice; } const priceInUSD = priceInSOL * (await getCurrentSolPrice()); + const supply:any = await connection.getTokenSupply(new PublicKey(tokenAddress)); const mc = priceInUSD * - (await connection.getTokenSupply(new PublicKey(tokenAddress))).value - .uiAmount; + supply.value.uiAmount; return mc; } catch (e) { console.log(`Error when getting current market cap of ${tokenAddress} `, e); @@ -75,4 +75,3 @@ async function getCurrentMarketCap(tokenAddress) { //getCurrentMarketCap("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP"); -module.exports = { getCurrentMarketCap, getCurrentSolPrice }; diff --git a/src/raydium/token-filters/pool-sol.js b/src/raydium/token-filters/pool-sol.ts similarity index 82% rename from src/raydium/token-filters/pool-sol.js rename to src/raydium/token-filters/pool-sol.ts index 8da004a..5661f40 100644 --- a/src/raydium/token-filters/pool-sol.js +++ b/src/raydium/token-filters/pool-sol.ts @@ -1,12 +1,12 @@ -const { initSdk } = require("../raydium_config"); -const Decimal = require("decimal.js"); -const { fetchAMMPoolId } = require("../Pool/fetch_pool"); -const { wsol } = require("../constants"); +import { initSdk } from "../raydium_config"; +import Decimal from "decimal.js"; +import { fetchAMMPoolId } from "../Pool/fetch_pool"; +import { wsol } from "../constants"; let sdkCache = { sdk: null, expiry: 0 }; -async function getCurrentSolInPool(tokenAddress) { +export async function getCurrentSolInPool(tokenAddress:string) { try { - let raydium = null; + let raydium:any = null; if (sdkCache.sdk) { raydium = sdkCache.sdk; } else { @@ -48,5 +48,4 @@ async function getCurrentSolInPool(tokenAddress) { } } -//getCurrentSolInPool("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP") -module.exports = { getCurrentSolInPool }; +//getCurrentSolInPool("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP"); diff --git a/src/raydium/token-filters/tx-count.js b/src/raydium/token-filters/tx-count.ts similarity index 100% rename from src/raydium/token-filters/tx-count.js rename to src/raydium/token-filters/tx-count.ts diff --git a/src/raydium/token-filters/volume.js b/src/raydium/token-filters/volume.ts similarity index 88% rename from src/raydium/token-filters/volume.js rename to src/raydium/token-filters/volume.ts index 56533b0..b64ac56 100644 --- a/src/raydium/token-filters/volume.js +++ b/src/raydium/token-filters/volume.ts @@ -1,6 +1,6 @@ const fetch = require('node-fetch'); -const {fetchAMMPoolId} = require("../Pool/fetch_pool") -async function getDayVolume(tokenAddress){ +import {fetchAMMPoolId} from "../Pool/fetch_pool"; +export async function getDayVolume(tokenAddress:string){ try{ const poolId = await fetchAMMPoolId(tokenAddress); let response = await( await fetch(`https://api-v3.raydium.io/pools/info/ids?ids=${poolId}`)).json(); @@ -20,7 +20,7 @@ async function getDayVolume(tokenAddress){ console.log("Error getting 24h volume: ", e) } } -async function getWeekVolume(tokenAddress){ +export async function getWeekVolume(tokenAddress:string){ try{ const poolId = await fetchAMMPoolId(tokenAddress); let response = await( await fetch(`https://api-v3.raydium.io/pools/info/ids?ids=${poolId}`)).json(); @@ -41,7 +41,7 @@ async function getWeekVolume(tokenAddress){ } } -async function getMonthVolume(tokenAddress){ +export async function getMonthVolume(tokenAddress:string){ try{ const poolId = await fetchAMMPoolId(tokenAddress); let response = await( await fetch(`https://api-v3.raydium.io/pools/info/ids?ids=${poolId}`)).json(); @@ -61,6 +61,4 @@ async function getMonthVolume(tokenAddress){ } } -//getDayVolume("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP") - -module.exports = {getDayVolume, getMonthVolume, getWeekVolume} \ No newline at end of file +//getDayVolume("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP"); \ No newline at end of file From 66c635df7529827e5b33fff1b139a54728fc1064 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 23 Aug 2024 18:16:16 +0800 Subject: [PATCH 005/140] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index c3704c4..e3aedf6 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ - Fastest Copy Trade Program +- Fetch the real-time lp-burn percentage, reserve and market cap of any raydium pool + - **_Got everything needed for any developer to create their own trading bot_** ## Credits From be8867615eea3d5c71bd48d40870a27c832f95e8 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 23 Aug 2024 18:44:42 +0800 Subject: [PATCH 006/140] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e3aedf6..3855068 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ - Fetch the real-time lp-burn percentage, reserve and market cap of any raydium pool +- fixed % tp/sl module + - **_Got everything needed for any developer to create their own trading bot_** ## Credits From 4b1281bad9830fe22fcb546f89ddb03a734b88b9 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 23 Aug 2024 18:58:06 +0800 Subject: [PATCH 007/140] converted src/Trading_dev/**/*.js to .ts --- src/Trading_dev/dex/meteora/constants.ts | 9 +- src/Trading_dev/dex/meteora/fetch-pool.ts | 4 +- src/Trading_dev/dex/meteora/fetch-price.ts | 12 +- src/Trading_dev/dex/meteora/idl.ts | 6501 ----------------- src/Trading_dev/dex/meteora/swap.ts | 20 +- src/Trading_dev/dex/orca/index.ts | 21 +- .../copy_trading/copy-buy.ts | 50 +- .../copy_trading/copy-sell.ts | 43 +- .../copy_trading/copy-trade.ts | 4 +- src/raydium/index.ts | 5 + 10 files changed, 80 insertions(+), 6589 deletions(-) delete mode 100644 src/Trading_dev/dex/meteora/idl.ts create mode 100644 src/raydium/index.ts diff --git a/src/Trading_dev/dex/meteora/constants.ts b/src/Trading_dev/dex/meteora/constants.ts index 818f309..98e4e7b 100644 --- a/src/Trading_dev/dex/meteora/constants.ts +++ b/src/Trading_dev/dex/meteora/constants.ts @@ -1,6 +1,5 @@ -const PROGRAM_ID = "Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB"; -const wsol = "So11111111111111111111111111111111111111112"; -const usdc = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; -const usdt = "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"; // USDT +export const PROGRAM_ID = "Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB"; +export const wsol = "So11111111111111111111111111111111111111112"; +export const usdc = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; +export const usdt = "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"; // USDT -module.exports = {PROGRAM_ID, wsol, usdc, usdt}; \ No newline at end of file diff --git a/src/Trading_dev/dex/meteora/fetch-pool.ts b/src/Trading_dev/dex/meteora/fetch-pool.ts index 28ebf90..b31b973 100644 --- a/src/Trading_dev/dex/meteora/fetch-pool.ts +++ b/src/Trading_dev/dex/meteora/fetch-pool.ts @@ -1,4 +1,4 @@ -async function fetchDLMMPoolId(tokenAddress) { +export async function fetchDLMMPoolId(tokenAddress:string) { const url = `https://dlmm-api.meteora.ag/pair/all_by_groups?sort_key=tvl&order_by=desc&search_term=${tokenAddress}&include_unknown=false`; const response = await (await fetch(url)).json(); // check if the string start with "SOL" or end with "SOL" @@ -21,5 +21,3 @@ async function main() { } //main(); - -module.exports = { fetchDLMMPoolId }; \ No newline at end of file diff --git a/src/Trading_dev/dex/meteora/fetch-price.ts b/src/Trading_dev/dex/meteora/fetch-price.ts index 13df08a..16d4175 100644 --- a/src/Trading_dev/dex/meteora/fetch-price.ts +++ b/src/Trading_dev/dex/meteora/fetch-price.ts @@ -1,21 +1,21 @@ -const { fetchDLMMPoolId } = require("./fetch-pool"); -const {usdc} = require("./constants"); +import { fetchDLMMPoolId } from "./fetch-pool"; +import {usdc} from "./constants"; -async function getCurrentPriceInSOL(tokenAddress) { +export async function getCurrentPriceInSOL(tokenAddress:string) { const poolId = await fetchDLMMPoolId(tokenAddress); const response = await ( await fetch(`https://dlmm-api.meteora.ag/pair/${poolId}`) ).json(); return response.current_price; } -async function getCurrentSolPrice() { +export async function getCurrentSolPrice() { const poolId = await fetchDLMMPoolId(usdc); const response = await ( await fetch(`https://dlmm-api.meteora.ag/pair/${poolId}`) ).json(); return response.current_price; } -async function getCurrentPriceInUSD(tokenAddress) { +export async function getCurrentPriceInUSD(tokenAddress:string) { const poolId = await fetchDLMMPoolId(tokenAddress); const response = await ( await fetch(`https://dlmm-api.meteora.ag/pair/${poolId}`) @@ -29,5 +29,3 @@ async function main(){ } //main(); - -module.exports = { getCurrentPriceInUSD, getCurrentPriceInSOL, getCurrentSolPrice }; \ No newline at end of file diff --git a/src/Trading_dev/dex/meteora/idl.ts b/src/Trading_dev/dex/meteora/idl.ts deleted file mode 100644 index e1c5dc3..0000000 --- a/src/Trading_dev/dex/meteora/idl.ts +++ /dev/null @@ -1,6501 +0,0 @@ -const Amm = { - version: "0.4.12", - name: "amm", - docs: ["Program for AMM"], - instructions: [ - { - name: "initializePermissionedPool", - docs: ["Initialize a new permissioned pool."], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: true, - docs: ["Pool account (arbitrary address)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "tokenAMint", - isMut: false, - isSigner: false, - docs: ["Token A mint of the pool. Eg: USDT"], - }, - { - name: "tokenBMint", - isMut: false, - isSigner: false, - docs: ["Token B mint of the pool. Eg: USDC"], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault A"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault B"], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "adminTokenA", - isMut: true, - isSigner: false, - docs: [ - "Admin token account for pool token A mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "adminTokenB", - isMut: true, - isSigner: false, - docs: [ - "Admin token account for pool token B mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "adminPoolLp", - isMut: true, - isSigner: false, - docs: [ - "Admin pool LP token account. Used to receive LP during first deposit (initialize pool)", - "Admin pool LP token account. Used to receive LP during first deposit (initialize pool)", - ], - }, - { - name: "protocolTokenAFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token A. Used to receive trading fee.", - ], - }, - { - name: "protocolTokenBFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token B. Used to receive trading fee.", - ], - }, - { - name: "admin", - isMut: true, - isSigner: true, - docs: [ - "Admin account. This account will be the admin of the pool, and the payer for PDA during initialize pool.", - ], - }, - { - name: "feeOwner", - isMut: false, - isSigner: false, - }, - { - name: "rent", - isMut: false, - isSigner: false, - docs: ["Rent account."], - }, - { - name: "mintMetadata", - isMut: true, - isSigner: false, - }, - { - name: "metadataProgram", - isMut: false, - isSigner: false, - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. The pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - { - name: "associatedTokenProgram", - isMut: false, - isSigner: false, - docs: ["Associated token program."], - }, - { - name: "systemProgram", - isMut: false, - isSigner: false, - docs: ["System program."], - }, - ], - args: [ - { - name: "curveType", - type: { - defined: "CurveType", - }, - }, - ], - }, - { - name: "initializePermissionlessPool", - docs: ["Initialize a new permissionless pool."], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA address)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "tokenAMint", - isMut: false, - isSigner: false, - docs: ["Token A mint of the pool. Eg: USDT"], - }, - { - name: "tokenBMint", - isMut: false, - isSigner: false, - docs: ["Token B mint of the pool. Eg: USDC"], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault A"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault B"], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "payerTokenA", - isMut: true, - isSigner: false, - docs: [ - "Payer token account for pool token A mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "payerTokenB", - isMut: true, - isSigner: false, - docs: [ - "Admin token account for pool token B mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "payerPoolLp", - isMut: true, - isSigner: false, - }, - { - name: "protocolTokenAFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token A. Used to receive trading fee.", - ], - }, - { - name: "protocolTokenBFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token B. Used to receive trading fee.", - ], - }, - { - name: "payer", - isMut: true, - isSigner: true, - docs: [ - "Admin account. This account will be the admin of the pool, and the payer for PDA during initialize pool.", - ], - }, - { - name: "feeOwner", - isMut: false, - isSigner: false, - }, - { - name: "rent", - isMut: false, - isSigner: false, - docs: ["Rent account."], - }, - { - name: "mintMetadata", - isMut: true, - isSigner: false, - }, - { - name: "metadataProgram", - isMut: false, - isSigner: false, - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. The pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - { - name: "associatedTokenProgram", - isMut: false, - isSigner: false, - docs: ["Associated token program."], - }, - { - name: "systemProgram", - isMut: false, - isSigner: false, - docs: ["System program."], - }, - ], - args: [ - { - name: "curveType", - type: { - defined: "CurveType", - }, - }, - { - name: "tokenAAmount", - type: "u64", - }, - { - name: "tokenBAmount", - type: "u64", - }, - ], - }, - { - name: "initializePermissionlessPoolWithFeeTier", - docs: ["Initialize a new permissionless pool with customized fee tier"], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA address)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "tokenAMint", - isMut: false, - isSigner: false, - docs: ["Token A mint of the pool. Eg: USDT"], - }, - { - name: "tokenBMint", - isMut: false, - isSigner: false, - docs: ["Token B mint of the pool. Eg: USDC"], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault A"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault B"], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "payerTokenA", - isMut: true, - isSigner: false, - docs: [ - "Payer token account for pool token A mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "payerTokenB", - isMut: true, - isSigner: false, - docs: [ - "Admin token account for pool token B mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "payerPoolLp", - isMut: true, - isSigner: false, - }, - { - name: "protocolTokenAFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token A. Used to receive trading fee.", - ], - }, - { - name: "protocolTokenBFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token B. Used to receive trading fee.", - ], - }, - { - name: "payer", - isMut: true, - isSigner: true, - docs: [ - "Admin account. This account will be the admin of the pool, and the payer for PDA during initialize pool.", - ], - }, - { - name: "feeOwner", - isMut: false, - isSigner: false, - }, - { - name: "rent", - isMut: false, - isSigner: false, - docs: ["Rent account."], - }, - { - name: "mintMetadata", - isMut: true, - isSigner: false, - }, - { - name: "metadataProgram", - isMut: false, - isSigner: false, - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. The pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - { - name: "associatedTokenProgram", - isMut: false, - isSigner: false, - docs: ["Associated token program."], - }, - { - name: "systemProgram", - isMut: false, - isSigner: false, - docs: ["System program."], - }, - ], - args: [ - { - name: "curveType", - type: { - defined: "CurveType", - }, - }, - { - name: "tradeFeeBps", - type: "u64", - }, - { - name: "tokenAAmount", - type: "u64", - }, - { - name: "tokenBAmount", - type: "u64", - }, - ], - }, - { - name: "enableOrDisablePool", - docs: [ - "Enable or disable a pool. A disabled pool allow only remove balanced liquidity operation.", - ], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "admin", - isMut: false, - isSigner: true, - docs: ["Admin account. Must be owner of the pool."], - }, - ], - args: [ - { - name: "enable", - type: "bool", - }, - ], - }, - { - name: "swap", - docs: [ - "Swap token A to B, or vice versa. An amount of trading fee will be charged for liquidity provider, and the admin of the pool.", - ], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "userSourceToken", - isMut: true, - isSigner: false, - docs: [ - "User token account. Token from this account will be transfer into the vault by the pool in exchange for another token of the pool.", - ], - }, - { - name: "userDestinationToken", - isMut: true, - isSigner: false, - docs: [ - "User token account. The exchanged token will be transfer into this account from the pool.", - ], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["Lp token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["Lp token mint of vault b"], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "protocolTokenFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account. Used to receive trading fee. It's mint field must matched with user_source_token mint field.", - ], - }, - { - name: "user", - isMut: false, - isSigner: true, - docs: ["User account. Must be owner of user_source_token."], - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. the pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - ], - args: [ - { - name: "inAmount", - type: "u64", - }, - { - name: "minimumOutAmount", - type: "u64", - }, - ], - }, - { - name: "removeLiquiditySingleSide", - docs: [ - "Withdraw only single token from the pool. Only supported by pool with stable swap curve.", - ], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "userPoolLp", - isMut: true, - isSigner: false, - docs: [ - "User pool lp token account. LP will be burned from this account upon success liquidity removal.", - ], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault A"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault B"], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "userDestinationToken", - isMut: true, - isSigner: false, - docs: [ - "User token account to receive token upon success liquidity removal.", - ], - }, - { - name: "user", - isMut: false, - isSigner: true, - docs: ["User account. Must be owner of the user_pool_lp account."], - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. The pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - ], - args: [ - { - name: "poolTokenAmount", - type: "u64", - }, - { - name: "minimumOutAmount", - type: "u64", - }, - ], - }, - { - name: "addImbalanceLiquidity", - docs: [ - "Deposit tokens to the pool in an imbalance ratio. Only supported by pool with stable swap curve.", - ], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "userPoolLp", - isMut: true, - isSigner: false, - docs: [ - "user pool lp token account. lp will be burned from this account upon success liquidity removal.", - ], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault b"], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "userAToken", - isMut: true, - isSigner: false, - docs: [ - "User token A account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "userBToken", - isMut: true, - isSigner: false, - docs: [ - "User token B account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "user", - isMut: false, - isSigner: true, - docs: [ - "User account. Must be owner of user_a_token, and user_b_token.", - ], - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. the pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - ], - args: [ - { - name: "minimumPoolTokenAmount", - type: "u64", - }, - { - name: "tokenAAmount", - type: "u64", - }, - { - name: "tokenBAmount", - type: "u64", - }, - ], - }, - { - name: "removeBalanceLiquidity", - docs: [ - "Withdraw tokens from the pool in a balanced ratio. User will still able to withdraw from pool even the pool is disabled. This allow user to exit their liquidity when there's some unforeseen event happen.", - ], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "userPoolLp", - isMut: true, - isSigner: false, - docs: [ - "user pool lp token account. lp will be burned from this account upon success liquidity removal.", - ], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault b"], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "userAToken", - isMut: true, - isSigner: false, - docs: [ - "User token A account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "userBToken", - isMut: true, - isSigner: false, - docs: [ - "User token B account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "user", - isMut: false, - isSigner: true, - docs: [ - "User account. Must be owner of user_a_token, and user_b_token.", - ], - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. the pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - ], - args: [ - { - name: "poolTokenAmount", - type: "u64", - }, - { - name: "minimumATokenOut", - type: "u64", - }, - { - name: "minimumBTokenOut", - type: "u64", - }, - ], - }, - { - name: "addBalanceLiquidity", - docs: ["Deposit tokens to the pool in a balanced ratio."], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "userPoolLp", - isMut: true, - isSigner: false, - docs: [ - "user pool lp token account. lp will be burned from this account upon success liquidity removal.", - ], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault b"], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "userAToken", - isMut: true, - isSigner: false, - docs: [ - "User token A account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "userBToken", - isMut: true, - isSigner: false, - docs: [ - "User token B account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "user", - isMut: false, - isSigner: true, - docs: [ - "User account. Must be owner of user_a_token, and user_b_token.", - ], - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. the pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - ], - args: [ - { - name: "poolTokenAmount", - type: "u64", - }, - { - name: "maximumTokenAAmount", - type: "u64", - }, - { - name: "maximumTokenBAmount", - type: "u64", - }, - ], - }, - { - name: "setPoolFees", - docs: ["Update trading fee charged for liquidity provider, and admin."], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "admin", - isMut: false, - isSigner: true, - docs: ["Admin account. Must be owner of the pool."], - }, - ], - args: [ - { - name: "fees", - type: { - defined: "PoolFees", - }, - }, - ], - }, - { - name: "overrideCurveParam", - docs: [ - "Update swap curve parameters. This function do not allow update of curve type. For example: stable swap curve to constant product curve. Only supported by pool with stable swap curve.", - "Only amp is allowed to be override. The other attributes of stable swap curve will be ignored.", - ], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "admin", - isMut: false, - isSigner: true, - docs: ["Admin account. Must be owner of the pool."], - }, - ], - args: [ - { - name: "curveType", - type: { - defined: "CurveType", - }, - }, - ], - }, - { - name: "transferAdmin", - docs: ["Transfer the admin of the pool to new admin."], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "admin", - isMut: false, - isSigner: true, - docs: ["Admin account. Must be owner of the pool."], - }, - { - name: "newAdmin", - isMut: false, - isSigner: true, - docs: ["New admin account."], - }, - ], - args: [], - }, - { - name: "getPoolInfo", - docs: ["Get the general information of the pool."], - accounts: [ - { - name: "pool", - isMut: false, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "lpMint", - isMut: false, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "aVaultLp", - isMut: false, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: false, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVault", - isMut: false, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: false, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLpMint", - isMut: false, - isSigner: false, - docs: ["LP token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: false, - isSigner: false, - docs: ["LP token mint of vault b"], - }, - ], - args: [], - }, - { - name: "bootstrapLiquidity", - docs: ["Bootstrap the pool when liquidity is depleted."], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "userPoolLp", - isMut: true, - isSigner: false, - docs: [ - "user pool lp token account. lp will be burned from this account upon success liquidity removal.", - ], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault b"], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "userAToken", - isMut: true, - isSigner: false, - docs: [ - "User token A account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "userBToken", - isMut: true, - isSigner: false, - docs: [ - "User token B account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "user", - isMut: false, - isSigner: true, - docs: [ - "User account. Must be owner of user_a_token, and user_b_token.", - ], - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. the pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - ], - args: [ - { - name: "tokenAAmount", - type: "u64", - }, - { - name: "tokenBAmount", - type: "u64", - }, - ], - }, - { - name: "createMintMetadata", - docs: ["Create mint metadata account for old pools"], - accounts: [ - { - name: "pool", - isMut: false, - isSigner: false, - docs: ["Pool account"], - }, - { - name: "lpMint", - isMut: false, - isSigner: false, - docs: ["LP mint account of the pool"], - }, - { - name: "aVaultLp", - isMut: false, - isSigner: false, - docs: ["Vault A LP account of the pool"], - }, - { - name: "mintMetadata", - isMut: true, - isSigner: false, - }, - { - name: "metadataProgram", - isMut: false, - isSigner: false, - }, - { - name: "systemProgram", - isMut: false, - isSigner: false, - docs: ["System program."], - }, - { - name: "payer", - isMut: true, - isSigner: true, - docs: ["Payer"], - }, - ], - args: [], - }, - { - name: "createLockEscrow", - docs: ["Create lock account"], - accounts: [ - { - name: "pool", - isMut: false, - isSigner: false, - docs: ["Pool account"], - }, - { - name: "lockEscrow", - isMut: true, - isSigner: false, - docs: ["Lock account"], - }, - { - name: "owner", - isMut: false, - isSigner: false, - }, - { - name: "lpMint", - isMut: false, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "payer", - isMut: true, - isSigner: true, - docs: ["Payer account"], - }, - { - name: "systemProgram", - isMut: false, - isSigner: false, - docs: ["System program."], - }, - ], - args: [], - }, - { - name: "lock", - docs: ["Lock Lp token"], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account"], - }, - { - name: "lpMint", - isMut: false, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "lockEscrow", - isMut: true, - isSigner: false, - docs: ["Lock account"], - }, - { - name: "owner", - isMut: true, - isSigner: true, - docs: ["Owner of lock account"], - }, - { - name: "sourceTokens", - isMut: true, - isSigner: false, - docs: ["owner lp token account"], - }, - { - name: "escrowVault", - isMut: true, - isSigner: false, - docs: ["Escrow vault"], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - { - name: "aVault", - isMut: false, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: false, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLp", - isMut: false, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: false, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVaultLpMint", - isMut: false, - isSigner: false, - docs: ["LP token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: false, - isSigner: false, - docs: ["LP token mint of vault b"], - }, - ], - args: [ - { - name: "maxAmount", - type: "u64", - }, - ], - }, - { - name: "claimFee", - docs: ["Claim fee"], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "lockEscrow", - isMut: true, - isSigner: false, - docs: ["Lock account"], - }, - { - name: "owner", - isMut: true, - isSigner: true, - docs: ["Owner of lock account"], - }, - { - name: "sourceTokens", - isMut: true, - isSigner: false, - docs: ["owner lp token account"], - }, - { - name: "escrowVault", - isMut: true, - isSigner: false, - docs: ["Escrow vault"], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault b"], - }, - { - name: "userAToken", - isMut: true, - isSigner: false, - docs: [ - "User token A account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "userBToken", - isMut: true, - isSigner: false, - docs: [ - "User token B account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. the pool will deposit/withdraw liquidity from the vault.", - ], - }, - ], - args: [ - { - name: "maxAmount", - type: "u64", - }, - ], - }, - { - name: "createConfig", - docs: ["Create config"], - accounts: [ - { - name: "config", - isMut: true, - isSigner: false, - }, - { - name: "admin", - isMut: true, - isSigner: true, - }, - { - name: "systemProgram", - isMut: false, - isSigner: false, - }, - ], - args: [ - { - name: "configParameters", - type: { - defined: "ConfigParameters", - }, - }, - ], - }, - { - name: "closeConfig", - docs: ["Close config"], - accounts: [ - { - name: "config", - isMut: true, - isSigner: false, - }, - { - name: "admin", - isMut: true, - isSigner: true, - }, - { - name: "rentReceiver", - isMut: true, - isSigner: false, - }, - ], - args: [], - }, - { - name: "initializePermissionlessConstantProductPoolWithConfig", - docs: ["Initialize permissionless pool with config"], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA address)"], - }, - { - name: "config", - isMut: false, - isSigner: false, - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "tokenAMint", - isMut: false, - isSigner: false, - docs: ["Token A mint of the pool. Eg: USDT"], - }, - { - name: "tokenBMint", - isMut: false, - isSigner: false, - docs: ["Token B mint of the pool. Eg: USDC"], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault A"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault B"], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "payerTokenA", - isMut: true, - isSigner: false, - docs: [ - "Payer token account for pool token A mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "payerTokenB", - isMut: true, - isSigner: false, - docs: [ - "Admin token account for pool token B mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "payerPoolLp", - isMut: true, - isSigner: false, - }, - { - name: "protocolTokenAFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token A. Used to receive trading fee.", - ], - }, - { - name: "protocolTokenBFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token B. Used to receive trading fee.", - ], - }, - { - name: "payer", - isMut: true, - isSigner: true, - docs: [ - "Admin account. This account will be the admin of the pool, and the payer for PDA during initialize pool.", - ], - }, - { - name: "rent", - isMut: false, - isSigner: false, - docs: ["Rent account."], - }, - { - name: "mintMetadata", - isMut: true, - isSigner: false, - }, - { - name: "metadataProgram", - isMut: false, - isSigner: false, - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. The pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - { - name: "associatedTokenProgram", - isMut: false, - isSigner: false, - docs: ["Associated token program."], - }, - { - name: "systemProgram", - isMut: false, - isSigner: false, - docs: ["System program."], - }, - ], - args: [ - { - name: "tokenAAmount", - type: "u64", - }, - { - name: "tokenBAmount", - type: "u64", - }, - ], - }, - ], - accounts: [ - { - name: "config", - type: { - kind: "struct", - fields: [ - { - name: "poolFees", - type: { - defined: "PoolFees", - }, - }, - { - name: "activationDurationInSlot", - type: "u64", - }, - { - name: "vaultConfigKey", - type: "publicKey", - }, - { - name: "padding", - type: { - array: ["u8", 260], - }, - }, - ], - }, - }, - { - name: "lockEscrow", - docs: ["State of lock escrow account"], - type: { - kind: "struct", - fields: [ - { - name: "pool", - docs: ["Pool address"], - type: "publicKey", - }, - { - name: "owner", - docs: ["Owner address"], - type: "publicKey", - }, - { - name: "escrowVault", - docs: ["Vault address, store the lock user lock"], - type: "publicKey", - }, - { - name: "bump", - docs: ["bump, used to sign"], - type: "u8", - }, - { - name: "totalLockedAmount", - docs: ["Total locked amount"], - type: "u64", - }, - { - name: "lpPerToken", - docs: ["Lp per token, virtual price of lp token"], - type: "u128", - }, - { - name: "unclaimedFeePending", - docs: ["Unclaimed fee pending"], - type: "u64", - }, - { - name: "aFee", - docs: ["Total a fee claimed so far"], - type: "u64", - }, - { - name: "bFee", - docs: ["Total b fee claimed so far"], - type: "u64", - }, - ], - }, - }, - { - name: "pool", - docs: ["State of pool account"], - type: { - kind: "struct", - fields: [ - { - name: "lpMint", - docs: ["LP token mint of the pool"], - type: "publicKey", - }, - { - name: "tokenAMint", - docs: ["Token A mint of the pool. Eg: USDT"], - type: "publicKey", - }, - { - name: "tokenBMint", - docs: ["Token B mint of the pool. Eg: USDC"], - type: "publicKey", - }, - { - name: "aVault", - docs: [ - "Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.", - ], - type: "publicKey", - }, - { - name: "bVault", - docs: [ - "Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.", - ], - type: "publicKey", - }, - { - name: "aVaultLp", - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - type: "publicKey", - }, - { - name: "bVaultLp", - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - type: "publicKey", - }, - { - name: "aVaultLpBump", - docs: ['"A" vault lp bump. Used to create signer seeds.'], - type: "u8", - }, - { - name: "enabled", - docs: [ - "Flag to determine whether the pool is enabled, or disabled.", - ], - type: "bool", - }, - { - name: "protocolTokenAFee", - docs: [ - "Protocol fee token account for token A. Used to receive trading fee.", - ], - type: "publicKey", - }, - { - name: "protocolTokenBFee", - docs: [ - "Protocol fee token account for token B. Used to receive trading fee.", - ], - type: "publicKey", - }, - { - name: "admin", - docs: ["Owner of the pool."], - type: "publicKey", - }, - { - name: "fees", - docs: ["Store the fee charges setting."], - type: { - defined: "PoolFees", - }, - }, - { - name: "poolType", - docs: ["Pool type"], - type: { - defined: "PoolType", - }, - }, - { - name: "stake", - docs: ["Stake pubkey of SPL stake pool"], - type: "publicKey", - }, - { - name: "totalLockedLp", - docs: ["Total locked lp token"], - type: "u64", - }, - { - name: "alphaVault", - docs: ["Alpha vault config"], - type: { - defined: "AlphaVault", - }, - }, - { - name: "padding", - docs: ["Padding for future pool field"], - type: { - defined: "Padding", - }, - }, - { - name: "curveType", - docs: ["The type of the swap curve supported by the pool."], - type: { - defined: "CurveType", - }, - }, - ], - }, - }, - ], - types: [ - { - name: "TokenMultiplier", - docs: [ - "Multiplier for the pool token. Used to normalized token with different decimal into the same precision.", - ], - type: { - kind: "struct", - fields: [ - { - name: "tokenAMultiplier", - docs: ["Multiplier for token A of the pool."], - type: "u64", - }, - { - name: "tokenBMultiplier", - docs: ["Multiplier for token B of the pool."], - type: "u64", - }, - { - name: "precisionFactor", - docs: [ - "Record the highest token decimal in the pool. For example, Token A is 6 decimal, token B is 9 decimal. This will save value of 9.", - ], - type: "u8", - }, - ], - }, - }, - { - name: "PoolFees", - docs: ["Information regarding fee charges"], - type: { - kind: "struct", - fields: [ - { - name: "tradeFeeNumerator", - docs: [ - "Trade fees are extra token amounts that are held inside the token", - "accounts during a trade, making the value of liquidity tokens rise.", - "Trade fee numerator", - ], - type: "u64", - }, - { - name: "tradeFeeDenominator", - docs: ["Trade fee denominator"], - type: "u64", - }, - { - name: "protocolTradeFeeNumerator", - docs: [ - "Protocol trading fees are extra token amounts that are held inside the token", - "accounts during a trade, with the equivalent in pool tokens minted to", - "the protocol of the program.", - "Protocol trade fee numerator", - ], - type: "u64", - }, - { - name: "protocolTradeFeeDenominator", - docs: ["Protocol trade fee denominator"], - type: "u64", - }, - ], - }, - }, - { - name: "Depeg", - docs: ["Contains information for depeg pool"], - type: { - kind: "struct", - fields: [ - { - name: "baseVirtualPrice", - docs: ["The virtual price of staking / interest bearing token"], - type: "u64", - }, - { - name: "baseCacheUpdated", - docs: ["The virtual price of staking / interest bearing token"], - type: "u64", - }, - { - name: "depegType", - docs: ["Type of the depeg pool"], - type: { - defined: "DepegType", - }, - }, - ], - }, - }, - { - name: "ConfigParameters", - type: { - kind: "struct", - fields: [ - { - name: "tradeFeeNumerator", - type: "u64", - }, - { - name: "protocolTradeFeeNumerator", - type: "u64", - }, - { - name: "activationDurationInSlot", - type: "u64", - }, - { - name: "vaultConfigKey", - type: "publicKey", - }, - { - name: "index", - type: "u64", - }, - ], - }, - }, - { - name: "Padding", - docs: ["Padding for future pool fields"], - type: { - kind: "struct", - fields: [ - { - name: "padding0", - docs: ["Padding 0"], - type: { - array: ["u8", 15], - }, - }, - { - name: "padding", - docs: ["Padding 1"], - type: { - array: ["u128", 24], - }, - }, - ], - }, - }, - { - name: "AlphaVault", - type: { - kind: "struct", - fields: [ - { - name: "activationSlot", - docs: ["Activation slot"], - type: "u64", - }, - { - name: "whitelistedVault", - docs: ["Whitelisted vault to be able to buy pool before open slot"], - type: "publicKey", - }, - { - name: "poolCreator", - docs: [ - "Need to store pool creator in lauch pool, so they can modify liquidity before activation slot", - ], - type: "publicKey", - }, - ], - }, - }, - { - name: "RoundDirection", - docs: ["Rounding direction"], - type: { - kind: "enum", - variants: [ - { - name: "Floor", - }, - { - name: "Ceiling", - }, - ], - }, - }, - { - name: "TradeDirection", - docs: ["Trade (swap) direction"], - type: { - kind: "enum", - variants: [ - { - name: "AtoB", - }, - { - name: "BtoA", - }, - ], - }, - }, - { - name: "NewCurveType", - docs: ["Type of the swap curve"], - type: { - kind: "enum", - variants: [ - { - name: "ConstantProduct", - }, - { - name: "Stable", - fields: [ - { - name: "amp", - docs: ["Amplification coefficient"], - type: "u64", - }, - { - name: "token_multiplier", - docs: [ - "Multiplier for the pool token. Used to normalized token with different decimal into the same precision.", - ], - type: { - defined: "TokenMultiplier", - }, - }, - { - name: "depeg", - docs: [ - "Depeg pool information. Contains functions to allow token amount to be repeg using stake / interest bearing token virtual price", - ], - type: { - defined: "Depeg", - }, - }, - { - name: "last_amp_updated_timestamp", - docs: [ - "The last amp updated timestamp. Used to prevent update_curve_info called infinitely many times within a short period", - ], - type: "u64", - }, - ], - }, - { - name: "NewCurve", - fields: [ - { - name: "field_one", - type: "u64", - }, - { - name: "field_two", - type: "u64", - }, - ], - }, - ], - }, - }, - { - name: "CurveType", - docs: ["Type of the swap curve"], - type: { - kind: "enum", - variants: [ - { - name: "ConstantProduct", - }, - { - name: "Stable", - fields: [ - { - name: "amp", - docs: ["Amplification coefficient"], - type: "u64", - }, - { - name: "token_multiplier", - docs: [ - "Multiplier for the pool token. Used to normalized token with different decimal into the same precision.", - ], - type: { - defined: "TokenMultiplier", - }, - }, - { - name: "depeg", - docs: [ - "Depeg pool information. Contains functions to allow token amount to be repeg using stake / interest bearing token virtual price", - ], - type: { - defined: "Depeg", - }, - }, - { - name: "last_amp_updated_timestamp", - docs: [ - "The last amp updated timestamp. Used to prevent update_curve_info called infinitely many times within a short period", - ], - type: "u64", - }, - ], - }, - ], - }, - }, - { - name: "DepegType", - docs: ["Type of depeg pool"], - type: { - kind: "enum", - variants: [ - { - name: "None", - }, - { - name: "Marinade", - }, - { - name: "Lido", - }, - { - name: "SplStake", - }, - ], - }, - }, - { - name: "Rounding", - docs: ["Round up, down"], - type: { - kind: "enum", - variants: [ - { - name: "Up", - }, - { - name: "Down", - }, - ], - }, - }, - { - name: "PoolType", - docs: ["Pool type"], - type: { - kind: "enum", - variants: [ - { - name: "Permissioned", - }, - { - name: "Permissionless", - }, - ], - }, - }, - ], - events: [ - { - name: "AddLiquidity", - fields: [ - { - name: "lpMintAmount", - type: "u64", - index: false, - }, - { - name: "tokenAAmount", - type: "u64", - index: false, - }, - { - name: "tokenBAmount", - type: "u64", - index: false, - }, - ], - }, - { - name: "RemoveLiquidity", - fields: [ - { - name: "lpUnmintAmount", - type: "u64", - index: false, - }, - { - name: "tokenAOutAmount", - type: "u64", - index: false, - }, - { - name: "tokenBOutAmount", - type: "u64", - index: false, - }, - ], - }, - { - name: "BootstrapLiquidity", - fields: [ - { - name: "lpMintAmount", - type: "u64", - index: false, - }, - { - name: "tokenAAmount", - type: "u64", - index: false, - }, - { - name: "tokenBAmount", - type: "u64", - index: false, - }, - { - name: "pool", - type: "publicKey", - index: false, - }, - ], - }, - { - name: "Swap", - fields: [ - { - name: "inAmount", - type: "u64", - index: false, - }, - { - name: "outAmount", - type: "u64", - index: false, - }, - { - name: "tradeFee", - type: "u64", - index: false, - }, - { - name: "protocolFee", - type: "u64", - index: false, - }, - { - name: "hostFee", - type: "u64", - index: false, - }, - ], - }, - { - name: "SetPoolFees", - fields: [ - { - name: "tradeFeeNumerator", - type: "u64", - index: false, - }, - { - name: "tradeFeeDenominator", - type: "u64", - index: false, - }, - { - name: "protocolTradeFeeNumerator", - type: "u64", - index: false, - }, - { - name: "protocolTradeFeeDenominator", - type: "u64", - index: false, - }, - { - name: "pool", - type: "publicKey", - index: false, - }, - ], - }, - { - name: "PoolInfo", - fields: [ - { - name: "tokenAAmount", - type: "u64", - index: false, - }, - { - name: "tokenBAmount", - type: "u64", - index: false, - }, - { - name: "virtualPrice", - type: "f64", - index: false, - }, - { - name: "currentTimestamp", - type: "u64", - index: false, - }, - ], - }, - { - name: "TransferAdmin", - fields: [ - { - name: "admin", - type: "publicKey", - index: false, - }, - { - name: "newAdmin", - type: "publicKey", - index: false, - }, - { - name: "pool", - type: "publicKey", - index: false, - }, - ], - }, - { - name: "OverrideCurveParam", - fields: [ - { - name: "newAmp", - type: "u64", - index: false, - }, - { - name: "updatedTimestamp", - type: "u64", - index: false, - }, - { - name: "pool", - type: "publicKey", - index: false, - }, - ], - }, - { - name: "PoolCreated", - fields: [ - { - name: "lpMint", - type: "publicKey", - index: false, - }, - { - name: "tokenAMint", - type: "publicKey", - index: false, - }, - { - name: "tokenBMint", - type: "publicKey", - index: false, - }, - { - name: "poolType", - type: { - defined: "PoolType", - }, - index: false, - }, - { - name: "pool", - type: "publicKey", - index: false, - }, - ], - }, - { - name: "PoolEnabled", - fields: [ - { - name: "pool", - type: "publicKey", - index: false, - }, - { - name: "enabled", - type: "bool", - index: false, - }, - ], - }, - { - name: "MigrateFeeAccount", - fields: [ - { - name: "pool", - type: "publicKey", - index: false, - }, - { - name: "newAdminTokenAFee", - type: "publicKey", - index: false, - }, - { - name: "newAdminTokenBFee", - type: "publicKey", - index: false, - }, - { - name: "tokenAAmount", - type: "u64", - index: false, - }, - { - name: "tokenBAmount", - type: "u64", - index: false, - }, - ], - }, - { - name: "CreateLockEscrow", - fields: [ - { - name: "pool", - type: "publicKey", - index: false, - }, - { - name: "owner", - type: "publicKey", - index: false, - }, - ], - }, - { - name: "Lock", - fields: [ - { - name: "pool", - type: "publicKey", - index: false, - }, - { - name: "owner", - type: "publicKey", - index: false, - }, - { - name: "amount", - type: "u64", - index: false, - }, - ], - }, - { - name: "ClaimFee", - fields: [ - { - name: "pool", - type: "publicKey", - index: false, - }, - { - name: "owner", - type: "publicKey", - index: false, - }, - { - name: "amount", - type: "u64", - index: false, - }, - { - name: "aFee", - type: "u64", - index: false, - }, - { - name: "bFee", - type: "u64", - index: false, - }, - ], - }, - { - name: "CreateConfig", - fields: [ - { - name: "tradeFeeNumerator", - type: "u64", - index: false, - }, - { - name: "protocolTradeFeeNumerator", - type: "u64", - index: false, - }, - { - name: "config", - type: "publicKey", - index: false, - }, - ], - }, - { - name: "CloseConfig", - fields: [ - { - name: "config", - type: "publicKey", - index: false, - }, - ], - }, - ], - errors: [ - { - code: 6000, - name: "MathOverflow", - msg: "Math operation overflow", - }, - { - code: 6001, - name: "InvalidFee", - msg: "Invalid fee setup", - }, - { - code: 6002, - name: "InvalidInvariant", - msg: "Invalid invariant d", - }, - { - code: 6003, - name: "FeeCalculationFailure", - msg: "Fee calculation failure", - }, - { - code: 6004, - name: "ExceededSlippage", - msg: "Exceeded slippage tolerance", - }, - { - code: 6005, - name: "InvalidCalculation", - msg: "Invalid curve calculation", - }, - { - code: 6006, - name: "ZeroTradingTokens", - msg: "Given pool token amount results in zero trading tokens", - }, - { - code: 6007, - name: "ConversionError", - msg: "Math conversion overflow", - }, - { - code: 6008, - name: "FaultyLpMint", - msg: "LP mint authority must be 'A' vault lp, without freeze authority, and 0 supply", - }, - { - code: 6009, - name: "MismatchedTokenMint", - msg: "Token mint mismatched", - }, - { - code: 6010, - name: "MismatchedLpMint", - msg: "LP mint mismatched", - }, - { - code: 6011, - name: "MismatchedOwner", - msg: "Invalid lp token owner", - }, - { - code: 6012, - name: "InvalidVaultAccount", - msg: "Invalid vault account", - }, - { - code: 6013, - name: "InvalidVaultLpAccount", - msg: "Invalid vault lp account", - }, - { - code: 6014, - name: "InvalidPoolLpMintAccount", - msg: "Invalid pool lp mint account", - }, - { - code: 6015, - name: "PoolDisabled", - msg: "Pool disabled", - }, - { - code: 6016, - name: "InvalidAdminAccount", - msg: "Invalid admin account", - }, - { - code: 6017, - name: "InvalidProtocolFeeAccount", - msg: "Invalid protocol fee account", - }, - { - code: 6018, - name: "SameAdminAccount", - msg: "Same admin account", - }, - { - code: 6019, - name: "IdenticalSourceDestination", - msg: "Identical user source and destination token account", - }, - { - code: 6020, - name: "ApyCalculationError", - msg: "Apy calculation error", - }, - { - code: 6021, - name: "InsufficientSnapshot", - msg: "Insufficient virtual price snapshot", - }, - { - code: 6022, - name: "NonUpdatableCurve", - msg: "Current curve is non-updatable", - }, - { - code: 6023, - name: "MisMatchedCurve", - msg: "New curve is mismatched with old curve", - }, - { - code: 6024, - name: "InvalidAmplification", - msg: "Amplification is invalid", - }, - { - code: 6025, - name: "UnsupportedOperation", - msg: "Operation is not supported", - }, - { - code: 6026, - name: "ExceedMaxAChanges", - msg: "Exceed max amplification changes", - }, - { - code: 6027, - name: "InvalidRemainingAccountsLen", - msg: "Invalid remaining accounts length", - }, - { - code: 6028, - name: "InvalidRemainingAccounts", - msg: "Invalid remaining account", - }, - { - code: 6029, - name: "MismatchedDepegMint", - msg: "Token mint B doesn't matches depeg type token mint", - }, - { - code: 6030, - name: "InvalidApyAccount", - msg: "Invalid APY account", - }, - { - code: 6031, - name: "InvalidTokenMultiplier", - msg: "Invalid token multiplier", - }, - { - code: 6032, - name: "InvalidDepegInformation", - msg: "Invalid depeg information", - }, - { - code: 6033, - name: "UpdateTimeConstraint", - msg: "Update time constraint violated", - }, - { - code: 6034, - name: "ExceedMaxFeeBps", - msg: "Exceeded max fee bps", - }, - { - code: 6035, - name: "InvalidAdmin", - msg: "Invalid admin", - }, - { - code: 6036, - name: "PoolIsNotPermissioned", - msg: "Pool is not permissioned", - }, - { - code: 6037, - name: "InvalidDepositAmount", - msg: "Invalid deposit amount", - }, - { - code: 6038, - name: "InvalidFeeOwner", - msg: "Invalid fee owner", - }, - { - code: 6039, - name: "NonDepletedPool", - msg: "Pool is not depleted", - }, - { - code: 6040, - name: "AmountNotPeg", - msg: "Token amount is not 1:1", - }, - { - code: 6041, - name: "AmountIsZero", - msg: "Amount is zero", - }, - { - code: 6042, - name: "TypeCastFailed", - msg: "Type cast error", - }, - { - code: 6043, - name: "AmountIsNotEnough", - msg: "Amount is not enough", - }, - { - code: 6044, - name: "InvalidActivationSlotInDuration", - msg: "Invalid activation slot in duration", - }, - ], -}; - -const IDL = { - version: "0.4.12", - name: "amm", - docs: ["Program for AMM"], - instructions: [ - { - name: "initializePermissionedPool", - docs: ["Initialize a new permissioned pool."], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: true, - docs: ["Pool account (arbitrary address)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "tokenAMint", - isMut: false, - isSigner: false, - docs: ["Token A mint of the pool. Eg: USDT"], - }, - { - name: "tokenBMint", - isMut: false, - isSigner: false, - docs: ["Token B mint of the pool. Eg: USDC"], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault A"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault B"], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "adminTokenA", - isMut: true, - isSigner: false, - docs: [ - "Admin token account for pool token A mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "adminTokenB", - isMut: true, - isSigner: false, - docs: [ - "Admin token account for pool token B mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "adminPoolLp", - isMut: true, - isSigner: false, - docs: [ - "Admin pool LP token account. Used to receive LP during first deposit (initialize pool)", - "Admin pool LP token account. Used to receive LP during first deposit (initialize pool)", - ], - }, - { - name: "protocolTokenAFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token A. Used to receive trading fee.", - ], - }, - { - name: "protocolTokenBFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token B. Used to receive trading fee.", - ], - }, - { - name: "admin", - isMut: true, - isSigner: true, - docs: [ - "Admin account. This account will be the admin of the pool, and the payer for PDA during initialize pool.", - ], - }, - { - name: "feeOwner", - isMut: false, - isSigner: false, - }, - { - name: "rent", - isMut: false, - isSigner: false, - docs: ["Rent account."], - }, - { - name: "mintMetadata", - isMut: true, - isSigner: false, - }, - { - name: "metadataProgram", - isMut: false, - isSigner: false, - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. The pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - { - name: "associatedTokenProgram", - isMut: false, - isSigner: false, - docs: ["Associated token program."], - }, - { - name: "systemProgram", - isMut: false, - isSigner: false, - docs: ["System program."], - }, - ], - args: [ - { - name: "curveType", - type: { - defined: "CurveType", - }, - }, - ], - }, - { - name: "initializePermissionlessPool", - docs: ["Initialize a new permissionless pool."], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA address)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "tokenAMint", - isMut: false, - isSigner: false, - docs: ["Token A mint of the pool. Eg: USDT"], - }, - { - name: "tokenBMint", - isMut: false, - isSigner: false, - docs: ["Token B mint of the pool. Eg: USDC"], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault A"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault B"], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "payerTokenA", - isMut: true, - isSigner: false, - docs: [ - "Payer token account for pool token A mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "payerTokenB", - isMut: true, - isSigner: false, - docs: [ - "Admin token account for pool token B mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "payerPoolLp", - isMut: true, - isSigner: false, - }, - { - name: "protocolTokenAFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token A. Used to receive trading fee.", - ], - }, - { - name: "protocolTokenBFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token B. Used to receive trading fee.", - ], - }, - { - name: "payer", - isMut: true, - isSigner: true, - docs: [ - "Admin account. This account will be the admin of the pool, and the payer for PDA during initialize pool.", - ], - }, - { - name: "feeOwner", - isMut: false, - isSigner: false, - }, - { - name: "rent", - isMut: false, - isSigner: false, - docs: ["Rent account."], - }, - { - name: "mintMetadata", - isMut: true, - isSigner: false, - }, - { - name: "metadataProgram", - isMut: false, - isSigner: false, - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. The pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - { - name: "associatedTokenProgram", - isMut: false, - isSigner: false, - docs: ["Associated token program."], - }, - { - name: "systemProgram", - isMut: false, - isSigner: false, - docs: ["System program."], - }, - ], - args: [ - { - name: "curveType", - type: { - defined: "CurveType", - }, - }, - { - name: "tokenAAmount", - type: "u64", - }, - { - name: "tokenBAmount", - type: "u64", - }, - ], - }, - { - name: "initializePermissionlessPoolWithFeeTier", - docs: ["Initialize a new permissionless pool with customized fee tier"], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA address)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "tokenAMint", - isMut: false, - isSigner: false, - docs: ["Token A mint of the pool. Eg: USDT"], - }, - { - name: "tokenBMint", - isMut: false, - isSigner: false, - docs: ["Token B mint of the pool. Eg: USDC"], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault A"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault B"], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "payerTokenA", - isMut: true, - isSigner: false, - docs: [ - "Payer token account for pool token A mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "payerTokenB", - isMut: true, - isSigner: false, - docs: [ - "Admin token account for pool token B mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "payerPoolLp", - isMut: true, - isSigner: false, - }, - { - name: "protocolTokenAFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token A. Used to receive trading fee.", - ], - }, - { - name: "protocolTokenBFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token B. Used to receive trading fee.", - ], - }, - { - name: "payer", - isMut: true, - isSigner: true, - docs: [ - "Admin account. This account will be the admin of the pool, and the payer for PDA during initialize pool.", - ], - }, - { - name: "feeOwner", - isMut: false, - isSigner: false, - }, - { - name: "rent", - isMut: false, - isSigner: false, - docs: ["Rent account."], - }, - { - name: "mintMetadata", - isMut: true, - isSigner: false, - }, - { - name: "metadataProgram", - isMut: false, - isSigner: false, - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. The pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - { - name: "associatedTokenProgram", - isMut: false, - isSigner: false, - docs: ["Associated token program."], - }, - { - name: "systemProgram", - isMut: false, - isSigner: false, - docs: ["System program."], - }, - ], - args: [ - { - name: "curveType", - type: { - defined: "CurveType", - }, - }, - { - name: "tradeFeeBps", - type: "u64", - }, - { - name: "tokenAAmount", - type: "u64", - }, - { - name: "tokenBAmount", - type: "u64", - }, - ], - }, - { - name: "enableOrDisablePool", - docs: [ - "Enable or disable a pool. A disabled pool allow only remove balanced liquidity operation.", - ], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "admin", - isMut: false, - isSigner: true, - docs: ["Admin account. Must be owner of the pool."], - }, - ], - args: [ - { - name: "enable", - type: "bool", - }, - ], - }, - { - name: "swap", - docs: [ - "Swap token A to B, or vice versa. An amount of trading fee will be charged for liquidity provider, and the admin of the pool.", - ], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "userSourceToken", - isMut: true, - isSigner: false, - docs: [ - "User token account. Token from this account will be transfer into the vault by the pool in exchange for another token of the pool.", - ], - }, - { - name: "userDestinationToken", - isMut: true, - isSigner: false, - docs: [ - "User token account. The exchanged token will be transfer into this account from the pool.", - ], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["Lp token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["Lp token mint of vault b"], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "protocolTokenFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account. Used to receive trading fee. It's mint field must matched with user_source_token mint field.", - ], - }, - { - name: "user", - isMut: false, - isSigner: true, - docs: ["User account. Must be owner of user_source_token."], - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. the pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - ], - args: [ - { - name: "inAmount", - type: "u64", - }, - { - name: "minimumOutAmount", - type: "u64", - }, - ], - }, - { - name: "removeLiquiditySingleSide", - docs: [ - "Withdraw only single token from the pool. Only supported by pool with stable swap curve.", - ], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "userPoolLp", - isMut: true, - isSigner: false, - docs: [ - "User pool lp token account. LP will be burned from this account upon success liquidity removal.", - ], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault A"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault B"], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "userDestinationToken", - isMut: true, - isSigner: false, - docs: [ - "User token account to receive token upon success liquidity removal.", - ], - }, - { - name: "user", - isMut: false, - isSigner: true, - docs: ["User account. Must be owner of the user_pool_lp account."], - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. The pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - ], - args: [ - { - name: "poolTokenAmount", - type: "u64", - }, - { - name: "minimumOutAmount", - type: "u64", - }, - ], - }, - { - name: "addImbalanceLiquidity", - docs: [ - "Deposit tokens to the pool in an imbalance ratio. Only supported by pool with stable swap curve.", - ], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "userPoolLp", - isMut: true, - isSigner: false, - docs: [ - "user pool lp token account. lp will be burned from this account upon success liquidity removal.", - ], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault b"], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "userAToken", - isMut: true, - isSigner: false, - docs: [ - "User token A account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "userBToken", - isMut: true, - isSigner: false, - docs: [ - "User token B account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "user", - isMut: false, - isSigner: true, - docs: [ - "User account. Must be owner of user_a_token, and user_b_token.", - ], - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. the pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - ], - args: [ - { - name: "minimumPoolTokenAmount", - type: "u64", - }, - { - name: "tokenAAmount", - type: "u64", - }, - { - name: "tokenBAmount", - type: "u64", - }, - ], - }, - { - name: "removeBalanceLiquidity", - docs: [ - "Withdraw tokens from the pool in a balanced ratio. User will still able to withdraw from pool even the pool is disabled. This allow user to exit their liquidity when there's some unforeseen event happen.", - ], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "userPoolLp", - isMut: true, - isSigner: false, - docs: [ - "user pool lp token account. lp will be burned from this account upon success liquidity removal.", - ], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault b"], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "userAToken", - isMut: true, - isSigner: false, - docs: [ - "User token A account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "userBToken", - isMut: true, - isSigner: false, - docs: [ - "User token B account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "user", - isMut: false, - isSigner: true, - docs: [ - "User account. Must be owner of user_a_token, and user_b_token.", - ], - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. the pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - ], - args: [ - { - name: "poolTokenAmount", - type: "u64", - }, - { - name: "minimumATokenOut", - type: "u64", - }, - { - name: "minimumBTokenOut", - type: "u64", - }, - ], - }, - { - name: "addBalanceLiquidity", - docs: ["Deposit tokens to the pool in a balanced ratio."], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "userPoolLp", - isMut: true, - isSigner: false, - docs: [ - "user pool lp token account. lp will be burned from this account upon success liquidity removal.", - ], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault b"], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "userAToken", - isMut: true, - isSigner: false, - docs: [ - "User token A account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "userBToken", - isMut: true, - isSigner: false, - docs: [ - "User token B account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "user", - isMut: false, - isSigner: true, - docs: [ - "User account. Must be owner of user_a_token, and user_b_token.", - ], - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. the pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - ], - args: [ - { - name: "poolTokenAmount", - type: "u64", - }, - { - name: "maximumTokenAAmount", - type: "u64", - }, - { - name: "maximumTokenBAmount", - type: "u64", - }, - ], - }, - { - name: "setPoolFees", - docs: ["Update trading fee charged for liquidity provider, and admin."], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "admin", - isMut: false, - isSigner: true, - docs: ["Admin account. Must be owner of the pool."], - }, - ], - args: [ - { - name: "fees", - type: { - defined: "PoolFees", - }, - }, - ], - }, - { - name: "overrideCurveParam", - docs: [ - "Update swap curve parameters. This function do not allow update of curve type. For example: stable swap curve to constant product curve. Only supported by pool with stable swap curve.", - "Only amp is allowed to be override. The other attributes of stable swap curve will be ignored.", - ], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "admin", - isMut: false, - isSigner: true, - docs: ["Admin account. Must be owner of the pool."], - }, - ], - args: [ - { - name: "curveType", - type: { - defined: "CurveType", - }, - }, - ], - }, - { - name: "transferAdmin", - docs: ["Transfer the admin of the pool to new admin."], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "admin", - isMut: false, - isSigner: true, - docs: ["Admin account. Must be owner of the pool."], - }, - { - name: "newAdmin", - isMut: false, - isSigner: true, - docs: ["New admin account."], - }, - ], - args: [], - }, - { - name: "getPoolInfo", - docs: ["Get the general information of the pool."], - accounts: [ - { - name: "pool", - isMut: false, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "lpMint", - isMut: false, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "aVaultLp", - isMut: false, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: false, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVault", - isMut: false, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: false, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLpMint", - isMut: false, - isSigner: false, - docs: ["LP token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: false, - isSigner: false, - docs: ["LP token mint of vault b"], - }, - ], - args: [], - }, - { - name: "bootstrapLiquidity", - docs: ["Bootstrap the pool when liquidity is depleted."], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA)"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "userPoolLp", - isMut: true, - isSigner: false, - docs: [ - "user pool lp token account. lp will be burned from this account upon success liquidity removal.", - ], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault b"], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "userAToken", - isMut: true, - isSigner: false, - docs: [ - "User token A account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "userBToken", - isMut: true, - isSigner: false, - docs: [ - "User token B account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "user", - isMut: false, - isSigner: true, - docs: [ - "User account. Must be owner of user_a_token, and user_b_token.", - ], - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. the pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - ], - args: [ - { - name: "tokenAAmount", - type: "u64", - }, - { - name: "tokenBAmount", - type: "u64", - }, - ], - }, - { - name: "createMintMetadata", - docs: ["Create mint metadata account for old pools"], - accounts: [ - { - name: "pool", - isMut: false, - isSigner: false, - docs: ["Pool account"], - }, - { - name: "lpMint", - isMut: false, - isSigner: false, - docs: ["LP mint account of the pool"], - }, - { - name: "aVaultLp", - isMut: false, - isSigner: false, - docs: ["Vault A LP account of the pool"], - }, - { - name: "mintMetadata", - isMut: true, - isSigner: false, - }, - { - name: "metadataProgram", - isMut: false, - isSigner: false, - }, - { - name: "systemProgram", - isMut: false, - isSigner: false, - docs: ["System program."], - }, - { - name: "payer", - isMut: true, - isSigner: true, - docs: ["Payer"], - }, - ], - args: [], - }, - { - name: "createLockEscrow", - docs: ["Create lock account"], - accounts: [ - { - name: "pool", - isMut: false, - isSigner: false, - docs: ["Pool account"], - }, - { - name: "lockEscrow", - isMut: true, - isSigner: false, - docs: ["Lock account"], - }, - { - name: "owner", - isMut: false, - isSigner: false, - }, - { - name: "lpMint", - isMut: false, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "payer", - isMut: true, - isSigner: true, - docs: ["Payer account"], - }, - { - name: "systemProgram", - isMut: false, - isSigner: false, - docs: ["System program."], - }, - ], - args: [], - }, - { - name: "lock", - docs: ["Lock Lp token"], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account"], - }, - { - name: "lpMint", - isMut: false, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "lockEscrow", - isMut: true, - isSigner: false, - docs: ["Lock account"], - }, - { - name: "owner", - isMut: true, - isSigner: true, - docs: ["Owner of lock account"], - }, - { - name: "sourceTokens", - isMut: true, - isSigner: false, - docs: ["owner lp token account"], - }, - { - name: "escrowVault", - isMut: true, - isSigner: false, - docs: ["Escrow vault"], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - { - name: "aVault", - isMut: false, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: false, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLp", - isMut: false, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: false, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVaultLpMint", - isMut: false, - isSigner: false, - docs: ["LP token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: false, - isSigner: false, - docs: ["LP token mint of vault b"], - }, - ], - args: [ - { - name: "maxAmount", - type: "u64", - }, - ], - }, - { - name: "claimFee", - docs: ["Claim fee"], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account"], - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "lockEscrow", - isMut: true, - isSigner: false, - docs: ["Lock account"], - }, - { - name: "owner", - isMut: true, - isSigner: true, - docs: ["Owner of lock account"], - }, - { - name: "sourceTokens", - isMut: true, - isSigner: false, - docs: ["owner lp token account"], - }, - { - name: "escrowVault", - isMut: true, - isSigner: false, - docs: ["Escrow vault"], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault a"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault b"], - }, - { - name: "userAToken", - isMut: true, - isSigner: false, - docs: [ - "User token A account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "userBToken", - isMut: true, - isSigner: false, - docs: [ - "User token B account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.", - ], - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. the pool will deposit/withdraw liquidity from the vault.", - ], - }, - ], - args: [ - { - name: "maxAmount", - type: "u64", - }, - ], - }, - { - name: "createConfig", - docs: ["Create config"], - accounts: [ - { - name: "config", - isMut: true, - isSigner: false, - }, - { - name: "admin", - isMut: true, - isSigner: true, - }, - { - name: "systemProgram", - isMut: false, - isSigner: false, - }, - ], - args: [ - { - name: "configParameters", - type: { - defined: "ConfigParameters", - }, - }, - ], - }, - { - name: "closeConfig", - docs: ["Close config"], - accounts: [ - { - name: "config", - isMut: true, - isSigner: false, - }, - { - name: "admin", - isMut: true, - isSigner: true, - }, - { - name: "rentReceiver", - isMut: true, - isSigner: false, - }, - ], - args: [], - }, - { - name: "initializePermissionlessConstantProductPoolWithConfig", - docs: ["Initialize permissionless pool with config"], - accounts: [ - { - name: "pool", - isMut: true, - isSigner: false, - docs: ["Pool account (PDA address)"], - }, - { - name: "config", - isMut: false, - isSigner: false, - }, - { - name: "lpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of the pool"], - }, - { - name: "tokenAMint", - isMut: false, - isSigner: false, - docs: ["Token A mint of the pool. Eg: USDT"], - }, - { - name: "tokenBMint", - isMut: false, - isSigner: false, - docs: ["Token B mint of the pool. Eg: USDC"], - }, - { - name: "aVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "bVault", - isMut: true, - isSigner: false, - docs: [ - "Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.", - ], - }, - { - name: "aTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault A"], - }, - { - name: "bTokenVault", - isMut: true, - isSigner: false, - docs: ["Token vault account of vault B"], - }, - { - name: "aVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault A"], - }, - { - name: "bVaultLpMint", - isMut: true, - isSigner: false, - docs: ["LP token mint of vault B"], - }, - { - name: "aVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "bVaultLp", - isMut: true, - isSigner: false, - docs: [ - "LP token account of vault B. Used to receive/burn vault LP upon deposit/withdraw from the vault.", - ], - }, - { - name: "payerTokenA", - isMut: true, - isSigner: false, - docs: [ - "Payer token account for pool token A mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "payerTokenB", - isMut: true, - isSigner: false, - docs: [ - "Admin token account for pool token B mint. Used to bootstrap the pool with initial liquidity.", - ], - }, - { - name: "payerPoolLp", - isMut: true, - isSigner: false, - }, - { - name: "protocolTokenAFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token A. Used to receive trading fee.", - ], - }, - { - name: "protocolTokenBFee", - isMut: true, - isSigner: false, - docs: [ - "Protocol fee token account for token B. Used to receive trading fee.", - ], - }, - { - name: "payer", - isMut: true, - isSigner: true, - docs: [ - "Admin account. This account will be the admin of the pool, and the payer for PDA during initialize pool.", - ], - }, - { - name: "rent", - isMut: false, - isSigner: false, - docs: ["Rent account."], - }, - { - name: "mintMetadata", - isMut: true, - isSigner: false, - }, - { - name: "metadataProgram", - isMut: false, - isSigner: false, - }, - { - name: "vaultProgram", - isMut: false, - isSigner: false, - docs: [ - "Vault program. The pool will deposit/withdraw liquidity from the vault.", - ], - }, - { - name: "tokenProgram", - isMut: false, - isSigner: false, - docs: ["Token program."], - }, - { - name: "associatedTokenProgram", - isMut: false, - isSigner: false, - docs: ["Associated token program."], - }, - { - name: "systemProgram", - isMut: false, - isSigner: false, - docs: ["System program."], - }, - ], - args: [ - { - name: "tokenAAmount", - type: "u64", - }, - { - name: "tokenBAmount", - type: "u64", - }, - ], - }, - ], - accounts: [ - { - name: "config", - type: { - kind: "struct", - fields: [ - { - name: "poolFees", - type: { - defined: "PoolFees", - }, - }, - { - name: "activationDurationInSlot", - type: "u64", - }, - { - name: "vaultConfigKey", - type: "publicKey", - }, - { - name: "padding", - type: { - array: ["u8", 260], - }, - }, - ], - }, - }, - { - name: "lockEscrow", - docs: ["State of lock escrow account"], - type: { - kind: "struct", - fields: [ - { - name: "pool", - docs: ["Pool address"], - type: "publicKey", - }, - { - name: "owner", - docs: ["Owner address"], - type: "publicKey", - }, - { - name: "escrowVault", - docs: ["Vault address, store the lock user lock"], - type: "publicKey", - }, - { - name: "bump", - docs: ["bump, used to sign"], - type: "u8", - }, - { - name: "totalLockedAmount", - docs: ["Total locked amount"], - type: "u64", - }, - { - name: "lpPerToken", - docs: ["Lp per token, virtual price of lp token"], - type: "u128", - }, - { - name: "unclaimedFeePending", - docs: ["Unclaimed fee pending"], - type: "u64", - }, - { - name: "aFee", - docs: ["Total a fee claimed so far"], - type: "u64", - }, - { - name: "bFee", - docs: ["Total b fee claimed so far"], - type: "u64", - }, - ], - }, - }, - { - name: "pool", - docs: ["State of pool account"], - type: { - kind: "struct", - fields: [ - { - name: "lpMint", - docs: ["LP token mint of the pool"], - type: "publicKey", - }, - { - name: "tokenAMint", - docs: ["Token A mint of the pool. Eg: USDT"], - type: "publicKey", - }, - { - name: "tokenBMint", - docs: ["Token B mint of the pool. Eg: USDC"], - type: "publicKey", - }, - { - name: "aVault", - docs: [ - "Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.", - ], - type: "publicKey", - }, - { - name: "bVault", - docs: [ - "Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.", - ], - type: "publicKey", - }, - { - name: "aVaultLp", - docs: [ - "LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - type: "publicKey", - }, - { - name: "bVaultLp", - docs: [ - "LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.", - ], - type: "publicKey", - }, - { - name: "aVaultLpBump", - docs: ['"A" vault lp bump. Used to create signer seeds.'], - type: "u8", - }, - { - name: "enabled", - docs: [ - "Flag to determine whether the pool is enabled, or disabled.", - ], - type: "bool", - }, - { - name: "protocolTokenAFee", - docs: [ - "Protocol fee token account for token A. Used to receive trading fee.", - ], - type: "publicKey", - }, - { - name: "protocolTokenBFee", - docs: [ - "Protocol fee token account for token B. Used to receive trading fee.", - ], - type: "publicKey", - }, - { - name: "admin", - docs: ["Owner of the pool."], - type: "publicKey", - }, - { - name: "fees", - docs: ["Store the fee charges setting."], - type: { - defined: "PoolFees", - }, - }, - { - name: "poolType", - docs: ["Pool type"], - type: { - defined: "PoolType", - }, - }, - { - name: "stake", - docs: ["Stake pubkey of SPL stake pool"], - type: "publicKey", - }, - { - name: "totalLockedLp", - docs: ["Total locked lp token"], - type: "u64", - }, - { - name: "alphaVault", - docs: ["Alpha vault config"], - type: { - defined: "AlphaVault", - }, - }, - { - name: "padding", - docs: ["Padding for future pool field"], - type: { - defined: "Padding", - }, - }, - { - name: "curveType", - docs: ["The type of the swap curve supported by the pool."], - type: { - defined: "CurveType", - }, - }, - ], - }, - }, - ], - types: [ - { - name: "TokenMultiplier", - docs: [ - "Multiplier for the pool token. Used to normalized token with different decimal into the same precision.", - ], - type: { - kind: "struct", - fields: [ - { - name: "tokenAMultiplier", - docs: ["Multiplier for token A of the pool."], - type: "u64", - }, - { - name: "tokenBMultiplier", - docs: ["Multiplier for token B of the pool."], - type: "u64", - }, - { - name: "precisionFactor", - docs: [ - "Record the highest token decimal in the pool. For example, Token A is 6 decimal, token B is 9 decimal. This will save value of 9.", - ], - type: "u8", - }, - ], - }, - }, - { - name: "PoolFees", - docs: ["Information regarding fee charges"], - type: { - kind: "struct", - fields: [ - { - name: "tradeFeeNumerator", - docs: [ - "Trade fees are extra token amounts that are held inside the token", - "accounts during a trade, making the value of liquidity tokens rise.", - "Trade fee numerator", - ], - type: "u64", - }, - { - name: "tradeFeeDenominator", - docs: ["Trade fee denominator"], - type: "u64", - }, - { - name: "protocolTradeFeeNumerator", - docs: [ - "Protocol trading fees are extra token amounts that are held inside the token", - "accounts during a trade, with the equivalent in pool tokens minted to", - "the protocol of the program.", - "Protocol trade fee numerator", - ], - type: "u64", - }, - { - name: "protocolTradeFeeDenominator", - docs: ["Protocol trade fee denominator"], - type: "u64", - }, - ], - }, - }, - { - name: "Depeg", - docs: ["Contains information for depeg pool"], - type: { - kind: "struct", - fields: [ - { - name: "baseVirtualPrice", - docs: ["The virtual price of staking / interest bearing token"], - type: "u64", - }, - { - name: "baseCacheUpdated", - docs: ["The virtual price of staking / interest bearing token"], - type: "u64", - }, - { - name: "depegType", - docs: ["Type of the depeg pool"], - type: { - defined: "DepegType", - }, - }, - ], - }, - }, - { - name: "ConfigParameters", - type: { - kind: "struct", - fields: [ - { - name: "tradeFeeNumerator", - type: "u64", - }, - { - name: "protocolTradeFeeNumerator", - type: "u64", - }, - { - name: "activationDurationInSlot", - type: "u64", - }, - { - name: "vaultConfigKey", - type: "publicKey", - }, - { - name: "index", - type: "u64", - }, - ], - }, - }, - { - name: "Padding", - docs: ["Padding for future pool fields"], - type: { - kind: "struct", - fields: [ - { - name: "padding0", - docs: ["Padding 0"], - type: { - array: ["u8", 15], - }, - }, - { - name: "padding", - docs: ["Padding 1"], - type: { - array: ["u128", 24], - }, - }, - ], - }, - }, - { - name: "AlphaVault", - type: { - kind: "struct", - fields: [ - { - name: "activationSlot", - docs: ["Activation slot"], - type: "u64", - }, - { - name: "whitelistedVault", - docs: ["Whitelisted vault to be able to buy pool before open slot"], - type: "publicKey", - }, - { - name: "poolCreator", - docs: [ - "Need to store pool creator in lauch pool, so they can modify liquidity before activation slot", - ], - type: "publicKey", - }, - ], - }, - }, - { - name: "RoundDirection", - docs: ["Rounding direction"], - type: { - kind: "enum", - variants: [ - { - name: "Floor", - }, - { - name: "Ceiling", - }, - ], - }, - }, - { - name: "TradeDirection", - docs: ["Trade (swap) direction"], - type: { - kind: "enum", - variants: [ - { - name: "AtoB", - }, - { - name: "BtoA", - }, - ], - }, - }, - { - name: "NewCurveType", - docs: ["Type of the swap curve"], - type: { - kind: "enum", - variants: [ - { - name: "ConstantProduct", - }, - { - name: "Stable", - fields: [ - { - name: "amp", - docs: ["Amplification coefficient"], - type: "u64", - }, - { - name: "token_multiplier", - docs: [ - "Multiplier for the pool token. Used to normalized token with different decimal into the same precision.", - ], - type: { - defined: "TokenMultiplier", - }, - }, - { - name: "depeg", - docs: [ - "Depeg pool information. Contains functions to allow token amount to be repeg using stake / interest bearing token virtual price", - ], - type: { - defined: "Depeg", - }, - }, - { - name: "last_amp_updated_timestamp", - docs: [ - "The last amp updated timestamp. Used to prevent update_curve_info called infinitely many times within a short period", - ], - type: "u64", - }, - ], - }, - { - name: "NewCurve", - fields: [ - { - name: "field_one", - type: "u64", - }, - { - name: "field_two", - type: "u64", - }, - ], - }, - ], - }, - }, - { - name: "CurveType", - docs: ["Type of the swap curve"], - type: { - kind: "enum", - variants: [ - { - name: "ConstantProduct", - }, - { - name: "Stable", - fields: [ - { - name: "amp", - docs: ["Amplification coefficient"], - type: "u64", - }, - { - name: "token_multiplier", - docs: [ - "Multiplier for the pool token. Used to normalized token with different decimal into the same precision.", - ], - type: { - defined: "TokenMultiplier", - }, - }, - { - name: "depeg", - docs: [ - "Depeg pool information. Contains functions to allow token amount to be repeg using stake / interest bearing token virtual price", - ], - type: { - defined: "Depeg", - }, - }, - { - name: "last_amp_updated_timestamp", - docs: [ - "The last amp updated timestamp. Used to prevent update_curve_info called infinitely many times within a short period", - ], - type: "u64", - }, - ], - }, - ], - }, - }, - { - name: "DepegType", - docs: ["Type of depeg pool"], - type: { - kind: "enum", - variants: [ - { - name: "None", - }, - { - name: "Marinade", - }, - { - name: "Lido", - }, - { - name: "SplStake", - }, - ], - }, - }, - { - name: "Rounding", - docs: ["Round up, down"], - type: { - kind: "enum", - variants: [ - { - name: "Up", - }, - { - name: "Down", - }, - ], - }, - }, - { - name: "PoolType", - docs: ["Pool type"], - type: { - kind: "enum", - variants: [ - { - name: "Permissioned", - }, - { - name: "Permissionless", - }, - ], - }, - }, - ], - events: [ - { - name: "AddLiquidity", - fields: [ - { - name: "lpMintAmount", - type: "u64", - index: false, - }, - { - name: "tokenAAmount", - type: "u64", - index: false, - }, - { - name: "tokenBAmount", - type: "u64", - index: false, - }, - ], - }, - { - name: "RemoveLiquidity", - fields: [ - { - name: "lpUnmintAmount", - type: "u64", - index: false, - }, - { - name: "tokenAOutAmount", - type: "u64", - index: false, - }, - { - name: "tokenBOutAmount", - type: "u64", - index: false, - }, - ], - }, - { - name: "BootstrapLiquidity", - fields: [ - { - name: "lpMintAmount", - type: "u64", - index: false, - }, - { - name: "tokenAAmount", - type: "u64", - index: false, - }, - { - name: "tokenBAmount", - type: "u64", - index: false, - }, - { - name: "pool", - type: "publicKey", - index: false, - }, - ], - }, - { - name: "Swap", - fields: [ - { - name: "inAmount", - type: "u64", - index: false, - }, - { - name: "outAmount", - type: "u64", - index: false, - }, - { - name: "tradeFee", - type: "u64", - index: false, - }, - { - name: "protocolFee", - type: "u64", - index: false, - }, - { - name: "hostFee", - type: "u64", - index: false, - }, - ], - }, - { - name: "SetPoolFees", - fields: [ - { - name: "tradeFeeNumerator", - type: "u64", - index: false, - }, - { - name: "tradeFeeDenominator", - type: "u64", - index: false, - }, - { - name: "protocolTradeFeeNumerator", - type: "u64", - index: false, - }, - { - name: "protocolTradeFeeDenominator", - type: "u64", - index: false, - }, - { - name: "pool", - type: "publicKey", - index: false, - }, - ], - }, - { - name: "PoolInfo", - fields: [ - { - name: "tokenAAmount", - type: "u64", - index: false, - }, - { - name: "tokenBAmount", - type: "u64", - index: false, - }, - { - name: "virtualPrice", - type: "f64", - index: false, - }, - { - name: "currentTimestamp", - type: "u64", - index: false, - }, - ], - }, - { - name: "TransferAdmin", - fields: [ - { - name: "admin", - type: "publicKey", - index: false, - }, - { - name: "newAdmin", - type: "publicKey", - index: false, - }, - { - name: "pool", - type: "publicKey", - index: false, - }, - ], - }, - { - name: "OverrideCurveParam", - fields: [ - { - name: "newAmp", - type: "u64", - index: false, - }, - { - name: "updatedTimestamp", - type: "u64", - index: false, - }, - { - name: "pool", - type: "publicKey", - index: false, - }, - ], - }, - { - name: "PoolCreated", - fields: [ - { - name: "lpMint", - type: "publicKey", - index: false, - }, - { - name: "tokenAMint", - type: "publicKey", - index: false, - }, - { - name: "tokenBMint", - type: "publicKey", - index: false, - }, - { - name: "poolType", - type: { - defined: "PoolType", - }, - index: false, - }, - { - name: "pool", - type: "publicKey", - index: false, - }, - ], - }, - { - name: "PoolEnabled", - fields: [ - { - name: "pool", - type: "publicKey", - index: false, - }, - { - name: "enabled", - type: "bool", - index: false, - }, - ], - }, - { - name: "MigrateFeeAccount", - fields: [ - { - name: "pool", - type: "publicKey", - index: false, - }, - { - name: "newAdminTokenAFee", - type: "publicKey", - index: false, - }, - { - name: "newAdminTokenBFee", - type: "publicKey", - index: false, - }, - { - name: "tokenAAmount", - type: "u64", - index: false, - }, - { - name: "tokenBAmount", - type: "u64", - index: false, - }, - ], - }, - { - name: "CreateLockEscrow", - fields: [ - { - name: "pool", - type: "publicKey", - index: false, - }, - { - name: "owner", - type: "publicKey", - index: false, - }, - ], - }, - { - name: "Lock", - fields: [ - { - name: "pool", - type: "publicKey", - index: false, - }, - { - name: "owner", - type: "publicKey", - index: false, - }, - { - name: "amount", - type: "u64", - index: false, - }, - ], - }, - { - name: "ClaimFee", - fields: [ - { - name: "pool", - type: "publicKey", - index: false, - }, - { - name: "owner", - type: "publicKey", - index: false, - }, - { - name: "amount", - type: "u64", - index: false, - }, - { - name: "aFee", - type: "u64", - index: false, - }, - { - name: "bFee", - type: "u64", - index: false, - }, - ], - }, - { - name: "CreateConfig", - fields: [ - { - name: "tradeFeeNumerator", - type: "u64", - index: false, - }, - { - name: "protocolTradeFeeNumerator", - type: "u64", - index: false, - }, - { - name: "config", - type: "publicKey", - index: false, - }, - ], - }, - { - name: "CloseConfig", - fields: [ - { - name: "config", - type: "publicKey", - index: false, - }, - ], - }, - ], - errors: [ - { - code: 6000, - name: "MathOverflow", - msg: "Math operation overflow", - }, - { - code: 6001, - name: "InvalidFee", - msg: "Invalid fee setup", - }, - { - code: 6002, - name: "InvalidInvariant", - msg: "Invalid invariant d", - }, - { - code: 6003, - name: "FeeCalculationFailure", - msg: "Fee calculation failure", - }, - { - code: 6004, - name: "ExceededSlippage", - msg: "Exceeded slippage tolerance", - }, - { - code: 6005, - name: "InvalidCalculation", - msg: "Invalid curve calculation", - }, - { - code: 6006, - name: "ZeroTradingTokens", - msg: "Given pool token amount results in zero trading tokens", - }, - { - code: 6007, - name: "ConversionError", - msg: "Math conversion overflow", - }, - { - code: 6008, - name: "FaultyLpMint", - msg: "LP mint authority must be 'A' vault lp, without freeze authority, and 0 supply", - }, - { - code: 6009, - name: "MismatchedTokenMint", - msg: "Token mint mismatched", - }, - { - code: 6010, - name: "MismatchedLpMint", - msg: "LP mint mismatched", - }, - { - code: 6011, - name: "MismatchedOwner", - msg: "Invalid lp token owner", - }, - { - code: 6012, - name: "InvalidVaultAccount", - msg: "Invalid vault account", - }, - { - code: 6013, - name: "InvalidVaultLpAccount", - msg: "Invalid vault lp account", - }, - { - code: 6014, - name: "InvalidPoolLpMintAccount", - msg: "Invalid pool lp mint account", - }, - { - code: 6015, - name: "PoolDisabled", - msg: "Pool disabled", - }, - { - code: 6016, - name: "InvalidAdminAccount", - msg: "Invalid admin account", - }, - { - code: 6017, - name: "InvalidProtocolFeeAccount", - msg: "Invalid protocol fee account", - }, - { - code: 6018, - name: "SameAdminAccount", - msg: "Same admin account", - }, - { - code: 6019, - name: "IdenticalSourceDestination", - msg: "Identical user source and destination token account", - }, - { - code: 6020, - name: "ApyCalculationError", - msg: "Apy calculation error", - }, - { - code: 6021, - name: "InsufficientSnapshot", - msg: "Insufficient virtual price snapshot", - }, - { - code: 6022, - name: "NonUpdatableCurve", - msg: "Current curve is non-updatable", - }, - { - code: 6023, - name: "MisMatchedCurve", - msg: "New curve is mismatched with old curve", - }, - { - code: 6024, - name: "InvalidAmplification", - msg: "Amplification is invalid", - }, - { - code: 6025, - name: "UnsupportedOperation", - msg: "Operation is not supported", - }, - { - code: 6026, - name: "ExceedMaxAChanges", - msg: "Exceed max amplification changes", - }, - { - code: 6027, - name: "InvalidRemainingAccountsLen", - msg: "Invalid remaining accounts length", - }, - { - code: 6028, - name: "InvalidRemainingAccounts", - msg: "Invalid remaining account", - }, - { - code: 6029, - name: "MismatchedDepegMint", - msg: "Token mint B doesn't matches depeg type token mint", - }, - { - code: 6030, - name: "InvalidApyAccount", - msg: "Invalid APY account", - }, - { - code: 6031, - name: "InvalidTokenMultiplier", - msg: "Invalid token multiplier", - }, - { - code: 6032, - name: "InvalidDepegInformation", - msg: "Invalid depeg information", - }, - { - code: 6033, - name: "UpdateTimeConstraint", - msg: "Update time constraint violated", - }, - { - code: 6034, - name: "ExceedMaxFeeBps", - msg: "Exceeded max fee bps", - }, - { - code: 6035, - name: "InvalidAdmin", - msg: "Invalid admin", - }, - { - code: 6036, - name: "PoolIsNotPermissioned", - msg: "Pool is not permissioned", - }, - { - code: 6037, - name: "InvalidDepositAmount", - msg: "Invalid deposit amount", - }, - { - code: 6038, - name: "InvalidFeeOwner", - msg: "Invalid fee owner", - }, - { - code: 6039, - name: "NonDepletedPool", - msg: "Pool is not depleted", - }, - { - code: 6040, - name: "AmountNotPeg", - msg: "Token amount is not 1:1", - }, - { - code: 6041, - name: "AmountIsZero", - msg: "Amount is zero", - }, - { - code: 6042, - name: "TypeCastFailed", - msg: "Type cast error", - }, - { - code: 6043, - name: "AmountIsNotEnough", - msg: "Amount is not enough", - }, - { - code: 6044, - name: "InvalidActivationSlotInDuration", - msg: "Invalid activation slot in duration", - }, - ], -}; - -module.exports = { Amm, IDL }; diff --git a/src/Trading_dev/dex/meteora/swap.ts b/src/Trading_dev/dex/meteora/swap.ts index 317142d..c5c911b 100644 --- a/src/Trading_dev/dex/meteora/swap.ts +++ b/src/Trading_dev/dex/meteora/swap.ts @@ -1,18 +1,18 @@ -const DLMM = require('@meteora-ag/dlmm'); -const { PublicKey, Keypair } = require("@solana/web3.js"); -const BN = require("bn.js"); -const { Wallet, AnchorProvider, Program } = require("@project-serum/anchor"); -const { connection, wallet } = require("../../../helpers/config.js"); -const {PROGRAM_ID} = require("./constants.js") -const {fetchDLMMPoolId} = require("./fetch-pool.js") +import 'rpc-websockets/dist/lib/client'; +import { PublicKey, Keypair } from "@solana/web3.js"; +import DLMM from '@meteora-ag/dlmm'; +//const BN =require("bn.js"); +import { Wallet, AnchorProvider, Program } from "@project-serum/anchor"; +import { connection, wallet } from "../../../helpers/config"; +import {PROGRAM_ID} from "./constants"; +import {fetchDLMMPoolId} from "./fetch-pool"; -console.log("PROGRAM_ID", PROGRAM_ID); const ourWallet = new Wallet(wallet); -const provider = new AnchorProvider(connection, Wallet, { +const provider = new AnchorProvider(connection, ourWallet, { commitment: "confirmed", }); -async function swap(tokenAddress){ +async function swap(tokenAddress:string){ const poolId = await fetchDLMMPoolId(tokenAddress); const dlmmPool = await DLMM.create(connection, new PublicKey(poolId)); console.log(dlmmPool); diff --git a/src/Trading_dev/dex/orca/index.ts b/src/Trading_dev/dex/orca/index.ts index f23e23e..2fed279 100644 --- a/src/Trading_dev/dex/orca/index.ts +++ b/src/Trading_dev/dex/orca/index.ts @@ -1,23 +1,23 @@ -const { PublicKey } = require("@solana/web3.js"); -const { AnchorProvider } = require("@coral-xyz/anchor"); -const { DecimalUtil, Percentage } = require("@orca-so/common-sdk"); -const { +import { PublicKey } from "@solana/web3.js"; +import { AnchorProvider, Wallet } from "@coral-xyz/anchor"; +import { DecimalUtil, Percentage } from "@orca-so/common-sdk"; +import { WhirlpoolContext, buildWhirlpoolClient, ORCA_WHIRLPOOL_PROGRAM_ID, PDAUtil, swapQuoteByInputToken, IGNORE_CACHE, -} = require("@orca-so/whirlpools-sdk"); -const Decimal = require("decimal.js"); -const { +} from "@orca-so/whirlpools-sdk"; +import Decimal from "decimal.js"; +import { connection, dev_connection, wallet, -} = require("../../../helpers/config"); - +} from "../../../helpers/config"; +const ourWallet = new Wallet(wallet); async function main() { - const provider = new AnchorProvider(connection, wallet, { + const provider = new AnchorProvider(connection, ourWallet, { commitment: "confirmed", }); const ctx = WhirlpoolContext.withProvider( @@ -25,6 +25,7 @@ async function main() { ORCA_WHIRLPOOL_PROGRAM_ID ); const client = buildWhirlpoolClient(ctx); + console.log("Whirlpool client: ", client); console.log("RPC endpoint: ", ctx.connection.rpcEndpoint); console.log("Wallet public key: ", ctx.wallet.publicKey.toString()); } diff --git a/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-buy.ts b/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-buy.ts index 54efd05..c187c7b 100644 --- a/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-buy.ts +++ b/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-buy.ts @@ -1,22 +1,19 @@ -const { PublicKey } = require("@solana/web3.js"); -const { TOKEN_PROGRAM_ID, AccountLayout } = require("@solana/spl-token"); -const { +import { PublicKey } from "@solana/web3.js"; +import { TOKEN_PROGRAM_ID, AccountLayout } from "@solana/spl-token"; +import { connection, wallet, smart_money_wallet, -} = require("../../../helpers/config"); -//const { buy } = require("../../dex/jupiter/swap/buy-helper"); -//const { sell } = require("../../dex/jupiter/swap/sell-helper"); -const path = require("path"); -const { swap } = require("../../../jupiter/swap/swap-helper"); -const { buy } = require("../../../raydium/buy_helper"); -const { sell } = require("../../../raydium/sell_helper"); -const fs = require("fs"); +} from "../../../helpers/config"; +import path from "path" ; +import { swap } from "../../../jupiter/swap/swap-helper"; +import { buy } from "../../../raydium/buy_helper"; +import { sell } from "../../../raydium/sell_helper"; +import fs from "fs"; const boughtTokensPath = path.join(__dirname, "bought-tokens.json"); -//const {swap} = require("../../../Pool/swap") let walletsToListen = []; -var previous_trader_wallet_state = {}; -var previous_our_wallet_state = {}; +var previous_trader_wallet_state:any = {}; +var previous_our_wallet_state:any = {}; // [usdc, sol, usdt, wsol] const wsol = "So11111111111111111111111111111111111111112"; const quoteToken = [ @@ -27,7 +24,7 @@ const quoteToken = [ ]; let boughtTokens = JSON.parse(fs.readFileSync(boughtTokensPath, "utf8")); -async function saveToJson(token) { +export async function saveToJson(token:string) { boughtTokens.push(token); fs.writeFileSync(boughtTokensPath, JSON.stringify(boughtTokens, null, 2)); } @@ -36,7 +33,7 @@ async function saveToJson(token) { * Listens to changes in multiple wallets and performs trading actions based on the changes. * @returns {Promise} A promise that resolves once the wallet listening is set up. */ -async function listenToWallets(address) { +export async function listenToWallets(address:PublicKey) { try { connection.onProgramAccountChange( TOKEN_PROGRAM_ID, @@ -48,10 +45,10 @@ async function listenToWallets(address) { // realize in smart money wallet there is a token's balance changed // then we look at trader's portfolio console.log("Wallet state changed"); - const current_trader_wallet_state = await retriveWalletState( + const current_trader_wallet_state:any = await retriveWalletState( address.toBase58() ); - const current_our_wallet_state = await retriveWalletState( + const current_our_wallet_state:any = await retriveWalletState( wallet.publicKey.toBase58() ); if ( @@ -93,7 +90,7 @@ async function listenToWallets(address) { console.log("We don't have enough SOL to swap"); throw new Error("We don't have enough SOL to swap"); } - if ((!changedMint) in current_trader_wallet_state) { + if (!(changedMint in current_trader_wallet_state)) { current_trader_wallet_state[changedMint] = 0; } const sell_percentage = Math.abs( @@ -215,7 +212,7 @@ async function listenToWallets(address) { * @param {string} wallet_address - The address of the wallet to retrieve the state for. * @returns {Object} - An object containing the token balances of the wallet and the SOL balance. */ -async function retriveWalletState(wallet_address) { +async function retriveWalletState(wallet_address:string) { try { const filters = [ { @@ -232,13 +229,13 @@ async function retriveWalletState(wallet_address) { TOKEN_PROGRAM_ID, //new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") { filters: filters } ); - let results = {}; + let results:any = {}; const solBalance = await connection.getBalance( new PublicKey(wallet_address) ); accounts.forEach((account, i) => { //Parse the account data - const parsedAccountInfo = account.account.data; + const parsedAccountInfo:any = account.account.data; const mintAddress = parsedAccountInfo["parsed"]["info"]["mint"]; const tokenBalance = parsedAccountInfo["parsed"]["info"]["tokenAmount"]["uiAmount"]; @@ -256,9 +253,9 @@ async function retriveWalletState(wallet_address) { * Copies trades based on predefined parameters. * @returns {Promise} A promise that resolves when the trade copying is complete. */ -async function copy_buy() { +export async function copy_buy() { // smart money wallet address - let smart_money_address = smart_money_wallet; + let smart_money_address:any = smart_money_wallet; // our wallet address let our_wallet_address = wallet.publicKey.toBase58(); previous_trader_wallet_state = await retriveWalletState(smart_money_address); @@ -271,8 +268,3 @@ async function copy_buy() { } copy_buy(); -module.exports = { - copy_buy, - listenToWallets, - retriveWalletState, -}; diff --git a/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-sell.ts b/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-sell.ts index 0ade9fd..28e692d 100644 --- a/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-sell.ts +++ b/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-sell.ts @@ -1,20 +1,20 @@ -const { +import { PublicKey, -} = require("@solana/web3.js"); -const { +} from "@solana/web3.js"; +import { TOKEN_PROGRAM_ID, AccountLayout, -} = require("@solana/spl-token"); -const fs = require('fs'); -const path = require('path'); -const { wallet, connection, smart_money_wallet } = require("../../../helpers/config"); -//const { buy } = require("../../dex/jupiter/swap/buy-helper"); -//const { sell } = require("../../dex/jupiter/swap/sell-helper"); -const {sell} = require("../../../raydium/sell_helper") +} from "@solana/spl-token"; +import fs from 'fs'; +import path from 'path'; +import { wallet, connection, smart_money_wallet } from "../../../helpers/config"; +//import { buy } from("../../dex/jupiter/swap/buy-helper"); +//import { sell } from("../../dex/jupiter/swap/sell-helper"); +import {sell} from "../../../raydium/sell_helper"; -//const {swap} = require("../../../Pool/swap") -var current_trader_wallet_state = {}; -var current_our_wallet_state = {}; +//const {swap} from("../../../Pool/swap") +var current_trader_wallet_state:any = {}; +var current_our_wallet_state:any = {}; // [usdc, sol, usdt, wsol] const wsol = "So11111111111111111111111111111111111111112" const quoteToken = [ @@ -33,7 +33,7 @@ function saveToJson() { * @param {string} wallet_address - The address of the wallet to retrieve the state for. * @returns {Object} - An object containing the token balances of the wallet and the SOL balance. */ -async function retriveWalletState(wallet_address) { +async function retriveWalletState(wallet_address:string) { const filters = [ { dataSize: 165, //size of account (bytes) @@ -49,11 +49,11 @@ async function retriveWalletState(wallet_address) { TOKEN_PROGRAM_ID, //new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") { filters: filters } ); - let results = {}; + let results:any = {}; const solBalance = await connection.getBalance(new PublicKey(wallet_address)); accounts.forEach((account, i) => { //Parse the account data - const parsedAccountInfo = account.account.data; + const parsedAccountInfo:any = account.account.data; const mintAddress = parsedAccountInfo["parsed"]["info"]["mint"]; const tokenBalance = parsedAccountInfo["parsed"]["info"]["tokenAmount"]["uiAmount"]; @@ -63,11 +63,11 @@ async function retriveWalletState(wallet_address) { }); return results; } -async function copy_sell(address){ +export async function copy_sell(address:string){ // 400 ms to check the wallet state // if token we have but trader doesn't have, sell it // that's it - let soldTokens = []; + let soldTokens:string[] = []; let flag = false; let possible_cant_sell_token = null try{ @@ -92,7 +92,7 @@ async function copy_sell(address){ } if(flag){ // Update the list with the remaining unsold tokens - boughtTokens = boughtTokens.filter((token) => !soldTokens.includes(token)); + boughtTokens = boughtTokens.filter((token:any) => !soldTokens.includes(token)); // Save the updated list back to the JSON file saveToJson(); @@ -102,10 +102,9 @@ async function copy_sell(address){ async function main(){ while(true){ boughtTokens = JSON.parse(fs.readFileSync(boughtTokensPath, 'utf8')); - await copy_sell(smart_money_wallet); + await copy_sell(smart_money_wallet||""); await new Promise((resolve) => setTimeout(resolve, 2500)); } } -main(); -module.exports = {copy_sell} \ No newline at end of file +main(); \ No newline at end of file diff --git a/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-trade.ts b/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-trade.ts index b12869e..2d68130 100644 --- a/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-trade.ts +++ b/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-trade.ts @@ -2,8 +2,8 @@ // use two cores to run the two functions // 1. copy_sell // 2. copy_buy -const { fork } = require('child_process'); -const path = require('path'); +import { fork } from 'child_process'; +import path from 'path'; const copySellPath = path.join(__dirname, 'copy-sell.js'); const copyBuyPath = path.join(__dirname, 'copy-buy.js'); // Run copy_sell in a separate process diff --git a/src/raydium/index.ts b/src/raydium/index.ts new file mode 100644 index 0000000..c9133c7 --- /dev/null +++ b/src/raydium/index.ts @@ -0,0 +1,5 @@ +export * from "./sell_helper"; +export * from "./buy_helper"; +export * from "./raydium_config"; +export * from "./constants"; +export * from "./fetch-price"; \ No newline at end of file From eb99f187d0f35f94b41b323e5e804ec42a5eb6fa Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 23 Aug 2024 20:38:48 +0800 Subject: [PATCH 008/140] converted src/pumpfunsdk/pumpdotfun-sdk/src/*.js to .ts --- package-lock.json | 10 +- package.json | 3 +- .../example/{util.js => util.ts} | 75 +- .../pumpdotfun-sdk/src/IDL/index.js | 4 - .../pumpdotfun-sdk/src/IDL/index.ts | 3 + .../pumpdotfun-sdk/src/IDL/pump-fun.js | 865 ------------------ .../pumpdotfun-sdk/src/IDL/pump-fun.ts | 865 ++++++++++++++++++ .../pumpdotfun-sdk/src/{amm.js => amm.ts} | 47 +- ...CurveAccount.js => bondingCurveAccount.ts} | 44 +- .../pumpdotfun-sdk/src/{buy.js => buy.ts} | 8 +- .../src/{createAndBuy.js => createAndBuy.ts} | 9 +- .../src/{events.js => events.ts} | 18 +- .../{globalAccount.js => globalAccount.ts} | 44 +- src/pumpfunsdk/pumpdotfun-sdk/src/index.js | 8 - src/pumpfunsdk/pumpdotfun-sdk/src/index.ts | 8 + .../{listeners.js => listeners.ts} | 20 +- .../src/{pumpfun.js => pumpfun.ts} | 308 +++---- .../pumpdotfun-sdk/src/{sell.js => sell.ts} | 10 +- .../pumpdotfun-sdk/src/{tools.js => tools.ts} | 61 +- .../src/transactions/jito-tx-executor.js | 126 --- src/pumpfunsdk/pumpdotfun-sdk/src/types.js | 80 -- src/pumpfunsdk/pumpdotfun-sdk/src/types.ts | 80 ++ src/pumpfunsdk/pumpdotfun-sdk/src/util.js | 568 ------------ src/pumpfunsdk/pumpdotfun-sdk/src/util.ts | 313 +++++++ tsconfig.json | 9 +- 25 files changed, 1583 insertions(+), 2003 deletions(-) rename src/pumpfunsdk/pumpdotfun-sdk/example/{util.js => util.ts} (60%) delete mode 100644 src/pumpfunsdk/pumpdotfun-sdk/src/IDL/index.js create mode 100644 src/pumpfunsdk/pumpdotfun-sdk/src/IDL/index.ts delete mode 100644 src/pumpfunsdk/pumpdotfun-sdk/src/IDL/pump-fun.js create mode 100644 src/pumpfunsdk/pumpdotfun-sdk/src/IDL/pump-fun.ts rename src/pumpfunsdk/pumpdotfun-sdk/src/{amm.js => amm.ts} (73%) rename src/pumpfunsdk/pumpdotfun-sdk/src/{bondingCurveAccount.js => bondingCurveAccount.ts} (76%) rename src/pumpfunsdk/pumpdotfun-sdk/src/{buy.js => buy.ts} (79%) rename src/pumpfunsdk/pumpdotfun-sdk/src/{createAndBuy.js => createAndBuy.ts} (87%) rename src/pumpfunsdk/pumpdotfun-sdk/src/{events.js => events.ts} (75%) rename src/pumpfunsdk/pumpdotfun-sdk/src/{globalAccount.js => globalAccount.ts} (62%) delete mode 100644 src/pumpfunsdk/pumpdotfun-sdk/src/index.js create mode 100644 src/pumpfunsdk/pumpdotfun-sdk/src/index.ts rename src/pumpfunsdk/pumpdotfun-sdk/src/pump-events-listener/{listeners.js => listeners.ts} (67%) rename src/pumpfunsdk/pumpdotfun-sdk/src/{pumpfun.js => pumpfun.ts} (68%) rename src/pumpfunsdk/pumpdotfun-sdk/src/{sell.js => sell.ts} (77%) rename src/pumpfunsdk/pumpdotfun-sdk/src/{tools.js => tools.ts} (79%) delete mode 100644 src/pumpfunsdk/pumpdotfun-sdk/src/transactions/jito-tx-executor.js delete mode 100644 src/pumpfunsdk/pumpdotfun-sdk/src/types.js create mode 100644 src/pumpfunsdk/pumpdotfun-sdk/src/types.ts delete mode 100644 src/pumpfunsdk/pumpdotfun-sdk/src/util.js create mode 100644 src/pumpfunsdk/pumpdotfun-sdk/src/util.ts diff --git a/package-lock.json b/package-lock.json index 9dd54af..017fb2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,8 @@ "pino-pretty": "^10.3.1", "pino-std-serializers": "^6.2.2", "pumpdotfun-sdk": "^1.3.2", - "random-js": "^2.1.0" + "random-js": "^2.1.0", + "rpc-websockets": "7.10.0" }, "devDependencies": { "typescript": "^5.5.4" @@ -13551,11 +13552,12 @@ } }, "node_modules/rpc-websockets": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.11.2.tgz", - "integrity": "sha512-pL9r5N6AVHlMN/vT98+fcO+5+/UcPLf/4tq+WUaid/PPUGS/ttJ3y8e9IqmaWKtShNAysMSjkczuEA49NuV7UQ==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.10.0.tgz", + "integrity": "sha512-cemZ6RiDtYZpPiBzYijdOrkQQzmBCmug0E9SdRH2gIUNT15ql4mwCYWIp0VnSZq6Qrw/JkGUygp4PrK1y9KfwQ==", "license": "LGPL-3.0-only", "dependencies": { + "@babel/runtime": "^7.17.2", "eventemitter3": "^4.0.7", "uuid": "^8.3.2", "ws": "^8.5.0" diff --git a/package.json b/package.json index ccecd15..38223a1 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,8 @@ "pino-pretty": "^10.3.1", "pino-std-serializers": "^6.2.2", "pumpdotfun-sdk": "^1.3.2", - "random-js": "^2.1.0" + "random-js": "^2.1.0", + "rpc-websockets": "7.10.0" }, "devDependencies": { "typescript": "^5.5.4" diff --git a/src/pumpfunsdk/pumpdotfun-sdk/example/util.js b/src/pumpfunsdk/pumpdotfun-sdk/example/util.ts similarity index 60% rename from src/pumpfunsdk/pumpdotfun-sdk/example/util.js rename to src/pumpfunsdk/pumpdotfun-sdk/example/util.ts index f890825..1f19276 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/example/util.js +++ b/src/pumpfunsdk/pumpdotfun-sdk/example/util.ts @@ -1,20 +1,23 @@ -const { bs58 } =require ("@coral-xyz/anchor/dist/cjs/utils/bytes"); -const { getAssociatedTokenAddressSync } =require ("@solana/spl-token"); -const { +import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; +import { getAssociatedTokenAddressSync } from "@solana/spl-token"; +import { Keypair, PublicKey, Connection, LAMPORTS_PER_SOL, -} =require ("@solana/web3.js"); -const { sha256 } =require ("js-sha256"); +} from "@solana/web3.js"; +import { sha256 } from "js-sha256"; -const fs =require ("fs"); +import fs from "fs"; - function getOrCreateKeypair(dir, keyName) { +export function getOrCreateKeypair(dir: string, keyName: string): Keypair { if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }); const authorityKey = dir + "/" + keyName + ".json"; if (fs.existsSync(authorityKey)) { - const data= JSON.parse(fs.readFileSync(authorityKey, "utf-8")); + const data: { + secretKey: string; + publicKey: string; + } = JSON.parse(fs.readFileSync(authorityKey, "utf-8")); return Keypair.fromSecretKey(bs58.decode(data.secretKey)); } else { const keypair = Keypair.generate(); @@ -30,7 +33,7 @@ const fs =require ("fs"); } } - function getKeypairByJsonPath(jsonPath) { +export function getKeypairByJsonPath(jsonPath:string) { try { const keypairJson = fs.readFileSync(jsonPath, "utf-8"); const data = JSON.parse(keypairJson); @@ -40,12 +43,11 @@ const fs =require ("fs"); console.log(e); } } - -async function printSOLBalance ( - connection, - pubKey, - info = "" -) { +export const printSOLBalance = async ( + connection: Connection, + pubKey: PublicKey, + info: string = "" +) => { const balance = await connection.getBalance(pubKey); console.log( `${info ? info + " " : ""}${pubKey.toBase58()}:`, @@ -54,12 +56,12 @@ async function printSOLBalance ( ); }; -async function getSPLBalance ( - connection, - mintAddress, - pubKey, - allowOffCurve = false -) { +export const getSPLBalance = async ( + connection: Connection, + mintAddress: PublicKey, + pubKey: PublicKey, + allowOffCurve: boolean = false +) => { try { let ata = getAssociatedTokenAddressSync(mintAddress, pubKey, allowOffCurve); const balance = await connection.getTokenAccountBalance(ata, "processed"); @@ -68,12 +70,12 @@ async function getSPLBalance ( return null; }; -async function printSPLBalance ( - connection, - mintAddress, - user, - info = "" -) { +export const printSPLBalance = async ( + connection: Connection, + mintAddress: PublicKey, + user: PublicKey, + info: string = "" +) => { const balance = await getSPLBalance(connection, mintAddress, user); if (balance === null) { console.log( @@ -85,26 +87,15 @@ async function printSPLBalance ( } }; - const baseToValue = (base, decimals) => { +export const baseToValue = (base: number, decimals: number): number => { return base * Math.pow(10, decimals); }; - const valueToBase = (value, decimal) => { +export const valueToBase = (value: number, decimals: number): number => { return value / Math.pow(10, decimals); }; //i.e. account:BondingCurve - function getDiscriminator(name) { +export function getDiscriminator(name: string) { return sha256.digest(name).slice(0, 8); -} - -module.exports = { - getOrCreateKeypair, - getKeypairByJsonPath, - printSOLBalance, - getSPLBalance, - printSPLBalance, - baseToValue, - valueToBase, - getDiscriminator, -}; \ No newline at end of file +} \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/IDL/index.js b/src/pumpfunsdk/pumpdotfun-sdk/src/IDL/index.js deleted file mode 100644 index e368b5a..0000000 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/IDL/index.js +++ /dev/null @@ -1,4 +0,0 @@ -// pump-fun.json should be a valid JSON file -const IDL = require("./pump-fun.json"); -const { PumpFun } = require("./pump-fun"); -module.exports = { PumpFun, IDL }; \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/IDL/index.ts b/src/pumpfunsdk/pumpdotfun-sdk/src/IDL/index.ts new file mode 100644 index 0000000..fe37e18 --- /dev/null +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/IDL/index.ts @@ -0,0 +1,3 @@ +// pump-fun.json should be a valid JSON file +export const IDL = require("./pump-fun.json"); +export * from "./pump-fun"; \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/IDL/pump-fun.js b/src/pumpfunsdk/pumpdotfun-sdk/src/IDL/pump-fun.js deleted file mode 100644 index b9537af..0000000 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/IDL/pump-fun.js +++ /dev/null @@ -1,865 +0,0 @@ -// export type PumpFun = { -// address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; -// metadata: { -// name: "pump"; -// version: "0.1.0"; -// spec: "0.1.0"; -// }; -// instructions: [ -// { -// name: "initialize"; -// discriminator: [175, 175, 109, 31, 13, 152, 155, 237]; -// docs: ["Creates the global state."]; -// accounts: [ -// { -// name: "global"; -// writable: true; -// pda: { -// seeds: [ -// { -// kind: "const"; -// value: [103, 108, 111, 98, 97, 108]; -// } -// ]; -// }; -// }, -// { -// name: "user"; -// writable: true; -// signer: true; -// }, -// { -// name: "systemProgram"; -// address: "11111111111111111111111111111111"; -// } -// ]; -// args: []; -// }, -// { -// name: "setParams"; -// discriminator: [165, 31, 134, 53, 189, 180, 130, 255]; -// docs: ["Sets the global state parameters."]; -// accounts: [ -// { -// name: "global"; -// writable: true; -// pda: { -// seeds: [ -// { -// kind: "const"; -// value: [103, 108, 111, 98, 97, 108]; -// } -// ]; -// }; -// }, -// { -// name: "user"; -// writable: true; -// signer: true; -// }, -// { -// name: "systemProgram"; -// address: "11111111111111111111111111111111"; -// }, -// { -// name: "eventAuthority"; -// address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; -// }, -// { -// name: "program"; -// address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; -// } -// ]; -// args: [ -// { -// name: "feeRecipient"; -// type: "pubkey"; -// }, -// { -// name: "initialVirtualTokenReserves"; -// type: "u64"; -// }, -// { -// name: "initialVirtualSolReserves"; -// type: "u64"; -// }, -// { -// name: "initialRealTokenReserves"; -// type: "u64"; -// }, -// { -// name: "tokenTotalSupply"; -// type: "u64"; -// }, -// { -// name: "feeBasisPoints"; -// type: "u64"; -// } -// ]; -// }, -// { -// name: "create"; -// discriminator: [24, 30, 200, 40, 5, 28, 7, 119]; -// docs: ["Creates a new coin and bonding curve."]; -// accounts: [ -// { -// name: "mint"; -// writable: true; -// signer: true; -// }, -// { -// name: "mint_authority"; -// pda: { -// seeds: [ -// { -// kind: "const"; -// value: [ -// 109, -// 105, -// 110, -// 116, -// 45, -// 97, -// 117, -// 116, -// 104, -// 111, -// 114, -// 105, -// 116, -// 121 -// ]; -// } -// ]; -// }; -// }, -// { -// name: "bondingCurve"; -// writable: true; -// pda: { -// seeds: [ -// { -// kind: "const"; -// value: [ -// 98, -// 111, -// 110, -// 100, -// 105, -// 110, -// 103, -// 45, -// 99, -// 117, -// 114, -// 118, -// 101 -// ]; -// }, -// { -// kind: "account"; -// path: "mint"; -// } -// ]; -// }; -// }, -// { -// name: "associatedBondingCurve"; -// writable: true; -// signer: false; -// }, -// { -// name: "global"; -// writable: false; -// pda: { -// seeds: [ -// { -// kind: "const"; -// value: [103, 108, 111, 98, 97, 108]; -// } -// ]; -// }; -// }, -// { -// name: "mplTokenMetadata"; -// address: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"; -// }, -// { -// name: "metadata"; -// writable: true; -// signer: false; -// }, -// { -// name: "user"; -// isMut: true; -// isSigner: true; -// }, -// { -// name: "systemProgram"; -// address: "11111111111111111111111111111111"; -// }, -// { -// name: "tokenProgram"; -// address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; -// }, -// { -// name: "associatedTokenProgram"; -// address: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"; -// }, -// { -// name: "rent"; -// address: "SysvarRent111111111111111111111111111111111"; -// }, -// { -// name: "eventAuthority"; -// address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; -// }, -// { -// name: "program"; -// address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; -// } -// ]; -// args: [ -// { -// name: "name"; -// type: "string"; -// }, -// { -// name: "symbol"; -// type: "string"; -// }, -// { -// name: "uri"; -// type: "string"; -// } -// ]; -// }, -// { -// name: "buy"; -// discriminator: [102, 6, 61, 18, 1, 218, 235, 234]; -// docs: ["Buys tokens from a bonding curve."]; -// accounts: [ -// { -// name: "global"; -// pda: { -// seeds: [ -// { -// kind: "const"; -// value: [103, 108, 111, 98, 97, 108]; -// } -// ]; -// }; -// }, -// { -// name: "feeRecipient"; -// writable: true; -// signer: false; -// }, -// { -// name: "mint"; -// writable: false; -// signer: false; -// }, -// { -// name: "bondingCurve"; -// writable: true; -// pda: { -// seeds: [ -// { -// kind: "const"; -// value: [ -// 98, -// 111, -// 110, -// 100, -// 105, -// 110, -// 103, -// 45, -// 99, -// 117, -// 114, -// 118, -// 101 -// ]; -// }, -// { -// kind: "account"; -// path: "mint"; -// } -// ]; -// }; -// }, -// { -// name: "associatedBondingCurve"; -// writable: true; -// signer: false; -// }, -// { -// name: "associatedUser"; -// writable: true; -// signer: false; -// }, -// { -// name: "user"; -// writable: true; -// signer: true; -// }, -// { -// name: "systemProgram"; -// address: "11111111111111111111111111111111"; -// }, -// { -// name: "tokenProgram"; -// address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; -// }, -// { -// name: "rent"; -// address: "SysvarRent111111111111111111111111111111111"; -// }, -// { -// name: "eventAuthority"; -// address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; -// }, -// { -// name: "program"; -// address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; -// } -// ]; -// args: [ -// { -// name: "amount"; -// type: "u64"; -// }, -// { -// name: "maxSolCost"; -// type: "u64"; -// } -// ]; -// }, -// { -// name: "sell"; -// discriminator: [51, 230, 133, 164, 1, 127, 131, 173]; -// docs: ["Sells tokens into a bonding curve."]; -// accounts: [ -// { -// name: "global"; -// writable: false; -// pda: { -// seeds: [ -// { -// kind: "const"; -// value: [103, 108, 111, 98, 97, 108]; -// } -// ]; -// }; -// }, -// { -// name: "feeRecipient"; -// writable: true; -// signer: false; -// }, -// { -// name: "mint"; -// writable: false; -// signer: false; -// }, -// { -// name: "bondingCurve"; -// writable: true; -// pda: { -// seeds: [ -// { -// kind: "const"; -// value: [ -// 98, -// 111, -// 110, -// 100, -// 105, -// 110, -// 103, -// 45, -// 99, -// 117, -// 114, -// 118, -// 101 -// ]; -// }, -// { -// kind: "account"; -// path: "mint"; -// } -// ]; -// }; -// }, -// { -// name: "associatedBondingCurve"; -// writable: true; -// signer: false; -// }, -// { -// name: "associatedUser"; -// writable: true; -// signer: false; -// }, -// { -// name: "user"; -// writable: true; -// signer: true; -// }, -// { -// name: "systemProgram"; -// address: "11111111111111111111111111111111"; -// }, -// { -// name: "associatedTokenProgram"; -// address: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"; -// }, -// { -// name: "tokenProgram"; -// address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; -// }, -// { -// name: "eventAuthority"; -// address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; -// }, -// { -// name: "program"; -// address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; -// } -// ]; -// args: [ -// { -// name: "amount"; -// type: "u64"; -// }, -// { -// name: "minSolOutput"; -// type: "u64"; -// } -// ]; -// }, -// { -// name: "withdraw"; -// discriminator: [183, 18, 70, 156, 148, 109, 161, 34]; -// docs: [ -// "Allows the admin to withdraw liquidity for a migration once the bonding curve completes" -// ]; -// accounts: [ -// { -// name: "global"; -// writable: false; -// pda: { -// seeds: [ -// { -// kind: "const"; -// value: [103, 108, 111, 98, 97, 108]; -// } -// ]; -// }; -// }, -// { -// name: "lastWithdraw"; -// writable: true; -// signer: false; -// }, -// { -// name: "mint"; -// writable: false; -// signer: false; -// }, -// { -// name: "bondingCurve"; -// writable: true; -// pda: { -// seeds: [ -// { -// kind: "const"; -// value: [ -// 98, -// 111, -// 110, -// 100, -// 105, -// 110, -// 103, -// 45, -// 99, -// 117, -// 114, -// 118, -// 101 -// ]; -// }, -// { -// kind: "account"; -// path: "mint"; -// } -// ]; -// }; -// }, -// { -// name: "associatedBondingCurve"; -// writable: true; -// signer: false; -// }, -// { -// name: "associatedUser"; -// writable: true; -// signer: false; -// }, -// { -// name: "user"; -// writable: true; -// signer: true; -// }, -// { -// name: "system_program"; -// address: "11111111111111111111111111111111"; -// }, -// { -// name: "tokenProgram"; -// address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; -// }, -// { -// name: "rent"; -// address: "SysvarRent111111111111111111111111111111111"; -// }, -// { -// name: "eventAuthority"; -// address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; -// }, -// { -// name: "program"; -// address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; -// } -// ]; -// args: []; -// } -// ]; -// accounts: [ -// { -// name: "bondingCurve"; -// discriminator: [23, 183, 248, 55, 96, 216, 172, 96]; -// }, -// { -// name: "global"; -// discriminator: [167, 232, 232, 177, 200, 108, 114, 127]; -// } -// ]; -// events: [ -// { -// name: "createEvent"; -// discriminator: [27, 114, 169, 77, 222, 235, 99, 118]; -// }, -// { -// name: "tradeEvent"; -// discriminator: [189, 219, 127, 211, 78, 230, 97, 238]; -// }, -// { -// name: "completeEvent"; -// discriminator: [95, 114, 97, 156, 212, 46, 152, 8]; -// }, -// { -// name: "setParamsEvent"; -// discriminator: [223, 195, 159, 246, 62, 48, 143, 131]; -// } -// ]; -// types: [ -// { -// name: "global"; -// type: { -// kind: "struct"; -// fields: [ -// { -// name: "initialized"; -// type: "bool"; -// }, -// { -// name: "authority"; -// type: "pubkey"; -// }, -// { -// name: "feeRecipient"; -// type: "pubkey"; -// }, -// { -// name: "initialVirtualTokenReserves"; -// type: "u64"; -// }, -// { -// name: "initialVirtualSolReserves"; -// type: "u64"; -// }, -// { -// name: "initialRealTokenReserves"; -// type: "u64"; -// }, -// { -// name: "tokenTotalSupply"; -// type: "u64"; -// }, -// { -// name: "feeBasisPoints"; -// type: "u64"; -// } -// ]; -// }; -// }, -// { -// name: "lastWithdraw"; -// type: { -// kind: "struct"; -// fields: [ -// { -// name: "lastWithdrawTimestamp"; -// type: "i64"; -// } -// ]; -// }; -// }, -// { -// name: "bondingCurve"; -// type: { -// kind: "struct"; -// fields: [ -// { -// name: "virtualTokenReserves"; -// type: "u64"; -// }, -// { -// name: "virtualSolReserves"; -// type: "u64"; -// }, -// { -// name: "realTokenReserves"; -// type: "u64"; -// }, -// { -// name: "realSolReserves"; -// type: "u64"; -// }, -// { -// name: "tokenTotalSupply"; -// type: "u64"; -// }, -// { -// name: "complete"; -// type: "bool"; -// } -// ]; -// }; -// }, -// { -// name: "createEvent"; -// type: { -// kind: "struct"; -// fields: [ -// { -// name: "name"; -// type: "string"; -// index: false; -// }, -// { -// name: "symbol"; -// type: "string"; -// index: false; -// }, -// { -// name: "uri"; -// type: "string"; -// index: false; -// }, -// { -// name: "mint"; -// type: "pubkey"; -// index: false; -// }, -// { -// name: "bondingCurve"; -// type: "pubkey"; -// index: false; -// }, -// { -// name: "user"; -// type: "pubkey"; -// index: false; -// } -// ]; -// }; -// }, -// { -// name: "tradeEvent"; -// type: { -// kind: "struct"; -// fields: [ -// { -// name: "mint"; -// type: "pubkey"; -// index: false; -// }, -// { -// name: "solAmount"; -// type: "u64"; -// index: false; -// }, -// { -// name: "tokenAmount"; -// type: "u64"; -// index: false; -// }, -// { -// name: "isBuy"; -// type: "bool"; -// index: false; -// }, -// { -// name: "user"; -// type: "pubkey"; -// index: false; -// }, -// { -// name: "timestamp"; -// type: "i64"; -// index: false; -// }, -// { -// name: "virtualSolReserves"; -// type: "u64"; -// index: false; -// }, -// { -// name: "virtualTokenReserves"; -// type: "u64"; -// index: false; -// }, -// { -// name: "realSolReserves"; -// type: "u64"; -// index: false; -// }, -// { -// name: "realTokenReserves"; -// type: "u64"; -// index: false; -// } -// ]; -// }; -// }, -// { -// name: "completeEvent"; -// type: { -// kind: "struct"; -// fields: [ -// { -// name: "user"; -// type: "pubkey"; -// index: false; -// }, -// { -// name: "mint"; -// type: "pubkey"; -// index: false; -// }, -// { -// name: "bondingCurve"; -// type: "pubkey"; -// index: false; -// }, -// { -// name: "timestamp"; -// type: "i64"; -// index: false; -// } -// ]; -// }; -// }, -// { -// name: "setParamsEvent"; -// type: { -// kind: "struct"; -// fields: [ -// { -// name: "feeRecipient"; -// type: "pubkey"; -// index: false; -// }, -// { -// name: "initialVirtualTokenReserves"; -// type: "u64"; -// index: false; -// }, -// { -// name: "initialVirtualSolReserves"; -// type: "u64"; -// index: false; -// }, -// { -// name: "initialRealTokenReserves"; -// type: "u64"; -// index: false; -// }, -// { -// name: "tokenTotalSupply"; -// type: "u64"; -// index: false; -// }, -// { -// name: "feeBasisPoints"; -// type: "u64"; -// index: false; -// } -// ]; -// }; -// } -// ]; -// errors: [ -// { -// code: 6000; -// name: "NotAuthorized"; -// msg: "The given account is not authorized to execute this instruction."; -// }, -// { -// code: 6001; -// name: "AlreadyInitialized"; -// msg: "The program is already initialized."; -// }, -// { -// code: 6002; -// name: "TooMuchSolRequired"; -// msg: "slippage: Too much SOL required to buy the given amount of tokens."; -// }, -// { -// code: 6003; -// name: "TooLittleSolReceived"; -// msg: "slippage: Too little SOL received to sell the given amount of tokens."; -// }, -// { -// code: 6004; -// name: "MintDoesNotMatchBondingCurve"; -// msg: "The mint does not match the bonding curve."; -// }, -// { -// code: 6005; -// name: "BondingCurveComplete"; -// msg: "The bonding curve has completed and liquidity migrated to raydium."; -// }, -// { -// code: 6006; -// name: "BondingCurveNotComplete"; -// msg: "The bonding curve has not completed."; -// }, -// { -// code: 6007; -// name: "NotInitialized"; -// msg: "The program is not initialized."; -// }, -// { -// code: 6008; -// name: "WithdrawTooFrequent"; -// msg: "Withdraw too frequent"; -// } -// ]; -// }; \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/IDL/pump-fun.ts b/src/pumpfunsdk/pumpdotfun-sdk/src/IDL/pump-fun.ts new file mode 100644 index 0000000..99cc93e --- /dev/null +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/IDL/pump-fun.ts @@ -0,0 +1,865 @@ +export type PumpFun = { + address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; + metadata: { + name: "pump"; + version: "0.1.0"; + spec: "0.1.0"; + }; + instructions: [ + { + name: "initialize"; + discriminator: [175, 175, 109, 31, 13, 152, 155, 237]; + docs: ["Creates the global state."]; + accounts: [ + { + name: "global"; + writable: true; + pda: { + seeds: [ + { + kind: "const"; + value: [103, 108, 111, 98, 97, 108]; + } + ]; + }; + }, + { + name: "user"; + writable: true; + signer: true; + }, + { + name: "systemProgram"; + address: "11111111111111111111111111111111"; + } + ]; + args: []; + }, + { + name: "setParams"; + discriminator: [165, 31, 134, 53, 189, 180, 130, 255]; + docs: ["Sets the global state parameters."]; + accounts: [ + { + name: "global"; + writable: true; + pda: { + seeds: [ + { + kind: "const"; + value: [103, 108, 111, 98, 97, 108]; + } + ]; + }; + }, + { + name: "user"; + writable: true; + signer: true; + }, + { + name: "systemProgram"; + address: "11111111111111111111111111111111"; + }, + { + name: "eventAuthority"; + address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; + }, + { + name: "program"; + address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; + } + ]; + args: [ + { + name: "feeRecipient"; + type: "pubkey"; + }, + { + name: "initialVirtualTokenReserves"; + type: "u64"; + }, + { + name: "initialVirtualSolReserves"; + type: "u64"; + }, + { + name: "initialRealTokenReserves"; + type: "u64"; + }, + { + name: "tokenTotalSupply"; + type: "u64"; + }, + { + name: "feeBasisPoints"; + type: "u64"; + } + ]; + }, + { + name: "create"; + discriminator: [24, 30, 200, 40, 5, 28, 7, 119]; + docs: ["Creates a new coin and bonding curve."]; + accounts: [ + { + name: "mint"; + writable: true; + signer: true; + }, + { + name: "mint_authority"; + pda: { + seeds: [ + { + kind: "const"; + value: [ + 109, + 105, + 110, + 116, + 45, + 97, + 117, + 116, + 104, + 111, + 114, + 105, + 116, + 121 + ]; + } + ]; + }; + }, + { + name: "bondingCurve"; + writable: true; + pda: { + seeds: [ + { + kind: "const"; + value: [ + 98, + 111, + 110, + 100, + 105, + 110, + 103, + 45, + 99, + 117, + 114, + 118, + 101 + ]; + }, + { + kind: "account"; + path: "mint"; + } + ]; + }; + }, + { + name: "associatedBondingCurve"; + writable: true; + signer: false; + }, + { + name: "global"; + writable: false; + pda: { + seeds: [ + { + kind: "const"; + value: [103, 108, 111, 98, 97, 108]; + } + ]; + }; + }, + { + name: "mplTokenMetadata"; + address: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"; + }, + { + name: "metadata"; + writable: true; + signer: false; + }, + { + name: "user"; + isMut: true; + isSigner: true; + }, + { + name: "systemProgram"; + address: "11111111111111111111111111111111"; + }, + { + name: "tokenProgram"; + address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; + }, + { + name: "associatedTokenProgram"; + address: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"; + }, + { + name: "rent"; + address: "SysvarRent111111111111111111111111111111111"; + }, + { + name: "eventAuthority"; + address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; + }, + { + name: "program"; + address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; + } + ]; + args: [ + { + name: "name"; + type: "string"; + }, + { + name: "symbol"; + type: "string"; + }, + { + name: "uri"; + type: "string"; + } + ]; + }, + { + name: "buy"; + discriminator: [102, 6, 61, 18, 1, 218, 235, 234]; + docs: ["Buys tokens from a bonding curve."]; + accounts: [ + { + name: "global"; + pda: { + seeds: [ + { + kind: "const"; + value: [103, 108, 111, 98, 97, 108]; + } + ]; + }; + }, + { + name: "feeRecipient"; + writable: true; + signer: false; + }, + { + name: "mint"; + writable: false; + signer: false; + }, + { + name: "bondingCurve"; + writable: true; + pda: { + seeds: [ + { + kind: "const"; + value: [ + 98, + 111, + 110, + 100, + 105, + 110, + 103, + 45, + 99, + 117, + 114, + 118, + 101 + ]; + }, + { + kind: "account"; + path: "mint"; + } + ]; + }; + }, + { + name: "associatedBondingCurve"; + writable: true; + signer: false; + }, + { + name: "associatedUser"; + writable: true; + signer: false; + }, + { + name: "user"; + writable: true; + signer: true; + }, + { + name: "systemProgram"; + address: "11111111111111111111111111111111"; + }, + { + name: "tokenProgram"; + address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; + }, + { + name: "rent"; + address: "SysvarRent111111111111111111111111111111111"; + }, + { + name: "eventAuthority"; + address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; + }, + { + name: "program"; + address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; + } + ]; + args: [ + { + name: "amount"; + type: "u64"; + }, + { + name: "maxSolCost"; + type: "u64"; + } + ]; + }, + { + name: "sell"; + discriminator: [51, 230, 133, 164, 1, 127, 131, 173]; + docs: ["Sells tokens into a bonding curve."]; + accounts: [ + { + name: "global"; + writable: false; + pda: { + seeds: [ + { + kind: "const"; + value: [103, 108, 111, 98, 97, 108]; + } + ]; + }; + }, + { + name: "feeRecipient"; + writable: true; + signer: false; + }, + { + name: "mint"; + writable: false; + signer: false; + }, + { + name: "bondingCurve"; + writable: true; + pda: { + seeds: [ + { + kind: "const"; + value: [ + 98, + 111, + 110, + 100, + 105, + 110, + 103, + 45, + 99, + 117, + 114, + 118, + 101 + ]; + }, + { + kind: "account"; + path: "mint"; + } + ]; + }; + }, + { + name: "associatedBondingCurve"; + writable: true; + signer: false; + }, + { + name: "associatedUser"; + writable: true; + signer: false; + }, + { + name: "user"; + writable: true; + signer: true; + }, + { + name: "systemProgram"; + address: "11111111111111111111111111111111"; + }, + { + name: "associatedTokenProgram"; + address: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"; + }, + { + name: "tokenProgram"; + address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; + }, + { + name: "eventAuthority"; + address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; + }, + { + name: "program"; + address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; + } + ]; + args: [ + { + name: "amount"; + type: "u64"; + }, + { + name: "minSolOutput"; + type: "u64"; + } + ]; + }, + { + name: "withdraw"; + discriminator: [183, 18, 70, 156, 148, 109, 161, 34]; + docs: [ + "Allows the admin to withdraw liquidity for a migration once the bonding curve completes" + ]; + accounts: [ + { + name: "global"; + writable: false; + pda: { + seeds: [ + { + kind: "const"; + value: [103, 108, 111, 98, 97, 108]; + } + ]; + }; + }, + { + name: "lastWithdraw"; + writable: true; + signer: false; + }, + { + name: "mint"; + writable: false; + signer: false; + }, + { + name: "bondingCurve"; + writable: true; + pda: { + seeds: [ + { + kind: "const"; + value: [ + 98, + 111, + 110, + 100, + 105, + 110, + 103, + 45, + 99, + 117, + 114, + 118, + 101 + ]; + }, + { + kind: "account"; + path: "mint"; + } + ]; + }; + }, + { + name: "associatedBondingCurve"; + writable: true; + signer: false; + }, + { + name: "associatedUser"; + writable: true; + signer: false; + }, + { + name: "user"; + writable: true; + signer: true; + }, + { + name: "system_program"; + address: "11111111111111111111111111111111"; + }, + { + name: "tokenProgram"; + address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; + }, + { + name: "rent"; + address: "SysvarRent111111111111111111111111111111111"; + }, + { + name: "eventAuthority"; + address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; + }, + { + name: "program"; + address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; + } + ]; + args: []; + } + ]; + accounts: [ + { + name: "bondingCurve"; + discriminator: [23, 183, 248, 55, 96, 216, 172, 96]; + }, + { + name: "global"; + discriminator: [167, 232, 232, 177, 200, 108, 114, 127]; + } + ]; + events: [ + { + name: "createEvent"; + discriminator: [27, 114, 169, 77, 222, 235, 99, 118]; + }, + { + name: "tradeEvent"; + discriminator: [189, 219, 127, 211, 78, 230, 97, 238]; + }, + { + name: "completeEvent"; + discriminator: [95, 114, 97, 156, 212, 46, 152, 8]; + }, + { + name: "setParamsEvent"; + discriminator: [223, 195, 159, 246, 62, 48, 143, 131]; + } + ]; + types: [ + { + name: "global"; + type: { + kind: "struct"; + fields: [ + { + name: "initialized"; + type: "bool"; + }, + { + name: "authority"; + type: "pubkey"; + }, + { + name: "feeRecipient"; + type: "pubkey"; + }, + { + name: "initialVirtualTokenReserves"; + type: "u64"; + }, + { + name: "initialVirtualSolReserves"; + type: "u64"; + }, + { + name: "initialRealTokenReserves"; + type: "u64"; + }, + { + name: "tokenTotalSupply"; + type: "u64"; + }, + { + name: "feeBasisPoints"; + type: "u64"; + } + ]; + }; + }, + { + name: "lastWithdraw"; + type: { + kind: "struct"; + fields: [ + { + name: "lastWithdrawTimestamp"; + type: "i64"; + } + ]; + }; + }, + { + name: "bondingCurve"; + type: { + kind: "struct"; + fields: [ + { + name: "virtualTokenReserves"; + type: "u64"; + }, + { + name: "virtualSolReserves"; + type: "u64"; + }, + { + name: "realTokenReserves"; + type: "u64"; + }, + { + name: "realSolReserves"; + type: "u64"; + }, + { + name: "tokenTotalSupply"; + type: "u64"; + }, + { + name: "complete"; + type: "bool"; + } + ]; + }; + }, + { + name: "createEvent"; + type: { + kind: "struct"; + fields: [ + { + name: "name"; + type: "string"; + index: false; + }, + { + name: "symbol"; + type: "string"; + index: false; + }, + { + name: "uri"; + type: "string"; + index: false; + }, + { + name: "mint"; + type: "pubkey"; + index: false; + }, + { + name: "bondingCurve"; + type: "pubkey"; + index: false; + }, + { + name: "user"; + type: "pubkey"; + index: false; + } + ]; + }; + }, + { + name: "tradeEvent"; + type: { + kind: "struct"; + fields: [ + { + name: "mint"; + type: "pubkey"; + index: false; + }, + { + name: "solAmount"; + type: "u64"; + index: false; + }, + { + name: "tokenAmount"; + type: "u64"; + index: false; + }, + { + name: "isBuy"; + type: "bool"; + index: false; + }, + { + name: "user"; + type: "pubkey"; + index: false; + }, + { + name: "timestamp"; + type: "i64"; + index: false; + }, + { + name: "virtualSolReserves"; + type: "u64"; + index: false; + }, + { + name: "virtualTokenReserves"; + type: "u64"; + index: false; + }, + { + name: "realSolReserves"; + type: "u64"; + index: false; + }, + { + name: "realTokenReserves"; + type: "u64"; + index: false; + } + ]; + }; + }, + { + name: "completeEvent"; + type: { + kind: "struct"; + fields: [ + { + name: "user"; + type: "pubkey"; + index: false; + }, + { + name: "mint"; + type: "pubkey"; + index: false; + }, + { + name: "bondingCurve"; + type: "pubkey"; + index: false; + }, + { + name: "timestamp"; + type: "i64"; + index: false; + } + ]; + }; + }, + { + name: "setParamsEvent"; + type: { + kind: "struct"; + fields: [ + { + name: "feeRecipient"; + type: "pubkey"; + index: false; + }, + { + name: "initialVirtualTokenReserves"; + type: "u64"; + index: false; + }, + { + name: "initialVirtualSolReserves"; + type: "u64"; + index: false; + }, + { + name: "initialRealTokenReserves"; + type: "u64"; + index: false; + }, + { + name: "tokenTotalSupply"; + type: "u64"; + index: false; + }, + { + name: "feeBasisPoints"; + type: "u64"; + index: false; + } + ]; + }; + } + ]; + errors: [ + { + code: 6000; + name: "NotAuthorized"; + msg: "The given account is not authorized to execute this instruction."; + }, + { + code: 6001; + name: "AlreadyInitialized"; + msg: "The program is already initialized."; + }, + { + code: 6002; + name: "TooMuchSolRequired"; + msg: "slippage: Too much SOL required to buy the given amount of tokens."; + }, + { + code: 6003; + name: "TooLittleSolReceived"; + msg: "slippage: Too little SOL received to sell the given amount of tokens."; + }, + { + code: 6004; + name: "MintDoesNotMatchBondingCurve"; + msg: "The mint does not match the bonding curve."; + }, + { + code: 6005; + name: "BondingCurveComplete"; + msg: "The bonding curve has completed and liquidity migrated to raydium."; + }, + { + code: 6006; + name: "BondingCurveNotComplete"; + msg: "The bonding curve has not completed."; + }, + { + code: 6007; + name: "NotInitialized"; + msg: "The program is not initialized."; + }, + { + code: 6008; + name: "WithdrawTooFrequent"; + msg: "Withdraw too frequent"; + } + ]; +}; \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/amm.js b/src/pumpfunsdk/pumpdotfun-sdk/src/amm.ts similarity index 73% rename from src/pumpfunsdk/pumpdotfun-sdk/src/amm.js rename to src/pumpfunsdk/pumpdotfun-sdk/src/amm.ts index 1799c3d..f48889a 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/amm.js +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/amm.ts @@ -1,26 +1,26 @@ -const { BondingCurveAccount } =require ("./bondingCurveAccount"); -const { GlobalAccount } =require ("./globalAccount"); +import { BondingCurveAccount } from "./bondingCurveAccount"; +import { GlobalAccount } from "./globalAccount"; -// type BuyResult = { -// token_amount: bigint; -// sol_amount: bigint; -// }; +export type BuyResult = { + token_amount: bigint; + sol_amount: bigint; +}; -// type SellResult = { -// token_amount: bigint; -// sol_amount: bigint; -// }; +export type SellResult = { + token_amount: bigint; + sol_amount: bigint; +}; -class AMM { +export class AMM { constructor( - virtualSolReserves, - virtualTokenReserves, - realSolReserves, - realTokenReserves, - initialVirtualTokenReserves + public virtualSolReserves: bigint, + public virtualTokenReserves: bigint, + public realSolReserves: bigint, + public realTokenReserves: bigint, + public initialVirtualTokenReserves: bigint ) {} - static fromGlobalAccount(global) { + static fromGlobalAccount(global: GlobalAccount): AMM { return new AMM( global.initialVirtualSolReserves, global.initialVirtualTokenReserves, @@ -30,7 +30,7 @@ class AMM { ); } - static fromBondingCurveAccount(bonding_curve, initialVirtualTokenReserves) { + static fromBondingCurveAccount(bonding_curve: BondingCurveAccount, initialVirtualTokenReserves: bigint): AMM { return new AMM( bonding_curve.virtualSolReserves, bonding_curve.virtualTokenReserves, @@ -40,7 +40,7 @@ class AMM { ); } - getBuyPrice(tokens){ + getBuyPrice(tokens: bigint): bigint { const product_of_reserves = this.virtualSolReserves * this.virtualTokenReserves; const new_virtual_token_reserves = this.virtualTokenReserves - tokens; const new_virtual_sol_reserves = product_of_reserves / new_virtual_token_reserves + 1n; @@ -48,7 +48,7 @@ class AMM { return amount_needed > 0n ? amount_needed : 0n; } - applyBuy(token_amount ) { + applyBuy(token_amount: bigint): BuyResult { const final_token_amount = token_amount > this.realTokenReserves ? this.realTokenReserves : token_amount; const sol_amount = this.getBuyPrice(final_token_amount); @@ -64,7 +64,7 @@ class AMM { } } - applySell(token_amount ) { + applySell(token_amount: bigint): SellResult { this.virtualTokenReserves = this.virtualTokenReserves + token_amount; this.realTokenReserves = this.realTokenReserves + token_amount; @@ -79,13 +79,10 @@ class AMM { } } - getSellPrice(tokens ) { + getSellPrice(tokens: bigint): bigint { const scaling_factor = this.initialVirtualTokenReserves; const token_sell_proportion = (tokens * scaling_factor) / this.virtualTokenReserves; const sol_received = (this.virtualSolReserves * token_sell_proportion) / scaling_factor; return sol_received < this.realSolReserves ? sol_received : this.realSolReserves; } -} -module.exports = { - AMM } \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/bondingCurveAccount.js b/src/pumpfunsdk/pumpdotfun-sdk/src/bondingCurveAccount.ts similarity index 76% rename from src/pumpfunsdk/pumpdotfun-sdk/src/bondingCurveAccount.js rename to src/pumpfunsdk/pumpdotfun-sdk/src/bondingCurveAccount.ts index 70caf83..c4d25fd 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/bondingCurveAccount.js +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/bondingCurveAccount.ts @@ -1,16 +1,22 @@ -const { struct, bool, u64, Layout } =require ("@coral-xyz/borsh"); - -class BondingCurveAccount { +import { struct, bool, u64, Layout } from "@coral-xyz/borsh"; +export class BondingCurveAccount { + public discriminator: bigint; + public virtualTokenReserves: bigint; + public virtualSolReserves: bigint; + public realTokenReserves: bigint; + public realSolReserves: bigint; + public tokenTotalSupply: bigint; + public complete: boolean; constructor( - discriminator, - virtualTokenReserves, - virtualSolReserves, - realTokenReserves, - realSolReserves, - tokenTotalSupply, - complete + discriminator: bigint, + virtualTokenReserves: bigint, + virtualSolReserves: bigint, + realTokenReserves: bigint, + realSolReserves: bigint, + tokenTotalSupply: bigint, + complete: boolean ) { this.discriminator = discriminator; this.virtualTokenReserves = virtualTokenReserves; @@ -21,7 +27,7 @@ class BondingCurveAccount { this.complete = complete; } - getBuyPrice(amount) { + getBuyPrice(amount: bigint): bigint { if (this.complete) { throw new Error("Curve is complete"); } @@ -46,7 +52,7 @@ class BondingCurveAccount { return s < this.realTokenReserves ? s : this.realTokenReserves; } - getSellPrice(amount , feeBasisPoints ) { + getSellPrice(amount: bigint, feeBasisPoints: bigint): bigint { if (this.complete) { throw new Error("Curve is complete"); } @@ -66,7 +72,7 @@ class BondingCurveAccount { return n - a; } - getMarketCapSOL() { + getMarketCapSOL(): bigint { if (this.virtualTokenReserves === 0n) { return 0n; } @@ -77,7 +83,7 @@ class BondingCurveAccount { ); } - getFinalMarketCapSOL(feeBasisPoints){ + getFinalMarketCapSOL(feeBasisPoints: bigint): bigint { let totalSellValue = this.getBuyOutPrice( this.realTokenReserves, feeBasisPoints @@ -92,7 +98,7 @@ class BondingCurveAccount { return (this.tokenTotalSupply * totalVirtualValue) / totalVirtualTokens; } - getBuyOutPrice(amount, feeBasisPoints) { + getBuyOutPrice(amount: bigint, feeBasisPoints: bigint): bigint { let solTokens = amount < this.realSolReserves ? this.realSolReserves : amount; let totalSellValue = @@ -103,8 +109,8 @@ class BondingCurveAccount { return totalSellValue + fee; } - static fromBuffer(buffer) { - const structure = struct([ + public static fromBuffer(buffer: Buffer): BondingCurveAccount { + const structure: Layout = struct([ u64("discriminator"), u64("virtualTokenReserves"), u64("virtualSolReserves"), @@ -125,6 +131,4 @@ class BondingCurveAccount { value.complete ); } -} - -module.exports = {BondingCurveAccount}; \ No newline at end of file +} \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/buy.js b/src/pumpfunsdk/pumpdotfun-sdk/src/buy.ts similarity index 79% rename from src/pumpfunsdk/pumpdotfun-sdk/src/buy.js rename to src/pumpfunsdk/pumpdotfun-sdk/src/buy.ts index b563eaf..476c9cc 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/buy.js +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/buy.ts @@ -1,7 +1,7 @@ -const { PublicKey } = require("@solana/web3.js"); -const {buy} = require("./tools"); -const { program } = require("commander"); -let token_address = null, sol = null; +import { PublicKey } from "@solana/web3.js"; +import {buy} from "./tools"; +import { program } from "commander"; +let token_address:any = null, sol = null; program .option("--token_address ", "Specify the token address") .option("--sol ", "Specify the number of SOL") diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/createAndBuy.js b/src/pumpfunsdk/pumpdotfun-sdk/src/createAndBuy.ts similarity index 87% rename from src/pumpfunsdk/pumpdotfun-sdk/src/createAndBuy.js rename to src/pumpfunsdk/pumpdotfun-sdk/src/createAndBuy.ts index 2086fbd..c8ea09a 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/createAndBuy.js +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/createAndBuy.ts @@ -1,9 +1,10 @@ -const {createAndBuy} = require("./tools"); +import {createAndBuy} from "./tools"; // command line tool -const {program} = require("commander"); -const fs = require("fs"); +import {program} from "commander"; +import fs from "fs"; -let sol = null, mintKeypair = null, name = null, symbol = null, description = null, telegram = null, twitter = null, website = null, file = null; +let sol:any = null, mintKeypair:any = null, name:any = null, symbol:any = null, +description:any = null, telegram:any = null, twitter:any = null, website:any = null, file:any = null; program.option("--pathToMintKeypair ", "Specify the path to your own mint keypair") .option("--sol ", "Specify the number of SOL you want to buy") .option("--name ", "Specify the token name") diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/events.js b/src/pumpfunsdk/pumpdotfun-sdk/src/events.ts similarity index 75% rename from src/pumpfunsdk/pumpdotfun-sdk/src/events.js rename to src/pumpfunsdk/pumpdotfun-sdk/src/events.ts index 8405c4d..b2c34c3 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/events.js +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/events.ts @@ -1,6 +1,12 @@ -const { PublicKey } =require ("@solana/web3.js"); +import { PublicKey } from "@solana/web3.js"; +import { + CompleteEvent, + CreateEvent, + SetParamsEvent, + TradeEvent, +} from "./types"; - function toCreateEvent(event) { +export function toCreateEvent(event: CreateEvent): CreateEvent { return { name: event.name, symbol: event.symbol, @@ -11,7 +17,7 @@ const { PublicKey } =require ("@solana/web3.js"); }; } - function toCompleteEvent(event) { +export function toCompleteEvent(event: CompleteEvent): CompleteEvent { return { user: new PublicKey(event.user), mint: new PublicKey(event.mint), @@ -20,7 +26,7 @@ const { PublicKey } =require ("@solana/web3.js"); }; } - function toTradeEvent(event) { +export function toTradeEvent(event: TradeEvent): TradeEvent { return { mint: new PublicKey(event.mint), solAmount: BigInt(event.solAmount), @@ -35,7 +41,7 @@ const { PublicKey } =require ("@solana/web3.js"); }; } - function toSetParamsEvent(event) { +export function toSetParamsEvent(event: SetParamsEvent): SetParamsEvent { return { feeRecipient: new PublicKey(event.feeRecipient), initialVirtualTokenReserves: BigInt(event.initialVirtualTokenReserves), @@ -44,4 +50,4 @@ const { PublicKey } =require ("@solana/web3.js"); tokenTotalSupply: BigInt(event.tokenTotalSupply), feeBasisPoints: BigInt(event.feeBasisPoints), }; -} +} \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/globalAccount.js b/src/pumpfunsdk/pumpdotfun-sdk/src/globalAccount.ts similarity index 62% rename from src/pumpfunsdk/pumpdotfun-sdk/src/globalAccount.js rename to src/pumpfunsdk/pumpdotfun-sdk/src/globalAccount.ts index 00451ef..5335fe7 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/globalAccount.js +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/globalAccount.ts @@ -1,19 +1,27 @@ -const { PublicKey } =require( "@solana/web3.js"); -const { struct, bool, u64, publicKey, Layout } =require( "@coral-xyz/borsh"); - -class GlobalAccount { +import { PublicKey } from "@solana/web3.js"; +import { struct, bool, u64, publicKey, Layout } from "@coral-xyz/borsh"; +export class GlobalAccount { + public discriminator: bigint; + public initialized: boolean = false; + public authority: PublicKey; + public feeRecipient: PublicKey; + public initialVirtualTokenReserves: bigint; + public initialVirtualSolReserves: bigint; + public initialRealTokenReserves: bigint; + public tokenTotalSupply: bigint; + public feeBasisPoints: bigint; constructor( - discriminator, - initialized, - authority, - feeRecipient, - initialVirtualTokenReserves, - initialVirtualSolReserves, - initialRealTokenReserves, - tokenTotalSupply, - feeBasisPoints + discriminator: bigint, + initialized: boolean, + authority: PublicKey, + feeRecipient: PublicKey, + initialVirtualTokenReserves: bigint, + initialVirtualSolReserves: bigint, + initialRealTokenReserves: bigint, + tokenTotalSupply: bigint, + feeBasisPoints: bigint ) { this.discriminator = discriminator; this.initialized = initialized; @@ -26,7 +34,7 @@ class GlobalAccount { this.feeBasisPoints = feeBasisPoints; } - getInitialBuyPrice(amount) { + getInitialBuyPrice(amount: bigint): bigint { if (amount <= 0n) { return 0n; } @@ -40,8 +48,8 @@ class GlobalAccount { : this.initialRealTokenReserves; } - static fromBuffer(buffer){ - const structure = struct([ + public static fromBuffer(buffer: Buffer): GlobalAccount { + const structure: Layout = struct([ u64("discriminator"), bool("initialized"), publicKey("authority"), @@ -66,6 +74,4 @@ class GlobalAccount { BigInt(value.feeBasisPoints) ); } -} - -module.exports = {GlobalAccount}; \ No newline at end of file +} \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/index.js b/src/pumpfunsdk/pumpdotfun-sdk/src/index.js deleted file mode 100644 index bbab489..0000000 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/index.js +++ /dev/null @@ -1,8 +0,0 @@ -// export * from './pumpfun' -// export * from './util' -// export * from './types' -// export * from './events' -// export * from './globalAccount' -// export * from './bondingCurveAccount' -// export * from './amm' - diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/index.ts b/src/pumpfunsdk/pumpdotfun-sdk/src/index.ts new file mode 100644 index 0000000..385e336 --- /dev/null +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/index.ts @@ -0,0 +1,8 @@ +export * from './pumpfun' +export * from './util' +export * from './types' +export * from './events' +export * from './globalAccount' +export * from './bondingCurveAccount' +export * from './amm' + diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/pump-events-listener/listeners.js b/src/pumpfunsdk/pumpdotfun-sdk/src/pump-events-listener/listeners.ts similarity index 67% rename from src/pumpfunsdk/pumpdotfun-sdk/src/pump-events-listener/listeners.js rename to src/pumpfunsdk/pumpdotfun-sdk/src/pump-events-listener/listeners.ts index 0c14462..0f86629 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/pump-events-listener/listeners.js +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/pump-events-listener/listeners.ts @@ -1,30 +1,30 @@ -const {connection} = require("../../../../helpers/config"); -const { Keypair, Connection } = require("@solana/web3.js"); -const {PumpFunSDK} =require ("pumpdotfun-sdk"); -const { AnchorProvider } = require ("@coral-xyz/anchor"); +import {connection} from "../../../../helpers/config"; +import { Keypair, Connection } from "@solana/web3.js"; +import {PumpFunSDK} from "pumpdotfun-sdk"; +import { AnchorProvider } from "@coral-xyz/anchor"; -function getProvider(){ - const wallet = Keypair.generate(); +export function getProvider(){ + const wallet:any = Keypair.generate(); const provider = new AnchorProvider(connection, wallet, { commitment: "finalized", }); return provider; } -async function subscribeToCompleteBondingCurveEvent(sdk){ +export async function subscribeToCompleteBondingCurveEvent(sdk: PumpFunSDK){ const completeEventId = sdk.addEventListener("completeEvent", (event, slot, signature) => { console.log("completeEvent", event, slot, signature); }); console.log("Subscribed to completeEvent with ID:", completeEventId); } -async function subscribeToCreatePumpTokenEvent(sdk){ +export async function subscribeToCreatePumpTokenEvent(sdk: PumpFunSDK){ const createEventId = sdk.addEventListener("createEvent", (event, slot, signature) => { console.log("createEvent", event, slot, signature); console.log("mint pubkey", event.mint.toBase58()) }); console.log("Subscribed to createEvent with ID:", createEventId); } -async function subscribeToTradeEvent(sdk){ +export async function subscribeToTradeEvent(sdk: PumpFunSDK){ const tradeEventId = sdk.addEventListener("tradeEvent", (event, slot, signature) => { console.log("tradeEvent", event, slot, signature); }); @@ -42,5 +42,3 @@ async function main(){ } } main(); - -module.exports = {subscribeToCompleteBondingCurveEvent, subscribeToCreatePumpTokenEvent, subscribeToTradeEvent, getProvider}; \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/pumpfun.js b/src/pumpfunsdk/pumpdotfun-sdk/src/pumpfun.ts similarity index 68% rename from src/pumpfunsdk/pumpdotfun-sdk/src/pumpfun.js rename to src/pumpfunsdk/pumpdotfun-sdk/src/pumpfun.ts index b4e7e07..47a80e9 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/pumpfun.js +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/pumpfun.ts @@ -1,121 +1,122 @@ -const { +import { Commitment, Connection, Finality, Keypair, PublicKey, Transaction, -} =require ("@solana/web3.js"); -const { Program, Provider } =require ("@coral-xyz/anchor"); -const { GlobalAccount } =require ("./globalAccount.js"); -const { +} from "@solana/web3.js"; +import { Program, Provider } from "@coral-xyz/anchor"; +import { GlobalAccount } from "./globalAccount"; +import { toCompleteEvent, toCreateEvent, toSetParamsEvent, toTradeEvent, -} =require ("./events.js"); -const { +} from "./events"; +import { createAssociatedTokenAccountInstruction, getAccount, getAssociatedTokenAddress, getOrCreateAssociatedTokenAccount, -} =require ("@solana/spl-token"); -const { BondingCurveAccount } =require ("./bondingCurveAccount.js"); -const { BN } =require ("bn.js"); -const { +} from "@solana/spl-token"; +import { BondingCurveAccount } from "./bondingCurveAccount"; +const {BN} = require("bn.js"); +import { DEFAULT_COMMITMENT, DEFAULT_FINALITY, calculateWithSlippageBuy, calculateWithSlippageSell, sendTx, sendTxToJito, -} =require ("./util.js"); -const { PumpFun, IDL } =require ("./IDL/index.js"); -const {wallet} = require("../../../helpers/config.js") -const PROGRAM_ID = "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; -const MPL_TOKEN_METADATA_PROGRAM_ID = +} from "./util"; +import { PumpFun, IDL } from "./IDL/index"; +import { wallet } from "../../../helpers/config"; +export const PROGRAM_ID = "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; +export const MPL_TOKEN_METADATA_PROGRAM_ID = "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"; - const GLOBAL_ACCOUNT_SEED = "global"; - const MINT_AUTHORITY_SEED = "mint-authority"; - const BONDING_CURVE_SEED = "bonding-curve"; - const METADATA_SEED = "metadata"; +export const GLOBAL_ACCOUNT_SEED = "global"; +export const MINT_AUTHORITY_SEED = "mint-authority"; +export const BONDING_CURVE_SEED = "bonding-curve"; +export const METADATA_SEED = "metadata"; - const DEFAULT_DECIMALS = 6; +export const DEFAULT_DECIMALS = 6; - class PumpFunSDK { - - constructor(provider) { - this.program = new Program(IDL, provider); +export class PumpFunSDK { + public program: Program; + public connection: Connection; + constructor(provider?: Provider) { + this.program = new Program(IDL as PumpFun, provider); this.connection = this.program.provider.connection; } - async bundleBuys( creator, - mint, - createTokenMetadata, - buyAmountSol, - buyersWallets, + async bundleBuys( + creator: any, + mint: any, + createTokenMetadata: any, + buyAmountSol: any, + buyersWallets: any, slippageBasisPoints = 500n, - priorityFees, + priorityFees: any, commitment = DEFAULT_COMMITMENT, - finality = DEFAULT_FINALITY, - ){ - let tokenMetadata = await this.createTokenMetadata(createTokenMetadata); - let createTx = await this.getCreateInstructions( + finality = DEFAULT_FINALITY + ) { + let tokenMetadata = await this.createTokenMetadata(createTokenMetadata); + let createTx = await this.getCreateInstructions( + creator.publicKey, + createTokenMetadata.name, + createTokenMetadata.symbol, + tokenMetadata.metadataUri, + mint + ); + let final_tx = new Transaction().add(createTx); + const globalAccount = await this.getGlobalAccount(commitment); + const buyAmount = globalAccount.getInitialBuyPrice(buyAmountSol); + const buyAmountWithSlippage = calculateWithSlippageBuy( + buyAmountSol, + slippageBasisPoints + ); + final_tx.add( + await this.getBuyInstructions( creator.publicKey, - createTokenMetadata.name, - createTokenMetadata.symbol, - tokenMetadata.metadataUri, - mint - ); - let final_tx = new Transaction().add(createTx); - const globalAccount = await this.getGlobalAccount(commitment); - const buyAmount = globalAccount.getInitialBuyPrice(buyAmountSol); - const buyAmountWithSlippage = calculateWithSlippageBuy( - buyAmountSol, - slippageBasisPoints - ); - final_tx.add( - await this.getBuyInstructions( - creator.publicKey, - mint.publicKey, - globalAccount.feeRecipient, - buyAmount, - buyAmountWithSlippage - ) - ); + mint.publicKey, + globalAccount.feeRecipient, + buyAmount, + buyAmountWithSlippage + ) + ); - for(let i=0; i { @@ -501,36 +490,20 @@ const MPL_TOKEN_METADATA_PROGRAM_ID = switch (eventType) { case "createEvent": processedEvent = toCreateEvent(event); - callback( - processedEvent, - slot, - signature - ); + callback(processedEvent, slot, signature); break; case "tradeEvent": processedEvent = toTradeEvent(event); - callback( - processedEvent, - slot, - signature - ); + callback(processedEvent, slot, signature); break; case "completeEvent": processedEvent = toCompleteEvent(event); - callback( - processedEvent , - slot, - signature - ); + callback(processedEvent, slot, signature); console.log("completeEvent", event, slot, signature); break; case "setParamsEvent": - processedEvent = toSetParamsEvent(event ); - callback( - processedEvent, - slot, - signature - ); + processedEvent = toSetParamsEvent(event); + callback(processedEvent, slot, signature); break; default: console.error("Unhandled event type:", eventType); @@ -539,9 +512,8 @@ const MPL_TOKEN_METADATA_PROGRAM_ID = ); } - removeEventListener(eventId) { + removeEventListener(eventId:any) { this.program.removeEventListener(eventId); } } -module.exports = { PumpFunSDK, PROGRAM_ID, GLOBAL_ACCOUNT_SEED, MINT_AUTHORITY_SEED, BONDING_CURVE_SEED, METADATA_SEED, DEFAULT_DECIMALS }; \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/sell.js b/src/pumpfunsdk/pumpdotfun-sdk/src/sell.ts similarity index 77% rename from src/pumpfunsdk/pumpdotfun-sdk/src/sell.js rename to src/pumpfunsdk/pumpdotfun-sdk/src/sell.ts index 5fbe1cc..c91019a 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/sell.js +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/sell.ts @@ -1,12 +1,12 @@ -const {sell} = require('./tools'); -const { PublicKey } = require("@solana/web3.js"); -const { program } = require("commander"); -let token_address = null, sellPercentage = null; +import {sell} from './tools'; +import { PublicKey } from "@solana/web3.js"; +import { program } from "commander"; +let token_address:any = null, sellPercentage:any = null; program .option("--token_address ", "Specify the token address") .option("--percentage ", "Specify the percentage of token to sell") .option("-h, --help", "display help for command") - .action((options) => { + .action((options:any) => { if (options.help) { console.log( "node sell --token_address --percentage " diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/tools.js b/src/pumpfunsdk/pumpdotfun-sdk/src/tools.ts similarity index 79% rename from src/pumpfunsdk/pumpdotfun-sdk/src/tools.js rename to src/pumpfunsdk/pumpdotfun-sdk/src/tools.ts index dbb4e41..6a26929 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/tools.js +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/tools.ts @@ -1,44 +1,28 @@ -const { AnchorProvider } = require("@coral-xyz/anchor"); -const { PumpFunSDK, DEFAULT_DECIMALS } = require("./pumpfun.js"); -const { - sendTxToJito, - DEFAULT_COMMITMENT, - generateWalletsAndDropSOL, - solCollector, -} = require("./util.js"); -const { wallet, connection } = require("../../../helpers/config.js"); -const { +import { AnchorProvider } from "@coral-xyz/anchor"; +import { PumpFunSDK, DEFAULT_DECIMALS } from "./pumpfun.js"; +import { wallet, connection } from "../../../helpers/config"; +import { getOrCreateKeypair, getSPLBalance, printSOLBalance, printSPLBalance, - getKeypairByJsonPath, -} = require("../example/util.js"); -const fs = require("fs"); -const { promises } = require("dns"); -const { + getKeypairByJsonPath +} from "../example/util"; +import fs from "fs"; +import { promises } from "dns"; +import { Keypair, PublicKey, SystemProgram, Transaction, LAMPORTS_PER_SOL, -} = require("@solana/web3.js"); -const { bs58 } = require("@coral-xyz/anchor/dist/cjs/utils/bytes"); -const { - calculateWithSlippageBuy, - sendTx, - getOurWallet, - getOtherTradersWallet, - readCSVFile, - extractPrivateKeyAndSolana, -} = require("./util.js"); -const { - jito_executeAndConfirm, -} = require("./transactions/jito-tx-executor.js"); -const path = require("path"); -const { get } = require("http"); +} from "@solana/web3.js"; +import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; +import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet"; +import path from "path"; const SLIPPAGE_BASIS_POINTS = 100n; +const Wallet = new NodeWallet(wallet); /** * Creates and buys a token using the provided parameters. * @param {string} pathToMintKeypair - The path to the mint keypair JSON file. @@ -46,13 +30,14 @@ const SLIPPAGE_BASIS_POINTS = 100n; * @param {number} initialBuySolAmount - The initial amount of SOL to buy the token with. * @returns {Promise} - A promise that resolves when the token creation and purchase is complete. */ -async function createAndBuy(pathToMintKeypair, tokenMetadata, initialBuySolAmount) { - const provider = new AnchorProvider(connection, wallet, { +export async function createAndBuy(pathToMintKeypair:any, tokenMetadata:any, initialBuySolAmount:any) { + const Wallet = new NodeWallet(wallet); + const provider = new AnchorProvider(connection, Wallet, { commitment: "finalized", }); const sdk = new PumpFunSDK(provider); - const mintKeypair = getKeypairByJsonPath(pathToMintKeypair); + const mintKeypair:any = getKeypairByJsonPath(pathToMintKeypair); console.log(mintKeypair.publicKey); await printSOLBalance(connection, wallet.publicKey, "Master wallet keypair"); let globalAccount = await sdk.getGlobalAccount(); @@ -100,8 +85,8 @@ async function createAndBuy(pathToMintKeypair, tokenMetadata, initialBuySolAmoun * @param {number} sellPercentage - The percentage of tokens to sell. * @returns {Promise} - A promise that resolves when the sell operation is complete. */ -async function sell(mintPubKey, sellPercentage) { - const provider = new AnchorProvider(connection, wallet, { +export async function sell(mintPubKey:any, sellPercentage:any) { + const provider = new AnchorProvider(connection, Wallet, { commitment: "finalized", }); @@ -143,8 +128,8 @@ async function sell(mintPubKey, sellPercentage) { * @param {number} solPerOrder - The amount of SOL to spend per order. * @returns {Promise} - A promise that resolves when the buy operation is complete. */ -async function buy(mintPubKey, solPerOrder) { - const provider = new AnchorProvider(connection, wallet, { +export async function buy(mintPubKey:any, solPerOrder:any) { + const provider = new AnchorProvider(connection, Wallet, { commitment: "finalized", }); @@ -211,5 +196,3 @@ async function run() { } //run(); - -module.exports = {buy, sell, createAndBuy} \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/transactions/jito-tx-executor.js b/src/pumpfunsdk/pumpdotfun-sdk/src/transactions/jito-tx-executor.js deleted file mode 100644 index e8a762f..0000000 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/transactions/jito-tx-executor.js +++ /dev/null @@ -1,126 +0,0 @@ -const { - BlockhashWithExpiryBlockHeight, - Keypair, - PublicKey, - SystemProgram, - Connection, - TransactionMessage, - VersionedTransaction, - } = require("@solana/web3.js"); -const axios = require("axios"); -const bs58 = require("bs58"); -const { Currency, CurrencyAmount } = require("@raydium-io/raydium-sdk"); -const { connection } = require("../../../../helpers/config"); - const jito_Validators = [ - "DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh", - "ADuUkR4vqLUMWXxW9gh6D6L8pMSawimctcNZ5pGwDcEt", - "3AVi9Tg9Uo68tJfuvoKvqKNWKkC5wPdSSdeBnizKZ6jT", - "HFqU5x63VTqvQss8hp11i4wVV8bD44PvwucfZ2bU7gRe", - "ADaUMid9yfUytqMBgopwjb2DTLSokTSzL1zt6iGPaS49", - "Cw8CFyM9FkoMi7K7Crf6HNQqf4uEMzpKw6QNghXLvLkY", - "DttWaMuVvTiduZRnguLF7jNxTgiMBZ1hyAumKUiL2KRL", - "96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5", - ]; - const endpoints = [ // TODO: Choose a jito endpoint which is closest to your location, and uncomment others - //"https://mainnet.block-engine.jito.wtf/api/v1/bundles", - //"https://amsterdam.mainnet.block-engine.jito.wtf/api/v1/bundles", - //"https://frankfurt.mainnet.block-engine.jito.wtf/api/v1/bundles", - //"https://ny.mainnet.block-engine.jito.wtf/api/v1/bundles", - "https://tokyo.mainnet.block-engine.jito.wtf/api/v1/bundles", - ]; -async function getRandomValidator() { - const res = - jito_Validators[Math.floor(Math.random() * jito_Validators.length)]; - return new PublicKey(res); - } - /** - * Executes and confirms a Jito transaction. - * @param {Transaction} transaction - The transaction to be executed and confirmed. - * @param {Account} payer - The payer account for the transaction. - * @param {Blockhash} lastestBlockhash - The latest blockhash. - * @param {number} jitofee - The fee for the Jito transaction. - * @returns {Promise<{ confirmed: boolean, signature: string | null }>} - A promise that resolves to an object containing the confirmation status and the transaction signature. - */ -async function jito_executeAndConfirm( - transaction, - payer, - lastestBlockhash, - jitofee - ){ - const jito_validator_wallet = await getRandomValidator(); - console.log("Executing transaction (jito)..."); - console.log("Selected Jito Validator: ", jito_validator_wallet.toBase58()); - try { - const fee = new CurrencyAmount(Currency.SOL, jitofee, false).raw.toNumber(); - console.log(`Jito Fee: ${fee / 10 ** 9} sol`); - const jitoFee_message = new TransactionMessage({ - payerKey: payer.publicKey, - recentBlockhash: lastestBlockhash.blockhash, - instructions: [ - SystemProgram.transfer({ - fromPubkey: payer.publicKey, - toPubkey: jito_validator_wallet, - lamports: fee, - }), - ], - }).compileToV0Message(); - const jitoFee_transaction = new VersionedTransaction(jitoFee_message); - jitoFee_transaction.sign([payer]); - const jitoTxSignature = bs58.encode(jitoFee_transaction.signatures[0]); - const serializedJitoFeeTransaction = bs58.encode( - jitoFee_transaction.serialize() - ); - const serializedTransaction = bs58.encode(transaction.serialize()); - const final_transaction = [ - serializedJitoFeeTransaction, - serializedTransaction, - ]; - const requests = endpoints.map((url) => - axios.post(url, { - jsonrpc: "2.0", - id: 1, - method: "sendBundle", - params: [final_transaction], - }) - ); - console.log("Sending tx to Jito validators..."); - const res = await Promise.all(requests.map((p) => p.catch((e) => e))); - const success_res = res.filter((r) => !(r instanceof Error)); - if (success_res.length > 0) { - console.log("Jito validator accepted the tx"); - return await jito_confirm(jitoTxSignature, lastestBlockhash); - } else { - console.log("No Jito validators accepted the tx"); - return { confirmed: false, signature: jitoTxSignature }; - } - } catch (e) { - if (e instanceof axios.AxiosError) { - console.log("Failed to execute the jito transaction"); - } else { - console.log("Error during jito transaction execution: ", e); - } - return { confirmed: false, signature: null }; - } - } - - /** - * Confirms a transaction on the Solana blockchain. - * @param {string} signature - The signature of the transaction. - * @param {object} latestBlockhash - The latest blockhash information. - * @returns {object} - An object containing the confirmation status and the transaction signature. - */ -async function jito_confirm(signature, latestBlockhash) { - console.log("Confirming the jito transaction..."); - const confirmation = await connection.confirmTransaction( - { - signature, - lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, - blockhash: latestBlockhash.blockhash, - }, - "confirmed" - ); - return { confirmed: !confirmation.value.err, signature: signature }; - } - - -module.exports = { jito_executeAndConfirm, jito_confirm }; \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/types.js b/src/pumpfunsdk/pumpdotfun-sdk/src/types.js deleted file mode 100644 index 4b9bf2c..0000000 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/types.js +++ /dev/null @@ -1,80 +0,0 @@ -const { PublicKey, VersionedTransactionResponse } = require("@solana/web3.js"); - -// export type CreateTokenMetadata = { -// name: string; -// symbol: string; -// description: string; -// file: Blob; -// twitter?: string; -// telegram?: string; -// website?: string; -// }; - -// export type TokenMetadata = { -// name: string; -// symbol: string; -// description: string; -// image: string; -// showName: boolean; -// createdOn: string; -// twitter: string; -// }; - -// export type CreateEvent = { -// name: string; -// symbol: string; -// uri: string; -// mint: PublicKey; -// bondingCurve: PublicKey; -// user: PublicKey; -// }; - -// export type TradeEvent = { -// mint: PublicKey; -// solAmount: bigint; -// tokenAmount: bigint; -// isBuy: boolean; -// user: PublicKey; -// timestamp: number; -// virtualSolReserves: bigint; -// virtualTokenReserves: bigint; -// realSolReserves: bigint; -// realTokenReserves: bigint; -// }; - -// export type CompleteEvent = { -// user: PublicKey; -// mint: PublicKey; -// bondingCurve: PublicKey; -// timestamp: number; -// }; - -// export type SetParamsEvent = { -// feeRecipient: PublicKey; -// initialVirtualTokenReserves: bigint; -// initialVirtualSolReserves: bigint; -// initialRealTokenReserves: bigint; -// tokenTotalSupply: bigint; -// feeBasisPoints: bigint; -// }; - -// export interface PumpFunEventHandlers { -// createEvent: CreateEvent; -// tradeEvent: TradeEvent; -// completeEvent: CompleteEvent; -// setParamsEvent: SetParamsEvent; -// } - -// export type PumpFunEventType = keyof PumpFunEventHandlers; - -// export type PriorityFee = { -// unitLimit: number; -// unitPrice: number; -// }; - -// export type TransactionResult = { -// signature?: string; -// error?: unknown; -// results?: VersionedTransactionResponse; -// success: boolean; -// }; diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/types.ts b/src/pumpfunsdk/pumpdotfun-sdk/src/types.ts new file mode 100644 index 0000000..60af5ec --- /dev/null +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/types.ts @@ -0,0 +1,80 @@ +import { PublicKey, VersionedTransactionResponse } from "@solana/web3.js"; + +export type CreateTokenMetadata = { + name: string; + symbol: string; + description: string; + file: Blob; + twitter?: string; + telegram?: string; + website?: string; +}; + +export type TokenMetadata = { + name: string; + symbol: string; + description: string; + image: string; + showName: boolean; + createdOn: string; + twitter: string; +}; + +export type CreateEvent = { + name: string; + symbol: string; + uri: string; + mint: PublicKey; + bondingCurve: PublicKey; + user: PublicKey; +}; + +export type TradeEvent = { + mint: PublicKey; + solAmount: bigint; + tokenAmount: bigint; + isBuy: boolean; + user: PublicKey; + timestamp: number; + virtualSolReserves: bigint; + virtualTokenReserves: bigint; + realSolReserves: bigint; + realTokenReserves: bigint; +}; + +export type CompleteEvent = { + user: PublicKey; + mint: PublicKey; + bondingCurve: PublicKey; + timestamp: number; +}; + +export type SetParamsEvent = { + feeRecipient: PublicKey; + initialVirtualTokenReserves: bigint; + initialVirtualSolReserves: bigint; + initialRealTokenReserves: bigint; + tokenTotalSupply: bigint; + feeBasisPoints: bigint; +}; + +export interface PumpFunEventHandlers { + createEvent: CreateEvent; + tradeEvent: TradeEvent; + completeEvent: CompleteEvent; + setParamsEvent: SetParamsEvent; +} + +export type PumpFunEventType = keyof PumpFunEventHandlers; + +export type PriorityFee = { + unitLimit: number; + unitPrice: number; +}; + +export type TransactionResult = { + signature?: string; + error?: unknown; + results?: VersionedTransactionResponse; + success: boolean; +}; \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/util.js b/src/pumpfunsdk/pumpdotfun-sdk/src/util.js deleted file mode 100644 index 9b6c6f6..0000000 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/util.js +++ /dev/null @@ -1,568 +0,0 @@ -const{ - Commitment, - ComputeBudgetProgram, - Connection, - Finality, - Keypair, - PublicKey, - SendTransactionError, - Transaction, - TransactionMessage, - VersionedTransaction, - VersionedTransactionResponse, - sendAndConfirmTransaction, - LAMPORTS_PER_SOL, - SystemProgram -} =require ("@solana/web3.js"); -const{ AnchorProvider } =require ("@coral-xyz/anchor"); -const {PumpFunSDK, DEFAULT_DECIMALS} = require("./pumpfun.js") -const{ PriorityFee, TransactionResult } =require ("./types.js"); -const{ jito_executeAndConfirm } =require ("./transactions/jito-tx-executor.js"); -const fs =require ("fs"); -const{ bs58 } =require ("@coral-xyz/anchor/dist/cjs/utils/bytes"); -const { - getOrCreateKeypair, - getSPLBalance, - printSOLBalance, - printSPLBalance, - getKeypairByJsonPath, -} = require("../example/util.js"); -const DEFAULT_COMMITMENT = "finalized"; -const DEFAULT_FINALITY = "finalized"; - -const calculateWithSlippageBuy = ( - amount, - basisPoints -) => { - return amount + (amount * basisPoints) / 10000n; -}; - -const calculateWithSlippageSell = ( - amount, - basisPoints -) => { - return amount - (amount * basisPoints) / 10000n; -}; - -function readCSVFile(filePath) { - try { - const data = fs.readFileSync(filePath, "utf8"); - return data; - } catch (err) { - console.error("Error reading the CSV file:", err); - return null; - } -} - -async function sendTxToJito( - connection, - tx, - payer, - signers, - jitofee -){ - const blockhash = (await connection.getLatestBlockhash()); - let final_tx = new Transaction(); - final_tx.add(tx); - let versionedTx = await buildVersionedTx(connection, payer.publicKey, final_tx, connection.commitment); - versionedTx.sign(signers); - try{ - const {confirmed, signature} = await jito_executeAndConfirm(versionedTx, payer, blockhash, jitofee); - // let txResult = await getTxDetails(connection, signature, connection.commitment, DEFAULT_FINALITY); - if (!confirmed) { - return { - success: false, - error: "Transaction failed", - }; - } - return { - success: true, - signature: signature, - }; - - }catch(e){ - if(e instanceof SendTransactionError){ - let ste = e; - console.log(await ste.getLogs(connection)); - }else{ - console.error(e); - } - return { - error: e, - success: false, - }; - } - - -} - -async function sendTx( - connection, - tx, - payer, - signers, - priorityFees, - commitment = DEFAULT_COMMITMENT, - finality = DEFAULT_FINALITY -){ - let newTx = new Transaction(); - - if (priorityFees) { - const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({ - units: priorityFees.unitLimit, - }); - - const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({ - microLamports: priorityFees.unitPrice, - }); - newTx.add(modifyComputeUnits); - newTx.add(addPriorityFee); - } - - newTx.add(tx); - let versionedTx = await buildVersionedTx(connection, payer, newTx, commitment); - versionedTx.sign(signers); - - try { - const sig = await connection.sendTransaction(versionedTx, { - skipPreflight: true, - }); - - console.log("sig:", `https://solscan.io/tx/${sig}`); - - let txResult = await getTxDetails(connection, sig, commitment, finality); - if (!txResult) { - return { - success: false, - error: "Transaction failed", - }; - } - return { - success: true, - }; - } catch (e) { - if (e instanceof SendTransactionError) { - let ste = e; - console.log(await ste.getLogs(connection)); - } else { - console.error(e); - } - return { - error: e, - success: false, - }; - } -} - -async function buildVersionedTx ( - connection, - payer, - tx, - commitment = DEFAULT_COMMITMENT -){ - const blockHash = (await connection.getLatestBlockhash(commitment)) - .blockhash; - - let messageV0 = new TransactionMessage({ - payerKey: payer, - recentBlockhash: blockHash, - instructions: tx.instructions, - }).compileToV0Message(); - - return new VersionedTransaction(messageV0); -}; - -async function getTxDetails ( - connection, - sig, - commitment = DEFAULT_COMMITMENT, - finality= DEFAULT_FINALITY -){ - const latestBlockHash = await connection.getLatestBlockhash(); - await connection.confirmTransaction( - { - blockhash: latestBlockHash.blockhash, - lastValidBlockHeight: latestBlockHash.lastValidBlockHeight, - signature: sig, - }, - commitment - ); - - return connection.getTransaction(sig, { - maxSupportedTransactionVersion: 0, - commitment: finality, - }); -}; - -function generateKeysAndAllocateSol(targetNumberOfKeys, targetTotalSol) { - // Generate private keys - const keys = []; - let sum = 0; - for (let i = 0; i < targetNumberOfKeys; i++) { - const keypair = Keypair.generate(); - keys.push(bs58.encode(keypair.secretKey)); - } - - // Allocate SOL with randomness - const averageAllocation = targetTotalSol / targetNumberOfKeys; - const maxDeviation = averageAllocation * 0.2; // 10% deviation - - const allocations = []; - let totalAllocated = 0; - - for (let i = 0; i < targetNumberOfKeys - 1; i++) { - const randomDeviation = (Math.random() * 2 - 1) * maxDeviation; - const allocation = parseFloat( - (averageAllocation + randomDeviation).toFixed(10) - ); - allocations.push({ privateKey: keys[i], sol: allocation }); - sum += allocation + 0.004; - totalAllocated += allocation; - } - - // Adjust the last allocation to match the target total precisely - const lastAllocation = parseFloat( - (targetTotalSol - totalAllocated).toFixed(10) - ); - - allocations.push({ - privateKey: keys[targetNumberOfKeys - 1], - sol: lastAllocation, - }); - console.log("sum", sum); - return allocations; -} - -// Function to write the allocations to a CSV file -async function writeAllocationsToCSV(filePath, allocations) { - const csvContent = allocations - .map(({ privateKey, sol }) => `${privateKey},${sol}`) - .join("\n"); - fs.writeFileSync(filePath, csvContent, "utf8"); -} - async function dropWalletBySOL(connection, walletListWithSOL, fundingWallet) { - console.log(fundingWallet.publicKey.toBase58()); - for (let i = 0; i < walletListWithSOL.length; i++) { - // we bundle 5 wallet to drop sol - if (i % 5 == 0) { - let final_tx = new Transaction(); - let fiveSigners = []; - for (let j = i; j < i + 5; j++) { - let secretKey = new Uint8Array( - bs58.decode(walletListWithSOL[j].privateKey) - ); - let sniperWallets = Keypair.fromSecretKey(secretKey); - console.log("Existing wallet: ", sniperWallets.publicKey.toBase58()); - console.log( - "it needs to drop: ", - walletListWithSOL[j].SOL * LAMPORTS_PER_SOL - ); - final_tx.add( - SystemProgram.transfer({ - fromPubkey: fundingWallet.publicKey, - toPubkey: sniperWallets.publicKey, - lamports: Math.round(walletListWithSOL[j].SOL * LAMPORTS_PER_SOL), - }) - ); - fiveSigners.push(sniperWallets); - } - - // Send the transaction - await sendTx( - connection, - final_tx, - fundingWallet.publicKey, - [fundingWallet], - { - unitLimit: 250000, - unitPrice: 0.005 * LAMPORTS_PER_SOL, - } - ); - } - } -} - -async function extractPrivateKeyAndSolana(data, numberOfSnipers) { - // Split the input string by newlines to handle multiple lines of input - const lines = data.split("\n"); - const pathToBoughtSnipers = - "/Users/chiwangso/Desktop/beta-memecoin-cli/src/memecoin-launch/pumpdotfun-sdk/src/WalletKeypairs/already3.json"; - let boughtSnipers = []; - try { - const fileContents = await fs.promises.readFile( - pathToBoughtSnipers, - "utf8" - ); - boughtSnipers = JSON.parse(fileContents); - } catch (error) { - // If the file doesn't exist, it's okay, we'll just create a new one - } - // Initialize an array to hold the results - const results= []; - let cnt = 0; - - // Iterate over each line - lines.forEach((line) => { - // Split the line by the comma to separate the private key and the number - const parts = line.split(","); - - // Check if the line has both a private key and a number - if (parts.length >= 2) { - const privateKey = parts[0].trim(); - const SOL = parseFloat(parts[1].trim()); - const keypair = Keypair.fromSecretKey( - new Uint8Array(bs58.decode(privateKey)) - ); - - // Push the result as an object if the status is not "done" and the count is less than the number of snipers - if ( - cnt < numberOfSnipers && - !boughtSnipers.includes(keypair.publicKey.toBase58()) - ) { - results.push({ - privateKey, - SOL, - }); - cnt++; - } - } - }); - - return results; -} - - async function getKeypairFromCsv(pathToCsv, numberOfSnipers) { - const data = await readCSVFile(pathToCsv); - const extractedData = await extractPrivateKeyAndSolana(data, numberOfSnipers); - let keypairList = []; - for (let i = 0; i < extractedData.length; i++) { - let secretKey = new Uint8Array(bs58.decode(extractedData[i].privateKey)); - let keypair = Keypair.fromSecretKey(secretKey); - keypairList.push(keypair); - } - return keypairList; -} - - - -async function getOtherTradersWallet(mintPubKey) { - let page = 1; - let allOwners = new Set(); - - while (true) { - const response = await fetch( - "https://mainnet.helius-rpc.com/?api-key=448fa184-4e3c-419b-a456-e9fd6889b659", - { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - jsonrpc: "2.0", - method: "getTokenAccounts", - id: "helius-test", - params: { - page: page, - limit: 1000, - displayOptions: {}, - mint: mintPubKey.toBase58(), - }, - }), - } - ); - const data = await response.json(); - - if (!data.result || data.result.token_accounts.length === 0) { - break; - } - data.result.token_accounts.forEach((account) => - allOwners.add(account.owner) - ); - page++; - } - - return Array.from(allOwners) ; - // return a list of outsider wallet address - // [ - // "owner": amount - // "owner2": amount - //] -} - - -async function getOurWallet() { - // return a list of our wallet address - const pathToSave = - "/Users/chiwangso/Desktop/beta-memecoin-cli/src/memecoin-launch/pumpdotfun-sdk/src/WalletKeypairs/already3.json"; - let listOfOurWallets= []; - const fileContents = await fs.promises.readFile(pathToSave, "utf8"); - listOfOurWallets = JSON.parse(fileContents); - return listOfOurWallets ; -} - -async function solCollector(connection, wallet, numberOfSnipers, pathToSnipersPrivateKey) { - - let sniperKeypairs = []; - const privateKeysArr = await fs.promises.readFile(pathToSnipersPrivateKey, "utf8"); - existingWallets = JSON.parse(privateKeysArr); - - for (let i = 0; i < existingWallets.length; i++) { - const sniperWallet = Keypair.fromSecretKey(bs58.decode(existingWallets[i])); - sniperKeypairs.push(sniperWallet); - } - console.log("Sol Collector is start"); - let final_tx = new Transaction(); - for (let i = 0; i < numberOfSnipers; i++) { - const solbalance = await connection.getBalance(sniperKeypairs[i].publicKey); - console.log( - `Sniper ${sniperKeypairs[i].publicKey.toBase58()} SOL balance: `, - solbalance - ); - final_tx.add( - SystemProgram.transfer({ - fromPubkey: sniperKeypairs[i].publicKey, - toPubkey: wallet.publicKey, - lamports: solbalance, - }) - ); - } - //send the transaction - - await sendTx( - connection, - final_tx, - wallet.publicKey, - [wallet, ...sniperKeypairs], - { - unitLimit: 250000, - unitPrice: 750000, - } - ); -} - -async function dropSOLToWallet(connection, masterWallet, walletPublicAddress, SOLToDrop) { - let final_tx = new Transaction(); - final_tx.add( - SystemProgram.transfer({ - fromPubkey: masterWallet.publicKey, - toPubkey: walletPublicAddress, - lamports: Math.round(SOLToDrop * LAMPORTS_PER_SOL), - }) - ); - const blockhash = await connection.getLatestBlockhash("confirmed"); - final_tx.feePayer = masterWallet.publicKey; - final_tx.recentBlockhash = blockhash.blockhash; - await sendTxToJito( - connection, - final_tx, - masterWallet, - [masterWallet], - 0.0001 - ); -} -async function getNumberOfKeypairsArrayFromPath( - path, - numberOfKeypairs -){ - let existingWallets = []; - let resWalletKeypairs = []; - try { - const fileContents = await fs.promises.readFile(path, "utf8"); - existingWallets = JSON.parse(fileContents); - for (let i = 0; i < numberOfKeypairs; i++) { - const secretKey = new Uint8Array(bs58.decode(existingWallets[i])); - const wallet = Keypair.fromSecretKey(secretKey); - console.log(wallet.publicKey.toBase58()); - resWalletKeypairs.push(wallet); - } - return resWalletKeypairs; - } catch (error) { - // If the file doesn't exist, it's okay, we'll just create a new one - } - return resWalletKeypairs; -} - - async function generateWalletsAndDropSOL( - connection, - masterWallet, - amountOfSol, - numberOfNewWallet, - pathToSave -){ - // Check if the file already exists - let existingWallets= []; - try { - const fileContents = await fs.promises.readFile(pathToSave, "utf8"); - existingWallets = JSON.parse(fileContents); - } catch (error) { - // If the file doesn't exist, it's okay, we'll just create a new one - } - let final_tx = new Transaction(); - for (let i = 0; i < existingWallets.length; i++) { - const wallet = Keypair.fromSecretKey(bs58.decode(existingWallets[i])); - console.log("Existing wallet: ", wallet.publicKey.toBase58()); - final_tx.add( - SystemProgram.transfer({ - fromPubkey: masterWallet.publicKey, - toPubkey: wallet.publicKey, - lamports: amountOfSol * LAMPORTS_PER_SOL, - }) - ); - } - // Generate new wallets and append to the existing array - for (let i = 0; i < numberOfNewWallet; i++) { - let newWallet = Keypair.generate(); - - console.log("New wallet created: ", newWallet.publicKey.toBase58()); - const privateKey = bs58.encode(newWallet.secretKey); - existingWallets.push(privateKey); - // Transfer SOL to the new wallet - final_tx.add( - SystemProgram.transfer({ - fromPubkey: masterWallet.publicKey, - toPubkey: newWallet.publicKey, - lamports: amountOfSol * LAMPORTS_PER_SOL, - }) - ); - } - - // Send the transaction - const blockhash = await connection.getLatestBlockhash("confirmed"); - final_tx.feePayer = masterWallet.publicKey; - final_tx.recentBlockhash = blockhash.blockhash; - await sendTxToJito( - connection, - final_tx, - masterWallet, - [masterWallet], - 0.0001 - ); - - // Save the updated array to the file - try { - await fs.promises.writeFile( - pathToSave, - JSON.stringify(existingWallets, null, 2) - ); - console.log(`Wallets saved to ${pathToSave}`); - } catch (error) { - console.error(`Error saving wallets to ${pathToSave}:`, error); - } - - return existingWallets; -} - - async function checkIfBondingCurveComplete(connection, wallet, mintKeypair) { - const provider = new AnchorProvider(connection, wallet, { - commitment: "finalized", - }); - - const sdk = new PumpFunSDK(provider); - const bondingCurveAccount = await sdk.getBondingCurveAccount( - mintKeypair.publicKey - ); - console.log("bondingCurveAccount: ", bondingCurveAccount); - return bondingCurveAccount?.complete; -} - -module.exports = {generateWalletsAndDropSOL, getNumberOfKeypairsArrayFromPath, dropSOLToWallet, solCollector, getOurWallet, getOtherTradersWallet, getKeypairFromCsv, extractPrivateKeyAndSolana, sendTx, sendTxToJito, readCSVFile, calculateWithSlippageSell, calculateWithSlippageBuy, DEFAULT_COMMITMENT, DEFAULT_FINALITY, sendTxToJito, buildVersionedTx, getTxDetails, generateKeysAndAllocateSol, writeAllocationsToCSV, dropWalletBySOL, getKeypairFromCsv, extractPrivateKeyAndSolana, getOtherTradersWallet, getOurWallet, solCollector, dropSOLToWallet, getNumberOfKeypairsArrayFromPath, generateWalletsAndDropSOL, checkIfBondingCurveComplete} \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/util.ts b/src/pumpfunsdk/pumpdotfun-sdk/src/util.ts new file mode 100644 index 0000000..e216c0d --- /dev/null +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/util.ts @@ -0,0 +1,313 @@ +import{ + Commitment, + ComputeBudgetProgram, + Connection, + Finality, + Keypair, + PublicKey, + SendTransactionError, + Transaction, + TransactionMessage, + VersionedTransaction, + VersionedTransactionResponse, + sendAndConfirmTransaction, + LAMPORTS_PER_SOL, + SystemProgram, +} from "@solana/web3.js"; +import{ AnchorProvider } from "@coral-xyz/anchor"; +import {PumpFunSDK, DEFAULT_DECIMALS} from "./pumpfun"; +import{ PriorityFee, TransactionResult } from "./types"; +import{ jito_executeAndConfirm } from "../../../Transactions/jito_tips_tx_executor"; +import fs from "fs"; +import{ bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; +export const DEFAULT_COMMITMENT = "finalized"; +export const DEFAULT_FINALITY = "finalized"; + +export const calculateWithSlippageBuy = ( + amount: bigint, + basisPoints: bigint +) => { + return amount + (amount * basisPoints) / 10000n; +}; + +export const calculateWithSlippageSell = ( + amount: bigint, + basisPoints: bigint +) => { + return amount - (amount * basisPoints) / 10000n; +}; + +function readCSVFile(filePath:string) { + try { + const data = fs.readFileSync(filePath, "utf8"); + return data; + } catch (err) { + console.error("Error reading the CSV file:", err); + return null; + } +} + +export async function sendTxToJito( + connection:Connection, + tx:any, + payer:Keypair, + signers:Keypair[], + jitofee:any +){ + const blockhash = (await connection.getLatestBlockhash()); + let final_tx = new Transaction(); + final_tx.add(tx); + let versionedTx = await buildVersionedTx(connection, payer.publicKey, final_tx, connection.commitment); + versionedTx.sign(signers); + try{ + const {confirmed, signature} = await jito_executeAndConfirm(versionedTx, payer, blockhash, jitofee); + // let txResult = await getTxDetails(connection, signature, connection.commitment, DEFAULT_FINALITY); + if (!confirmed) { + return { + success: false, + error: "Transaction failed", + }; + } + return { + success: true, + signature: signature, + }; + + }catch(e){ + if(e instanceof SendTransactionError){ + let ste = e; + }else{ + console.error(e); + } + return { + error: e, + success: false, + }; + } + + +} + +export async function sendTx( + connection: Connection, + tx: Transaction, + payer: PublicKey, + signers: Keypair[], + priorityFees?: PriorityFee, + commitment: any = DEFAULT_COMMITMENT, + finality: any = DEFAULT_FINALITY +): Promise { + let newTx = new Transaction(); + + if (priorityFees) { + const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({ + units: priorityFees.unitLimit, + }); + + const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: priorityFees.unitPrice, + }); + newTx.add(modifyComputeUnits); + newTx.add(addPriorityFee); + } + + newTx.add(tx); + + let versionedTx = await buildVersionedTx(connection, payer, newTx, commitment); + versionedTx.sign(signers); + + try { + const sig = await connection.sendTransaction(versionedTx, { + skipPreflight: false, + }); + console.log("sig:", `https://solscan.io/tx/${sig}`); + + let txResult = await getTxDetails(connection, sig, commitment, finality); + if (!txResult) { + return { + success: false, + error: "Transaction failed", + }; + } + return { + success: true, + signature: sig, + results: txResult, + }; + } catch (e) { + if (e instanceof SendTransactionError) { + let ste = e as SendTransactionError; + } else { + console.error(e); + } + return { + error: e, + success: false, + }; + } +} + +export const buildVersionedTx = async ( + connection: Connection, + payer: PublicKey, + tx: Transaction, + commitment: Commitment = DEFAULT_COMMITMENT +): Promise => { + const blockHash = (await connection.getLatestBlockhash(commitment)) + .blockhash; + + let messageV0 = new TransactionMessage({ + payerKey: payer, + recentBlockhash: blockHash, + instructions: tx.instructions, + }).compileToV0Message(); + + return new VersionedTransaction(messageV0); +}; + +export const getTxDetails = async ( + connection: Connection, + sig: string, + commitment: Commitment = DEFAULT_COMMITMENT, + finality: Finality = DEFAULT_FINALITY +): Promise => { + const latestBlockHash = await connection.getLatestBlockhash(); + await connection.confirmTransaction( + { + blockhash: latestBlockHash.blockhash, + lastValidBlockHeight: latestBlockHash.lastValidBlockHeight, + signature: sig, + }, + commitment + ); + + return connection.getTransaction(sig, { + maxSupportedTransactionVersion: 0, + commitment: finality, + }); +}; + +export function generateKeysAndAllocateSol(targetNumberOfKeys:number, targetTotalSol:number) { + // Generate private keys + const keys = []; + let sum = 0; + for (let i = 0; i < targetNumberOfKeys; i++) { + const keypair = Keypair.generate(); + keys.push(bs58.encode(keypair.secretKey)); + } + + // Allocate SOL with randomness + const averageAllocation = targetTotalSol / targetNumberOfKeys; + const maxDeviation = averageAllocation * 0.2; // 10% deviation + + const allocations = []; + let totalAllocated = 0; + + for (let i = 0; i < targetNumberOfKeys - 1; i++) { + const randomDeviation = (Math.random() * 2 - 1) * maxDeviation; + const allocation = parseFloat( + (averageAllocation + randomDeviation).toFixed(10) + ); + allocations.push({ privateKey: keys[i], sol: allocation }); + sum += allocation + 0.004; + totalAllocated += allocation; + } + + // Adjust the last allocation to match the target total precisely + const lastAllocation = parseFloat( + (targetTotalSol - totalAllocated).toFixed(10) + ); + + allocations.push({ + privateKey: keys[targetNumberOfKeys - 1], + sol: lastAllocation, + }); + console.log("sum", sum); + return allocations; +} + + +export async function generateWalletsAndDropSOL( + connection:Connection, + masterWallet:Keypair, + amountOfSol:number, + numberOfNewWallet:number, + pathToSave:string +){ + // Check if the file already exists + let existingWallets= []; + try { + const fileContents = await fs.promises.readFile(pathToSave, "utf8"); + existingWallets = JSON.parse(fileContents); + } catch (error) { + // If the file doesn't exist, it's okay, we'll just create a new one + } + let final_tx = new Transaction(); + for (let i = 0; i < existingWallets.length; i++) { + const wallet = Keypair.fromSecretKey(bs58.decode(existingWallets[i])); + console.log("Existing wallet: ", wallet.publicKey.toBase58()); + final_tx.add( + SystemProgram.transfer({ + fromPubkey: masterWallet.publicKey, + toPubkey: wallet.publicKey, + lamports: amountOfSol * LAMPORTS_PER_SOL, + }) + ); + } + // Generate new wallets and append to the existing array + for (let i = 0; i < numberOfNewWallet; i++) { + let newWallet = Keypair.generate(); + + console.log("New wallet created: ", newWallet.publicKey.toBase58()); + const privateKey = bs58.encode(newWallet.secretKey); + existingWallets.push(privateKey); + // Transfer SOL to the new wallet + final_tx.add( + SystemProgram.transfer({ + fromPubkey: masterWallet.publicKey, + toPubkey: newWallet.publicKey, + lamports: amountOfSol * LAMPORTS_PER_SOL, + }) + ); + } + + // Send the transaction + const blockhash = await connection.getLatestBlockhash("confirmed"); + final_tx.feePayer = masterWallet.publicKey; + final_tx.recentBlockhash = blockhash.blockhash; + await sendTxToJito( + connection, + final_tx, + masterWallet, + [masterWallet], + 0.0001 + ); + + // Save the updated array to the file + try { + await fs.promises.writeFile( + pathToSave, + JSON.stringify(existingWallets, null, 2) + ); + console.log(`Wallets saved to ${pathToSave}`); + } catch (error) { + console.error(`Error saving wallets to ${pathToSave}:`, error); + } + + return existingWallets; +} + + export async function checkIfBondingCurveComplete(connection:Connection, wallet:any, mintKeypair:any){ + const provider = new AnchorProvider(connection, wallet, { + commitment: "finalized", + }); + + const sdk = new PumpFunSDK(provider); + const bondingCurveAccount = await sdk.getBondingCurveAccount( + mintKeypair.publicKey + ); + console.log("bondingCurveAccount: ", bondingCurveAccount); + return bondingCurveAccount?.complete; + + } + diff --git a/tsconfig.json b/tsconfig.json index 8bb6097..8d9133b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { /* Visit https://aka.ms/tsconfig to read more about this file */ - + "moduleResolution": "node", /* Projects */ // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ @@ -11,7 +11,7 @@ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "target": "es2022", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ @@ -25,7 +25,7 @@ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ /* Modules */ - "module": "commonjs", /* Specify what module code is generated. */ + "module": "es2022", /* Specify what module code is generated. */ // "rootDir": "./", /* Specify the root folder within your source files. */ // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ @@ -103,6 +103,7 @@ /* Completeness */ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ + "skipLibCheck": true, /* Skip type checking all .d.ts files. */ + "rootDir": "./src", } } From cbc94030bf80884d75f36b578f727e2bdfd55853 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 23 Aug 2024 21:14:50 +0800 Subject: [PATCH 009/140] changed to not load jup token in src/raydium/raydium_config.ts --- src/Transactions/simple_tx_executor.ts | 2 +- src/helpers/util.ts | 2 +- src/raydium/Pool/swap.ts | 3 ++- src/raydium/buy.ts | 1 + src/raydium/raydium_config.ts | 9 +++------ tsconfig.json | 11 +++++------ 6 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/Transactions/simple_tx_executor.ts b/src/Transactions/simple_tx_executor.ts index 7817336..bf46fde 100644 --- a/src/Transactions/simple_tx_executor.ts +++ b/src/Transactions/simple_tx_executor.ts @@ -5,7 +5,7 @@ import { Transaction, VersionedTransaction, } from "@solana/web3.js"; -import { connection } from "../helpers/config.js"; +import { connection } from "../helpers/config"; /** * Executes a transaction and confirms it on the Solana blockchain. diff --git a/src/helpers/util.ts b/src/helpers/util.ts index f55d920..fd69a48 100644 --- a/src/helpers/util.ts +++ b/src/helpers/util.ts @@ -9,7 +9,7 @@ import { connection, makeTxVersion, wallet, -} from "./config.js"; +} from "./config"; import { Metaplex } from "@metaplex-foundation/js"; import fs from "fs"; import { diff --git a/src/raydium/Pool/swap.ts b/src/raydium/Pool/swap.ts index ee07dbd..16f852b 100644 --- a/src/raydium/Pool/swap.ts +++ b/src/raydium/Pool/swap.ts @@ -337,11 +337,12 @@ export async function swap( ); const inputToken = DEFAULT_TOKEN.WSOL; // SOL let targetPool = null; + console.log("Fetching pool id..."); if (!(tokenAddress in tokenToPoolIdMap)) { targetPool = await fetchAMMPoolId(tokenAddress); tokenToPoolIdMap[tokenAddress] = targetPool; } else targetPool = tokenToPoolIdMap[tokenAddress]; - + console.log("Pool id fetched."); if (targetPool === null) { console.log( "Pool not found or raydium is not supported for this token. Exiting..." diff --git a/src/raydium/buy.ts b/src/raydium/buy.ts index fafbb02..3b51382 100644 --- a/src/raydium/buy.ts +++ b/src/raydium/buy.ts @@ -49,6 +49,7 @@ async function buy(side:string, address:string, no_of_sol:number, payer:Keypair) payer_wallet = await loadOrCreateKeypair_wallet(payer_keypair); await swap(side, address, no_of_sol, -1, payer_wallet, "trade"); } else { + console.log("here") await swap(side, address, no_of_sol, -1, wallet, "trade"); } } diff --git a/src/raydium/raydium_config.ts b/src/raydium/raydium_config.ts index 7dce53d..fff4f39 100644 --- a/src/raydium/raydium_config.ts +++ b/src/raydium/raydium_config.ts @@ -4,22 +4,19 @@ import { parseTokenAccountResp, } from "@raydium-io/raydium-sdk-v2"; import { TOKEN_PROGRAM_ID } from "@solana/spl-token"; -import { - wallet, - connection, -} from "../helpers/config"; +import { wallet, connection } from "../helpers/config"; const txVersion = TxVersion.V0; const cluster = "mainnet"; export const initSdk = async () => { + const raydium = await Raydium.load({ owner: wallet, connection: connection, cluster: cluster, disableFeatureCheck: true, - disableLoadToken: false, + disableLoadToken: true, blockhashCommitment: "confirmed", }); return raydium; }; - diff --git a/tsconfig.json b/tsconfig.json index 8d9133b..7abedb9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { /* Visit https://aka.ms/tsconfig to read more about this file */ - "moduleResolution": "node", + /* Projects */ // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ @@ -11,7 +11,7 @@ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "es2022", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ @@ -25,7 +25,7 @@ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ /* Modules */ - "module": "es2022", /* Specify what module code is generated. */ + "module": "commonjs", /* Specify what module code is generated. */ // "rootDir": "./", /* Specify the root folder within your source files. */ // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ @@ -103,7 +103,6 @@ /* Completeness */ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true, /* Skip type checking all .d.ts files. */ - "rootDir": "./src", + "skipLibCheck": true /* Skip type checking all .d.ts files. */ } -} +} \ No newline at end of file From 33b6416f535f3c2f0d733c9787a0f63c3410e053 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 23 Aug 2024 21:23:49 +0800 Subject: [PATCH 010/140] tested src/raydium/ --- src/helpers/config.ts | 22 ---------------------- src/raydium/Pool/swap.ts | 3 ++- src/raydium/token-filters/marketcap.ts | 1 + src/raydium/token-filters/volume.ts | 3 ++- 4 files changed, 5 insertions(+), 24 deletions(-) diff --git a/src/helpers/config.ts b/src/helpers/config.ts index e1efc4f..eddde61 100644 --- a/src/helpers/config.ts +++ b/src/helpers/config.ts @@ -73,25 +73,3 @@ export const DEFAULT_TOKEN = { "USDC" ), }; - -// module.exports = { -// wallet, -// dev_connection, -// dev_endpoint, -// main_endpoint, -// connection, -// TOKEN_PROGRAM_ID, -// RAYDIUM_MAINNET, -// RAYDIUM_MAINNET_API, -// PROGRAMIDS, -// makeTxVersion, -// DEFAULT_TOKEN, -// addLookupTableInfo, -// _ENDPOINT, -// shyft_api_key, -// jito_fee, -// smart_money_wallet, -// bloXRoute_auth_header, -// private_key, -// bloXroute_fee, -// }; diff --git a/src/raydium/Pool/swap.ts b/src/raydium/Pool/swap.ts index 16f852b..a58a416 100644 --- a/src/raydium/Pool/swap.ts +++ b/src/raydium/Pool/swap.ts @@ -382,11 +382,12 @@ export async function swap( ); const outputToken = DEFAULT_TOKEN.WSOL; // SOL let targetPool = null; + console.log("Fetching pool id..."); if (!(tokenAddress in tokenToPoolIdMap)) { targetPool = await fetchAMMPoolId(tokenAddress); tokenToPoolIdMap[tokenAddress] = targetPool; } else targetPool = tokenToPoolIdMap[tokenAddress]; - + console.log("Pool id fetched."); if (targetPool === null) { console.log( "Pool not found or raydium is not supported for this token. Exiting..." diff --git a/src/raydium/token-filters/marketcap.ts b/src/raydium/token-filters/marketcap.ts index 72c1254..2926e61 100644 --- a/src/raydium/token-filters/marketcap.ts +++ b/src/raydium/token-filters/marketcap.ts @@ -67,6 +67,7 @@ export async function getCurrentMarketCap(tokenAddress:string) { const mc = priceInUSD * supply.value.uiAmount; + console.log(`Current market cap of ${tokenAddress} is: ${mc}`); return mc; } catch (e) { console.log(`Error when getting current market cap of ${tokenAddress} `, e); diff --git a/src/raydium/token-filters/volume.ts b/src/raydium/token-filters/volume.ts index b64ac56..c67a942 100644 --- a/src/raydium/token-filters/volume.ts +++ b/src/raydium/token-filters/volume.ts @@ -11,6 +11,7 @@ export async function getDayVolume(tokenAddress:string){ response = await( await fetch(`https://api-v3.raydium.io/pools/info/ids?ids=${poolId}`)).json(); if(response.success) dayVolume = response.data[0].day.volume } + console.log(dayVolume) if(dayVolume !== 0) return dayVolume; else{ dayVolume = response.data[0].day.volume @@ -61,4 +62,4 @@ export async function getMonthVolume(tokenAddress:string){ } } -//getDayVolume("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP"); \ No newline at end of file +getDayVolume("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP"); \ No newline at end of file From b6136f83b714ace40f61726707be2e31c0130dd8 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 23 Aug 2024 21:46:09 +0800 Subject: [PATCH 011/140] tested src/jupiter/ --- src/jupiter/swap/buy-helper.ts | 9 +++++++++ src/jupiter/swap/sell-helper.ts | 25 ++++++++++++++++++++----- src/jupiter/swap/swap-helper.ts | 2 +- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/jupiter/swap/buy-helper.ts b/src/jupiter/swap/buy-helper.ts index 8328c48..2f5d659 100644 --- a/src/jupiter/swap/buy-helper.ts +++ b/src/jupiter/swap/buy-helper.ts @@ -45,3 +45,12 @@ export async function buy(tokenToBuy:string, amountTokenOut:number, slippage:any } } +async function main() { + const tokenAddress = "3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh"; + const amountOfSOLToUse = 0.015 + const slippage = 1; + await buy(tokenAddress, amountOfSOLToUse, slippage); +} + +//main(); + diff --git a/src/jupiter/swap/sell-helper.ts b/src/jupiter/swap/sell-helper.ts index d480f2a..4eabd22 100644 --- a/src/jupiter/swap/sell-helper.ts +++ b/src/jupiter/swap/sell-helper.ts @@ -1,4 +1,9 @@ -import {convertToInteger, getQuote, getSwapTransaction, finalizeTransaction} from "./swap-helper"; +import { + convertToInteger, + getQuote, + getSwapTransaction, + finalizeTransaction, +} from "./swap-helper"; import { PublicKey } from "@solana/web3.js"; import { wallet } from "../../helpers/config"; import { getDecimals } from "../../helpers/util"; @@ -11,7 +16,11 @@ const wsol = "So11111111111111111111111111111111111111112"; * @param {number} slippage - The slippage tolerance percentage. * @returns {Promise} - A promise that resolves when the sell operation is completed. */ -export async function sell(tokenToSell:string, amountOfTokenToSell:number, slippage:any) { +export async function sell( + tokenToSell: string, + amountOfTokenToSell: number, + slippage: any +) { try { const decimals = await getDecimals(new PublicKey(tokenToSell)); console.log(decimals); @@ -31,9 +40,7 @@ export async function sell(tokenToSell:string, amountOfTokenToSell:number, slipp quoteResponse, wallet_PubKey ); - const { confirmed, signature } = await finalizeTransaction( - swapTransaction - ); + const { confirmed, signature } = await finalizeTransaction(swapTransaction); if (confirmed) { console.log("http://solscan.io/tx/" + signature); } else { @@ -46,3 +53,11 @@ export async function sell(tokenToSell:string, amountOfTokenToSell:number, slipp } } +async function main() { + const tokenAddress = "3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh"; + const amountOfTokenToSell = 0.000025; + const slippage = 1; + await sell(tokenAddress, amountOfTokenToSell, slippage); +} + +// main(); \ No newline at end of file diff --git a/src/jupiter/swap/swap-helper.ts b/src/jupiter/swap/swap-helper.ts index 3d18778..faa2e1a 100644 --- a/src/jupiter/swap/swap-helper.ts +++ b/src/jupiter/swap/swap-helper.ts @@ -82,7 +82,7 @@ export async function finalizeTransaction(swapTransaction:any) { // sign the transaction transaction.sign([wallet]); - const latestBlockhash = await connection.getLatestBlockhash("processed"); + const latestBlockhash = await connection.getLatestBlockhash("confirmed"); const res = await jito_executeAndConfirm( transaction, wallet, From 6a8ae918083ef6e749585d56696254d60d9bb42d Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 23 Aug 2024 21:55:26 +0800 Subject: [PATCH 012/140] changed tsconfig.json --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 7abedb9..2cb0cd8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,7 @@ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "target": "es2022", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ From 9eb16b67d8b2400edeb6fc91e7aaa3d2912a6a04 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 24 Aug 2024 09:37:54 +0800 Subject: [PATCH 013/140] Update README.md --- README.md | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 3855068..1badf9c 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,7 @@ 3. `nvm install v22.2.0` 4. `nvm use v22.2.0` 5. `npm install` -6. `node help.js `(to see commands or read cli_doc.txt file) -7. also see the command examples in examples/ +6. also see the command examples in examples/ ### Prerequisites 🚨 @@ -72,60 +71,60 @@ 1. Specify the token symbol, name, mint keypair(optional, will help u to generate), supply, decimals, path to metadata json file, path to image file, the cluster you want to use, and the file type(png, jpg, jpeg). ``` -node create --payer --symbol --token_name --mint --supply --decimals --metadata --image --cluster --priority-fee --file_type +ts-node create --payer --symbol --token_name --mint --supply --decimals --metadata --image --cluster --priority-fee --file_type ``` 2. Specify the token address, the percentage of the token you want to burn and the cluster you want to use. ``` -node burn --payer --token_address --percentage --cluster +ts-node burn --payer --token_address --percentage --cluster ``` 3. Specify the token address and the cluster you want to use. ``` -node revoke_authority --payer --mint_address --cluster --mint --freeze +ts-node revoke_authority --payer --mint_address --cluster --mint --freeze ``` 4. Specify the token address you want to query and the cluster for boosting the volume of the token. ``` -node boost_volume --token_address --payer --cluster --sol_per_order +ts-node boost_volume --token_address --payer --cluster --sol_per_order ``` 5. Specify the token address, the amount of Sol you want to swap, and the cluster you want to use. ``` -node buy --payer --token_address --sol --cluster +ts-node buy --payer --token_address --sol --cluster ``` 6. Specify the token address, the percentage of the token you want to sell, and the cluster you want to use. ``` -node sell --payer --token_address --percentage --cluster +ts-node sell --payer --token_address --percentage --cluster ``` 7. Specify the token address, the pool id(optional, will help to find the pool with the most liquidity using the given token address), the amount of Sol you want to add, and the cluster you want to use. ``` -node add_pool --payer --token_address --pool_id --sol --cluster --priority_fee +ts-node add_pool --payer --token_address --pool_id --sol --cluster --priority_fee ``` 8. Specify the token address, the percentage of the LP token you want to remove(1=1%), and the cluster you want to use. ``` -node remove_pool --payer --token_address --percentage --cluster +ts-node remove_pool --payer --token_address --percentage --cluster ``` 9. wrap your sol to wsol. ``` -node wrap_sol.js --size +ts-node wrap_sol.js --size ``` 10. unwrap your wsol to sol. ``` -node unwrap_sol.js +ts-node unwrap_sol.js ``` ### Pump.fun commands @@ -133,19 +132,19 @@ node unwrap_sol.js 9. Specify the path to your mint keypair, the amount of Sol you want to buy, the name of the token, the symbol of the token, the description of the token, the telegram link, the twitter link, the website link, and the image file path. ``` -node createAndBuy --pathToMintKeypair --sol --name --symbol --description --telegram --twitter --website --file +ts-node createAndBuy --pathToMintKeypair --sol --name --symbol --description --telegram --twitter --website --file ``` 10. Specify the token address, the sol you want to buy ``` -node buy --token_address --sol +ts-node buy --token_address --sol ``` 11. Specify the token address, the percentage of the token you want to sell ``` -node sell --token_address --percentage +ts-node sell --token_address --percentage ``` # Code Usage From 041cdf69a9edac3f8c40055611acd1e44029d1c5 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 24 Aug 2024 11:50:08 +0800 Subject: [PATCH 014/140] converted src/Memecoin_dev/**/*.js to .ts --- .../{boost_volume.js => boost_volume.ts} | 36 +++++++++---------- .../sniping_dev/{index.js => index.ts} | 0 src/raydium/token-filters/volume.ts | 4 ++- 3 files changed, 21 insertions(+), 19 deletions(-) rename src/Memecoin_dev/market-making_dev/{boost_volume.js => boost_volume.ts} (78%) rename src/Memecoin_dev/sniping_dev/{index.js => index.ts} (100%) diff --git a/src/Memecoin_dev/market-making_dev/boost_volume.js b/src/Memecoin_dev/market-making_dev/boost_volume.ts similarity index 78% rename from src/Memecoin_dev/market-making_dev/boost_volume.js rename to src/Memecoin_dev/market-making_dev/boost_volume.ts index 751df3a..cfb8362 100644 --- a/src/Memecoin_dev/market-making_dev/boost_volume.js +++ b/src/Memecoin_dev/market-making_dev/boost_volume.ts @@ -1,26 +1,26 @@ -const { connection, wallet } = require("../../helpers/config.js"); -const { +import { connection, wallet } from "../../helpers/config"; +import { simple_executeAndConfirm, -} = require("../../Transactions/simple_tx_executor.js"); -const { +} from "../../Transactions/simple_tx_executor"; +import { jito_executeAndConfirm, -} = require("../../Transactions/jito_tips_tx_executor.js"); -const { program } = require("commander"); -const { +} from "../../Transactions/jito_tips_tx_executor"; +import { program } from "commander"; +import { loadOrCreateKeypair_wallet, checkTx, -} = require("../../helpers/util.js"); -const { +} from "../../helpers/util"; +import { ComputeBudgetProgram, TransactionMessage, VersionedTransaction, -} = require("@solana/web3.js"); -const { swapForVolume } = require("../../raydium/Pool/swap.js"); +} from "@solana/web3.js"; +import { swapForVolume } from "../../raydium/Pool/swap"; let slippage = null, - tokenAddress = null, - payer = null, + tokenAddress:any = null, + payer:any = null, cluster = null, - solPerOrder = null; + solPerOrder:any = null; program .option("--token_address ", "Specify the token address") @@ -31,7 +31,7 @@ program "Specify the number of SOL per order" ) .option("-h, --help", "display help for command") - .action((options) => { + .action((options:any) => { if (options.help) { console.log( "node boost_volume --token_address --payer --cluster --sol_per_order " @@ -61,11 +61,11 @@ async function boost_volume() { `Boosting volume..., buying and selling ${tokenAddress} in one transaction...` ); try { - const { confirmed, signature } = await swapForVolume( + const res:any = await swapForVolume( tokenAddress, solPerOrder ); - await error_handling(signature, confirmed); + await error_handling(res.signature, res.confirmed); } catch (e) { console.log(e); console.log("trying to send the transaction again..."); @@ -81,7 +81,7 @@ async function boost_volume() { * @param {boolean} confirmed - Indicates if the transaction is confirmed. * @returns {Promise} - A promise that resolves when the error handling is complete. */ -async function error_handling(signature, confirmed) { +async function error_handling(signature:any, confirmed:any) { if (confirmed) { console.log(`https://solscan.io/tx/${signature}?cluster=mainnet`); return; diff --git a/src/Memecoin_dev/sniping_dev/index.js b/src/Memecoin_dev/sniping_dev/index.ts similarity index 100% rename from src/Memecoin_dev/sniping_dev/index.js rename to src/Memecoin_dev/sniping_dev/index.ts diff --git a/src/raydium/token-filters/volume.ts b/src/raydium/token-filters/volume.ts index c67a942..58c5e32 100644 --- a/src/raydium/token-filters/volume.ts +++ b/src/raydium/token-filters/volume.ts @@ -31,6 +31,7 @@ export async function getWeekVolume(tokenAddress:string){ response = await( await fetch(`https://api-v3.raydium.io/pools/info/ids?ids=${poolId}`)).json(); if(response.success) weekVolume = response.data[0].week.volume } + console.log(weekVolume); if(weekVolume !== 0) return weekVolume; else{ weekVolume = response.data[0].week.volume @@ -52,6 +53,7 @@ export async function getMonthVolume(tokenAddress:string){ response = await( await fetch(`https://api-v3.raydium.io/pools/info/ids?ids=${poolId}`)).json(); if(response.success) monthVolume = response.data[0].month.volume } + console.log(monthVolume); if(monthVolume !== 0) return monthVolume; else{ monthVolume = response.data[0].month.volume @@ -62,4 +64,4 @@ export async function getMonthVolume(tokenAddress:string){ } } -getDayVolume("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP"); \ No newline at end of file +getMonthVolume("GiMsMKgMq3cX3PJwPZCxh6CsrsVTc5P975eeAMPLpump"); \ No newline at end of file From e900ea4ab7f6790efc75e7efe0c58f746e606a99 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 27 Aug 2024 22:05:05 +0800 Subject: [PATCH 015/140] add fetch price method using meteora sdk --- .../dex/meteora/{ => Pool}/fetch-pool.ts | 18 +++- src/Trading_dev/dex/meteora/Pool/index.ts | 2 + src/Trading_dev/dex/meteora/Pool/swap.ts | 88 +++++++++++++++++++ src/Trading_dev/dex/meteora/fetch-price.ts | 45 +++++----- src/Trading_dev/dex/meteora/swap.ts | 26 ------ .../dex/meteora/token-filters/marketcap.ts | 0 .../dex/meteora/token-filters/pool-sol.ts | 0 .../dex/meteora/token-filters/volume.ts | 0 8 files changed, 128 insertions(+), 51 deletions(-) rename src/Trading_dev/dex/meteora/{ => Pool}/fetch-pool.ts (64%) create mode 100644 src/Trading_dev/dex/meteora/Pool/index.ts create mode 100644 src/Trading_dev/dex/meteora/Pool/swap.ts delete mode 100644 src/Trading_dev/dex/meteora/swap.ts create mode 100644 src/Trading_dev/dex/meteora/token-filters/marketcap.ts create mode 100644 src/Trading_dev/dex/meteora/token-filters/pool-sol.ts create mode 100644 src/Trading_dev/dex/meteora/token-filters/volume.ts diff --git a/src/Trading_dev/dex/meteora/fetch-pool.ts b/src/Trading_dev/dex/meteora/Pool/fetch-pool.ts similarity index 64% rename from src/Trading_dev/dex/meteora/fetch-pool.ts rename to src/Trading_dev/dex/meteora/Pool/fetch-pool.ts index b31b973..f78acf1 100644 --- a/src/Trading_dev/dex/meteora/fetch-pool.ts +++ b/src/Trading_dev/dex/meteora/Pool/fetch-pool.ts @@ -1,3 +1,7 @@ +import { PublicKey, Keypair } from "@solana/web3.js"; +import DLMM from '@meteora-ag/dlmm'; +import { connection, wallet } from "../../../../helpers/config"; + export async function fetchDLMMPoolId(tokenAddress:string) { const url = `https://dlmm-api.meteora.ag/pair/all_by_groups?sort_key=tvl&order_by=desc&search_term=${tokenAddress}&include_unknown=false`; const response = await (await fetch(url)).json(); @@ -13,11 +17,17 @@ export async function fetchDLMMPoolId(tokenAddress:string) { console.log("No DLMM Pool ID found for the given token address: ", tokenAddress); return ""; // return empty string if no DLMMPool ID is found } - +export async function fetchDLMMPool(tokenAddress:string) { + const poolId = await fetchDLMMPoolId(tokenAddress); + console.log("Pool ID: ", poolId); + const dlmmPool = await DLMM.create(connection, new PublicKey(poolId)); + return dlmmPool; +} async function main() { const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; - const poolId = await fetchDLMMPoolId(tokenAddress); - console.log(poolId); + // const poolId = await fetchDLMMPoolId(tokenAddress); + // console.log(poolId); + await fetchDLMMPool(tokenAddress); } -//main(); +// main(); diff --git a/src/Trading_dev/dex/meteora/Pool/index.ts b/src/Trading_dev/dex/meteora/Pool/index.ts new file mode 100644 index 0000000..62ea691 --- /dev/null +++ b/src/Trading_dev/dex/meteora/Pool/index.ts @@ -0,0 +1,2 @@ +export * from "./fetch-pool"; +export * from "./swap"; \ No newline at end of file diff --git a/src/Trading_dev/dex/meteora/Pool/swap.ts b/src/Trading_dev/dex/meteora/Pool/swap.ts new file mode 100644 index 0000000..505b53d --- /dev/null +++ b/src/Trading_dev/dex/meteora/Pool/swap.ts @@ -0,0 +1,88 @@ +import "rpc-websockets/dist/lib/client"; +import { + PublicKey, + Keypair, + LAMPORTS_PER_SOL, + sendAndConfirmRawTransaction, + sendAndConfirmTransaction, +} from "@solana/web3.js"; +import DLMM from "@meteora-ag/dlmm"; +//const BN =require("bn.js"); +import { connection, wallet } from "../../../../helpers/config"; +import { PROGRAM_ID } from "../constants"; +import { fetchDLMMPoolId, fetchDLMMPool } from "./fetch-pool"; +import { + TransactionMessage, + ComputeBudgetProgram, + VersionedTransaction, +} from "@solana/web3.js"; +import { jito_executeAndConfirm } from "../../../../Transactions/jito_tips_tx_executor"; +import { jito_fee } from "../../../../helpers/config"; +const BN = require("bn.js"); +// const provider = new AnchorProvider(connection, ourWallet, { +// commitment: "confirmed", +// }); + +async function swap(tokenAddress: string) { + const swapYtoX = true; + console.log(wallet.publicKey.toBase58()); + const swapAmount = new BN(1); + const dlmmPool = await fetchDLMMPool(tokenAddress); + const binArrays = await dlmmPool.getBinArrayForSwap(swapYtoX); + const swapQuote = await dlmmPool.swapQuote( + swapAmount, + swapYtoX, + new BN(10*100), + binArrays + ); + const swapTx: any = await dlmmPool.swap({ + inToken: dlmmPool.tokenX.publicKey, + binArraysPubkey: swapQuote.binArraysPubkey, + inAmount: swapAmount, + lbPair: dlmmPool.pubkey, + user: wallet.publicKey, + minOutAmount: swapQuote.minOutAmount, + outToken: dlmmPool.tokenY.publicKey, + }); + try { + const swapTxHash = await sendAndConfirmTransaction(connection, swapTx, [ + wallet, + ]); + console.log("🚀 ~ swapTxHash:", swapTxHash); + } catch (error) { + console.log("🚀 ~ error:", JSON.parse(JSON.stringify(error))); + } + // const recentBlockhash = await connection.getLatestBlockhash(); + // const messageV0 = new TransactionMessage({ + // payerKey: wallet.publicKey, + // recentBlockhash: recentBlockhash.blockhash, + // instructions: [ + // ...[ + // ComputeBudgetProgram.setComputeUnitPrice({ + // microLamports: 305290, + // }), + // ComputeBudgetProgram.setComputeUnitLimit({ + // units: 102750, + // }), + // ], + // ...swapTx.instructions, + // ], + // }).compileToV0Message(); + + // const transaction = new VersionedTransaction(messageV0); + // transaction.sign([wallet]); + // const res = await jito_executeAndConfirm(transaction, wallet,recentBlockhash, jito_fee); + // const signature = res.signature; + // const confirmed = res.confirmed; + + // if (signature) { + // return { txid: signature }; + // } else { + // console.log("jito fee transaction failed when swapping token in a DLMM pool"); + // } +} +async function main() { + const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; + await swap(tokenAddress); +} +main(); diff --git a/src/Trading_dev/dex/meteora/fetch-price.ts b/src/Trading_dev/dex/meteora/fetch-price.ts index 16d4175..d53dc15 100644 --- a/src/Trading_dev/dex/meteora/fetch-price.ts +++ b/src/Trading_dev/dex/meteora/fetch-price.ts @@ -1,31 +1,34 @@ -import { fetchDLMMPoolId } from "./fetch-pool"; +import { fetchDLMMPoolId, fetchDLMMPool } from "./Pool"; import {usdc} from "./constants"; -export async function getCurrentPriceInSOL(tokenAddress:string) { - const poolId = await fetchDLMMPoolId(tokenAddress); - const response = await ( - await fetch(`https://dlmm-api.meteora.ag/pair/${poolId}`) - ).json(); - return response.current_price; +// on-chain rpc method to get the current price of the token +export async function getCurrentPriceInSOL(tokenAddress:string):Promise { + const dlmmPool = await fetchDLMMPool(tokenAddress); + const activeBin = await dlmmPool.getActiveBin(); + const activeBinPricePerToken = dlmmPool.fromPricePerLamport( + Number(activeBin.price) + ); + return activeBinPricePerToken; } -export async function getCurrentSolPrice() { - const poolId = await fetchDLMMPoolId(usdc); - const response = await ( - await fetch(`https://dlmm-api.meteora.ag/pair/${poolId}`) - ).json(); - return response.current_price; +export async function getCurrentSolPrice():Promise { + + const dlmmPool = await fetchDLMMPool(usdc); + const activeBin = await dlmmPool.getActiveBin(); + const activeBinPricePerToken = dlmmPool.fromPricePerLamport( + Number(activeBin.price) + ); + return activeBinPricePerToken; } -export async function getCurrentPriceInUSD(tokenAddress:string) { - const poolId = await fetchDLMMPoolId(tokenAddress); - const response = await ( - await fetch(`https://dlmm-api.meteora.ag/pair/${poolId}`) - ).json(); - return response.current_price*(await getCurrentSolPrice()); +export async function getCurrentPriceInUSD(tokenAddress:string):Promise { + return (await getCurrentPriceInSOL(tokenAddress))*(await getCurrentSolPrice()); } + + async function main(){ - console.log(await getCurrentPriceInSOL("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr")); + // console.log(await getCurrentPriceInSOL("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr")); + // console.log(await getCurrentPriceInUSD("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr")); console.log(await getCurrentPriceInUSD("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr")); } -//main(); +main(); diff --git a/src/Trading_dev/dex/meteora/swap.ts b/src/Trading_dev/dex/meteora/swap.ts deleted file mode 100644 index c5c911b..0000000 --- a/src/Trading_dev/dex/meteora/swap.ts +++ /dev/null @@ -1,26 +0,0 @@ -import 'rpc-websockets/dist/lib/client'; -import { PublicKey, Keypair } from "@solana/web3.js"; -import DLMM from '@meteora-ag/dlmm'; -//const BN =require("bn.js"); -import { Wallet, AnchorProvider, Program } from "@project-serum/anchor"; -import { connection, wallet } from "../../../helpers/config"; -import {PROGRAM_ID} from "./constants"; -import {fetchDLMMPoolId} from "./fetch-pool"; - -const ourWallet = new Wallet(wallet); -const provider = new AnchorProvider(connection, ourWallet, { - commitment: "confirmed", -}); - -async function swap(tokenAddress:string){ - const poolId = await fetchDLMMPoolId(tokenAddress); - const dlmmPool = await DLMM.create(connection, new PublicKey(poolId)); - console.log(dlmmPool); - - -} -async function main(){ - const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; - await swap(tokenAddress); -} -main(); \ No newline at end of file diff --git a/src/Trading_dev/dex/meteora/token-filters/marketcap.ts b/src/Trading_dev/dex/meteora/token-filters/marketcap.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/Trading_dev/dex/meteora/token-filters/pool-sol.ts b/src/Trading_dev/dex/meteora/token-filters/pool-sol.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/Trading_dev/dex/meteora/token-filters/volume.ts b/src/Trading_dev/dex/meteora/token-filters/volume.ts new file mode 100644 index 0000000..e69de29 From 41e87617b0aeb8c276def04eee4c0250259bbdfe Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 27 Aug 2024 22:07:37 +0800 Subject: [PATCH 016/140] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1badf9c..ce51dfe 100644 --- a/README.md +++ b/README.md @@ -4,17 +4,17 @@ - Create your own Solana **_SPL tokens_** on mainnet | Pump.fun -- Swap tokens on top of Raydium, Orca, Meteora, and pump.fun +- Swap tokens on Raydium, Orca, Meteora, and pump.fun -- Predefined Jito tips and Priority fee +- land transactions faster using Jito/bloXroute - Fastest Copy Trade Program -- Fetch the real-time lp-burn percentage, reserve and market cap of any raydium pool +- Fetch the real-time lp-burn percentage, pool reserve and market cap of any liquidity pool - fixed % tp/sl module -- **_Got everything needed for any developer to create their own trading bot_** +- **_Got everything needed to create your own trading bot_** ## Credits - https://github.com/raydium-io/raydium-sdk-V2 From ee2f6806c392dc7ca28ce272a79707db7cc89de2 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Wed, 28 Aug 2024 00:14:33 +0800 Subject: [PATCH 017/140] meteora swap cli done. --- src/Trading_dev/dex/meteora/Pool/swap.ts | 131 +++++++++++++-------- src/Trading_dev/dex/meteora/buy.ts | 37 ++++++ src/Trading_dev/dex/meteora/buy_helper.ts | 11 ++ src/Trading_dev/dex/meteora/fetch-price.ts | 3 +- src/Trading_dev/dex/meteora/sell.ts | 37 ++++++ src/Trading_dev/dex/meteora/sell_helper.ts | 11 ++ 6 files changed, 178 insertions(+), 52 deletions(-) create mode 100644 src/Trading_dev/dex/meteora/buy_helper.ts create mode 100644 src/Trading_dev/dex/meteora/sell_helper.ts diff --git a/src/Trading_dev/dex/meteora/Pool/swap.ts b/src/Trading_dev/dex/meteora/Pool/swap.ts index 505b53d..501ba02 100644 --- a/src/Trading_dev/dex/meteora/Pool/swap.ts +++ b/src/Trading_dev/dex/meteora/Pool/swap.ts @@ -9,7 +9,8 @@ import { import DLMM from "@meteora-ag/dlmm"; //const BN =require("bn.js"); import { connection, wallet } from "../../../../helpers/config"; -import { PROGRAM_ID } from "../constants"; +import { getSPLTokenBalance} from "../../../../helpers/check_balance"; +import { PROGRAM_ID, wsol } from "../constants"; import { fetchDLMMPoolId, fetchDLMMPool } from "./fetch-pool"; import { TransactionMessage, @@ -18,71 +19,101 @@ import { } from "@solana/web3.js"; import { jito_executeAndConfirm } from "../../../../Transactions/jito_tips_tx_executor"; import { jito_fee } from "../../../../helpers/config"; +import { C } from "@raydium-io/raydium-sdk-v2/lib/raydium-276d396e"; const BN = require("bn.js"); -// const provider = new AnchorProvider(connection, ourWallet, { -// commitment: "confirmed", -// }); -async function swap(tokenAddress: string) { - const swapYtoX = true; - console.log(wallet.publicKey.toBase58()); - const swapAmount = new BN(1); - const dlmmPool = await fetchDLMMPool(tokenAddress); - const binArrays = await dlmmPool.getBinArrayForSwap(swapYtoX); - const swapQuote = await dlmmPool.swapQuote( +/** + * Performs a swap operation in a DLMM pool. + * @param side The side of the swap operation, either "buy" or "sell". Default is "buy". + * @param tokenAddress The address of the token to be swapped. + * @param buyAmountInSOL The amount of SOL to be used for buying the token. Default is 0.1. + * @param sellPercentage The percentage of the token to be sold. Default is 100%. + * @returns A Promise that resolves to the transaction hash if the swap is successful, otherwise an error object. + */ +export async function swap(side: string = "buy", tokenAddress: string, buyAmountInSOL: number = 0.1, sellPercentage: number = 100) { + let swapYtoX = true, decimalY:number, decimalX:number, inToken:PublicKey, outToken:PublicKey, swapAmount:any; + const dlmmPool = await fetchDLMMPool(tokenAddress); // fetch the DLMM pool object for swapping + decimalY = dlmmPool.tokenY.decimal; + decimalX = dlmmPool.tokenX.decimal; + if(side === "buy"){ + // inToken = wsol + if(dlmmPool.tokenY.publicKey.toBase58() === wsol){ + inToken = dlmmPool.tokenY.publicKey; + outToken = dlmmPool.tokenX.publicKey; + }else{ + inToken = dlmmPool.tokenX.publicKey; + outToken = dlmmPool.tokenY.publicKey; + } + swapAmount = new BN(buyAmountInSOL * 10 ** 9); // convert to lamports + + }else{ + if(dlmmPool.tokenY.publicKey.toBase58() === wsol){ + inToken = dlmmPool.tokenX.publicKey; + outToken = dlmmPool.tokenY.publicKey; + const balance = await getSPLTokenBalance(connection, inToken, wallet.publicKey); + const amount = balance * (sellPercentage / 100); + swapAmount = new BN(amount * 10 ** decimalX); // convert to lamports + }else{ + inToken = dlmmPool.tokenY.publicKey; + outToken = dlmmPool.tokenX.publicKey; + const balance = await getSPLTokenBalance(connection, inToken, wallet.publicKey); + const amount = balance * (sellPercentage / 100); + swapAmount = new BN(amount * 10 ** decimalY); // convert to lamports + } + + } + + const binArrays = await dlmmPool.getBinArrayForSwap(swapYtoX); // list of pools + const swapQuote = await dlmmPool.swapQuote( // get the swap quote swapAmount, swapYtoX, - new BN(10*100), + new BN(10), binArrays ); const swapTx: any = await dlmmPool.swap({ - inToken: dlmmPool.tokenX.publicKey, + inToken: inToken, binArraysPubkey: swapQuote.binArraysPubkey, inAmount: swapAmount, lbPair: dlmmPool.pubkey, user: wallet.publicKey, minOutAmount: swapQuote.minOutAmount, - outToken: dlmmPool.tokenY.publicKey, + outToken: outToken, }); - try { - const swapTxHash = await sendAndConfirmTransaction(connection, swapTx, [ - wallet, - ]); - console.log("🚀 ~ swapTxHash:", swapTxHash); - } catch (error) { - console.log("🚀 ~ error:", JSON.parse(JSON.stringify(error))); - } - // const recentBlockhash = await connection.getLatestBlockhash(); - // const messageV0 = new TransactionMessage({ - // payerKey: wallet.publicKey, - // recentBlockhash: recentBlockhash.blockhash, - // instructions: [ - // ...[ - // ComputeBudgetProgram.setComputeUnitPrice({ - // microLamports: 305290, - // }), - // ComputeBudgetProgram.setComputeUnitLimit({ - // units: 102750, - // }), - // ], - // ...swapTx.instructions, - // ], - // }).compileToV0Message(); + // try { + // const swapTxHash = await sendAndConfirmTransaction(connection, swapTx, [ + // wallet, + // ]); + // console.log(`🚀 https://solscan.io/tx/${swapTxHash}`); + // } catch (error) { + // console.log("🚀 ~ error:", JSON.parse(JSON.stringify(error))); + // } + try{ + const recentBlockhash = await connection.getLatestBlockhash(); + const messageV0 = new TransactionMessage({ + payerKey: wallet.publicKey, + recentBlockhash: recentBlockhash.blockhash, + instructions: [ + ...swapTx.instructions, + ], + }).compileToV0Message(); - // const transaction = new VersionedTransaction(messageV0); - // transaction.sign([wallet]); - // const res = await jito_executeAndConfirm(transaction, wallet,recentBlockhash, jito_fee); - // const signature = res.signature; - // const confirmed = res.confirmed; + const transaction = new VersionedTransaction(messageV0); + transaction.sign([wallet]); + const res = await jito_executeAndConfirm(transaction, wallet,recentBlockhash, jito_fee); + const signature = res.signature; + const confirmed = res.confirmed; - // if (signature) { - // return { txid: signature }; - // } else { - // console.log("jito fee transaction failed when swapping token in a DLMM pool"); - // } + if (confirmed) { + console.log(`🚀 https://solscan.io/tx/${signature}`); + } else { + console.log("jito fee transaction failed when swapping token in a DLMM pool"); + } + }catch(error:any){ + console.log("🚀 ~ error:", JSON.parse(JSON.stringify(error))); + } } async function main() { const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; - await swap(tokenAddress); + await swap("sell",tokenAddress, -1, 100); } -main(); +//main(); diff --git a/src/Trading_dev/dex/meteora/buy.ts b/src/Trading_dev/dex/meteora/buy.ts index e69de29..df514fe 100644 --- a/src/Trading_dev/dex/meteora/buy.ts +++ b/src/Trading_dev/dex/meteora/buy.ts @@ -0,0 +1,37 @@ +import {swap} from "./Pool" +import { program } from "commander"; + +let token:string="", + sol:number=0; +program + .option("--token ", "Specify the token address") + .option("--sol ", "Specify the number of SOL") + .option("-h, --help", "display help for command") + .action((options) => { + if (options.help) { + console.log( + "ts-node buy --token --sol " + ); + process.exit(0); + } + if (!options.token || !options.sol) { + console.error("❌ Missing required options"); + process.exit(1); + } + token = options.token; + sol = options.sol; + }); +program.parse(); + +/** + * Buy function to perform a swap on the Meteora DEX. + * + * @param {string} side - The side of the trade (buy/sell). + * @param {string} token_address - The address of the token to trade. + * @param {number} no_of_sol - The amount of SOL to trade. + * @returns {Promise} - A promise that resolves when the swap is completed. + */ +async function buy(side:string, token_address:string, no_of_sol:number) { + await swap(side, token_address, no_of_sol, -1); +} +buy("buy", token, sol); diff --git a/src/Trading_dev/dex/meteora/buy_helper.ts b/src/Trading_dev/dex/meteora/buy_helper.ts new file mode 100644 index 0000000..abdc4c4 --- /dev/null +++ b/src/Trading_dev/dex/meteora/buy_helper.ts @@ -0,0 +1,11 @@ +import {swap} from "./Pool"; + +/** + * Buys a specified amount of tokens using SOL. + * + * @param token_address The address of the token to buy. + * @param buyAmountInSOL The amount of SOL to use for the purchase. + */ +export async function buy(token_address:string, buyAmountInSOL:number) { + await swap("buy", token_address, buyAmountInSOL, -1); +} \ No newline at end of file diff --git a/src/Trading_dev/dex/meteora/fetch-price.ts b/src/Trading_dev/dex/meteora/fetch-price.ts index d53dc15..29551b8 100644 --- a/src/Trading_dev/dex/meteora/fetch-price.ts +++ b/src/Trading_dev/dex/meteora/fetch-price.ts @@ -24,11 +24,10 @@ export async function getCurrentPriceInUSD(tokenAddress:string):Promise { } - async function main(){ // console.log(await getCurrentPriceInSOL("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr")); // console.log(await getCurrentPriceInUSD("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr")); console.log(await getCurrentPriceInUSD("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr")); } -main(); +//main(); diff --git a/src/Trading_dev/dex/meteora/sell.ts b/src/Trading_dev/dex/meteora/sell.ts index e69de29..eb8601f 100644 --- a/src/Trading_dev/dex/meteora/sell.ts +++ b/src/Trading_dev/dex/meteora/sell.ts @@ -0,0 +1,37 @@ +import {swap} from "./Pool" +import { program } from "commander"; + +let token:string="", + percentage:number=0; +program + .option("--token ", "Specify the token address") + .option("--percentage ", "Specify the sell percentage") + .option("-h, --help", "display help for command") + .action((options) => { + if (options.help) { + console.log( + "ts-node sell --token --percentage " + ); + process.exit(0); + } + if (!options.token || !options.percentage) { + console.error("❌ Missing required options"); + process.exit(1); + } + token = options.token; + percentage = options.percentage; + }); +program.parse(); + +/** + * Sell function to perform a swap on the Meteora DEX. + * + * @param {string} side - The side of the trade (buy/sell). + * @param {string} token_address - The address of the token to trade. + * @param {number} sell_percentage - The sell percentage. + * @returns {Promise} - A promise that resolves when the swap is completed. + */ +async function sell(side:string, token_address:string, sell_percentage:number) { + await swap(side, token_address, -1, sell_percentage); +} +sell("sell", token, percentage); diff --git a/src/Trading_dev/dex/meteora/sell_helper.ts b/src/Trading_dev/dex/meteora/sell_helper.ts new file mode 100644 index 0000000..c8eac70 --- /dev/null +++ b/src/Trading_dev/dex/meteora/sell_helper.ts @@ -0,0 +1,11 @@ +import {swap} from "./Pool"; + +/** + * Sells a token with the specified token address and sell percentage. + * + * @param token_address The address of the token to be sold. + * @param sell_percentage The percentage of the token to be sold. + */ +export async function sell(token_address:string, sell_percentage:number) { + await swap("sell", token_address, -1, sell_percentage); +} \ No newline at end of file From 5ccec9e169febe245a3ebe831c777bef23ad5264 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Wed, 28 Aug 2024 09:36:27 +0800 Subject: [PATCH 018/140] Added method to fetch dlmm pool's marketcap, volume, sol in pool --- src/Trading_dev/dex/meteora/fetch-price.ts | 2 + src/Trading_dev/dex/meteora/index.ts | 5 ++ src/Trading_dev/dex/meteora/sell_helper.ts | 2 +- .../dex/meteora/token-filters/index.ts | 3 + .../dex/meteora/token-filters/marketcap.ts | 13 +++++ .../dex/meteora/token-filters/pool-sol.ts | 16 +++++ .../dex/meteora/token-filters/volume.ts | 58 +++++++++++++++++++ src/raydium/token-filters/marketcap.ts | 2 +- tsconfig.json | 1 + 9 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 src/Trading_dev/dex/meteora/token-filters/index.ts diff --git a/src/Trading_dev/dex/meteora/fetch-price.ts b/src/Trading_dev/dex/meteora/fetch-price.ts index 29551b8..3e01216 100644 --- a/src/Trading_dev/dex/meteora/fetch-price.ts +++ b/src/Trading_dev/dex/meteora/fetch-price.ts @@ -4,6 +4,7 @@ import {usdc} from "./constants"; // on-chain rpc method to get the current price of the token export async function getCurrentPriceInSOL(tokenAddress:string):Promise { const dlmmPool = await fetchDLMMPool(tokenAddress); + dlmmPool.refetchStates(); const activeBin = await dlmmPool.getActiveBin(); const activeBinPricePerToken = dlmmPool.fromPricePerLamport( Number(activeBin.price) @@ -13,6 +14,7 @@ export async function getCurrentPriceInSOL(tokenAddress:string):Promise { export async function getCurrentSolPrice():Promise { const dlmmPool = await fetchDLMMPool(usdc); + dlmmPool.refetchStates(); const activeBin = await dlmmPool.getActiveBin(); const activeBinPricePerToken = dlmmPool.fromPricePerLamport( Number(activeBin.price) diff --git a/src/Trading_dev/dex/meteora/index.ts b/src/Trading_dev/dex/meteora/index.ts index e69de29..fb25ce1 100644 --- a/src/Trading_dev/dex/meteora/index.ts +++ b/src/Trading_dev/dex/meteora/index.ts @@ -0,0 +1,5 @@ +export * from "./buy_helper"; +export * from "./sell_helper"; +export * from "./fetch-price"; +export * from "./Pool"; +export * from "./token-filters"; \ No newline at end of file diff --git a/src/Trading_dev/dex/meteora/sell_helper.ts b/src/Trading_dev/dex/meteora/sell_helper.ts index c8eac70..68ac72c 100644 --- a/src/Trading_dev/dex/meteora/sell_helper.ts +++ b/src/Trading_dev/dex/meteora/sell_helper.ts @@ -8,4 +8,4 @@ import {swap} from "./Pool"; */ export async function sell(token_address:string, sell_percentage:number) { await swap("sell", token_address, -1, sell_percentage); -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/Trading_dev/dex/meteora/token-filters/index.ts b/src/Trading_dev/dex/meteora/token-filters/index.ts new file mode 100644 index 0000000..12b289b --- /dev/null +++ b/src/Trading_dev/dex/meteora/token-filters/index.ts @@ -0,0 +1,3 @@ +export * from "./marketcap"; +export * from "./pool-sol"; +export * from "./volume"; \ No newline at end of file diff --git a/src/Trading_dev/dex/meteora/token-filters/marketcap.ts b/src/Trading_dev/dex/meteora/token-filters/marketcap.ts index e69de29..30f69dd 100644 --- a/src/Trading_dev/dex/meteora/token-filters/marketcap.ts +++ b/src/Trading_dev/dex/meteora/token-filters/marketcap.ts @@ -0,0 +1,13 @@ +import { wsol } from "../constants"; +import {getCurrentPriceInUSD} from "../fetch-price" +import { connection } from "../../../../helpers/config"; +import { PublicKey } from "@solana/web3.js"; + +export async function getCurrentMarketCap(tokenAddress:string):Promise { + let priceInUSD:number = await getCurrentPriceInUSD(tokenAddress); + const tokenSupply:any = (await connection.getTokenSupply(new PublicKey(tokenAddress))) + const marketCap:number = priceInUSD * tokenSupply.value.uiAmount; + return marketCap; +} + +getCurrentMarketCap("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); \ No newline at end of file diff --git a/src/Trading_dev/dex/meteora/token-filters/pool-sol.ts b/src/Trading_dev/dex/meteora/token-filters/pool-sol.ts index e69de29..3f5c7a5 100644 --- a/src/Trading_dev/dex/meteora/token-filters/pool-sol.ts +++ b/src/Trading_dev/dex/meteora/token-filters/pool-sol.ts @@ -0,0 +1,16 @@ +import {fetchDLMMPool} from "../Pool"; +import {wsol} from "../constants" +export async function getCurrentSolInPool(token_address:string):Promise { + const dlmmPool = await fetchDLMMPool(token_address); + let solReserve:number; + if(dlmmPool.tokenX.publicKey.toBase58() === wsol){ + solReserve = Number(dlmmPool.tokenX.amount)/Math.pow(10,dlmmPool.tokenX.decimal); + }else{ + solReserve = Number(dlmmPool.tokenY.amount)/Math.pow(10,dlmmPool.tokenY.decimal); + } + console.log(solReserve); + return solReserve; + +} + +//getCurrentSolInPool("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); \ No newline at end of file diff --git a/src/Trading_dev/dex/meteora/token-filters/volume.ts b/src/Trading_dev/dex/meteora/token-filters/volume.ts index e69de29..863eabe 100644 --- a/src/Trading_dev/dex/meteora/token-filters/volume.ts +++ b/src/Trading_dev/dex/meteora/token-filters/volume.ts @@ -0,0 +1,58 @@ +import {fetchDLMMPoolId} from "../Pool"; +const fetch = require('node-fetch'); + + +// max 255 days of data +export async function getLastNDayVolume( + tokenAddress: string, + n: number +): Promise { + const poolId = await fetchDLMMPoolId(tokenAddress); + const url = `https://dlmm-api.meteora.ag/pair/${poolId}/analytic/pair_trade_volume?num_of_days=${n}` + const response = await (await fetch(url)).json(); + let sumOfVolume = 0; + for (const day of response) { + sumOfVolume += day.trade_volume; + } + console.log(sumOfVolume); + return sumOfVolume; +} + +export async function getDayVolume(tokenAddress:string){ + const poolId = await fetchDLMMPoolId(tokenAddress); + const url = `https://dlmm-api.meteora.ag/pair/${poolId}/analytic/pair_trade_volume?num_of_days=1` + const response = await (await fetch(url)).json(); + let sumOfVolume = 0; + for (const day of response) { + sumOfVolume += day.trade_volume; + } + console.log(sumOfVolume); + return sumOfVolume; +} + +export async function getWeekVolume(tokenAddress:string){ + const poolId = await fetchDLMMPoolId(tokenAddress); + const url = `https://dlmm-api.meteora.ag/pair/${poolId}/analytic/pair_trade_volume?num_of_days=7` + const response = await (await fetch(url)).json(); + let sumOfVolume = 0; + for (const day of response) { + sumOfVolume += day.trade_volume; + } + console.log(sumOfVolume); + return sumOfVolume; +} + +export async function getMonthVolume(tokenAddress:string){ + const poolId = await fetchDLMMPoolId(tokenAddress); + const url = `https://dlmm-api.meteora.ag/pair/${poolId}/analytic/pair_trade_volume?num_of_days=30` + const response = await (await fetch(url)).json(); + let sumOfVolume = 0; + for (const day of response) { + sumOfVolume += day.trade_volume; + } + console.log(sumOfVolume); + return sumOfVolume; +} + + +//getMonthVolume("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); \ No newline at end of file diff --git a/src/raydium/token-filters/marketcap.ts b/src/raydium/token-filters/marketcap.ts index 2926e61..0a154e2 100644 --- a/src/raydium/token-filters/marketcap.ts +++ b/src/raydium/token-filters/marketcap.ts @@ -74,5 +74,5 @@ export async function getCurrentMarketCap(tokenAddress:string) { } } -//getCurrentMarketCap("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP"); +//getCurrentMarketCap("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); diff --git a/tsconfig.json b/tsconfig.json index 2cb0cd8..ca6b4a4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,4 +1,5 @@ { + "include": ["./src/**/*.ts", "./src/**/**/*.ts","./src/**/**/**/*.ts","./src/**/**/**/**/*.ts", ], "compilerOptions": { /* Visit https://aka.ms/tsconfig to read more about this file */ From 9839b1952b36ff5fcbf9f752b57255e965af8b4c Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Wed, 28 Aug 2024 09:55:30 +0800 Subject: [PATCH 019/140] moved meteora&orca dir under the src/ --- .../copy_trading/bought-tokens.json | 0 .../copy_trading/copy-buy.ts | 34 +++--- src/Trading_dev/copy_trading/copy-sell.ts | 104 +++++++++++++++++ .../copy_trading/copy-trade.ts | 0 .../dex/meteora/token-filters/marketcap.ts | 13 --- .../copy_trading/copy-sell.ts | 110 ------------------ .../stop-loss.ts | 0 .../take-profit.ts | 0 .../dex => }/meteora/Pool/fetch-pool.ts | 23 ++-- .../dex => }/meteora/Pool/index.ts | 0 .../dex => }/meteora/Pool/swap.ts | 100 +++++++++------- src/{Trading_dev/dex => }/meteora/buy.ts | 0 .../dex => }/meteora/buy_helper.ts | 0 .../dex => }/meteora/constants.ts | 0 .../dex => }/meteora/fetch-price.ts | 0 src/{Trading_dev/dex => }/meteora/index.ts | 0 src/{Trading_dev/dex => }/meteora/sell.ts | 0 .../dex => }/meteora/sell_helper.ts | 0 .../dex => }/meteora/token-filters/index.ts | 0 src/meteora/token-filters/marketcap.ts | 17 +++ .../meteora/token-filters/pool-sol.ts | 0 .../dex => }/meteora/token-filters/volume.ts | 0 src/{Trading_dev/dex => }/orca/buy.ts | 0 src/{Trading_dev/dex => }/orca/fetch-pool.ts | 0 src/{Trading_dev/dex => }/orca/index.ts | 2 +- src/{Trading_dev/dex => }/orca/sell.ts | 0 src/{Trading_dev/dex => }/orca/swap.ts | 0 27 files changed, 211 insertions(+), 192 deletions(-) rename src/Trading_dev/{memecoin_trading_strategies => }/copy_trading/bought-tokens.json (100%) rename src/Trading_dev/{memecoin_trading_strategies => }/copy_trading/copy-buy.ts (92%) create mode 100644 src/Trading_dev/copy_trading/copy-sell.ts rename src/Trading_dev/{memecoin_trading_strategies => }/copy_trading/copy-trade.ts (100%) delete mode 100644 src/Trading_dev/dex/meteora/token-filters/marketcap.ts delete mode 100644 src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-sell.ts rename src/Trading_dev/{memecoin_trading_strategies => }/stop-loss.ts (100%) rename src/Trading_dev/{memecoin_trading_strategies => }/take-profit.ts (100%) rename src/{Trading_dev/dex => }/meteora/Pool/fetch-pool.ts (62%) rename src/{Trading_dev/dex => }/meteora/Pool/index.ts (100%) rename src/{Trading_dev/dex => }/meteora/Pool/swap.ts (59%) rename src/{Trading_dev/dex => }/meteora/buy.ts (100%) rename src/{Trading_dev/dex => }/meteora/buy_helper.ts (100%) rename src/{Trading_dev/dex => }/meteora/constants.ts (100%) rename src/{Trading_dev/dex => }/meteora/fetch-price.ts (100%) rename src/{Trading_dev/dex => }/meteora/index.ts (100%) rename src/{Trading_dev/dex => }/meteora/sell.ts (100%) rename src/{Trading_dev/dex => }/meteora/sell_helper.ts (100%) rename src/{Trading_dev/dex => }/meteora/token-filters/index.ts (100%) create mode 100644 src/meteora/token-filters/marketcap.ts rename src/{Trading_dev/dex => }/meteora/token-filters/pool-sol.ts (100%) rename src/{Trading_dev/dex => }/meteora/token-filters/volume.ts (100%) rename src/{Trading_dev/dex => }/orca/buy.ts (100%) rename src/{Trading_dev/dex => }/orca/fetch-pool.ts (100%) rename src/{Trading_dev/dex => }/orca/index.ts (96%) rename src/{Trading_dev/dex => }/orca/sell.ts (100%) rename src/{Trading_dev/dex => }/orca/swap.ts (100%) diff --git a/src/Trading_dev/memecoin_trading_strategies/copy_trading/bought-tokens.json b/src/Trading_dev/copy_trading/bought-tokens.json similarity index 100% rename from src/Trading_dev/memecoin_trading_strategies/copy_trading/bought-tokens.json rename to src/Trading_dev/copy_trading/bought-tokens.json diff --git a/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-buy.ts b/src/Trading_dev/copy_trading/copy-buy.ts similarity index 92% rename from src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-buy.ts rename to src/Trading_dev/copy_trading/copy-buy.ts index c187c7b..1ddda78 100644 --- a/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-buy.ts +++ b/src/Trading_dev/copy_trading/copy-buy.ts @@ -1,19 +1,15 @@ import { PublicKey } from "@solana/web3.js"; import { TOKEN_PROGRAM_ID, AccountLayout } from "@solana/spl-token"; -import { - connection, - wallet, - smart_money_wallet, -} from "../../../helpers/config"; -import path from "path" ; -import { swap } from "../../../jupiter/swap/swap-helper"; -import { buy } from "../../../raydium/buy_helper"; -import { sell } from "../../../raydium/sell_helper"; +import { connection, wallet, smart_money_wallet } from "../../helpers/config"; +import path from "path"; +import { swap } from "../../jupiter/swap/swap-helper"; +import { buy } from "../../raydium/buy_helper"; +import { sell } from "../../raydium/sell_helper"; import fs from "fs"; const boughtTokensPath = path.join(__dirname, "bought-tokens.json"); let walletsToListen = []; -var previous_trader_wallet_state:any = {}; -var previous_our_wallet_state:any = {}; +var previous_trader_wallet_state: any = {}; +var previous_our_wallet_state: any = {}; // [usdc, sol, usdt, wsol] const wsol = "So11111111111111111111111111111111111111112"; const quoteToken = [ @@ -24,7 +20,7 @@ const quoteToken = [ ]; let boughtTokens = JSON.parse(fs.readFileSync(boughtTokensPath, "utf8")); -export async function saveToJson(token:string) { +export async function saveToJson(token: string) { boughtTokens.push(token); fs.writeFileSync(boughtTokensPath, JSON.stringify(boughtTokens, null, 2)); } @@ -33,7 +29,7 @@ export async function saveToJson(token:string) { * Listens to changes in multiple wallets and performs trading actions based on the changes. * @returns {Promise} A promise that resolves once the wallet listening is set up. */ -export async function listenToWallets(address:PublicKey) { +export async function listenToWallets(address: PublicKey) { try { connection.onProgramAccountChange( TOKEN_PROGRAM_ID, @@ -45,10 +41,10 @@ export async function listenToWallets(address:PublicKey) { // realize in smart money wallet there is a token's balance changed // then we look at trader's portfolio console.log("Wallet state changed"); - const current_trader_wallet_state:any = await retriveWalletState( + const current_trader_wallet_state: any = await retriveWalletState( address.toBase58() ); - const current_our_wallet_state:any = await retriveWalletState( + const current_our_wallet_state: any = await retriveWalletState( wallet.publicKey.toBase58() ); if ( @@ -212,7 +208,7 @@ export async function listenToWallets(address:PublicKey) { * @param {string} wallet_address - The address of the wallet to retrieve the state for. * @returns {Object} - An object containing the token balances of the wallet and the SOL balance. */ -async function retriveWalletState(wallet_address:string) { +async function retriveWalletState(wallet_address: string) { try { const filters = [ { @@ -229,13 +225,13 @@ async function retriveWalletState(wallet_address:string) { TOKEN_PROGRAM_ID, //new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") { filters: filters } ); - let results:any = {}; + let results: any = {}; const solBalance = await connection.getBalance( new PublicKey(wallet_address) ); accounts.forEach((account, i) => { //Parse the account data - const parsedAccountInfo:any = account.account.data; + const parsedAccountInfo: any = account.account.data; const mintAddress = parsedAccountInfo["parsed"]["info"]["mint"]; const tokenBalance = parsedAccountInfo["parsed"]["info"]["tokenAmount"]["uiAmount"]; @@ -255,7 +251,7 @@ async function retriveWalletState(wallet_address:string) { */ export async function copy_buy() { // smart money wallet address - let smart_money_address:any = smart_money_wallet; + let smart_money_address: any = smart_money_wallet; // our wallet address let our_wallet_address = wallet.publicKey.toBase58(); previous_trader_wallet_state = await retriveWalletState(smart_money_address); diff --git a/src/Trading_dev/copy_trading/copy-sell.ts b/src/Trading_dev/copy_trading/copy-sell.ts new file mode 100644 index 0000000..6ffd37d --- /dev/null +++ b/src/Trading_dev/copy_trading/copy-sell.ts @@ -0,0 +1,104 @@ +import { PublicKey } from "@solana/web3.js"; +import { TOKEN_PROGRAM_ID, AccountLayout } from "@solana/spl-token"; +import fs from "fs"; +import path from "path"; +import { wallet, connection, smart_money_wallet } from "../../helpers/config"; +//import { buy } from("../../dex/jupiter/swap/buy-helper"); +//import { sell } from("../../dex/jupiter/swap/sell-helper"); +import { sell } from "../../raydium/sell_helper"; + +//const {swap} from("../../../Pool/swap") +var current_trader_wallet_state: any = {}; +var current_our_wallet_state: any = {}; +// [usdc, sol, usdt, wsol] +const wsol = "So11111111111111111111111111111111111111112"; +const quoteToken = [ + "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "SOL", + "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", + wsol, +]; +const boughtTokensPath = path.join(__dirname, "bought-tokens.json"); +let boughtTokens = JSON.parse(fs.readFileSync(boughtTokensPath, "utf8")); +function saveToJson() { + fs.writeFileSync(boughtTokensPath, JSON.stringify(boughtTokens, null, 2)); +} +/** + * Retrieves the state of a wallet by querying the Solana blockchain. + * @param {string} wallet_address - The address of the wallet to retrieve the state for. + * @returns {Object} - An object containing the token balances of the wallet and the SOL balance. + */ +async function retriveWalletState(wallet_address: string) { + const filters = [ + { + dataSize: 165, //size of account (bytes) + }, + { + memcmp: { + offset: 32, //location of our query in the account (bytes) + bytes: wallet_address, //our search criteria, a base58 encoded string + }, + }, + ]; + const accounts = await connection.getParsedProgramAccounts( + TOKEN_PROGRAM_ID, //new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") + { filters: filters } + ); + let results: any = {}; + const solBalance = await connection.getBalance(new PublicKey(wallet_address)); + accounts.forEach((account, i) => { + //Parse the account data + const parsedAccountInfo: any = account.account.data; + const mintAddress = parsedAccountInfo["parsed"]["info"]["mint"]; + const tokenBalance = + parsedAccountInfo["parsed"]["info"]["tokenAmount"]["uiAmount"]; + + results[mintAddress] = tokenBalance; + results["SOL"] = solBalance / 10 ** 9; + }); + return results; +} +export async function copy_sell(address: string) { + // 400 ms to check the wallet state + // if token we have but trader doesn't have, sell it + // that's it + let soldTokens: string[] = []; + let flag = false; + let possible_cant_sell_token = null; + try { + if (boughtTokens.length > 0) { + for (let i = 0; i < boughtTokens.length; i++) { + let token = boughtTokens[i]; + current_trader_wallet_state = await retriveWalletState(address); + if ( + !(token in current_trader_wallet_state) || + current_trader_wallet_state[token] == 0 + ) { + console.log(`Selling ${token}...`); + soldTokens.push(token); + flag = true; + sell("sell", token, 100, wallet); + } + } + } + } catch (err) { + console.log(err); + } + if (flag) { + // Update the list with the remaining unsold tokens + boughtTokens = boughtTokens.filter( + (token: any) => !soldTokens.includes(token) + ); + // Save the updated list back to the JSON file + saveToJson(); + } +} +async function main() { + while (true) { + boughtTokens = JSON.parse(fs.readFileSync(boughtTokensPath, "utf8")); + await copy_sell(smart_money_wallet || ""); + + await new Promise((resolve) => setTimeout(resolve, 2500)); + } +} +main(); diff --git a/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-trade.ts b/src/Trading_dev/copy_trading/copy-trade.ts similarity index 100% rename from src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-trade.ts rename to src/Trading_dev/copy_trading/copy-trade.ts diff --git a/src/Trading_dev/dex/meteora/token-filters/marketcap.ts b/src/Trading_dev/dex/meteora/token-filters/marketcap.ts deleted file mode 100644 index 30f69dd..0000000 --- a/src/Trading_dev/dex/meteora/token-filters/marketcap.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { wsol } from "../constants"; -import {getCurrentPriceInUSD} from "../fetch-price" -import { connection } from "../../../../helpers/config"; -import { PublicKey } from "@solana/web3.js"; - -export async function getCurrentMarketCap(tokenAddress:string):Promise { - let priceInUSD:number = await getCurrentPriceInUSD(tokenAddress); - const tokenSupply:any = (await connection.getTokenSupply(new PublicKey(tokenAddress))) - const marketCap:number = priceInUSD * tokenSupply.value.uiAmount; - return marketCap; -} - -getCurrentMarketCap("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); \ No newline at end of file diff --git a/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-sell.ts b/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-sell.ts deleted file mode 100644 index 28e692d..0000000 --- a/src/Trading_dev/memecoin_trading_strategies/copy_trading/copy-sell.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { - PublicKey, -} from "@solana/web3.js"; -import { - TOKEN_PROGRAM_ID, - AccountLayout, -} from "@solana/spl-token"; -import fs from 'fs'; -import path from 'path'; -import { wallet, connection, smart_money_wallet } from "../../../helpers/config"; -//import { buy } from("../../dex/jupiter/swap/buy-helper"); -//import { sell } from("../../dex/jupiter/swap/sell-helper"); -import {sell} from "../../../raydium/sell_helper"; - -//const {swap} from("../../../Pool/swap") -var current_trader_wallet_state:any = {}; -var current_our_wallet_state:any = {}; -// [usdc, sol, usdt, wsol] -const wsol = "So11111111111111111111111111111111111111112" -const quoteToken = [ - "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", - "SOL", - "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", - wsol, -]; -const boughtTokensPath = path.join(__dirname, 'bought-tokens.json'); -let boughtTokens = JSON.parse(fs.readFileSync(boughtTokensPath, 'utf8')); -function saveToJson() { - fs.writeFileSync(boughtTokensPath, JSON.stringify(boughtTokens, null, 2)); -} -/** -* Retrieves the state of a wallet by querying the Solana blockchain. -* @param {string} wallet_address - The address of the wallet to retrieve the state for. -* @returns {Object} - An object containing the token balances of the wallet and the SOL balance. -*/ -async function retriveWalletState(wallet_address:string) { - const filters = [ - { - dataSize: 165, //size of account (bytes) - }, - { - memcmp: { - offset: 32, //location of our query in the account (bytes) - bytes: wallet_address, //our search criteria, a base58 encoded string - }, - }, - ]; - const accounts = await connection.getParsedProgramAccounts( - TOKEN_PROGRAM_ID, //new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") - { filters: filters } - ); - let results:any = {}; - const solBalance = await connection.getBalance(new PublicKey(wallet_address)); - accounts.forEach((account, i) => { - //Parse the account data - const parsedAccountInfo:any = account.account.data; - const mintAddress = parsedAccountInfo["parsed"]["info"]["mint"]; - const tokenBalance = - parsedAccountInfo["parsed"]["info"]["tokenAmount"]["uiAmount"]; - - results[mintAddress] = tokenBalance; - results["SOL"] = solBalance / 10 ** 9; - }); - return results; -} -export async function copy_sell(address:string){ - // 400 ms to check the wallet state - // if token we have but trader doesn't have, sell it - // that's it - let soldTokens:string[] = []; - let flag = false; - let possible_cant_sell_token = null - try{ - if(boughtTokens.length > 0){ - for(let i=0; i !soldTokens.includes(token)); - // Save the updated list back to the JSON file - saveToJson(); - - } - -} -async function main(){ -while(true){ - boughtTokens = JSON.parse(fs.readFileSync(boughtTokensPath, 'utf8')); - await copy_sell(smart_money_wallet||""); - - await new Promise((resolve) => setTimeout(resolve, 2500)); -} -} -main(); \ No newline at end of file diff --git a/src/Trading_dev/memecoin_trading_strategies/stop-loss.ts b/src/Trading_dev/stop-loss.ts similarity index 100% rename from src/Trading_dev/memecoin_trading_strategies/stop-loss.ts rename to src/Trading_dev/stop-loss.ts diff --git a/src/Trading_dev/memecoin_trading_strategies/take-profit.ts b/src/Trading_dev/take-profit.ts similarity index 100% rename from src/Trading_dev/memecoin_trading_strategies/take-profit.ts rename to src/Trading_dev/take-profit.ts diff --git a/src/Trading_dev/dex/meteora/Pool/fetch-pool.ts b/src/meteora/Pool/fetch-pool.ts similarity index 62% rename from src/Trading_dev/dex/meteora/Pool/fetch-pool.ts rename to src/meteora/Pool/fetch-pool.ts index f78acf1..7cd364b 100644 --- a/src/Trading_dev/dex/meteora/Pool/fetch-pool.ts +++ b/src/meteora/Pool/fetch-pool.ts @@ -1,23 +1,26 @@ import { PublicKey, Keypair } from "@solana/web3.js"; -import DLMM from '@meteora-ag/dlmm'; -import { connection, wallet } from "../../../../helpers/config"; +import DLMM from "@meteora-ag/dlmm"; +import { connection, wallet } from "../../helpers/config"; -export async function fetchDLMMPoolId(tokenAddress:string) { +export async function fetchDLMMPoolId(tokenAddress: string) { const url = `https://dlmm-api.meteora.ag/pair/all_by_groups?sort_key=tvl&order_by=desc&search_term=${tokenAddress}&include_unknown=false`; const response = await (await fetch(url)).json(); // check if the string start with "SOL" or end with "SOL" const listOfGroups = response.groups; - for (const group of listOfGroups) { - const name = group.name; - if(name.startsWith("SOL") || name.endsWith("SOL")){ - return group.pairs[0].address; - } + for (const group of listOfGroups) { + const name = group.name; + if (name.startsWith("SOL") || name.endsWith("SOL")) { + return group.pairs[0].address; } - console.log("No DLMM Pool ID found for the given token address: ", tokenAddress); + } + console.log( + "No DLMM Pool ID found for the given token address: ", + tokenAddress + ); return ""; // return empty string if no DLMMPool ID is found } -export async function fetchDLMMPool(tokenAddress:string) { +export async function fetchDLMMPool(tokenAddress: string) { const poolId = await fetchDLMMPoolId(tokenAddress); console.log("Pool ID: ", poolId); const dlmmPool = await DLMM.create(connection, new PublicKey(poolId)); diff --git a/src/Trading_dev/dex/meteora/Pool/index.ts b/src/meteora/Pool/index.ts similarity index 100% rename from src/Trading_dev/dex/meteora/Pool/index.ts rename to src/meteora/Pool/index.ts diff --git a/src/Trading_dev/dex/meteora/Pool/swap.ts b/src/meteora/Pool/swap.ts similarity index 59% rename from src/Trading_dev/dex/meteora/Pool/swap.ts rename to src/meteora/Pool/swap.ts index 501ba02..cf75820 100644 --- a/src/Trading_dev/dex/meteora/Pool/swap.ts +++ b/src/meteora/Pool/swap.ts @@ -8,8 +8,8 @@ import { } from "@solana/web3.js"; import DLMM from "@meteora-ag/dlmm"; //const BN =require("bn.js"); -import { connection, wallet } from "../../../../helpers/config"; -import { getSPLTokenBalance} from "../../../../helpers/check_balance"; +import { connection, wallet } from "../../helpers/config"; +import { getSPLTokenBalance } from "../../helpers/check_balance"; import { PROGRAM_ID, wsol } from "../constants"; import { fetchDLMMPoolId, fetchDLMMPool } from "./fetch-pool"; import { @@ -17,8 +17,8 @@ import { ComputeBudgetProgram, VersionedTransaction, } from "@solana/web3.js"; -import { jito_executeAndConfirm } from "../../../../Transactions/jito_tips_tx_executor"; -import { jito_fee } from "../../../../helpers/config"; +import { jito_executeAndConfirm } from "../../Transactions/jito_tips_tx_executor"; +import { jito_fee } from "../../helpers/config"; import { C } from "@raydium-io/raydium-sdk-v2/lib/raydium-276d396e"; const BN = require("bn.js"); @@ -30,41 +30,58 @@ const BN = require("bn.js"); * @param sellPercentage The percentage of the token to be sold. Default is 100%. * @returns A Promise that resolves to the transaction hash if the swap is successful, otherwise an error object. */ -export async function swap(side: string = "buy", tokenAddress: string, buyAmountInSOL: number = 0.1, sellPercentage: number = 100) { - let swapYtoX = true, decimalY:number, decimalX:number, inToken:PublicKey, outToken:PublicKey, swapAmount:any; +export async function swap( + side: string = "buy", + tokenAddress: string, + buyAmountInSOL: number = 0.1, + sellPercentage: number = 100 +) { + let swapYtoX = true, + decimalY: number, + decimalX: number, + inToken: PublicKey, + outToken: PublicKey, + swapAmount: any; const dlmmPool = await fetchDLMMPool(tokenAddress); // fetch the DLMM pool object for swapping - decimalY = dlmmPool.tokenY.decimal; + decimalY = dlmmPool.tokenY.decimal; decimalX = dlmmPool.tokenX.decimal; - if(side === "buy"){ + if (side === "buy") { // inToken = wsol - if(dlmmPool.tokenY.publicKey.toBase58() === wsol){ + if (dlmmPool.tokenY.publicKey.toBase58() === wsol) { inToken = dlmmPool.tokenY.publicKey; outToken = dlmmPool.tokenX.publicKey; - }else{ + } else { inToken = dlmmPool.tokenX.publicKey; outToken = dlmmPool.tokenY.publicKey; } swapAmount = new BN(buyAmountInSOL * 10 ** 9); // convert to lamports - - }else{ - if(dlmmPool.tokenY.publicKey.toBase58() === wsol){ + } else { + if (dlmmPool.tokenY.publicKey.toBase58() === wsol) { inToken = dlmmPool.tokenX.publicKey; outToken = dlmmPool.tokenY.publicKey; - const balance = await getSPLTokenBalance(connection, inToken, wallet.publicKey); + const balance = await getSPLTokenBalance( + connection, + inToken, + wallet.publicKey + ); const amount = balance * (sellPercentage / 100); swapAmount = new BN(amount * 10 ** decimalX); // convert to lamports - }else{ + } else { inToken = dlmmPool.tokenY.publicKey; outToken = dlmmPool.tokenX.publicKey; - const balance = await getSPLTokenBalance(connection, inToken, wallet.publicKey); + const balance = await getSPLTokenBalance( + connection, + inToken, + wallet.publicKey + ); const amount = balance * (sellPercentage / 100); swapAmount = new BN(amount * 10 ** decimalY); // convert to lamports } - } const binArrays = await dlmmPool.getBinArrayForSwap(swapYtoX); // list of pools - const swapQuote = await dlmmPool.swapQuote( // get the swap quote + const swapQuote = await dlmmPool.swapQuote( + // get the swap quote swapAmount, swapYtoX, new BN(10), @@ -87,33 +104,38 @@ export async function swap(side: string = "buy", tokenAddress: string, buyAmount // } catch (error) { // console.log("🚀 ~ error:", JSON.parse(JSON.stringify(error))); // } - try{ - const recentBlockhash = await connection.getLatestBlockhash(); - const messageV0 = new TransactionMessage({ - payerKey: wallet.publicKey, - recentBlockhash: recentBlockhash.blockhash, - instructions: [ - ...swapTx.instructions, - ], - }).compileToV0Message(); + try { + const recentBlockhash = await connection.getLatestBlockhash(); + const messageV0 = new TransactionMessage({ + payerKey: wallet.publicKey, + recentBlockhash: recentBlockhash.blockhash, + instructions: [...swapTx.instructions], + }).compileToV0Message(); - const transaction = new VersionedTransaction(messageV0); - transaction.sign([wallet]); - const res = await jito_executeAndConfirm(transaction, wallet,recentBlockhash, jito_fee); - const signature = res.signature; - const confirmed = res.confirmed; + const transaction = new VersionedTransaction(messageV0); + transaction.sign([wallet]); + const res = await jito_executeAndConfirm( + transaction, + wallet, + recentBlockhash, + jito_fee + ); + const signature = res.signature; + const confirmed = res.confirmed; - if (confirmed) { - console.log(`🚀 https://solscan.io/tx/${signature}`); - } else { - console.log("jito fee transaction failed when swapping token in a DLMM pool"); - } - }catch(error:any){ + if (confirmed) { + console.log(`🚀 https://solscan.io/tx/${signature}`); + } else { + console.log( + "jito fee transaction failed when swapping token in a DLMM pool" + ); + } + } catch (error: any) { console.log("🚀 ~ error:", JSON.parse(JSON.stringify(error))); } } async function main() { const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; - await swap("sell",tokenAddress, -1, 100); + await swap("sell", tokenAddress, -1, 100); } //main(); diff --git a/src/Trading_dev/dex/meteora/buy.ts b/src/meteora/buy.ts similarity index 100% rename from src/Trading_dev/dex/meteora/buy.ts rename to src/meteora/buy.ts diff --git a/src/Trading_dev/dex/meteora/buy_helper.ts b/src/meteora/buy_helper.ts similarity index 100% rename from src/Trading_dev/dex/meteora/buy_helper.ts rename to src/meteora/buy_helper.ts diff --git a/src/Trading_dev/dex/meteora/constants.ts b/src/meteora/constants.ts similarity index 100% rename from src/Trading_dev/dex/meteora/constants.ts rename to src/meteora/constants.ts diff --git a/src/Trading_dev/dex/meteora/fetch-price.ts b/src/meteora/fetch-price.ts similarity index 100% rename from src/Trading_dev/dex/meteora/fetch-price.ts rename to src/meteora/fetch-price.ts diff --git a/src/Trading_dev/dex/meteora/index.ts b/src/meteora/index.ts similarity index 100% rename from src/Trading_dev/dex/meteora/index.ts rename to src/meteora/index.ts diff --git a/src/Trading_dev/dex/meteora/sell.ts b/src/meteora/sell.ts similarity index 100% rename from src/Trading_dev/dex/meteora/sell.ts rename to src/meteora/sell.ts diff --git a/src/Trading_dev/dex/meteora/sell_helper.ts b/src/meteora/sell_helper.ts similarity index 100% rename from src/Trading_dev/dex/meteora/sell_helper.ts rename to src/meteora/sell_helper.ts diff --git a/src/Trading_dev/dex/meteora/token-filters/index.ts b/src/meteora/token-filters/index.ts similarity index 100% rename from src/Trading_dev/dex/meteora/token-filters/index.ts rename to src/meteora/token-filters/index.ts diff --git a/src/meteora/token-filters/marketcap.ts b/src/meteora/token-filters/marketcap.ts new file mode 100644 index 0000000..c339327 --- /dev/null +++ b/src/meteora/token-filters/marketcap.ts @@ -0,0 +1,17 @@ +import { wsol } from "../constants"; +import { getCurrentPriceInUSD } from "../fetch-price"; +import { connection } from "../../helpers/config"; +import { PublicKey } from "@solana/web3.js"; + +export async function getCurrentMarketCap( + tokenAddress: string +): Promise { + let priceInUSD: number = await getCurrentPriceInUSD(tokenAddress); + const tokenSupply: any = await connection.getTokenSupply( + new PublicKey(tokenAddress) + ); + const marketCap: number = priceInUSD * tokenSupply.value.uiAmount; + return marketCap; +} + +getCurrentMarketCap("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); diff --git a/src/Trading_dev/dex/meteora/token-filters/pool-sol.ts b/src/meteora/token-filters/pool-sol.ts similarity index 100% rename from src/Trading_dev/dex/meteora/token-filters/pool-sol.ts rename to src/meteora/token-filters/pool-sol.ts diff --git a/src/Trading_dev/dex/meteora/token-filters/volume.ts b/src/meteora/token-filters/volume.ts similarity index 100% rename from src/Trading_dev/dex/meteora/token-filters/volume.ts rename to src/meteora/token-filters/volume.ts diff --git a/src/Trading_dev/dex/orca/buy.ts b/src/orca/buy.ts similarity index 100% rename from src/Trading_dev/dex/orca/buy.ts rename to src/orca/buy.ts diff --git a/src/Trading_dev/dex/orca/fetch-pool.ts b/src/orca/fetch-pool.ts similarity index 100% rename from src/Trading_dev/dex/orca/fetch-pool.ts rename to src/orca/fetch-pool.ts diff --git a/src/Trading_dev/dex/orca/index.ts b/src/orca/index.ts similarity index 96% rename from src/Trading_dev/dex/orca/index.ts rename to src/orca/index.ts index 2fed279..3f12744 100644 --- a/src/Trading_dev/dex/orca/index.ts +++ b/src/orca/index.ts @@ -14,7 +14,7 @@ import { connection, dev_connection, wallet, -} from "../../../helpers/config"; +} from "../helpers/config"; const ourWallet = new Wallet(wallet); async function main() { const provider = new AnchorProvider(connection, ourWallet, { diff --git a/src/Trading_dev/dex/orca/sell.ts b/src/orca/sell.ts similarity index 100% rename from src/Trading_dev/dex/orca/sell.ts rename to src/orca/sell.ts diff --git a/src/Trading_dev/dex/orca/swap.ts b/src/orca/swap.ts similarity index 100% rename from src/Trading_dev/dex/orca/swap.ts rename to src/orca/swap.ts From dc64148a492f23127e6e955081abdcb2ffe6acf2 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Wed, 28 Aug 2024 11:26:10 +0800 Subject: [PATCH 020/140] comment testing --- src/meteora/token-filters/marketcap.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/meteora/token-filters/marketcap.ts b/src/meteora/token-filters/marketcap.ts index c339327..484f9ad 100644 --- a/src/meteora/token-filters/marketcap.ts +++ b/src/meteora/token-filters/marketcap.ts @@ -14,4 +14,4 @@ export async function getCurrentMarketCap( return marketCap; } -getCurrentMarketCap("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); +//getCurrentMarketCap("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); From 8f4b624c17f3ca97a058c7ea50a50d37a6069beb Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Wed, 28 Aug 2024 13:48:08 +0800 Subject: [PATCH 021/140] added method to fetch whirl pool --- src/Transactions/index.ts | 3 + src/meteora/Pool/swap.ts | 3 +- src/orca/Pool/fetch-pool.ts | 44 ++++++++++++++ src/orca/Pool/swap.ts | 116 ++++++++++++++++++++++++++++++++++++ src/orca/constants.ts | 13 ++++ src/orca/fetch-pool.ts | 0 src/orca/index.ts | 33 ---------- src/orca/swap.ts | 0 8 files changed, 178 insertions(+), 34 deletions(-) create mode 100644 src/Transactions/index.ts create mode 100644 src/orca/Pool/fetch-pool.ts create mode 100644 src/orca/Pool/swap.ts create mode 100644 src/orca/constants.ts delete mode 100644 src/orca/fetch-pool.ts delete mode 100644 src/orca/swap.ts diff --git a/src/Transactions/index.ts b/src/Transactions/index.ts new file mode 100644 index 0000000..6fc74d9 --- /dev/null +++ b/src/Transactions/index.ts @@ -0,0 +1,3 @@ +export * from "./bloXroute_tips_tx_executor"; +export * from "./jito_tips_tx_executor"; +export * from "./simple_tx_executor"; \ No newline at end of file diff --git a/src/meteora/Pool/swap.ts b/src/meteora/Pool/swap.ts index cf75820..97588bc 100644 --- a/src/meteora/Pool/swap.ts +++ b/src/meteora/Pool/swap.ts @@ -96,6 +96,7 @@ export async function swap( minOutAmount: swapQuote.minOutAmount, outToken: outToken, }); + console.log(swapTx); // try { // const swapTxHash = await sendAndConfirmTransaction(connection, swapTx, [ // wallet, @@ -138,4 +139,4 @@ async function main() { const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; await swap("sell", tokenAddress, -1, 100); } -//main(); +//main(); \ No newline at end of file diff --git a/src/orca/Pool/fetch-pool.ts b/src/orca/Pool/fetch-pool.ts new file mode 100644 index 0000000..3d2b2ee --- /dev/null +++ b/src/orca/Pool/fetch-pool.ts @@ -0,0 +1,44 @@ +import { PublicKey, sendAndConfirmTransaction } from "@solana/web3.js"; +import { AnchorProvider, Wallet } from "@coral-xyz/anchor"; +import { + WhirlpoolContext, + buildWhirlpoolClient, + ORCA_WHIRLPOOL_PROGRAM_ID, + PDAUtil, +} from "@orca-so/whirlpools-sdk"; +import { + MAINNET_WHIRLPOOLS_CONFIG, + WSOL, + USDC, + tick_spacing, +} from "../constants"; +import { connection, wallet } from "../../helpers/config"; + +const ourWallet = new Wallet(wallet); +const provider = new AnchorProvider(connection, ourWallet, { + commitment: "confirmed", + }); + const ctx = WhirlpoolContext.withProvider( + provider, + ORCA_WHIRLPOOL_PROGRAM_ID + ); + const client = buildWhirlpoolClient(ctx); +export async function fetchWhirlPoolId(tokenAddress:string) { + const tokenMint = new PublicKey(tokenAddress); + const whirlpool_pubkey = PDAUtil.getWhirlpool( + ORCA_WHIRLPOOL_PROGRAM_ID, + MAINNET_WHIRLPOOLS_CONFIG, + WSOL.mint, + tokenMint, + tick_spacing + ).publicKey; + console.log("Pool Id: ", whirlpool_pubkey.toBase58()); + return whirlpool_pubkey.toBase58(); +} +export async function fetchWhirlPool(tokenAddress:string) { + const whirlPoolId = await fetchWhirlPoolId(tokenAddress); + const whirlpool = await client.getPool(new PublicKey(whirlPoolId)); + return whirlpool; +} + +//fetchWhirlPoolId("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); diff --git a/src/orca/Pool/swap.ts b/src/orca/Pool/swap.ts new file mode 100644 index 0000000..a4b1040 --- /dev/null +++ b/src/orca/Pool/swap.ts @@ -0,0 +1,116 @@ +import { PublicKey, sendAndConfirmTransaction } from "@solana/web3.js"; +import { AnchorProvider, Wallet } from "@coral-xyz/anchor"; +import { + DecimalUtil, + Percentage, + TransactionBuilder, +} from "@orca-so/common-sdk"; +import { + WhirlpoolContext, + buildWhirlpoolClient, + ORCA_WHIRLPOOL_PROGRAM_ID, + PDAUtil, + swapQuoteByInputToken, + Whirlpool, + WhirlpoolData, + IGNORE_CACHE, +} from "@orca-so/whirlpools-sdk"; +import { + MAINNET_WHIRLPOOLS_CONFIG, + WSOL, + USDC, + tick_spacing, +} from "../constants"; +import Decimal from "decimal.js"; +import { connection, wallet, jito_fee } from "../../helpers/config"; +import { jito_executeAndConfirm } from "../../Transactions"; +import { TransactionMessage, Transaction, TransactionInstruction } from "@solana/web3.js"; +import { VersionedTransaction } from "@solana/web3.js"; +const ourWallet = new Wallet(wallet); +async function main() { + console.log(ourWallet.publicKey.toBase58()); + const provider = new AnchorProvider(connection, ourWallet, { + commitment: "confirmed", + }); + const ctx = WhirlpoolContext.withProvider( + provider, + ORCA_WHIRLPOOL_PROGRAM_ID + ); + const client = buildWhirlpoolClient(ctx); + const whirlpool_pubkey = PDAUtil.getWhirlpool( + ORCA_WHIRLPOOL_PROGRAM_ID, + MAINNET_WHIRLPOOLS_CONFIG, + WSOL.mint, + USDC.mint, + tick_spacing + ).publicKey; + console.log("Pool Id: ", whirlpool_pubkey.toBase58()); + const whirlpool = await client.getPool(whirlpool_pubkey); + // tokenB -> tokenA + const amountIn = new Decimal("1"); // 1 USDC to WSOL + const quote = await swapQuoteByInputToken( + whirlpool, + USDC.mint, + DecimalUtil.toBN(amountIn, USDC.decimals), + Percentage.fromFraction(10, 1000), // 10/1000 = 1% slippage + ctx.program.programId, + ctx.fetcher, + IGNORE_CACHE + ); + // Output the estimation + console.log( + "estimatedAmountIn:", + DecimalUtil.fromBN(quote.estimatedAmountIn, USDC.decimals).toString(), + "USDC" + ); + console.log( + "estimatedAmountOut:", + DecimalUtil.fromBN(quote.estimatedAmountOut, WSOL.decimals).toString(), + "WSOL" + ); + console.log( + "otherAmountThreshold:", + DecimalUtil.fromBN(quote.otherAmountThreshold, WSOL.decimals).toString(), + "WSOL" + ); + // build the tx + const swapTx: any = await whirlpool.swap(quote); + let ixList = [], signers = []; + for (const ix of swapTx.instructions) { + ixList.push(...ix.instructions); + //ixList.push(...ix.cleanupInstructions); + signers.push(...ix.signers); + } + + try { + const recentBlockhash = await connection.getLatestBlockhash(); + const messageV0 = new TransactionMessage({ + payerKey: wallet.publicKey, + recentBlockhash: recentBlockhash.blockhash, + instructions: [...ixList], + }).compileToV0Message(); + + const transaction = new VersionedTransaction(messageV0); + transaction.sign([wallet,...signers]); + const res = await jito_executeAndConfirm( + transaction, + wallet, + recentBlockhash, + jito_fee + ); + const signature = res.signature; + const confirmed = res.confirmed; + + if (confirmed) { + console.log(`🚀 https://solscan.io/tx/${signature}`); + } else { + console.log( + "jito fee transaction failed when swapping token in a orca whirl pool" + ); + } + } catch (error: any) { + console.log("🚀 ~ error: ", JSON.parse(JSON.stringify(error))); + } +} + +main(); diff --git a/src/orca/constants.ts b/src/orca/constants.ts new file mode 100644 index 0000000..485a65f --- /dev/null +++ b/src/orca/constants.ts @@ -0,0 +1,13 @@ +import { PublicKey } from "@solana/web3.js"; + +export const PROGRAM_ID = "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc"; +export const MAINNET_WHIRLPOOLS_CONFIG = new PublicKey("2LecshUwdy9xi7meFgHtFJQNSKk4KdTrcpvaB56dP2NQ"); +export const DEVNET_WHIRLPOOLS_CONFIG = new PublicKey("FcrweFY1G9HJAHG5inkGB6pKg1HZ6x9UC2WioAfWrGkR"); +export const wsol = "So11111111111111111111111111111111111111112"; +export const usdc = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; +export const usdt = "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"; +export const USDC = {mint: new PublicKey(usdc), decimals: 6}; +export const WSOL = {mint: new PublicKey(wsol), decimals: 9}; +export const USDT = {mint: new PublicKey(usdt), decimals: 6}; +export const tick_spacing = 64; + diff --git a/src/orca/fetch-pool.ts b/src/orca/fetch-pool.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/orca/index.ts b/src/orca/index.ts index 3f12744..e69de29 100644 --- a/src/orca/index.ts +++ b/src/orca/index.ts @@ -1,33 +0,0 @@ -import { PublicKey } from "@solana/web3.js"; -import { AnchorProvider, Wallet } from "@coral-xyz/anchor"; -import { DecimalUtil, Percentage } from "@orca-so/common-sdk"; -import { - WhirlpoolContext, - buildWhirlpoolClient, - ORCA_WHIRLPOOL_PROGRAM_ID, - PDAUtil, - swapQuoteByInputToken, - IGNORE_CACHE, -} from "@orca-so/whirlpools-sdk"; -import Decimal from "decimal.js"; -import { - connection, - dev_connection, - wallet, -} from "../helpers/config"; -const ourWallet = new Wallet(wallet); -async function main() { - const provider = new AnchorProvider(connection, ourWallet, { - commitment: "confirmed", - }); - const ctx = WhirlpoolContext.withProvider( - provider, - ORCA_WHIRLPOOL_PROGRAM_ID - ); - const client = buildWhirlpoolClient(ctx); - console.log("Whirlpool client: ", client); - console.log("RPC endpoint: ", ctx.connection.rpcEndpoint); - console.log("Wallet public key: ", ctx.wallet.publicKey.toString()); -} - -main(); diff --git a/src/orca/swap.ts b/src/orca/swap.ts deleted file mode 100644 index e69de29..0000000 From 9d18840a9918deca89d3d20ab5a87a64bf24d859 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Wed, 28 Aug 2024 13:53:25 +0800 Subject: [PATCH 022/140] added method to fetch whirl pool --- src/orca/Pool/fetch-pool.ts | 20 ++++---------------- src/orca/Pool/index.ts | 2 ++ src/orca/constants.ts | 17 ++++++++++++++++- src/orca/index.ts | 1 + 4 files changed, 23 insertions(+), 17 deletions(-) create mode 100644 src/orca/Pool/index.ts diff --git a/src/orca/Pool/fetch-pool.ts b/src/orca/Pool/fetch-pool.ts index 3d2b2ee..197db20 100644 --- a/src/orca/Pool/fetch-pool.ts +++ b/src/orca/Pool/fetch-pool.ts @@ -1,28 +1,16 @@ -import { PublicKey, sendAndConfirmTransaction } from "@solana/web3.js"; -import { AnchorProvider, Wallet } from "@coral-xyz/anchor"; +import { PublicKey } from "@solana/web3.js"; import { - WhirlpoolContext, - buildWhirlpoolClient, ORCA_WHIRLPOOL_PROGRAM_ID, PDAUtil, } from "@orca-so/whirlpools-sdk"; import { MAINNET_WHIRLPOOLS_CONFIG, WSOL, - USDC, tick_spacing, + client } from "../constants"; -import { connection, wallet } from "../../helpers/config"; -const ourWallet = new Wallet(wallet); -const provider = new AnchorProvider(connection, ourWallet, { - commitment: "confirmed", - }); - const ctx = WhirlpoolContext.withProvider( - provider, - ORCA_WHIRLPOOL_PROGRAM_ID - ); - const client = buildWhirlpoolClient(ctx); + export async function fetchWhirlPoolId(tokenAddress:string) { const tokenMint = new PublicKey(tokenAddress); const whirlpool_pubkey = PDAUtil.getWhirlpool( @@ -41,4 +29,4 @@ export async function fetchWhirlPool(tokenAddress:string) { return whirlpool; } -//fetchWhirlPoolId("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); +//fetchWhirlPool("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); diff --git a/src/orca/Pool/index.ts b/src/orca/Pool/index.ts new file mode 100644 index 0000000..62ea691 --- /dev/null +++ b/src/orca/Pool/index.ts @@ -0,0 +1,2 @@ +export * from "./fetch-pool"; +export * from "./swap"; \ No newline at end of file diff --git a/src/orca/constants.ts b/src/orca/constants.ts index 485a65f..a91c230 100644 --- a/src/orca/constants.ts +++ b/src/orca/constants.ts @@ -1,5 +1,20 @@ import { PublicKey } from "@solana/web3.js"; - +import { AnchorProvider, Wallet } from "@coral-xyz/anchor"; +import { connection, wallet} from "../helpers/config" +import { + WhirlpoolContext, + buildWhirlpoolClient, + ORCA_WHIRLPOOL_PROGRAM_ID +} from "@orca-so/whirlpools-sdk"; +export const ourWallet = new Wallet(wallet); +export const provider = new AnchorProvider(connection, ourWallet, { + commitment: "confirmed", + }); +export const ctx = WhirlpoolContext.withProvider( + provider, + ORCA_WHIRLPOOL_PROGRAM_ID + ); +export const client = buildWhirlpoolClient(ctx); export const PROGRAM_ID = "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc"; export const MAINNET_WHIRLPOOLS_CONFIG = new PublicKey("2LecshUwdy9xi7meFgHtFJQNSKk4KdTrcpvaB56dP2NQ"); export const DEVNET_WHIRLPOOLS_CONFIG = new PublicKey("FcrweFY1G9HJAHG5inkGB6pKg1HZ6x9UC2WioAfWrGkR"); diff --git a/src/orca/index.ts b/src/orca/index.ts index e69de29..abdd41a 100644 --- a/src/orca/index.ts +++ b/src/orca/index.ts @@ -0,0 +1 @@ +export * from "./Pool"; \ No newline at end of file From 82d61fbee86b08a1bae60be3674ae9538fb4b783 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Wed, 28 Aug 2024 14:41:28 +0800 Subject: [PATCH 023/140] orca swap cli done. --- src/orca/Pool/swap.ts | 185 +++++++++++++++------------- src/orca/buy.ts | 37 ++++++ src/orca/buy_helper.ts | 11 ++ src/orca/fetch-price.ts | 0 src/orca/index.ts | 4 +- src/orca/sell.ts | 37 ++++++ src/orca/sell_helper.ts | 11 ++ src/orca/token-filters/marketcap.ts | 0 src/orca/token-filters/pool-sol.ts | 0 src/orca/token-filters/volume.ts | 0 10 files changed, 195 insertions(+), 90 deletions(-) create mode 100644 src/orca/buy_helper.ts create mode 100644 src/orca/fetch-price.ts create mode 100644 src/orca/sell_helper.ts create mode 100644 src/orca/token-filters/marketcap.ts create mode 100644 src/orca/token-filters/pool-sol.ts create mode 100644 src/orca/token-filters/volume.ts diff --git a/src/orca/Pool/swap.ts b/src/orca/Pool/swap.ts index a4b1040..8a2166f 100644 --- a/src/orca/Pool/swap.ts +++ b/src/orca/Pool/swap.ts @@ -1,9 +1,7 @@ -import { PublicKey, sendAndConfirmTransaction } from "@solana/web3.js"; -import { AnchorProvider, Wallet } from "@coral-xyz/anchor"; +import { AnchorProvider } from "@coral-xyz/anchor"; import { DecimalUtil, Percentage, - TransactionBuilder, } from "@orca-so/common-sdk"; import { WhirlpoolContext, @@ -20,97 +18,106 @@ import { WSOL, USDC, tick_spacing, + ourWallet, + client, + ctx } from "../constants"; import Decimal from "decimal.js"; import { connection, wallet, jito_fee } from "../../helpers/config"; +import { getSPLTokenBalance } from "../../helpers/check_balance" import { jito_executeAndConfirm } from "../../Transactions"; -import { TransactionMessage, Transaction, TransactionInstruction } from "@solana/web3.js"; -import { VersionedTransaction } from "@solana/web3.js"; -const ourWallet = new Wallet(wallet); -async function main() { - console.log(ourWallet.publicKey.toBase58()); - const provider = new AnchorProvider(connection, ourWallet, { - commitment: "confirmed", - }); - const ctx = WhirlpoolContext.withProvider( - provider, - ORCA_WHIRLPOOL_PROGRAM_ID - ); - const client = buildWhirlpoolClient(ctx); - const whirlpool_pubkey = PDAUtil.getWhirlpool( - ORCA_WHIRLPOOL_PROGRAM_ID, - MAINNET_WHIRLPOOLS_CONFIG, - WSOL.mint, - USDC.mint, - tick_spacing - ).publicKey; - console.log("Pool Id: ", whirlpool_pubkey.toBase58()); - const whirlpool = await client.getPool(whirlpool_pubkey); - // tokenB -> tokenA - const amountIn = new Decimal("1"); // 1 USDC to WSOL - const quote = await swapQuoteByInputToken( - whirlpool, - USDC.mint, - DecimalUtil.toBN(amountIn, USDC.decimals), - Percentage.fromFraction(10, 1000), // 10/1000 = 1% slippage - ctx.program.programId, - ctx.fetcher, - IGNORE_CACHE - ); - // Output the estimation - console.log( - "estimatedAmountIn:", - DecimalUtil.fromBN(quote.estimatedAmountIn, USDC.decimals).toString(), - "USDC" - ); - console.log( - "estimatedAmountOut:", - DecimalUtil.fromBN(quote.estimatedAmountOut, WSOL.decimals).toString(), - "WSOL" - ); - console.log( - "otherAmountThreshold:", - DecimalUtil.fromBN(quote.otherAmountThreshold, WSOL.decimals).toString(), - "WSOL" - ); - // build the tx - const swapTx: any = await whirlpool.swap(quote); - let ixList = [], signers = []; - for (const ix of swapTx.instructions) { - ixList.push(...ix.instructions); - //ixList.push(...ix.cleanupInstructions); - signers.push(...ix.signers); - } - - try { - const recentBlockhash = await connection.getLatestBlockhash(); - const messageV0 = new TransactionMessage({ - payerKey: wallet.publicKey, - recentBlockhash: recentBlockhash.blockhash, - instructions: [...ixList], - }).compileToV0Message(); - - const transaction = new VersionedTransaction(messageV0); - transaction.sign([wallet,...signers]); - const res = await jito_executeAndConfirm( - transaction, - wallet, - recentBlockhash, - jito_fee +import { TransactionMessage, Transaction, TransactionInstruction, VersionedTransaction, PublicKey} from "@solana/web3.js"; +import {fetchWhirlPool} from "./fetch-pool" +/** + * Performs a swap operation in a Whirl pool. + * @param side The side of the swap operation, either "buy" or "sell". Default is "buy". + * @param tokenAddress The address of the token to be swapped. + * @param buyAmountInSOL The amount of SOL to be used for buying the token. Default is 0.1. + * @param sellPercentage The percentage of the token to be sold. Default is 100%. + * @returns A Promise that resolves to the transaction hash if the swap is successful, otherwise an error object. + */ +export async function swap( + side: string = "buy", + tokenAddress: string, + buyAmountInSOL: number = 0.1, + sellPercentage: number = 100 +) { + const tokenMint = new PublicKey(tokenAddress); + const whirlPool:any = await fetchWhirlPool(tokenAddress); + let amountIn:Decimal, inToken:PublicKey, outToken:PublicKey, tokenDecimal:number, quote:any; + if(side === "buy"){ + amountIn = new Decimal(buyAmountInSOL); + inToken = WSOL.mint; + outToken = tokenMint; + quote = await swapQuoteByInputToken( + whirlPool, + inToken, + DecimalUtil.toBN(amountIn, WSOL.decimals), + Percentage.fromFraction(10, 1000), // 10/1000 = 1% slippage + ctx.program.programId, + ctx.fetcher, + IGNORE_CACHE ); - const signature = res.signature; - const confirmed = res.confirmed; - - if (confirmed) { - console.log(`🚀 https://solscan.io/tx/${signature}`); - } else { - console.log( - "jito fee transaction failed when swapping token in a orca whirl pool" - ); + }else{ + const balance = await getSPLTokenBalance(connection, tokenMint, wallet.publicKey); + amountIn = new Decimal(balance * (sellPercentage / 100)); + inToken = tokenMint; + outToken = WSOL.mint; + if(whirlPool.tokenAInfo.mint.toBase58() === tokenMint.toBase58()){ + tokenDecimal = whirlPool.tokenAInfo.decimals; + }else{ + tokenDecimal = whirlPool.tokenBInfo.decimals; } - } catch (error: any) { - console.log("🚀 ~ error: ", JSON.parse(JSON.stringify(error))); + quote = await swapQuoteByInputToken( + whirlPool, + inToken, + DecimalUtil.toBN(amountIn, tokenDecimal), + Percentage.fromFraction(10, 1000), // 10/1000 = 1% slippage + ctx.program.programId, + ctx.fetcher, + IGNORE_CACHE + ); } + // build the tx + const swapTx: any = await whirlPool.swap(quote); + let ixList = [], signers = []; + // extract the instructions and signers + for (const ix of swapTx.instructions) { + ixList.push(...ix.instructions); + //ixList.push(...ix.cleanupInstructions); + signers.push(...ix.signers); + } + + // send the tx to jito + try { + const recentBlockhash = await connection.getLatestBlockhash(); + const messageV0 = new TransactionMessage({ + payerKey: wallet.publicKey, + recentBlockhash: recentBlockhash.blockhash, + instructions: [...ixList], + }).compileToV0Message(); + + const transaction = new VersionedTransaction(messageV0); + transaction.sign([wallet,...signers]); + const res = await jito_executeAndConfirm( + transaction, + wallet, + recentBlockhash, + jito_fee + ); + const signature = res.signature; + const confirmed = res.confirmed; + + if (confirmed) { + console.log(`🚀 https://solscan.io/tx/${signature}`); + } else { + console.log( + "jito fee transaction failed when swapping token in a orca whirl pool" + ); + } + } catch (error: any) { + console.log("🚀 ~ error: ", JSON.parse(JSON.stringify(error))); + } } - -main(); +//swap("buy", "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr", 0.01, -1); // buy 0.01 SOL worth of the token +//swap("sell", "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr", -1, 50); // sell 50% of the token diff --git a/src/orca/buy.ts b/src/orca/buy.ts index e69de29..df514fe 100644 --- a/src/orca/buy.ts +++ b/src/orca/buy.ts @@ -0,0 +1,37 @@ +import {swap} from "./Pool" +import { program } from "commander"; + +let token:string="", + sol:number=0; +program + .option("--token ", "Specify the token address") + .option("--sol ", "Specify the number of SOL") + .option("-h, --help", "display help for command") + .action((options) => { + if (options.help) { + console.log( + "ts-node buy --token --sol " + ); + process.exit(0); + } + if (!options.token || !options.sol) { + console.error("❌ Missing required options"); + process.exit(1); + } + token = options.token; + sol = options.sol; + }); +program.parse(); + +/** + * Buy function to perform a swap on the Meteora DEX. + * + * @param {string} side - The side of the trade (buy/sell). + * @param {string} token_address - The address of the token to trade. + * @param {number} no_of_sol - The amount of SOL to trade. + * @returns {Promise} - A promise that resolves when the swap is completed. + */ +async function buy(side:string, token_address:string, no_of_sol:number) { + await swap(side, token_address, no_of_sol, -1); +} +buy("buy", token, sol); diff --git a/src/orca/buy_helper.ts b/src/orca/buy_helper.ts new file mode 100644 index 0000000..abdc4c4 --- /dev/null +++ b/src/orca/buy_helper.ts @@ -0,0 +1,11 @@ +import {swap} from "./Pool"; + +/** + * Buys a specified amount of tokens using SOL. + * + * @param token_address The address of the token to buy. + * @param buyAmountInSOL The amount of SOL to use for the purchase. + */ +export async function buy(token_address:string, buyAmountInSOL:number) { + await swap("buy", token_address, buyAmountInSOL, -1); +} \ No newline at end of file diff --git a/src/orca/fetch-price.ts b/src/orca/fetch-price.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/orca/index.ts b/src/orca/index.ts index abdd41a..fe46c0f 100644 --- a/src/orca/index.ts +++ b/src/orca/index.ts @@ -1 +1,3 @@ -export * from "./Pool"; \ No newline at end of file +export * from "./Pool"; +export * from "./sell_helper"; +export * from "./buy_helper"; \ No newline at end of file diff --git a/src/orca/sell.ts b/src/orca/sell.ts index e69de29..eb8601f 100644 --- a/src/orca/sell.ts +++ b/src/orca/sell.ts @@ -0,0 +1,37 @@ +import {swap} from "./Pool" +import { program } from "commander"; + +let token:string="", + percentage:number=0; +program + .option("--token ", "Specify the token address") + .option("--percentage ", "Specify the sell percentage") + .option("-h, --help", "display help for command") + .action((options) => { + if (options.help) { + console.log( + "ts-node sell --token --percentage " + ); + process.exit(0); + } + if (!options.token || !options.percentage) { + console.error("❌ Missing required options"); + process.exit(1); + } + token = options.token; + percentage = options.percentage; + }); +program.parse(); + +/** + * Sell function to perform a swap on the Meteora DEX. + * + * @param {string} side - The side of the trade (buy/sell). + * @param {string} token_address - The address of the token to trade. + * @param {number} sell_percentage - The sell percentage. + * @returns {Promise} - A promise that resolves when the swap is completed. + */ +async function sell(side:string, token_address:string, sell_percentage:number) { + await swap(side, token_address, -1, sell_percentage); +} +sell("sell", token, percentage); diff --git a/src/orca/sell_helper.ts b/src/orca/sell_helper.ts new file mode 100644 index 0000000..68ac72c --- /dev/null +++ b/src/orca/sell_helper.ts @@ -0,0 +1,11 @@ +import {swap} from "./Pool"; + +/** + * Sells a token with the specified token address and sell percentage. + * + * @param token_address The address of the token to be sold. + * @param sell_percentage The percentage of the token to be sold. + */ +export async function sell(token_address:string, sell_percentage:number) { + await swap("sell", token_address, -1, sell_percentage); +} \ No newline at end of file diff --git a/src/orca/token-filters/marketcap.ts b/src/orca/token-filters/marketcap.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/orca/token-filters/pool-sol.ts b/src/orca/token-filters/pool-sol.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/orca/token-filters/volume.ts b/src/orca/token-filters/volume.ts new file mode 100644 index 0000000..e69de29 From 0e6a616c0146af351d28d3cf6600555198fe5988 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Wed, 28 Aug 2024 17:35:50 +0800 Subject: [PATCH 024/140] added method to fetch number of sol in whirl pool --- src/orca/Pool/fetch-pool.ts | 1 - src/orca/Pool/swap.ts | 7 ------- src/orca/buy_helper.ts | 2 +- src/orca/constants.ts | 2 +- src/orca/token-filters/pool-sol.ts | 16 ++++++++++++++++ 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/orca/Pool/fetch-pool.ts b/src/orca/Pool/fetch-pool.ts index 197db20..a53cb27 100644 --- a/src/orca/Pool/fetch-pool.ts +++ b/src/orca/Pool/fetch-pool.ts @@ -10,7 +10,6 @@ import { client } from "../constants"; - export async function fetchWhirlPoolId(tokenAddress:string) { const tokenMint = new PublicKey(tokenAddress); const whirlpool_pubkey = PDAUtil.getWhirlpool( diff --git a/src/orca/Pool/swap.ts b/src/orca/Pool/swap.ts index 8a2166f..dc6a6f7 100644 --- a/src/orca/Pool/swap.ts +++ b/src/orca/Pool/swap.ts @@ -1,16 +1,9 @@ -import { AnchorProvider } from "@coral-xyz/anchor"; import { DecimalUtil, Percentage, } from "@orca-so/common-sdk"; import { - WhirlpoolContext, - buildWhirlpoolClient, - ORCA_WHIRLPOOL_PROGRAM_ID, - PDAUtil, swapQuoteByInputToken, - Whirlpool, - WhirlpoolData, IGNORE_CACHE, } from "@orca-so/whirlpools-sdk"; import { diff --git a/src/orca/buy_helper.ts b/src/orca/buy_helper.ts index abdc4c4..7600568 100644 --- a/src/orca/buy_helper.ts +++ b/src/orca/buy_helper.ts @@ -8,4 +8,4 @@ import {swap} from "./Pool"; */ export async function buy(token_address:string, buyAmountInSOL:number) { await swap("buy", token_address, buyAmountInSOL, -1); -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/orca/constants.ts b/src/orca/constants.ts index a91c230..8e3ecf0 100644 --- a/src/orca/constants.ts +++ b/src/orca/constants.ts @@ -13,7 +13,7 @@ export const provider = new AnchorProvider(connection, ourWallet, { export const ctx = WhirlpoolContext.withProvider( provider, ORCA_WHIRLPOOL_PROGRAM_ID - ); +); export const client = buildWhirlpoolClient(ctx); export const PROGRAM_ID = "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc"; export const MAINNET_WHIRLPOOLS_CONFIG = new PublicKey("2LecshUwdy9xi7meFgHtFJQNSKk4KdTrcpvaB56dP2NQ"); diff --git a/src/orca/token-filters/pool-sol.ts b/src/orca/token-filters/pool-sol.ts index e69de29..646a0c6 100644 --- a/src/orca/token-filters/pool-sol.ts +++ b/src/orca/token-filters/pool-sol.ts @@ -0,0 +1,16 @@ +import {fetchWhirlPool} from "../Pool" +import { wsol } from "../constants"; + +export async function getCurrentSolInPool(token_address:string):Promise { + const whirlPool:any = await fetchWhirlPool(token_address); + let solReserve:number = 0; + console.log(whirlPool.tokenVaultAInfo) + if(whirlPool.tokenVaultAInfo.mint.toBase58() === wsol){ + solReserve = Number(whirlPool.tokenVaultAInfo.amount)/Math.pow(10,9); + } + console.log(solReserve); + return solReserve; +} + + +// getCurrentSolInPool("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); \ No newline at end of file From 6d3f73bcd2af4fa2fb04685411e44398235eb2b5 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Wed, 28 Aug 2024 17:36:15 +0800 Subject: [PATCH 025/140] added method to fetch number of sol in whirl pool --- src/orca/token-filters/pool-sol.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/orca/token-filters/pool-sol.ts b/src/orca/token-filters/pool-sol.ts index 646a0c6..6b6811d 100644 --- a/src/orca/token-filters/pool-sol.ts +++ b/src/orca/token-filters/pool-sol.ts @@ -7,6 +7,8 @@ export async function getCurrentSolInPool(token_address:string):Promise { console.log(whirlPool.tokenVaultAInfo) if(whirlPool.tokenVaultAInfo.mint.toBase58() === wsol){ solReserve = Number(whirlPool.tokenVaultAInfo.amount)/Math.pow(10,9); + }else{ + solReserve = Number(whirlPool.tokenVaultBInfo.amount)/Math.pow(10,9); } console.log(solReserve); return solReserve; From d5de66dcd9a294c5951321ee711cc1216d016b7f Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Wed, 28 Aug 2024 18:06:22 +0800 Subject: [PATCH 026/140] added method to fetch price of whirl pool --- src/orca/fetch-price.ts | 24 ++++++++++++++++++++++++ src/orca/token-filters/marketcap.ts | 6 ++++++ src/raydium/fetch-price.ts | 4 +++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/orca/fetch-price.ts b/src/orca/fetch-price.ts index e69de29..25e814f 100644 --- a/src/orca/fetch-price.ts +++ b/src/orca/fetch-price.ts @@ -0,0 +1,24 @@ +import Decimal from "decimal.js"; +import { wsol, usdc } from "../raydium"; +import {fetchWhirlPool} from "./Pool" +import { PriceMath } from "@orca-so/whirlpools-sdk"; +// on-chain rpc method to get the current price of the token +export async function getCurrentPriceInSOL(tokenAddress:string):Promise { + const whirlPool:any = await fetchWhirlPool(tokenAddress); + const sqrt_price_x64 = whirlPool.getData().sqrtPrice; + const price = PriceMath.sqrtPriceX64ToPrice(sqrt_price_x64, whirlPool.tokenAInfo.decimals, whirlPool.tokenBInfo.decimals); + return new Decimal(1).div(price.toFixed(whirlPool.tokenBInfo.decimals)); +} +export async function getCurrentSolPrice():Promise { + const whirlPool:any = await fetchWhirlPool(usdc); + const sqrt_price_x64 = whirlPool.getData().sqrtPrice; + const price = PriceMath.sqrtPriceX64ToPrice(sqrt_price_x64, whirlPool.tokenAInfo.decimals, whirlPool.tokenBInfo.decimals); + return price; +} +export async function getCurrentPriceInUSD(tokenAddress:string):Promise { + return (await getCurrentPriceInSOL(tokenAddress))*(await getCurrentSolPrice()); +} + +//getCurrentPriceInSOL("DhFTtmQ1ymhWWabzViW1Ewf43iaqaVuriSsw5HF8pump"); +//getCurrentSolPrice(); +//getCurrentPriceInUSD("DhFTtmQ1ymhWWabzViW1Ewf43iaqaVuriSsw5HF8pump"); \ No newline at end of file diff --git a/src/orca/token-filters/marketcap.ts b/src/orca/token-filters/marketcap.ts index e69de29..ae001bf 100644 --- a/src/orca/token-filters/marketcap.ts +++ b/src/orca/token-filters/marketcap.ts @@ -0,0 +1,6 @@ +import {fetchWhirlPool} from "../Pool"; + +export async function getCurrentMarketCap(token_address:string):Promise { + const whirlPool:any = await fetchWhirlPool(token_address); + +} \ No newline at end of file diff --git a/src/raydium/fetch-price.ts b/src/raydium/fetch-price.ts index 0427efd..842e697 100644 --- a/src/raydium/fetch-price.ts +++ b/src/raydium/fetch-price.ts @@ -2,6 +2,7 @@ import { initSdk } from "./raydium_config"; import {fetchAMMPoolId} from "./Pool/fetch_pool"; import Decimal from "decimal.js"; import {wsol} from "./constants"; +import { sol } from "@metaplex-foundation/js"; let sdkCache = { sdk: null, expiry: 0 }; export async function getCurrentPriceInSOL( tokenAddress:string @@ -90,6 +91,7 @@ export async function getCurrentPriceInUSD(tokenAddress:string){ async function main(){ // console.log(await getCurrentPriceInSOL("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP")); // console.log(await getCurrentSolPrice()); - console.log(await getCurrentPriceInUSD("4MBEqrtgabZ9G5EmKm7XTrcknZ1nWg3TrvFHZMrENgrd")); + //console.log(await getCurrentPriceInUSD("4MBEqrtgabZ9G5EmKm7XTrcknZ1nWg3TrvFHZMrENgrd")); + //console.log(await getCurrentPriceInSOL("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr")); } //main(); From bf0d71d727ac274b82f42844ab8ce8b67886fdd5 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Wed, 28 Aug 2024 18:09:12 +0800 Subject: [PATCH 027/140] added method to fetch the market cap of a token --- src/orca/token-filters/marketcap.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/orca/token-filters/marketcap.ts b/src/orca/token-filters/marketcap.ts index ae001bf..85ebadd 100644 --- a/src/orca/token-filters/marketcap.ts +++ b/src/orca/token-filters/marketcap.ts @@ -1,6 +1,14 @@ import {fetchWhirlPool} from "../Pool"; - +import {getCurrentPriceInUSD} from "../fetch-price"; +import { PublicKey } from "@solana/web3.js"; +import { connection } from "../../helpers/config"; export async function getCurrentMarketCap(token_address:string):Promise { - const whirlPool:any = await fetchWhirlPool(token_address); - -} \ No newline at end of file + const priceInUSD = await getCurrentPriceInUSD(token_address); + const tokenSupply: any = await connection.getTokenSupply( + new PublicKey(token_address) + ); + const marketCap: number = priceInUSD * tokenSupply.value.uiAmount; + return marketCap; +} + +//getCurrentMarketCap("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); \ No newline at end of file From cf776ff7112acecf2307ea5060dba52b293100c9 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 29 Aug 2024 14:50:20 +0800 Subject: [PATCH 028/140] added README.md for test in raydium/ --- src/raydium/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/raydium/README.md diff --git a/src/raydium/README.md b/src/raydium/README.md new file mode 100644 index 0000000..32f95c0 --- /dev/null +++ b/src/raydium/README.md @@ -0,0 +1 @@ +hi \ No newline at end of file From afcdc7840a3818011d39ec56d7a64a5288ac34db Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 29 Aug 2024 15:01:11 +0800 Subject: [PATCH 029/140] added something in README.md of raydium/ --- src/raydium/README.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/raydium/README.md b/src/raydium/README.md index 32f95c0..9fc7878 100644 --- a/src/raydium/README.md +++ b/src/raydium/README.md @@ -1 +1,23 @@ -hi \ No newline at end of file +# Raydium DEX Usage Examples + +## Buy token through cli +` +ts-node ts-node src/raydium/buy.ts --token_address --sol +` + +## Sell token through cli +` +ts-node src/raydium/sell.ts --token_address --percentage +` + +## Fetch the price +```typescript +import {getCurrentPriceInUSD, getCurrentPriceInSOL} from "../raydium"; + +const currentPopcatPriceInSOL = await getCurrentPriceInSOL("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); +const currentPopcatPriceInUSD = await getCurrentPriceInUSD("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); + +console.log(currentPopcatPriceInSOL); +console.log(currentPopcatPriceInUSD); +``` + From a07c6ef3e08ddaf9e6b8a8339fc0c11b9aab2d32 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 29 Aug 2024 15:02:49 +0800 Subject: [PATCH 030/140] Update README.md --- src/raydium/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/raydium/README.md b/src/raydium/README.md index 9fc7878..fe1e1b7 100644 --- a/src/raydium/README.md +++ b/src/raydium/README.md @@ -1,16 +1,16 @@ # Raydium DEX Usage Examples -## Buy token through cli +### Buy token through cli ` ts-node ts-node src/raydium/buy.ts --token_address --sol ` -## Sell token through cli +### Sell token through cli ` ts-node src/raydium/sell.ts --token_address --percentage ` -## Fetch the price +### Fetch the price ```typescript import {getCurrentPriceInUSD, getCurrentPriceInSOL} from "../raydium"; From fd8ab33aeca0e14807e9b24305c889bb94c2edd6 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 29 Aug 2024 15:18:45 +0800 Subject: [PATCH 031/140] Wrote README.md on how to use functions in raydium/ --- src/raydium/Pool/index.ts | 4 +++ src/raydium/README.md | 48 ++++++++++++++++++++++++-- src/raydium/index.ts | 4 ++- src/raydium/token-filters/index.ts | 4 +++ src/raydium/token-filters/marketcap.ts | 18 +--------- 5 files changed, 57 insertions(+), 21 deletions(-) create mode 100644 src/raydium/Pool/index.ts create mode 100644 src/raydium/token-filters/index.ts diff --git a/src/raydium/Pool/index.ts b/src/raydium/Pool/index.ts new file mode 100644 index 0000000..cada997 --- /dev/null +++ b/src/raydium/Pool/index.ts @@ -0,0 +1,4 @@ +export * from "./add_pool"; +export * from "./remove_pool"; +export * from "./formatAmmKeysById"; +export * from "./swap"; \ No newline at end of file diff --git a/src/raydium/README.md b/src/raydium/README.md index 9fc7878..bfa316f 100644 --- a/src/raydium/README.md +++ b/src/raydium/README.md @@ -1,16 +1,28 @@ # Raydium DEX Usage Examples -## Buy token through cli +### Buy token through cli ` ts-node ts-node src/raydium/buy.ts --token_address --sol ` -## Sell token through cli +### Sell token through cli ` ts-node src/raydium/sell.ts --token_address --percentage ` +### buy/sell token by calling the function +```typescript +import {buy, sell} from "../raydium"; +import {wallet} from "../helpers/config"; +async function main() { + const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; + const sol = 1; // buy 1 SOL worth of token using WSOL + const sellPercentage = 50; // sell 50% of the token + await buy("buy", tokenAddress, sol, wallet); // buy 1 SOL worth of POPCAT + await sell("sell", tokenAddress, sellPercentage, wallet); // sell 50% of the POPCAT +} +``` -## Fetch the price +### Fetch the price ```typescript import {getCurrentPriceInUSD, getCurrentPriceInSOL} from "../raydium"; @@ -21,3 +33,33 @@ console.log(currentPopcatPriceInSOL); console.log(currentPopcatPriceInUSD); ``` +### Fetch the pool address for the target token +```typescript +import {fetchAMMPoolId, fetchAMMPoolIdByMintPair} from "../raydium"; + +async function main(){ + const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; + const poolId = await fetchAMMPoolId(tokenAddress); // output Address: POPCAT/WSOL or WSOL/POPCAT + const poolIdByMintPair = await fetchAMMPoolIdByMintPair(tokenAddress, "YOUR_MINT_ADDRESS"); // output Address: POPCAT/YOUR_MINT_ADDRESS or YOUR_MINT_ADDRESS/POPCAT + console.log(poolId); + console.log(poolIdByMintPair); +} +``` + +### Fetch the metrics of the pool +```typescript +import {getLPBurnPercentage, getCurrentMarketCap, getCurrentSolInPool, getDayVolume, getWeekVolume, getMonthVolume} from "../raydium"; + +async function main(){ + const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; + const LPBurnPercentage = await getLPBurnPercentage(tokenAddress); // to get the percentage of LP tokens burned + const currentMarketCap = await getCurrentMarketCap(tokenAddress); // to get the current market cap of the token + const currentSolInPool = await getCurrentSolInPool(tokenAddress); // to get the current number of SOL in the pool + const dayVolume = await getDayVolume(tokenAddress); // to get the volume of the pool in the last 24 hours + const weekVolume = await getWeekVolume(tokenAddress); // to get the volume of the pool in the last week + const monthVolume = await getMonthVolume(tokenAddress); // to get the volume of the pool in the last month + // output ... +} +``` + + diff --git a/src/raydium/index.ts b/src/raydium/index.ts index c9133c7..9a5e521 100644 --- a/src/raydium/index.ts +++ b/src/raydium/index.ts @@ -2,4 +2,6 @@ export * from "./sell_helper"; export * from "./buy_helper"; export * from "./raydium_config"; export * from "./constants"; -export * from "./fetch-price"; \ No newline at end of file +export * from "./fetch-price"; +export * from "./Pool"; +export * from "./token-filters"; \ No newline at end of file diff --git a/src/raydium/token-filters/index.ts b/src/raydium/token-filters/index.ts new file mode 100644 index 0000000..c26d446 --- /dev/null +++ b/src/raydium/token-filters/index.ts @@ -0,0 +1,4 @@ +export * from "./lp-burn"; +export * from "./marketcap"; +export * from "./pool-sol"; +export * from "./volume"; \ No newline at end of file diff --git a/src/raydium/token-filters/marketcap.ts b/src/raydium/token-filters/marketcap.ts index 0a154e2..98e715b 100644 --- a/src/raydium/token-filters/marketcap.ts +++ b/src/raydium/token-filters/marketcap.ts @@ -4,24 +4,8 @@ import { fetchAMMPoolId } from "../Pool/fetch_pool"; import { wsol } from "../constants"; import { connection } from "../../helpers/config"; import { PublicKey } from "@solana/web3.js"; +import { getCurrentSolPrice } from "../fetch-price"; let sdkCache = { sdk: null, expiry: 0 }; -export async function getCurrentSolPrice() { - try { - let raydium:any = null; - if (sdkCache.sdk) { - raydium = sdkCache.sdk; - } else { - raydium = await initSdk(); - sdkCache.sdk = raydium; - } - const sol_usdc = "58oQChx4yWmvKdwLLZzBi4ChoCc2fqCUWBkwMihLYQo2"; - const res = await raydium.liquidity.getRpcPoolInfos([sol_usdc]); - const poolInfo = res[sol_usdc]; - return poolInfo.poolPrice; - } catch (e) { - console.log("Error getting current SOL price: ", e); - } -} export async function getCurrentMarketCap(tokenAddress:string) { try { let raydium:any = null; From ea0495444fb5762f3839179203cc2a3dd5ce0119 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 29 Aug 2024 15:19:27 +0800 Subject: [PATCH 032/140] Wrote README.md on how to use functions in raydium/ --- src/raydium/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/raydium/README.md b/src/raydium/README.md index bfa316f..211525f 100644 --- a/src/raydium/README.md +++ b/src/raydium/README.md @@ -2,7 +2,7 @@ ### Buy token through cli ` -ts-node ts-node src/raydium/buy.ts --token_address --sol +ts-node src/raydium/buy.ts --token_address --sol ` ### Sell token through cli From 4c14637cc680e6de6c0412ebbd5d9ac9420d05dc Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 29 Aug 2024 15:28:47 +0800 Subject: [PATCH 033/140] added readme.md in every dir --- src/Token/README.md | 0 src/Transactions/README.md | 0 src/helpers/README.md | 0 src/jupiter/README.md | 0 src/meteora/README.md | 0 src/orca/README.md | 0 src/pumpfunsdk/README.md | 0 7 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/Token/README.md create mode 100644 src/Transactions/README.md create mode 100644 src/helpers/README.md create mode 100644 src/jupiter/README.md create mode 100644 src/meteora/README.md create mode 100644 src/orca/README.md create mode 100644 src/pumpfunsdk/README.md diff --git a/src/Token/README.md b/src/Token/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/Transactions/README.md b/src/Transactions/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/helpers/README.md b/src/helpers/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/jupiter/README.md b/src/jupiter/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/meteora/README.md b/src/meteora/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/orca/README.md b/src/orca/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/pumpfunsdk/README.md b/src/pumpfunsdk/README.md new file mode 100644 index 0000000..e69de29 From 345dc07d8929d58132ccf4ddf8e7495a25698f3e Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 29 Aug 2024 15:34:48 +0800 Subject: [PATCH 034/140] added Disclaimer to README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index ce51dfe..5fb0d6d 100644 --- a/README.md +++ b/README.md @@ -315,6 +315,14 @@ ts-node sell --token_address --percentage - ``` git pull --rebase # Pull the latest changes``` - ``` git stash pop # Apply Your stashed changes``` +## Disclaimer + +This software is provided "as is," without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software. + +**Use at your own risk.** The authors take no responsibility for any harm or damage caused by the use of this software. Users are responsible for ensuring the suitability and safety of this software for their specific use cases. + +By using this software, you acknowledge that you have read, understood, and agree to this disclaimer. + ### If you think this project is useful, please give us a star🌟, it will help us a lot. ### Discord channel: https://discord.gg/hFhQeBCqWX From f0df384780c4d37c8990be80d922758348ec859d Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 31 Aug 2024 10:25:09 +0800 Subject: [PATCH 035/140] release the beta of grpc pump.fun sniper & copy bot --- package-lock.json | 148 +++ package.json | 4 +- src/Memecoin_dev/sniping_dev/index.ts | 0 .../bought-tokens.json | 0 .../{copy_trading => copy-bot}/copy-buy.ts | 0 .../{copy_trading => copy-bot}/copy-sell.ts | 0 .../{copy_trading => copy-bot}/copy-trade.ts | 0 src/Trading_dev/grpc-copy-bot/README.md | 8 + src/Trading_dev/grpc-copy-bot/command.sh | 1 + src/Trading_dev/grpc-copy-bot/main.ts | 24 + src/Trading_dev/grpc-copy-bot/src/.DS_Store | Bin 0 -> 6148 bytes .../grpc-copy-bot/src/constants/constants.ts | 54 + .../grpc-copy-bot/src/constants/index.ts | 1 + .../grpc-copy-bot/src/jito/bundle.ts | 127 +++ .../grpc-copy-bot/src/jito/index.ts | 1 + .../grpc-copy-bot/src/raydium/buy-helper.ts | 10 + .../src/raydium/formatAmmKeys.ts | 82 ++ .../grpc-copy-bot/src/raydium/index.ts | 5 + .../grpc-copy-bot/src/raydium/sell-helper.ts | 9 + .../grpc-copy-bot/src/raydium/swap.ts | 252 +++++ .../grpc-copy-bot/src/raydium/utils.ts | 43 + .../grpc-copy-bot/src/streaming/copy-trade.ts | 44 + .../src/streaming/grpc-requests-type.ts | 46 + .../src/streaming/stream-trader.ts | 243 +++++ .../grpc-copy-bot/src/streaming/utils.ts | 73 ++ .../src/transaction/transaction.ts | 73 ++ src/Trading_dev/grpc-pf-sniper/.DS_Store | Bin 0 -> 6148 bytes src/Trading_dev/grpc-pf-sniper/README.md | 32 + src/Trading_dev/grpc-pf-sniper/src/.DS_Store | Bin 0 -> 6148 bytes .../grpc-pf-sniper/src/constants/constants.ts | 19 + .../grpc-pf-sniper/src/constants/index.ts | 1 + .../grpc-pf-sniper/src/jito/bundle.ts | 133 +++ .../grpc-pf-sniper/src/jito/index.ts | 1 + .../src/pumpdotfun-sdk/example/basic/index.ts | 165 ++++ .../pumpdotfun-sdk/example/basic/random.png | Bin 0 -> 20610 bytes .../pumpdotfun-sdk/example/events/index.ts | 44 + .../src/pumpdotfun-sdk/example/util.ts | 91 ++ .../src/pumpdotfun-sdk/src/IDL/index.ts | 2 + .../src/pumpdotfun-sdk/src/IDL/pump-fun.json | 925 ++++++++++++++++++ .../src/pumpdotfun-sdk/src/IDL/pump-fun.ts | 865 ++++++++++++++++ .../src/pumpdotfun-sdk/src/amm.ts | 88 ++ .../pumpdotfun-sdk/src/bondingCurveAccount.ts | 134 +++ .../src/pumpdotfun-sdk/src/events.ts | 53 + .../src/pumpdotfun-sdk/src/globalAccount.ts | 77 ++ .../src/pumpdotfun-sdk/src/index.ts | 7 + .../src/pumpdotfun-sdk/src/pumpfun.ts | 459 +++++++++ .../src/pumpdotfun-sdk/src/types.ts | 80 ++ .../src/pumpdotfun-sdk/src/util.ts | 131 +++ .../src/streaming/grpc-requests-type.ts | 121 +++ .../grpc-pf-sniper/src/streaming/pump.fun.ts | 130 +++ .../src/streaming/snipe-create.ts | 75 ++ .../grpc-pf-sniper/src/streaming/utils.ts | 65 ++ .../grpc-pf-sniper/src/transaction/index.ts | 1 + .../src/transaction/transaction.ts | 350 +++++++ .../grpc-pf-sniper/src/utils/index.ts | 2 + .../grpc-pf-sniper/src/utils/logger.ts | 17 + .../grpc-pf-sniper/src/utils/utils.ts | 70 ++ src/helpers/.env.copy | 20 +- src/helpers/index.ts | 4 +- src/helpers/logger.ts | 17 + src/helpers/util.ts | 10 - src/helpers/utils.ts | 115 +++ src/utils/index.ts | 2 + tsconfig.json | 1 + 64 files changed, 5542 insertions(+), 13 deletions(-) delete mode 100644 src/Memecoin_dev/sniping_dev/index.ts rename src/Trading_dev/{copy_trading => copy-bot}/bought-tokens.json (100%) rename src/Trading_dev/{copy_trading => copy-bot}/copy-buy.ts (100%) rename src/Trading_dev/{copy_trading => copy-bot}/copy-sell.ts (100%) rename src/Trading_dev/{copy_trading => copy-bot}/copy-trade.ts (100%) create mode 100644 src/Trading_dev/grpc-copy-bot/README.md create mode 100644 src/Trading_dev/grpc-copy-bot/command.sh create mode 100644 src/Trading_dev/grpc-copy-bot/main.ts create mode 100644 src/Trading_dev/grpc-copy-bot/src/.DS_Store create mode 100644 src/Trading_dev/grpc-copy-bot/src/constants/constants.ts create mode 100644 src/Trading_dev/grpc-copy-bot/src/constants/index.ts create mode 100644 src/Trading_dev/grpc-copy-bot/src/jito/bundle.ts create mode 100644 src/Trading_dev/grpc-copy-bot/src/jito/index.ts create mode 100644 src/Trading_dev/grpc-copy-bot/src/raydium/buy-helper.ts create mode 100644 src/Trading_dev/grpc-copy-bot/src/raydium/formatAmmKeys.ts create mode 100644 src/Trading_dev/grpc-copy-bot/src/raydium/index.ts create mode 100644 src/Trading_dev/grpc-copy-bot/src/raydium/sell-helper.ts create mode 100644 src/Trading_dev/grpc-copy-bot/src/raydium/swap.ts create mode 100644 src/Trading_dev/grpc-copy-bot/src/raydium/utils.ts create mode 100644 src/Trading_dev/grpc-copy-bot/src/streaming/copy-trade.ts create mode 100644 src/Trading_dev/grpc-copy-bot/src/streaming/grpc-requests-type.ts create mode 100644 src/Trading_dev/grpc-copy-bot/src/streaming/stream-trader.ts create mode 100644 src/Trading_dev/grpc-copy-bot/src/streaming/utils.ts create mode 100644 src/Trading_dev/grpc-copy-bot/src/transaction/transaction.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/.DS_Store create mode 100644 src/Trading_dev/grpc-pf-sniper/README.md create mode 100644 src/Trading_dev/grpc-pf-sniper/src/.DS_Store create mode 100644 src/Trading_dev/grpc-pf-sniper/src/constants/constants.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/constants/index.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/jito/bundle.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/jito/index.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/index.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/random.png create mode 100644 src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/events/index.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/util.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/index.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.json create mode 100644 src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/amm.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/bondingCurveAccount.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/events.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/globalAccount.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/index.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/pumpfun.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/types.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/util.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/streaming/grpc-requests-type.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/streaming/pump.fun.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/streaming/snipe-create.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/streaming/utils.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/transaction/index.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/transaction/transaction.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/utils/index.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/utils/logger.ts create mode 100644 src/Trading_dev/grpc-pf-sniper/src/utils/utils.ts create mode 100644 src/helpers/logger.ts create mode 100644 src/helpers/utils.ts create mode 100644 src/utils/index.ts diff --git a/package-lock.json b/package-lock.json index 017fb2b..7fa840f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "@rollup/plugin-json": "^6.1.0", "@solana/spl-token": "^0.4.0", "@solana/web3.js": "^1.89.1", + "@triton-one/yellowstone-grpc": "^0.4.0", "axios": "^1.6.8", "bigint-buffer": "^1.1.5", "bip39": "^3.1.0", @@ -42,6 +43,7 @@ "dotenv": "^16.4.5", "graphql-request": "^4.0.0", "i": "^0.3.7", + "jito-ts": "^4.0.0", "npm": "^10.5.2", "pino": "^8.18.0", "pino-pretty": "^10.3.1", @@ -4849,6 +4851,15 @@ "node": ">=10" } }, + "node_modules/@triton-one/yellowstone-grpc": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@triton-one/yellowstone-grpc/-/yellowstone-grpc-0.4.0.tgz", + "integrity": "sha512-YJaX+ByPtN6aG4HiKfd62Yd5NUZIiEMoBmSfxdRLBEgT3J9WWqoCRqVTzS93sWpP7IJ5pkGBfxMpDlugM8zn3g==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.8.0" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", @@ -4879,6 +4890,25 @@ "integrity": "sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==", "license": "MIT" }, + "node_modules/@types/bs58": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/bs58/-/bs58-4.0.4.tgz", + "integrity": "sha512-0IEpMFXXQi2zXaXl9GJ3sRwQo0uEkD+yFOv+FnAU5lkPtcu6h61xb7jc2CFPEZ5BUOaiP13ThuGc9HD4R8lR5g==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "base-x": "^3.0.6" + } + }, + "node_modules/@types/bs58/node_modules/base-x": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/@types/cacheable-request": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", @@ -8680,6 +8710,124 @@ } } }, + "node_modules/jito-ts": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jito-ts/-/jito-ts-4.1.1.tgz", + "integrity": "sha512-5a/z7AvtitpExcyxYh1RhPoWRfCA4IPopE5hM5Cxw7/zHnV+VBNZL0m4t3fjfPgMnmPkeoTx2xTw+mSD4PDG7w==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.8.13", + "@noble/ed25519": "^1.7.1", + "@solana/web3.js": "~1.77.3", + "@types/bs58": "^4.0.4", + "agentkeepalive": "^4.3.0", + "bs58": "^6.0.0", + "dotenv": "^16.0.3", + "jayson": "^4.0.0", + "node-fetch": "^2.6.7", + "superstruct": "^1.0.3" + } + }, + "node_modules/jito-ts/node_modules/@solana/web3.js": { + "version": "1.77.4", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.77.4.tgz", + "integrity": "sha512-XdN0Lh4jdY7J8FYMyucxCwzn6Ga2Sr1DHDWRbqVzk7ZPmmpSPOVWHzO67X1cVT+jNi1D6gZi2tgjHgDPuj6e9Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@noble/curves": "^1.0.0", + "@noble/hashes": "^1.3.0", + "@solana/buffer-layout": "^4.0.0", + "agentkeepalive": "^4.2.1", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.0.0", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.0", + "node-fetch": "^2.6.7", + "rpc-websockets": "^7.5.1", + "superstruct": "^0.14.2" + } + }, + "node_modules/jito-ts/node_modules/@solana/web3.js/node_modules/base-x": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jito-ts/node_modules/@solana/web3.js/node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/jito-ts/node_modules/@solana/web3.js/node_modules/superstruct": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==", + "license": "MIT" + }, + "node_modules/jito-ts/node_modules/base-x": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.0.tgz", + "integrity": "sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==", + "license": "MIT" + }, + "node_modules/jito-ts/node_modules/borsh": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", + "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", + "license": "Apache-2.0", + "dependencies": { + "bn.js": "^5.2.0", + "bs58": "^4.0.0", + "text-encoding-utf-8": "^1.0.2" + } + }, + "node_modules/jito-ts/node_modules/borsh/node_modules/base-x": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jito-ts/node_modules/borsh/node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/jito-ts/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, + "node_modules/jito-ts/node_modules/superstruct": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", + "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/joi": { "version": "17.13.3", "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", diff --git a/package.json b/package.json index 38223a1..2897a6f 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,9 @@ "pino-std-serializers": "^6.2.2", "pumpdotfun-sdk": "^1.3.2", "random-js": "^2.1.0", - "rpc-websockets": "7.10.0" + "rpc-websockets": "7.10.0", + "@triton-one/yellowstone-grpc": "^0.4.0", + "jito-ts": "^4.0.0" }, "devDependencies": { "typescript": "^5.5.4" diff --git a/src/Memecoin_dev/sniping_dev/index.ts b/src/Memecoin_dev/sniping_dev/index.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/Trading_dev/copy_trading/bought-tokens.json b/src/Trading_dev/copy-bot/bought-tokens.json similarity index 100% rename from src/Trading_dev/copy_trading/bought-tokens.json rename to src/Trading_dev/copy-bot/bought-tokens.json diff --git a/src/Trading_dev/copy_trading/copy-buy.ts b/src/Trading_dev/copy-bot/copy-buy.ts similarity index 100% rename from src/Trading_dev/copy_trading/copy-buy.ts rename to src/Trading_dev/copy-bot/copy-buy.ts diff --git a/src/Trading_dev/copy_trading/copy-sell.ts b/src/Trading_dev/copy-bot/copy-sell.ts similarity index 100% rename from src/Trading_dev/copy_trading/copy-sell.ts rename to src/Trading_dev/copy-bot/copy-sell.ts diff --git a/src/Trading_dev/copy_trading/copy-trade.ts b/src/Trading_dev/copy-bot/copy-trade.ts similarity index 100% rename from src/Trading_dev/copy_trading/copy-trade.ts rename to src/Trading_dev/copy-bot/copy-trade.ts diff --git a/src/Trading_dev/grpc-copy-bot/README.md b/src/Trading_dev/grpc-copy-bot/README.md new file mode 100644 index 0000000..5ec58e3 --- /dev/null +++ b/src/Trading_dev/grpc-copy-bot/README.md @@ -0,0 +1,8 @@ +# Implementation Details +- grpc copy bot to support any trades on raydium. +- expected latency would be in 1-3 block = (0.4 - 1.2s). +- expected slippage would be in 3-5% range. +- jito tips is decided by the user, to send to the closet jito block engine. +- Our buy/sell amount depends on the trader +- our buy amount using SOL = (-(trader's new sol balance - trader's old sol balance) / trader's old sol price) * our current sol balance +- our sell amount of the token = (-(trader's new token balance - trader's old token balance) / trader's old token price) * our current token balance diff --git a/src/Trading_dev/grpc-copy-bot/command.sh b/src/Trading_dev/grpc-copy-bot/command.sh new file mode 100644 index 0000000..276895c --- /dev/null +++ b/src/Trading_dev/grpc-copy-bot/command.sh @@ -0,0 +1 @@ +ts-node /Users/{your_path_to_this_dir}/src/stream/copy-trade.ts --trader your_target_trader_address diff --git a/src/Trading_dev/grpc-copy-bot/main.ts b/src/Trading_dev/grpc-copy-bot/main.ts new file mode 100644 index 0000000..d5d79d7 --- /dev/null +++ b/src/Trading_dev/grpc-copy-bot/main.ts @@ -0,0 +1,24 @@ +import { spawn } from 'child_process'; +import path from 'path'; + +const scriptPath = path.join(__dirname, 'command.sh'); + +function runScript() { + const child = spawn('sh', [scriptPath], { + stdio: 'inherit', + shell: true, + }); + + child.on('close', (code) => { + console.log(`child process exited with code ${code}`); + console.error('copy-trade.ts script closed or encountered an error, restarting...'); + runScript(); + + }); + + child.on('error', (err) => { + console.error('Error running script.sh:', err); + runScript(); + }); +} +runScript(); \ No newline at end of file diff --git a/src/Trading_dev/grpc-copy-bot/src/.DS_Store b/src/Trading_dev/grpc-copy-bot/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 +): SearcherServiceClient => { + const client: SearcherServiceClient = new SearcherServiceClient( + url, + ChannelCredentials.createSsl(), + { ...grpcOptions } + ); + + return client; +}; + +// Get Tip Accounts + +let tipAccounts: string[] = []; +(async () => { + try { + tipAccounts = await c.getTipAccounts(); + // console.log('Result:', tipAccounts); + } catch (error) { + console.error("Error:", error); + } +})(); + +export async function sendBundle( + latestBlockhash: string, + transaction: VersionedTransaction, + poolId: PublicKey, + masterKeypair: Keypair +) { + try { + const _tipAccount = tipAccounts[Math.floor(Math.random() * 6)]; + const tipAccount = new PublicKey(_tipAccount); + const b = new Bundle([transaction], 4); + const jito_tips = parseFloat(JITO_TIPS); + b.addTipTx( + masterKeypair, + jito_tips * LAMPORTS_PER_SOL, // Adjust Jito tip amount here + tipAccount, + latestBlockhash + ); + logger.info(`Sending bundle`); + const bundleResult = await c.sendBundle(b); + logger.info(`Sent trade tx to jito!`); + logger.info({ + dexscreener: `https://dexscreener.com/solana/${poolId.toBase58()}?maker=${masterKeypair.publicKey.toBase58()}`, + }); + } catch (error) { + logger.error(error); + } +} + +// Get leader schedule + +// This was when I was experimenting with only sending the buy tx when a Jito leader was up or going to be up in the next slot so that I wouldn't +// have to wait multiple slots for the tx to be processed. I ended up not using this feature as it couldn't get it working correctly before I moved on. + +export async function storeJitoLeaderSchedule() { + const cs = searcherClientAdv(blockEngineUrl, undefined); + + const leaderSchedule = new Set(); + + cs.getConnectedLeadersRegioned( + { regions: ["tokyo", "amsterdam", "ny", "frankfurt"] }, + (error, response) => { + for (let key in response) { + if (key === "connectedValidators") { + let validators = response[key]; + for (let validatorKey in validators) { + // Each validator object + let validator = validators[validatorKey]; + // Assuming `slots` is an array inside each validator object + Object.keys(validator.connectedValidators).forEach( + (key: string) => { + const slotsArray: number[][] = Object.values( + validator.connectedValidators[key] + ); // Assume SlotList is an array of arrays + const flattenedSlotsArray: number[] = slotsArray.flat(); // Flatten the array + flattenedSlotsArray.forEach((slot: number) => { + leaderSchedule.add(slot); + }); + } + ); + } + } + } + + //console.log(leaderSchedule); + } + ); + + return leaderSchedule; +} diff --git a/src/Trading_dev/grpc-copy-bot/src/jito/index.ts b/src/Trading_dev/grpc-copy-bot/src/jito/index.ts new file mode 100644 index 0000000..cf76714 --- /dev/null +++ b/src/Trading_dev/grpc-copy-bot/src/jito/index.ts @@ -0,0 +1 @@ +export * from "./bundle"; \ No newline at end of file diff --git a/src/Trading_dev/grpc-copy-bot/src/raydium/buy-helper.ts b/src/Trading_dev/grpc-copy-bot/src/raydium/buy-helper.ts new file mode 100644 index 0000000..2e206f8 --- /dev/null +++ b/src/Trading_dev/grpc-copy-bot/src/raydium/buy-helper.ts @@ -0,0 +1,10 @@ +import { Keypair } from "@solana/web3.js"; +import {swap} from "./swap"; +import {connection} from "../constants" +import { VersionedTransaction } from "@solana/web3.js"; + + +export async function buy(side = "buy", address: string, no_of_sol: number, payer: Keypair): Promise { + return await swap(side, address, no_of_sol, -1, payer, "trade", connection); +} + \ No newline at end of file diff --git a/src/Trading_dev/grpc-copy-bot/src/raydium/formatAmmKeys.ts b/src/Trading_dev/grpc-copy-bot/src/raydium/formatAmmKeys.ts new file mode 100644 index 0000000..330ef1a --- /dev/null +++ b/src/Trading_dev/grpc-copy-bot/src/raydium/formatAmmKeys.ts @@ -0,0 +1,82 @@ +import { + LIQUIDITY_STATE_LAYOUT_V4, + MARKET_STATE_LAYOUT_V3, + SPL_MINT_LAYOUT, + Liquidity, + Market, + MAINNET_PROGRAM_ID, + LiquidityStateV4, + publicKey, + struct, + } from "@raydium-io/raydium-sdk"; + import { PublicKey } from "@solana/web3.js"; + const MINIMAL_MARKET_STATE_LAYOUT_V3 = struct([ + publicKey("eventQueue"), + publicKey("bids"), + publicKey("asks"), + ]); + import { connection } from "../constants"; + + // Promise + /** + * Formats AMM keys by ID. + * @param {string} id - The ID of the AMM. + * @returns {Object} - The formatted AMM keys. + * @throws {Error} - If there is an error retrieving the account information. + */ +export async function formatAmmKeysById_swap(id: PublicKey):Promise { + const account = await connection.getAccountInfo(id); + if (account === null) throw Error(" get id info error "); + const info = LIQUIDITY_STATE_LAYOUT_V4.decode(account.data); + + const marketId = info.marketId; + const marketAccount_minimal = await connection.getAccountInfo(marketId, { + commitment: "processed", + dataSlice: { + offset: MARKET_STATE_LAYOUT_V3.offsetOf("eventQueue"), + length: 32 * 3, + }, + }); + const marketAccount = await connection.getAccountInfo(marketId); + if (marketAccount === null || marketAccount_minimal === null) + throw Error(" get market info error"); + const marketInfo_minimal = MINIMAL_MARKET_STATE_LAYOUT_V3.decode( + marketAccount_minimal.data + ); + const marketInfo = MARKET_STATE_LAYOUT_V3.decode(marketAccount.data); + + return { + id, + baseMint: info.baseMint, + quoteMint: info.quoteMint, + lpMint: info.lpMint, + baseDecimals: info.baseDecimal.toNumber(), + quoteDecimals: info.quoteDecimal.toNumber(), + lpDecimals: 5, + version: 4, + programId: MAINNET_PROGRAM_ID.AmmV4, + authority: Liquidity.getAssociatedAuthority({ + programId: MAINNET_PROGRAM_ID.AmmV4, + }).publicKey, + openOrders: info.openOrders, + targetOrders: info.targetOrders, + baseVault: info.baseVault, + quoteVault: info.quoteVault, + marketVersion: 3, + marketProgramId: info.marketProgramId, + marketId: info.marketId, + marketAuthority: Market.getAssociatedAuthority({ + programId: info.marketProgramId, + marketId: info.marketId, + }).publicKey, + marketBaseVault: marketInfo.baseVault, + marketQuoteVault: marketInfo.quoteVault, + marketBids: marketInfo_minimal.bids, + marketAsks: marketInfo_minimal.asks, + marketEventQueue: marketInfo_minimal.eventQueue, + withdrawQueue: info.withdrawQueue, + lpVault: info.lpVault, + lookupTableAccount: PublicKey.default, + }; + } + \ No newline at end of file diff --git a/src/Trading_dev/grpc-copy-bot/src/raydium/index.ts b/src/Trading_dev/grpc-copy-bot/src/raydium/index.ts new file mode 100644 index 0000000..09eb9b9 --- /dev/null +++ b/src/Trading_dev/grpc-copy-bot/src/raydium/index.ts @@ -0,0 +1,5 @@ +export * from "./utils"; +export * from "./buy-helper"; +export * from "./sell-helper"; +export * from "./swap"; +export * from "./formatAmmKeys"; \ No newline at end of file diff --git a/src/Trading_dev/grpc-copy-bot/src/raydium/sell-helper.ts b/src/Trading_dev/grpc-copy-bot/src/raydium/sell-helper.ts new file mode 100644 index 0000000..c52690c --- /dev/null +++ b/src/Trading_dev/grpc-copy-bot/src/raydium/sell-helper.ts @@ -0,0 +1,9 @@ +import { Keypair } from "@solana/web3.js"; +import {swap} from "./swap"; +import {connection} from "../constants" +import { VersionedTransaction } from "@solana/web3.js"; + + +export async function sell(side = "sell", address: string, sell_percentage: number, payer: Keypair): Promise { + return await swap(side, address, -1, sell_percentage, payer, "trade", connection); +} diff --git a/src/Trading_dev/grpc-copy-bot/src/raydium/swap.ts b/src/Trading_dev/grpc-copy-bot/src/raydium/swap.ts new file mode 100644 index 0000000..24d00cf --- /dev/null +++ b/src/Trading_dev/grpc-copy-bot/src/raydium/swap.ts @@ -0,0 +1,252 @@ +import { + Liquidity, + Percent, + Token, + TOKEN_PROGRAM_ID, + TokenAmount, +} from "@raydium-io/raydium-sdk"; +import { + PublicKey, + TransactionMessage, + ComputeBudgetProgram, + VersionedTransaction, +} from "@solana/web3.js"; +import { Decimal } from "decimal.js"; +import { BN } from "@project-serum/anchor"; +import { getSPLBalance, getDecimals } from "../../../../helpers/utils"; +import { DEFAULT_TOKEN } from "../constants"; +import { fetchAMMPoolId } from "./utils"; +import { + getAssociatedTokenAddress, + getAssociatedTokenAddressSync, + createAssociatedTokenAccountIdempotentInstruction, + createCloseAccountInstruction, +} from "@solana/spl-token"; +import { formatAmmKeysById_swap } from "./formatAmmKeys"; +import { Keypair } from "@solana/web3.js"; +import { Connection } from "@solana/web3.js"; + +let tokenToPoolId:any = {}; +let walletPublicKeyToWSOLAta:any = {}; +let walletPublicKeyToTokenAta:any = {}; +let tokenToDecimal:any = {}; +/** + * Performs a swap operation using an Automated Market Maker (AMM) pool in Raydium. + * @param {Object} input - The input parameters for the swap operation. + * @returns {Object} - The transaction IDs of the executed swap operation. + */ +async function swapOnlyAmm(input: any): Promise { + // -------- pre-action: get pool info --------\ + const poolKeys = await formatAmmKeysById_swap( + new PublicKey(input.targetPool) + ); + const poolInfo = await Liquidity.fetchInfo({ + connection: input.connection_obj, + poolKeys: poolKeys, + }); + // -------- step 1: coumpute amount out -------- + const { amountOut, minAmountOut } = Liquidity.computeAmountOut({ + poolKeys: poolKeys, + poolInfo: poolInfo, + amountIn: input.inputTokenAmount, + currencyOut: input.outputToken, + slippage: input.slippage, + }); + // -------- step 2: create instructions by SDK function -------- + const { innerTransaction } = await Liquidity.makeSwapFixedInInstruction( + { + poolKeys: poolKeys, + userKeys: { + tokenAccountIn: input.ataIn, + tokenAccountOut: input.ataOut, + owner: input.master_wallet.publicKey, + }, + amountIn: input.inputTokenAmount.raw, + minAmountOut: minAmountOut.raw, + }, + poolKeys.version + ); + + let latestBlockhash = await input.connection_obj.getLatestBlockhash(); + const messageV0 = new TransactionMessage({ + payerKey: input.master_wallet.publicKey, + recentBlockhash: latestBlockhash.blockhash, + instructions: [ + ...[ + ComputeBudgetProgram.setComputeUnitLimit({ + units: 70000, + }), + ], + ...(input.side === "buy" + ? [ + createAssociatedTokenAccountIdempotentInstruction( + input.master_wallet.publicKey, + input.ataOut, + input.master_wallet.publicKey, + input.outputToken.mint + ), + ] + : []), + ...innerTransaction.instructions, + ], + }).compileToV0Message(); + + const transaction = new VersionedTransaction(messageV0); + transaction.sign([input.master_wallet, ...innerTransaction.signers]); + return transaction; +} + +/** + * Performs a swap operation. + * + * @param {string} side - The side of the swap operation ("buy" or "sell"). + * @param {string} tokenAddr - The address of the token involved in the swap. + * @param {number} buy_AmountOfSol - The amount of SOL to buy (only applicable for "buy" side). + * @param {number} sell_PercentageOfToken - The percentage of the token to sell (only applicable for "sell" side). + * @param {object} payer_wallet - The payer's wallet object. + * @param {string} usage - The usage of the swap operation. + * @param {object} connection_obj - The connection object. + * @returns {Promise} - A promise that resolves when the swap operation is completed. + */ +export async function swap( + side: string, + tokenAddr: string, + buy_AmountOfSol: number, + sell_PercentageOfToken: number, + payer_wallet: Keypair, + usage: string, + connection_obj: Connection +): Promise { + const tokenAddress: string = tokenAddr; + const tokenAccount: PublicKey = new PublicKey(tokenAddress); + let mintAta: any = null, + quoteAta: any = null, + targetPool: string = ""; + + // to avoid creating associated token account multiple times + if (!(payer_wallet.publicKey.toBase58() in walletPublicKeyToTokenAta)) { + walletPublicKeyToTokenAta[payer_wallet.publicKey.toBase58()] = {}; + walletPublicKeyToTokenAta[payer_wallet.publicKey.toBase58()][tokenAddress] = + await getAssociatedTokenAddress(tokenAccount, payer_wallet.publicKey); + mintAta = + walletPublicKeyToTokenAta[payer_wallet.publicKey.toBase58()][ + tokenAddress + ]; + } else { + if ( + !( + tokenAddress in + walletPublicKeyToTokenAta[payer_wallet.publicKey.toBase58()] + ) + ) { + walletPublicKeyToTokenAta[payer_wallet.publicKey.toBase58()][ + tokenAddress + ] = await getAssociatedTokenAddress(tokenAccount, payer_wallet.publicKey); + } + mintAta = + walletPublicKeyToTokenAta[payer_wallet.publicKey.toBase58()][ + tokenAddress + ]; + } + // to avoid creating associated WSOL account multiple times + if (!(payer_wallet.publicKey.toBase58() in walletPublicKeyToWSOLAta)) { + quoteAta = await getAssociatedTokenAddressSync( + Token.WSOL.mint, + payer_wallet.publicKey + ); + walletPublicKeyToWSOLAta[payer_wallet.publicKey.toBase58()] = quoteAta; + } else { + quoteAta = walletPublicKeyToWSOLAta[payer_wallet.publicKey.toBase58()]; + } + // to avoid getting the same pool id multiple times + if (!(tokenAddress in tokenToPoolId)) { + targetPool = await fetchAMMPoolId(tokenAddress); + tokenToPoolId[tokenAddress] = targetPool; + } else { + targetPool = tokenToPoolId[tokenAddress]; + } + // to avoid getting the same decimal multiple times + if (!(tokenAddress in tokenToDecimal)) { + tokenToDecimal[tokenAddress] = await getDecimals(tokenAccount); + } + if (side === "buy") { + // buy - use sol to swap to the token + //const { tokenName, tokenSymbol } = await getTokenMetadata(tokenAddress); + const outputToken = new Token( + TOKEN_PROGRAM_ID, + tokenAccount, + tokenToDecimal[tokenAddress] + ); + const inputToken = DEFAULT_TOKEN.WSOL; // SOL + if (targetPool === null) { + console.log( + "Pool not found or raydium is not supported for this token. Exiting..." + ); + return Object.create(null); + } + const amountOfSol = new Decimal(buy_AmountOfSol); + const inputTokenAmount = new TokenAmount( + inputToken, + new BN(amountOfSol.mul(10 ** inputToken.decimals).toFixed(0)) + ); + const slippage = new Percent(3, 100); + const input = { + outputToken, + targetPool, + inputTokenAmount, + slippage, + ataIn: quoteAta, + ataOut: mintAta, + side, + usage, + connection_obj: connection_obj, + master_wallet: payer_wallet, + }; + + return { pool: new PublicKey(targetPool), txn: await swapOnlyAmm(input) }; + } else { + // sell + const inputToken = new Token( + TOKEN_PROGRAM_ID, + tokenAccount, + tokenToDecimal[tokenAddress], + "", + "" + ); + const outputToken = DEFAULT_TOKEN.WSOL; // WSOL + + if (targetPool === null) { + console.log( + "Pool not found or raydium is not supported for this token. Exiting..." + ); + return Object.create(null); + } + const balnaceOfToken = await getSPLBalance( + connection_obj, + new PublicKey(tokenAddress), + payer_wallet.publicKey + ); + const percentage = sell_PercentageOfToken; + const amount = new Decimal(percentage * balnaceOfToken); + const slippage = new Percent(5, 100); + const inputTokenAmount = new TokenAmount( + inputToken, + new BN(amount.mul(10 ** inputToken.decimals).toFixed(0)) + ); + const input = { + outputToken, + sell_PercentageOfToken, + targetPool, + inputTokenAmount, + slippage, + ataIn: mintAta, + ataOut: quoteAta, + side, + usage, + tokenAddress: tokenAddress, + connection_obj: connection_obj, + master_wallet: payer_wallet, + }; + return { pool: new PublicKey(targetPool), txn: await swapOnlyAmm(input) }; + } +} diff --git a/src/Trading_dev/grpc-copy-bot/src/raydium/utils.ts b/src/Trading_dev/grpc-copy-bot/src/raydium/utils.ts new file mode 100644 index 0000000..dac1445 --- /dev/null +++ b/src/Trading_dev/grpc-copy-bot/src/raydium/utils.ts @@ -0,0 +1,43 @@ +import { Raydium } from "@raydium-io/raydium-sdk-v2"; +import { connection, wallet, wsol } from "../constants"; +import { formatAmmKeysById_swap } from "./formatAmmKeys"; +import { PublicKey } from "@solana/web3.js"; +import { logger } from "../../../../utils"; + +export const initSdk = async () => { + const raydium = await Raydium.load({ + owner: wallet, + connection: connection, + cluster: "mainnet", + disableFeatureCheck: true, + disableLoadToken: false, + blockhashCommitment: "processed", + }); + return raydium; +}; + +export async function fetchAMMPoolId(tokenAddress: string): Promise { + const raydium = await initSdk(); + const data = await raydium.api.fetchPoolByMints({ + mint1: wsol, + mint2: tokenAddress, + }); + const listOfPools = data.data; + for (const obj of listOfPools) { + if (obj.type === "Standard") { + // return the first AMM pool ID + console.log("AMM Pool ID: ", obj.id); + return obj.id; + } + } + logger.error("No AMM pool ID found for the given token address"); + return ""; // return empty string if no AMM pool ID is found +} +// async function main() { +// const tokenAddress = "3B5wuUrMEi5yATD7on46hKfej3pfmd7t1RKgrsN3pump"; // billy +// const poolId = await fetchAMMPoolId(tokenAddress); +// console.log(await formatAmmKeysById_swap(new PublicKey(poolId))); + +// } + +// main(); diff --git a/src/Trading_dev/grpc-copy-bot/src/streaming/copy-trade.ts b/src/Trading_dev/grpc-copy-bot/src/streaming/copy-trade.ts new file mode 100644 index 0000000..647a03d --- /dev/null +++ b/src/Trading_dev/grpc-copy-bot/src/streaming/copy-trade.ts @@ -0,0 +1,44 @@ +import { streamTargetTrader } from "./stream-trader"; +import { init } from "../transaction/transaction"; +import { logger } from "../../../../helpers/logger"; +import { fork } from "child_process"; +import bs58 from "bs58"; +import path from "path"; +export const stream_trader_path = path.join(__dirname, "stream-trader.ts"); +import { program } from "commander"; +let targetTraderToCopy: string = ""; + +program + .option("--trader ", "Specify the trader you want to copy") + .option("-h, --help", "display help for command") + .action((options: any) => { + if (options.help) { + logger.info("ts-node copy-trade.ts --trader "); + process.exit(0); + } + if (options.trader) { + targetTraderToCopy = options.trader; + } + }); +program.parse(); + +async function snipe() { + // show the options + logger.info(`Trader: ${targetTraderToCopy}`); + // show the target token + logger.info(`bot will copy the trades from ${targetTraderToCopy}.`); + + // initialize the bot + await init(); + try { + // Start copy_buy in a separate process + await streamTargetTrader(targetTraderToCopy); + } catch (e) { + logger.error(`error when streaming ${e}`); + logger.info("Retrying in 1 second"); + await new Promise((resolve) => setTimeout(resolve, 1000)); + await snipe(); + } +} + +snipe(); diff --git a/src/Trading_dev/grpc-copy-bot/src/streaming/grpc-requests-type.ts b/src/Trading_dev/grpc-copy-bot/src/streaming/grpc-requests-type.ts new file mode 100644 index 0000000..703b30d --- /dev/null +++ b/src/Trading_dev/grpc-copy-bot/src/streaming/grpc-requests-type.ts @@ -0,0 +1,46 @@ +import { + CommitmentLevel, + SubscribeRequest, + } from "@triton-one/yellowstone-grpc"; +import { req } from "pino-std-serializers"; +const RaydiumProgram = "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8" +const RaydiumRoute = "routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS" +const RaydiumCAMM = "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK" +const tokenAccountProgram = "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" +export async function createSubscribeTraderRequest(traderAddress: string) { + let request: any = null; + request = { + slots: {}, + accounts: {}, + transactions: { + pumpdotfun: { + vote: false, + failed: false, + signature: undefined, + accountInclude: [traderAddress], + accountExclude: [], + accountRequired: [traderAddress], + }, + }, + transactionsStatus: {}, + blocks: {}, + blocksMeta: {}, + accountsDataSlice: [], + commitment: CommitmentLevel.PROCESSED, // Subscribe to processed blocks for the fastest updates + entry: {}, + }; + return request; +} +export async function createClearAllSubscriptionsRequest() { + const request = { + "slots": {}, + "accounts": {}, + "transactions": {}, + "blocks": {}, + "blocksMeta": {}, + "accountsDataSlice": [] + }; + return request; +} + + diff --git a/src/Trading_dev/grpc-copy-bot/src/streaming/stream-trader.ts b/src/Trading_dev/grpc-copy-bot/src/streaming/stream-trader.ts new file mode 100644 index 0000000..10f2997 --- /dev/null +++ b/src/Trading_dev/grpc-copy-bot/src/streaming/stream-trader.ts @@ -0,0 +1,243 @@ +import pino from "pino"; +import Client from "@triton-one/yellowstone-grpc"; +import { PublicKey } from "@solana/web3.js"; +import { storeJitoLeaderSchedule, sendBundle } from "../jito/bundle"; +import bs58 from "bs58"; +import { + createClearAllSubscriptionsRequest, + createSubscribeTraderRequest, +} from "./grpc-requests-type"; +import { handleSubscribe, wsol } from "./utils"; +import { getSPLBalance, retriveWalletState } from "../../../../utils"; +import { connection, quoteToken, wallet, GRPC_XTOKEN } from "../constants/constants"; +import { sell, buy } from "../raydium"; +let trader_balance_wallet:any = {}; +let targetTrader = ""; +const client = new Client( + "https://grpc.fra.shyft.to", + GRPC_XTOKEN, + { + "grpc.max_receive_message_length": 64 * 1024 * 1024, // 64MiB + } +); //grpc endpoint +const transport = pino.transport({ + target: "pino-pretty", +}); + +export const logger = pino( + { + level: "info", + serializers: { + error: pino.stdSerializers.err, + }, + base: undefined, + }, + transport +); +// Array to store Jito leaders for current epoch +let leaderSchedule = new Set(); +export async function populateJitoLeaderArray() { + leaderSchedule = await storeJitoLeaderSchedule(); +} + +(async () => { + const version = await client.getVersion(); // gets the version information + logger.info(version); +})(); + +export async function checkTraderBuyOrSell(data: any, traderAddress: string) { + const preTokenBalances = data.transaction.transaction.meta.preTokenBalances; + const postTokenBalances = data.transaction.transaction.meta.postTokenBalances; + const latestBlockhash = await connection.getLatestBlockhash("processed"); + let targetToken = ""; + // look for the token that the trader is buying or selling + for (let i = 0; i < preTokenBalances.length; i++) { + if ( + preTokenBalances[i].owner === traderAddress && + preTokenBalances[i].mint !== wsol + ) { + targetToken = preTokenBalances[i].mint; + break; + } + } + for (let i = 0; i < postTokenBalances.length; i++) { + if ( + postTokenBalances[i].owner === traderAddress && + postTokenBalances[i].mint !== wsol + ) { + targetToken = postTokenBalances[i].mint; + break; + } + } + if (targetToken === "") return; + const old_wallet_state = trader_balance_wallet; + trader_balance_wallet = await retriveWalletState(traderAddress); + console.log("Old wallet state: ", old_wallet_state); + console.log("New wallet state: ", trader_balance_wallet); + if (trader_balance_wallet[wsol] < old_wallet_state[wsol]) { + logger.info(`Trader is buying ${targetToken} using WSOL`); + let buy_percentage = Math.abs( + (trader_balance_wallet[wsol] - old_wallet_state[wsol]) / + old_wallet_state[wsol] + ); + console.log("Buy percentage: ", buy_percentage); + const ourWsolBalance = await getSPLBalance( + connection, + new PublicKey(wsol), + wallet.publicKey + ); + console.log(`We are using ${ourWsolBalance * buy_percentage} WSOL`); + const { pool, txn } = await buy( + "buy", + targetToken, + buy_percentage * ourWsolBalance, + wallet + ); + sendBundle(latestBlockhash.blockhash, txn, pool, wallet); + } else if (trader_balance_wallet[wsol] > old_wallet_state[wsol]) { + logger.info(`Trader is selling ${targetToken} for WSOL`); + let newBalanceOfToken = 0; + if (targetToken in trader_balance_wallet) + newBalanceOfToken = trader_balance_wallet[targetToken]; + let sell_percentage = Math.abs( + (newBalanceOfToken - old_wallet_state[targetToken]) / + old_wallet_state[targetToken] + ); + console.log("Sell percentage: ", sell_percentage); + const ourTokenBalance = await getSPLBalance( + connection, + new PublicKey(targetToken), + wallet.publicKey + ); + if (ourTokenBalance === 0) { + logger.info(`We don't have any ${targetToken} to sell`); + return; + } + const { pool, txn } = await sell( + "sell", + targetToken, + sell_percentage, + wallet + ); + sendBundle(latestBlockhash.blockhash, txn, pool, wallet); + // wait for 1 second and send again + await new Promise((resolve) => setTimeout(resolve, 1000)); + sendBundle(latestBlockhash.blockhash, txn, pool, wallet); + } else if (trader_balance_wallet["SOL"] < old_wallet_state["SOL"]) { + logger.info(`Trader is buying ${targetToken} using SOL`); + let buy_percentage = Math.abs( + (trader_balance_wallet["SOL"] - old_wallet_state["SOL"]) / + old_wallet_state["SOL"] + ); + console.log("Buy percentage: ", buy_percentage); + const ourWsolBalance = await getSPLBalance( + connection, + new PublicKey(wsol), + wallet.publicKey + ); + console.log(`We are using ${ourWsolBalance * buy_percentage} WSOL`); + const { pool, txn } = await buy( + "buy", + targetToken, + buy_percentage * ourWsolBalance, + wallet + ); + sendBundle(latestBlockhash.blockhash, txn, pool, wallet); + } else if (trader_balance_wallet["SOL"] > old_wallet_state["SOL"]) { + logger.info(`Trader is selling ${targetToken} for SOL`); + let newBalanceOfToken = 0; + if (targetToken in trader_balance_wallet) + newBalanceOfToken = trader_balance_wallet[targetToken]; + let sell_percentage = Math.abs( + (newBalanceOfToken - old_wallet_state[targetToken]) / + old_wallet_state[targetToken] + ); + console.log("Sell percentage: ", sell_percentage); + const ourTokenBalance = await getSPLBalance( + connection, + new PublicKey(targetToken), + wallet.publicKey + ); + if (ourTokenBalance === 0) { + logger.info(`We don't have any ${targetToken} to sell`); + return; + } + const { pool, txn } = await sell( + "sell", + targetToken, + sell_percentage, + wallet + ); + sendBundle(latestBlockhash.blockhash, txn, pool, wallet); + // wait for 1 second and send again + await new Promise((resolve) => setTimeout(resolve, 1000)); + sendBundle(latestBlockhash.blockhash, txn, pool, wallet); + } else { + // check if the trader is swapping tokens + let increasedToken = "", + decreasedToken = ""; + for (const mint in trader_balance_wallet) { + if (mint === wsol || mint === "SOL") { + continue; + } + if (increasedToken && decreasedToken) { + break; + } + const prevBalance = old_wallet_state[mint] || 0; + const currentBalance = trader_balance_wallet[mint]; + + if (currentBalance > prevBalance) { + increasedToken = mint; + } else if (currentBalance < prevBalance) { + decreasedToken = mint; + } + } + if (increasedToken && decreasedToken) { + logger.info(`Trader is swapping ${decreasedToken} for ${increasedToken}`); + let swap_percentage = Math.abs( + (trader_balance_wallet[decreasedToken] - + old_wallet_state[decreasedToken]) / + old_wallet_state[decreasedToken] + ); + console.log("Swap percentage: ", swap_percentage); + // we use wsol as the quote token to buy the increased token + const ourWsolBalance = await getSPLBalance( + connection, + new PublicKey(wsol), + wallet.publicKey + ); + const { pool, txn } = await buy( + "buy", + increasedToken, + swap_percentage * ourWsolBalance, + wallet + ); + sendBundle(latestBlockhash.blockhash, txn, pool, wallet); + } + } +} + +export async function streamTargetTrader(traderAddress: string) { + try { + console.log("Target trader: ", traderAddress); + trader_balance_wallet = await retriveWalletState(traderAddress); + console.log(trader_balance_wallet); + + const stream = await client.subscribe(); + // throw new Error("test"); // test if it restarts when error occurs + // process.exit(1); // test if it restart when process exit + // Create `error` / `end` handler + const r1 = await createSubscribeTraderRequest(traderAddress); + handleSubscribe(stream, r1); + stream.on("data", (data) => { + // receive an update when trader makes a transaction + if (data.transaction !== undefined) { + logger.info(`Current slot: ${data.transaction.slot}`); + checkTraderBuyOrSell(data, traderAddress); + } + }); + } catch (e) { + logger.error(e); + throw e; + } +} diff --git a/src/Trading_dev/grpc-copy-bot/src/streaming/utils.ts b/src/Trading_dev/grpc-copy-bot/src/streaming/utils.ts new file mode 100644 index 0000000..fe474f5 --- /dev/null +++ b/src/Trading_dev/grpc-copy-bot/src/streaming/utils.ts @@ -0,0 +1,73 @@ +import { + CommitmentLevel, + SubscribeRequest, +} from "@triton-one/yellowstone-grpc"; +import Client from "@triton-one/yellowstone-grpc"; +import { logger } from "../../../../utils"; +const PING_INTERVAL_MS = 100_000; +export const wsol = "So11111111111111111111111111111111111111112"; +export async function handleSubscribe( + client_stream: any, + args: SubscribeRequest +) { + try { + const streamClosed = new Promise((resolve, reject) => { + client_stream.on("error", (error:any) => { + console.log("ERROR", error); + reject(error); + client_stream.end(); + }); + client_stream.on("end", () => { + resolve(); + }); + client_stream.on("close", () => { + resolve(); + }); + }); + + // Send subscribe request + await new Promise((resolve, reject) => { + client_stream.write(args, (err: any) => { + if (err === null || err === undefined) { + resolve(); + } else { + reject(err); + } + }); + }).catch((reason) => { + console.error(reason); + throw reason; + }); + // Send pings every 5s to keep the connection open + const pingRequest: SubscribeRequest = { + ping: { id: 1 }, + // Required, but unused arguments + accounts: {}, + accountsDataSlice: [], + transactions: {}, + blocks: {}, + blocksMeta: {}, + entry: {}, + slots: {}, + }; + setInterval(async () => { + await new Promise((resolve, reject) => { + client_stream.write(pingRequest, (err:any) => { + if (err === null || err === undefined) { + resolve(); + } else { + reject(err); + } + }); + }).catch((reason) => { + console.error(reason); + throw reason; + }); + }, PING_INTERVAL_MS); + + await streamClosed; + } catch (e) { + logger.error(e); + throw e; + } +} diff --git a/src/Trading_dev/grpc-copy-bot/src/transaction/transaction.ts b/src/Trading_dev/grpc-copy-bot/src/transaction/transaction.ts new file mode 100644 index 0000000..58a7bc2 --- /dev/null +++ b/src/Trading_dev/grpc-copy-bot/src/transaction/transaction.ts @@ -0,0 +1,73 @@ +import { + Liquidity, + LiquidityPoolKeys, + LiquidityStateV4, + Token, + TokenAmount, +} from "@raydium-io/raydium-sdk"; +import { + Commitment, + ComputeBudgetProgram, + Connection, + Keypair, + LAMPORTS_PER_SOL, + PublicKey, + SystemProgram, + TransactionMessage, + VersionedTransaction, + Transaction, +} from "@solana/web3.js"; +import fs from "fs"; +import bs58 from "bs58"; +import { + COMMITMENT_LEVEL, + LOG_LEVEL, + PRIVATE_KEY, + RPC_ENDPOINT, + RPC_WEBSOCKET_ENDPOINT, +} from "../constants"; +import { + AccountLayout, + createAssociatedTokenAccountIdempotentInstruction, + createCloseAccountInstruction, + getAssociatedTokenAddress, + getAssociatedTokenAddressSync, + TOKEN_PROGRAM_ID, +} from "@solana/spl-token"; +import { TokenInstructions } from "@project-serum/serum"; +import { logger } from "../../../../helpers/logger"; +import { + retrieveEnvVariable, + getKeypairByJsonPath, + printSOLBalance, + getSPLBalance, +} from "../../../../utils"; +import { populateJitoLeaderArray } from "../streaming/stream-trader"; +import { sendBundle } from "../jito/bundle"; +import { AnchorProvider } from "@coral-xyz/anchor"; +import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet"; +let wallet: Keypair; +let quoteAmount: TokenAmount; +export const solanaConnection = new Connection(RPC_ENDPOINT, { + wsEndpoint: RPC_WEBSOCKET_ENDPOINT, +}); + +// Init funtions right here + +export async function init(): Promise { + logger.level = LOG_LEVEL; + + // get wallet + wallet = Keypair.fromSecretKey(bs58.decode(PRIVATE_KEY)); + logger.info(`Wallet Address: ${wallet.publicKey}`); + + logger.info(`Any Buys using WSOL`); + + // check existing wallet for associated token account of quote mint + const SOLBalance = await solanaConnection.getBalance(wallet.publicKey); + if (SOLBalance === 0) { + throw new Error(`No SOL balance left in wallet: ${wallet.publicKey}`); + } + + await populateJitoLeaderArray(); +} diff --git a/src/Trading_dev/grpc-pf-sniper/.DS_Store b/src/Trading_dev/grpc-pf-sniper/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f7f871ee1b890c429e32fc89b2d06c736539bb3c GIT binary patch literal 6148 zcmeHKF=_)r43uIQhBPiy?iccd#W*kU2SRK}bNIj}sjter@-)v#Dq@b1!lW@H(9W(_ zv&&9#I+>YoJ`T@jYcpHHiT1@|ZrrEO?4cq==NbFqZ5#(i7q#^#kh`$6oos(N|KvyL zb9Xup~XBM4gLye&NrNfc~CG!IR-{K h#)9SeDUvd;agP07I3)%h@t_0sGeBKrQsBQ8xB#VA7f=8I literal 0 HcmV?d00001 diff --git a/src/Trading_dev/grpc-pf-sniper/README.md b/src/Trading_dev/grpc-pf-sniper/README.md new file mode 100644 index 0000000..b339f8a --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/README.md @@ -0,0 +1,32 @@ +#*Geyser grpc Pump.fun Sniper Bot (Beta)* + +## How it works + +- It uses the geyser grpc plugin that subscribe all the latest slot that receive from the validators of your grpc endpoint. +- It basically only consider the slot or block in "processed" commitment level to make sure the request can land in the next block. +- Use a grpc subscription to subscribe the transactions that including the solana account of the Pump.fun Token Mint Authority and listen for the mint event (https://solscan.io/account/TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM). +- Once the mint event is detected, it will create a snipe transaction to snipe the token! + + +## Prerequisites + +- run `npm install` to install all the dependencies +- run `ts-node src/streaming/snipe-create.ts -h` to test the snipe-create command and see the available options +- to change the parameters, you can modify the .env file +- to have a try, run ```ts-node src/streaming/snipe-create.ts --auto-sell --jito --n 3``` + +## Code usage + +- constants/constants.ts: retriving the variable in .env + +- streaming/pump.fun.ts: subscribing any pump.fun create token's txns of newest block in processed level + +- src/jito/bundle.ts: sending the bundle with tips to jito + +- src/transaction/transaction.ts: main functions of createAndBuy, buy, and sell + +- src/pumpdotfun-sdk/*: constructing the proper instructions of create, buy, and sell + +- src/streaming/snipe-create.ts: a cli interface to interact the whole dir + +- src/streaming/grpc-requests-type.ts: different grpc request types for sniping on pump.fun \ No newline at end of file diff --git a/src/Trading_dev/grpc-pf-sniper/src/.DS_Store b/src/Trading_dev/grpc-pf-sniper/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2ae1ed0658030460ce027df235408fed0967e671 GIT binary patch literal 6148 zcmeHKJ5Iw;5S)b+k!V~}z6+$t4Xh}fAQyzJSCug$op%fv@rFm7@G`5uoN#W3S2CU%zw=i( za{q)C*2D4Pa6gWR%U38X1*Cu!kOERb3j9I=@4d9;O`@U{kOETRO9B5rG`eG7I3>oX zgCRx$;)3Zgu49%UHct@y!YPp%nkAK(RI3rglFodqy1sBqOggNF5346zO(+&m=lw0p zVSS>a6p#Yv3S8&5^ZtKF|6%?=Cut`Iq`<#Yz!uxxcEeYy-a30Z@3oD-r+du@-Hq#@ nFhn~hMmy%l+wpA_WnJ?%&-=nDG3d+(ov5Dy*F`1;{#t=gtu7az literal 0 HcmV?d00001 diff --git a/src/Trading_dev/grpc-pf-sniper/src/constants/constants.ts b/src/Trading_dev/grpc-pf-sniper/src/constants/constants.ts new file mode 100644 index 0000000..acf7600 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/constants/constants.ts @@ -0,0 +1,19 @@ +import { logger, retrieveEnvVariable } from "../../../../utils"; +import { + Commitment + } from "@solana/web3.js"; +export const NETWORK = 'mainnet-beta'; +export const COMMITMENT_LEVEL: Commitment = retrieveEnvVariable('COMMITMENT_LEVEL', logger) as Commitment; +export const RPC_ENDPOINT = retrieveEnvVariable('MAINNET_ENDPOINT', logger); +export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable('WS_MAINNET_ENDPOINT', logger); +export const GRPC_XTOKEN = retrieveEnvVariable('GRPC_XTOKEN', logger); +export const LOG_LEVEL = retrieveEnvVariable('LOG_LEVEL', logger); +export const PRIVATE_KEY = retrieveEnvVariable('PRIVATE_KEY', logger); +export const QUOTE_AMOUNT = retrieveEnvVariable('QUOTE_AMOUNT', logger); +export const JITO_TIPS = retrieveEnvVariable('JITO_FEE', logger); +export const AUTO_SELL = retrieveEnvVariable('AUTO_SELL', logger) === 'true'; +export const AUTO_SELL_TIMEOUT = retrieveEnvVariable('AUTO_SELL_TIMEOUT', logger); +export {ComputeBudgetProgram, Connection, + Keypair, LAMPORTS_PER_SOL, PublicKey, SystemProgram, + TransactionMessage, VersionedTransaction, Transaction, + Commitment} from "@solana/web3.js"; \ No newline at end of file diff --git a/src/Trading_dev/grpc-pf-sniper/src/constants/index.ts b/src/Trading_dev/grpc-pf-sniper/src/constants/index.ts new file mode 100644 index 0000000..c7582ff --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/constants/index.ts @@ -0,0 +1 @@ +export * from "./constants" \ No newline at end of file diff --git a/src/Trading_dev/grpc-pf-sniper/src/jito/bundle.ts b/src/Trading_dev/grpc-pf-sniper/src/jito/bundle.ts new file mode 100644 index 0000000..3fdd55e --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/jito/bundle.ts @@ -0,0 +1,133 @@ +import { + Connection, + PublicKey, + Keypair, + VersionedTransaction, + MessageV0, + LAMPORTS_PER_SOL + } + from '@solana/web3.js'; + import { Bundle } from 'jito-ts/dist/sdk/block-engine/types'; + import * as Fs from 'fs'; + require('dotenv').config(); + import { searcherClient } from 'jito-ts/dist/sdk/block-engine/searcher'; + import { + ChannelCredentials, + ChannelOptions, + ClientReadableStream, + ServiceError, + } from '@grpc/grpc-js'; + import { SearcherServiceClient } from 'jito-ts/dist/gen/block-engine/searcher' + import { + PRIVATE_KEY, + RPC_ENDPOINT, + RPC_WEBSOCKET_ENDPOINT, + JITO_TIPS + } from '../constants'; + + import bs58 from 'bs58'; + import { logger } from '../utils/logger'; + import { bundle } from 'jito-ts'; + const blockEngineUrl = process.env.BLOCK_ENGINE_URL || ''; + logger.info(`BLOCK_ENGINE_URL: ${blockEngineUrl}`); + const c = searcherClient(blockEngineUrl, undefined); + export const searcherClientAdv = ( + url: string, + authKeypair: Keypair | undefined, + grpcOptions?: Partial + ): SearcherServiceClient => { + const client: SearcherServiceClient = new SearcherServiceClient( + url, + ChannelCredentials.createSsl(), + { ...grpcOptions } + ); + + return client; + } + + + // Get Tip Accounts + + let tipAccounts: string[] = []; + (async () => { + try { + tipAccounts = await c.getTipAccounts(); + // console.log('Result:', tipAccounts); + } catch (error) { + console.error('Error:', error); + } + })(); + + + + export async function sendBundle(latestBlockhash: string, transaction: VersionedTransaction, mint: PublicKey, masterKeypair: Keypair) { + + try { + logger.info(`Fetching and adding tip`); + const _tipAccount = tipAccounts[Math.floor(Math.random() * 6)]; + const tipAccount = new PublicKey(_tipAccount); + const b = new Bundle([transaction], 3); + const jito_tips = parseFloat(JITO_TIPS); + b.addTipTx( + masterKeypair, + jito_tips*LAMPORTS_PER_SOL, // Adjust Jito tip amount here + tipAccount, + latestBlockhash + ); + logger.info(`Sending bundle`); + const bundleResult = await c.sendBundle(b); + logger.info(`Sent bundle! bundleResult = ${bundleResult}`); + logger.info( + { + Pumpfun:`https://pump.fun/${mint.toBase58()}` + }, + ); + + + } + + catch (error) { + logger.error(error); + + } + + } + + // Get leader schedule + + // This was when I was experimenting with only sending the buy tx when a Jito leader was up or going to be up in the next slot so that I wouldn't + // have to wait multiple slots for the tx to be processed. I ended up not using this feature as it couldn't get it working correctly before I moved on. + + export async function storeJitoLeaderSchedule() { + + const cs = searcherClientAdv(blockEngineUrl, undefined); + + + const leaderSchedule = new Set(); + + cs.getConnectedLeadersRegioned({ regions: ["tokyo", "amsterdam", "ny", "frankfurt"] }, (error, response) => { + + + for (let key in response) { + if (key === 'connectedValidators') { + let validators = response[key]; + for (let validatorKey in validators) { + // Each validator object + let validator = validators[validatorKey]; + // Assuming `slots` is an array inside each validator object + Object.keys(validator.connectedValidators).forEach((key: string) => { + const slotsArray: number[][] = Object.values(validator.connectedValidators[key]); // Assume SlotList is an array of arrays + const flattenedSlotsArray: number[] = slotsArray.flat(); // Flatten the array + flattenedSlotsArray.forEach((slot: number) => { + leaderSchedule.add(slot); + }); + }); + } + } + } + + //console.log(leaderSchedule); + }); + + return leaderSchedule; + } \ No newline at end of file diff --git a/src/Trading_dev/grpc-pf-sniper/src/jito/index.ts b/src/Trading_dev/grpc-pf-sniper/src/jito/index.ts new file mode 100644 index 0000000..cf76714 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/jito/index.ts @@ -0,0 +1 @@ +export * from "./bundle"; \ No newline at end of file diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/index.ts b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/index.ts new file mode 100644 index 0000000..8b65d5d --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/index.ts @@ -0,0 +1,165 @@ +// import dotenv from "dotenv"; +// import fs from "fs"; +// import { Connection, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js"; +// import { DEFAULT_DECIMALS, PumpFunSDK } from "../../src"; +// import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet"; +// import { AnchorProvider } from "@coral-xyz/anchor"; +// import { +// getOrCreateKeypair, +// getSPLBalance, +// printSOLBalance, +// printSPLBalance, +// } from "../util"; + +// const KEYS_FOLDER = __dirname + "/.keys"; +// const SLIPPAGE_BASIS_POINTS = 100n; + +// //create token example: +// //https://solscan.io/tx/bok9NgPeoJPtYQHoDqJZyRDmY88tHbPcAk1CJJsKV3XEhHpaTZhUCG3mA9EQNXcaUfNSgfPkuVbEsKMp6H7D9NY +// //devnet faucet +// //https://faucet.solana.com/ + +// const main = async () => { +// dotenv.config(); + +// if (!process.env.HELIUS_RPC_URL) { +// console.error("Please set HELIUS_RPC_URL in .env file"); +// console.error( +// "Example: HELIUS_RPC_URL=https://mainnet.helius-rpc.com/?api-key=" +// ); +// console.error("Get one at: https://www.helius.dev"); +// return; +// } + +// let connection = new Connection(process.env.HELIUS_RPC_URL || ""); + +// let wallet = new NodeWallet(new Keypair()); //note this is not used +// const provider = new AnchorProvider(connection, wallet, { +// commitment: "finalized", +// }); + +// const testAccount = getOrCreateKeypair(KEYS_FOLDER, "test-account"); +// const mint = getOrCreateKeypair(KEYS_FOLDER, "mint"); + +// await printSOLBalance( +// connection, +// testAccount.publicKey, +// "Test Account keypair" +// ); + +// let sdk = new PumpFunSDK(provider); + +// let globalAccount = await sdk.getGlobalAccount(); +// console.log(globalAccount); + +// let currentSolBalance = await connection.getBalance(testAccount.publicKey); +// if (currentSolBalance == 0) { +// console.log( +// "Please send some SOL to the test-account:", +// testAccount.publicKey.toBase58() +// ); +// return; +// } + +// console.log(await sdk.getGlobalAccount()); + +// //Check if mint already exists +// let boundingCurveAccount = await sdk.getBondingCurveAccount(mint.publicKey); +// if (!boundingCurveAccount) { +// let tokenMetadata = { +// name: "TST-7", +// symbol: "TST-7", +// description: "TST-7: This is a test token", +// file: await fs.openAsBlob("example/basic/random.png"), +// }; + +// let createResults = await sdk.createAndBuy( +// testAccount, +// mint, +// tokenMetadata, +// BigInt(0.0001 * LAMPORTS_PER_SOL), +// SLIPPAGE_BASIS_POINTS, +// { +// unitLimit: 250000, +// unitPrice: 250000, +// } +// ); + +// if (createResults.success) { +// console.log("Success:", `https://pump.fun/${mint.publicKey.toBase58()}`); +// boundingCurveAccount = await sdk.getBondingCurveAccount(mint.publicKey); +// console.log("Bonding curve after create and buy", boundingCurveAccount); +// printSPLBalance(connection, mint.publicKey, testAccount.publicKey); +// } +// } else { +// console.log("boundingCurveAccount", boundingCurveAccount); +// console.log("Success:", `https://pump.fun/${mint.publicKey.toBase58()}`); +// printSPLBalance(connection, mint.publicKey, testAccount.publicKey); +// } + +// if (boundingCurveAccount) { +// //buy 0.0001 SOL worth of tokens +// let buyResults = await sdk.buy( +// testAccount, +// mint.publicKey, +// BigInt(0.0001 * LAMPORTS_PER_SOL), +// SLIPPAGE_BASIS_POINTS, +// { +// unitLimit: 250000, +// unitPrice: 250000, +// } +// ); + +// if (buyResults.success) { +// printSPLBalance(connection, mint.publicKey, testAccount.publicKey); +// console.log( +// "Bonding curve after buy", +// await sdk.getBondingCurveAccount(mint.publicKey) +// ); +// } else { +// console.log("Buy failed"); +// } + +// //sell all tokens +// let currentSPLBalance = await getSPLBalance( +// connection, +// mint.publicKey, +// testAccount.publicKey +// ); +// console.log("currentSPLBalance", currentSPLBalance); +// if (currentSPLBalance) { +// let sellResults = await sdk.sell( +// testAccount, +// mint.publicKey, +// BigInt(currentSPLBalance * Math.pow(10, DEFAULT_DECIMALS)), +// SLIPPAGE_BASIS_POINTS, +// { +// unitLimit: 250000, +// unitPrice: 250000, +// } +// ); +// if (sellResults.success) { +// await printSOLBalance( +// connection, +// testAccount.publicKey, +// "Test Account keypair" +// ); + +// printSPLBalance( +// connection, +// mint.publicKey, +// testAccount.publicKey, +// "After SPL sell all" +// ); +// console.log( +// "Bonding curve after sell", +// await sdk.getBondingCurveAccount(mint.publicKey) +// ); +// } else { +// console.log("Sell failed"); +// } +// } +// } +// }; + +// main(); diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/random.png b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/random.png new file mode 100644 index 0000000000000000000000000000000000000000..6c107cd8bc85493f037fe814bd0668d8cbcc1886 GIT binary patch literal 20610 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 { + dotenv.config(); + + if (!process.env.HELIUS_RPC_URL) { + console.error("Please set HELIUS_RPC_URL in .env file"); + console.error( + "Example: HELIUS_RPC_URL=https://mainnet.helius-rpc.com/?api-key=" + ); + console.error("Get one at: https://www.helius.dev"); + return; + } + + let connection = new Connection(process.env.HELIUS_RPC_URL || ""); + + let wallet = new NodeWallet(new Keypair()); //note this is not used + const provider = new AnchorProvider(connection, wallet, { + commitment: "finalized", + }); + + let sdk = new PumpFunSDK(provider); + + let createEvent = sdk.addEventListener("createEvent", (event) => { + console.log("createEvent", event); + }); + console.log("createEvent", createEvent); + + let tradeEvent = sdk.addEventListener("tradeEvent", (event) => { + console.log("tradeEvent", event); + }); + console.log("tradeEvent", tradeEvent); + + let completeEvent = sdk.addEventListener("completeEvent", (event) => { + console.log("completeEvent", event); + }); + console.log("completeEvent", completeEvent); +}; + +main(); diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/util.ts b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/util.ts new file mode 100644 index 0000000..9ddd534 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/util.ts @@ -0,0 +1,91 @@ +import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; +import { getAssociatedTokenAddressSync } from "@solana/spl-token"; +import { + Keypair, + PublicKey, + Connection, + LAMPORTS_PER_SOL, +} from "@solana/web3.js"; +import { sha256 } from "js-sha256"; + +import fs from "fs"; + +export function getOrCreateKeypair(dir: string, keyName: string): Keypair { + if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }); + const authorityKey = dir + "/" + keyName + ".json"; + if (fs.existsSync(authorityKey)) { + const data: { + secretKey: string; + publicKey: string; + } = JSON.parse(fs.readFileSync(authorityKey, "utf-8")); + return Keypair.fromSecretKey(bs58.decode(data.secretKey)); + } else { + const keypair = Keypair.generate(); + keypair.secretKey; + fs.writeFileSync( + authorityKey, + JSON.stringify({ + secretKey: bs58.encode(keypair.secretKey), + publicKey: keypair.publicKey.toBase58(), + }) + ); + return keypair; + } +} + +export const printSOLBalance = async ( + connection: Connection, + pubKey: PublicKey, + info: string = "" +) => { + const balance = await connection.getBalance(pubKey); + console.log( + `${info ? info + " " : ""}${pubKey.toBase58()}:`, + balance / LAMPORTS_PER_SOL, + `SOL` + ); +}; + +export const getSPLBalance = async ( + connection: Connection, + mintAddress: PublicKey, + pubKey: PublicKey, + allowOffCurve: boolean = false +) => { + try { + let ata = getAssociatedTokenAddressSync(mintAddress, pubKey, allowOffCurve); + const balance = await connection.getTokenAccountBalance(ata, "processed"); + return balance.value.uiAmount; + } catch (e) {} + return null; +}; + +export const printSPLBalance = async ( + connection: Connection, + mintAddress: PublicKey, + user: PublicKey, + info: string = "" +) => { + const balance = await getSPLBalance(connection, mintAddress, user); + if (balance === null) { + console.log( + `${info ? info + " " : ""}${user.toBase58()}:`, + "No Account Found" + ); + } else { + console.log(`${info ? info + " " : ""}${user.toBase58()}:`, balance); + } +}; + +export const baseToValue = (base: number, decimals: number): number => { + return base * Math.pow(10, decimals); +}; + +export const valueToBase = (value: number, decimals: number): number => { + return value / Math.pow(10, decimals); +}; + +//i.e. account:BondingCurve +export function getDiscriminator(name: string) { + return sha256.digest(name).slice(0, 8); +} diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/index.ts b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/index.ts new file mode 100644 index 0000000..65beef3 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/index.ts @@ -0,0 +1,2 @@ +export { default as IDL } from "./pump-fun.json"; +export { PumpFun } from "./pump-fun"; \ No newline at end of file diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.json b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.json new file mode 100644 index 0000000..eea03f0 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.json @@ -0,0 +1,925 @@ +{ + "address": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P", + "metadata": { + "name": "pump", + "version": "0.1.0", + "spec": "0.1.0" + }, + "instructions": [ + { + "name": "initialize", + "discriminator": [175, 175, 109, 31, 13, 152, 155, 237], + "docs": ["Creates the global state."], + "accounts": [ + { + "name": "global", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 103, + 108, + 111, + 98, + 97, + 108 + ] + } + ] + } + }, + { + "name": "user", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "setParams", + "discriminator": [165, 31, 134, 53, 189, 180, 130, 255], + "docs": ["Sets the global state parameters."], + "accounts": [ + { + "name": "global", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 103, + 108, + 111, + 98, + 97, + 108 + ] + } + ] + } + }, + { + "name": "user", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "event_authority", + "address": "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1" + }, + { + "name": "program", + "address": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P" + } + ], + "args": [ + { + "name": "feeRecipient", + "type": "pubkey" + }, + { + "name": "initialVirtualTokenReserves", + "type": "u64" + }, + { + "name": "initialVirtualSolReserves", + "type": "u64" + }, + { + "name": "initialRealTokenReserves", + "type": "u64" + }, + { + "name": "tokenTotalSupply", + "type": "u64" + }, + { + "name": "feeBasisPoints", + "type": "u64" + } + ] + }, + { + "name": "create", + "discriminator": [24, 30, 200, 40, 5, 28, 7, 119], + "docs": ["Creates a new coin and bonding curve."], + "accounts": [ + { + "name": "mint", + "writable": true, + "signer": true + }, + { + "name": "mint_authority", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 45, + 97, + 117, + 116, + 104, + 111, + 114, + 105, + 116, + 121 + ] + } + ] + } + }, + { + "name": "bonding_curve", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 111, + 110, + 100, + 105, + 110, + 103, + 45, + 99, + 117, + 114, + 118, + 101 + ] + }, + { + "kind": "account", + "path": "mint" + } + ] + } + }, + { + "name": "associated_bonding_curve", + "writable": true, + "signer": false + }, + { + "name": "global", + "writable": false, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 103, + 108, + 111, + 98, + 97, + 108 + ] + } + ] + } + }, + { + "name": "mpl_token_metadata", + "address": "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" + }, + { + "name": "metadata", + "writable": true, + "signer": false + }, + { + "name": "user", + "isMut": true, + "isSigner": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + }, + { + "name": "rent", + "address": "SysvarRent111111111111111111111111111111111" + }, + { + "name": "event_authority", + "address": "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1" + }, + { + "name": "program", + "address": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P" + } + ], + "args": [ + { + "name": "name", + "type": "string" + }, + { + "name": "symbol", + "type": "string" + }, + { + "name": "uri", + "type": "string" + } + ] + }, + { + "name": "buy", + "discriminator": [102, 6, 61, 18, 1, 218, 235, 234], + "docs": ["Buys tokens from a bonding curve."], + "accounts": [ + { + "name": "global", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 103, + 108, + 111, + 98, + 97, + 108 + ] + } + ] + } + }, + { + "name": "fee_recipient", + "writable": true, + "signer": false + }, + { + "name": "mint", + "writable": false, + "signer": false + }, + { + "name": "bonding_curve", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 111, + 110, + 100, + 105, + 110, + 103, + 45, + 99, + 117, + 114, + 118, + 101 + ] + }, + { + "kind": "account", + "path": "mint" + } + ] + } + }, + { + "name": "associated_bonding_curve", + "writable": true, + "signer": false + }, + { + "name": "associated_user", + "writable": true, + "signer": false + }, + { + "name": "user", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "rent", + "address": "SysvarRent111111111111111111111111111111111" + }, + { + "name": "event_authority", + "address": "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1" + }, + { + "name": "program", + "address": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P" + } + ], + "args": [ + { + "name": "amount", + "type": "u64" + }, + { + "name": "maxSolCost", + "type": "u64" + } + ] + }, + { + "name": "sell", + "discriminator": [51, 230, 133, 164, 1, 127, 131, 173], + "docs": ["Sells tokens into a bonding curve."], + "accounts": [ + { + "name": "global", + "writable": false, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 103, + 108, + 111, + 98, + 97, + 108 + ] + } + ] + } + }, + { + "name": "feeRecipient", + "writable": true, + "signer": false + }, + { + "name": "mint", + "writable": false, + "signer": false + }, + { + "name": "bonding_curve", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 111, + 110, + 100, + 105, + 110, + 103, + 45, + 99, + 117, + 114, + 118, + 101 + ] + }, + { + "kind": "account", + "path": "mint" + } + ] + } + }, + { + "name": "associatedBondingCurve", + "writable": true, + "signer": false + }, + { + "name": "associatedUser", + "writable": true, + "signer": false + }, + { + "name": "user", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "event_authority", + "address": "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1" + }, + { + "name": "program", + "address": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P" + } + ], + "args": [ + { + "name": "amount", + "type": "u64" + }, + { + "name": "minSolOutput", + "type": "u64" + } + ] + }, + { + "name": "withdraw", + "discriminator": [183, 18, 70, 156, 148, 109, 161, 34], + "docs": [ + "Allows the admin to withdraw liquidity for a migration once the bonding curve completes" + ], + "accounts": [ + { + "name": "global", + "writable": false, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 103, + 108, + 111, + 98, + 97, + 108 + ] + } + ] + } + }, + { + "name": "lastWithdraw", + "writable": true, + "signer": false + }, + { + "name": "mint", + "writable": false, + "signer": false + }, + { + "name": "bonding_curve", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 111, + 110, + 100, + 105, + 110, + 103, + 45, + 99, + 117, + 114, + 118, + 101 + ] + }, + { + "kind": "account", + "path": "mint" + } + ] + } + }, + { + "name": "associatedBondingCurve", + "writable": true, + "signer": false + }, + { + "name": "associatedUser", + "writable": true, + "signer": false + }, + { + "name": "user", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "rent", + "address": "SysvarRent111111111111111111111111111111111" + }, + { + "name": "event_authority", + "address": "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1" + }, + { + "name": "program", + "address": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P" + } + ], + "args": [] + } + ], + "accounts": [ + { + "name": "BondingCurve", + "discriminator": [ + 23, + 183, + 248, + 55, + 96, + 216, + 172, + 96 + ] + }, + { + "name": "Global", + "discriminator": [ + 167, + 232, + 232, + 177, + 200, + 108, + 114, + 127 + ] + } + ], + "events": [ + { + "name": "CreateEvent", + "discriminator": [27, 114, 169, 77, 222, 235, 99, 118] + }, + { + "name": "TradeEvent", + "discriminator": [189, 219, 127, 211, 78, 230, 97, 238] + }, + { + "name": "CompleteEvent", + "discriminator": [95, 114, 97, 156, 212, 46, 152, 8] + }, + { + "name": "SetParamsEvent", + "discriminator": [223, 195, 159, 246, 62, 48, 143, 131] + } + ], + "types": [ + { + "name": "Global", + "type": { + "kind": "struct", + "fields": [ + { + "name": "initialized", + "type": "bool" + }, + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "feeRecipient", + "type": "pubkey" + }, + { + "name": "initialVirtualTokenReserves", + "type": "u64" + }, + { + "name": "initialVirtualSolReserves", + "type": "u64" + }, + { + "name": "initialRealTokenReserves", + "type": "u64" + }, + { + "name": "tokenTotalSupply", + "type": "u64" + }, + { + "name": "feeBasisPoints", + "type": "u64" + } + ] + } + }, + { + "name": "LastWithdraw", + "type": { + "kind": "struct", + "fields": [ + { + "name": "lastWithdrawTimestamp", + "type": "i64" + } + ] + } + }, + { + "name": "BondingCurve", + "type": { + "kind": "struct", + "fields": [ + { + "name": "virtualTokenReserves", + "type": "u64" + }, + { + "name": "virtualSolReserves", + "type": "u64" + }, + { + "name": "realTokenReserves", + "type": "u64" + }, + { + "name": "realSolReserves", + "type": "u64" + }, + { + "name": "tokenTotalSupply", + "type": "u64" + }, + { + "name": "complete", + "type": "bool" + } + ] + } + }, + { + "name": "CreateEvent", + "type": { + "kind": "struct", + "fields": [ + { + "name": "name", + "type": "string", + "index": false + }, + { + "name": "symbol", + "type": "string", + "index": false + }, + { + "name": "uri", + "type": "string", + "index": false + }, + { + "name": "mint", + "type": "pubkey", + "index": false + }, + { + "name": "bondingCurve", + "type": "pubkey", + "index": false + }, + { + "name": "user", + "type": "pubkey", + "index": false + } + ] + } + }, + { + "name": "TradeEvent", + "type": { + "kind": "struct", + "fields": [ + { + "name": "mint", + "type": "pubkey", + "index": false + }, + { + "name": "solAmount", + "type": "u64", + "index": false + }, + { + "name": "tokenAmount", + "type": "u64", + "index": false + }, + { + "name": "isBuy", + "type": "bool", + "index": false + }, + { + "name": "user", + "type": "pubkey", + "index": false + }, + { + "name": "timestamp", + "type": "i64", + "index": false + }, + { + "name": "virtualSolReserves", + "type": "u64", + "index": false + }, + { + "name": "virtualTokenReserves", + "type": "u64", + "index": false + }, + { + "name": "realSolReserves", + "type": "u64", + "index": false + }, + { + "name": "realTokenReserves", + "type": "u64", + "index": false + } + ] + } + }, + { + "name": "CompleteEvent", + "type": { + "kind": "struct", + "fields": [ + { + "name": "user", + "type": "pubkey", + "index": false + }, + { + "name": "mint", + "type": "pubkey", + "index": false + }, + { + "name": "bondingCurve", + "type": "pubkey", + "index": false + }, + { + "name": "timestamp", + "type": "i64", + "index": false + } + ] + } + }, + { + "name": "SetParamsEvent", + "type": { + "kind": "struct", + "fields": [ + { + "name": "feeRecipient", + "type": "pubkey", + "index": false + }, + { + "name": "initialVirtualTokenReserves", + "type": "u64", + "index": false + }, + { + "name": "initialVirtualSolReserves", + "type": "u64", + "index": false + }, + { + "name": "initialRealTokenReserves", + "type": "u64", + "index": false + }, + { + "name": "tokenTotalSupply", + "type": "u64", + "index": false + }, + { + "name": "feeBasisPoints", + "type": "u64", + "index": false + } + ] + } + } + ], + "errors": [ + { + "code": 6000, + "name": "NotAuthorized", + "msg": "The given account is not authorized to execute this instruction." + }, + { + "code": 6001, + "name": "AlreadyInitialized", + "msg": "The program is already initialized." + }, + { + "code": 6002, + "name": "TooMuchSolRequired", + "msg": "slippage: Too much SOL required to buy the given amount of tokens." + }, + { + "code": 6003, + "name": "TooLittleSolReceived", + "msg": "slippage: Too little SOL received to sell the given amount of tokens." + }, + { + "code": 6004, + "name": "MintDoesNotMatchBondingCurve", + "msg": "The mint does not match the bonding curve." + }, + { + "code": 6005, + "name": "BondingCurveComplete", + "msg": "The bonding curve has completed and liquidity migrated to raydium." + }, + { + "code": 6006, + "name": "BondingCurveNotComplete", + "msg": "The bonding curve has not completed." + }, + { + "code": 6007, + "name": "NotInitialized", + "msg": "The program is not initialized." + }, + { + "code": 6008, + "name": "WithdrawTooFrequent", + "msg": "Withdraw too frequent" + } + ] +} diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.ts b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.ts new file mode 100644 index 0000000..99cc93e --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.ts @@ -0,0 +1,865 @@ +export type PumpFun = { + address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; + metadata: { + name: "pump"; + version: "0.1.0"; + spec: "0.1.0"; + }; + instructions: [ + { + name: "initialize"; + discriminator: [175, 175, 109, 31, 13, 152, 155, 237]; + docs: ["Creates the global state."]; + accounts: [ + { + name: "global"; + writable: true; + pda: { + seeds: [ + { + kind: "const"; + value: [103, 108, 111, 98, 97, 108]; + } + ]; + }; + }, + { + name: "user"; + writable: true; + signer: true; + }, + { + name: "systemProgram"; + address: "11111111111111111111111111111111"; + } + ]; + args: []; + }, + { + name: "setParams"; + discriminator: [165, 31, 134, 53, 189, 180, 130, 255]; + docs: ["Sets the global state parameters."]; + accounts: [ + { + name: "global"; + writable: true; + pda: { + seeds: [ + { + kind: "const"; + value: [103, 108, 111, 98, 97, 108]; + } + ]; + }; + }, + { + name: "user"; + writable: true; + signer: true; + }, + { + name: "systemProgram"; + address: "11111111111111111111111111111111"; + }, + { + name: "eventAuthority"; + address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; + }, + { + name: "program"; + address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; + } + ]; + args: [ + { + name: "feeRecipient"; + type: "pubkey"; + }, + { + name: "initialVirtualTokenReserves"; + type: "u64"; + }, + { + name: "initialVirtualSolReserves"; + type: "u64"; + }, + { + name: "initialRealTokenReserves"; + type: "u64"; + }, + { + name: "tokenTotalSupply"; + type: "u64"; + }, + { + name: "feeBasisPoints"; + type: "u64"; + } + ]; + }, + { + name: "create"; + discriminator: [24, 30, 200, 40, 5, 28, 7, 119]; + docs: ["Creates a new coin and bonding curve."]; + accounts: [ + { + name: "mint"; + writable: true; + signer: true; + }, + { + name: "mint_authority"; + pda: { + seeds: [ + { + kind: "const"; + value: [ + 109, + 105, + 110, + 116, + 45, + 97, + 117, + 116, + 104, + 111, + 114, + 105, + 116, + 121 + ]; + } + ]; + }; + }, + { + name: "bondingCurve"; + writable: true; + pda: { + seeds: [ + { + kind: "const"; + value: [ + 98, + 111, + 110, + 100, + 105, + 110, + 103, + 45, + 99, + 117, + 114, + 118, + 101 + ]; + }, + { + kind: "account"; + path: "mint"; + } + ]; + }; + }, + { + name: "associatedBondingCurve"; + writable: true; + signer: false; + }, + { + name: "global"; + writable: false; + pda: { + seeds: [ + { + kind: "const"; + value: [103, 108, 111, 98, 97, 108]; + } + ]; + }; + }, + { + name: "mplTokenMetadata"; + address: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"; + }, + { + name: "metadata"; + writable: true; + signer: false; + }, + { + name: "user"; + isMut: true; + isSigner: true; + }, + { + name: "systemProgram"; + address: "11111111111111111111111111111111"; + }, + { + name: "tokenProgram"; + address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; + }, + { + name: "associatedTokenProgram"; + address: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"; + }, + { + name: "rent"; + address: "SysvarRent111111111111111111111111111111111"; + }, + { + name: "eventAuthority"; + address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; + }, + { + name: "program"; + address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; + } + ]; + args: [ + { + name: "name"; + type: "string"; + }, + { + name: "symbol"; + type: "string"; + }, + { + name: "uri"; + type: "string"; + } + ]; + }, + { + name: "buy"; + discriminator: [102, 6, 61, 18, 1, 218, 235, 234]; + docs: ["Buys tokens from a bonding curve."]; + accounts: [ + { + name: "global"; + pda: { + seeds: [ + { + kind: "const"; + value: [103, 108, 111, 98, 97, 108]; + } + ]; + }; + }, + { + name: "feeRecipient"; + writable: true; + signer: false; + }, + { + name: "mint"; + writable: false; + signer: false; + }, + { + name: "bondingCurve"; + writable: true; + pda: { + seeds: [ + { + kind: "const"; + value: [ + 98, + 111, + 110, + 100, + 105, + 110, + 103, + 45, + 99, + 117, + 114, + 118, + 101 + ]; + }, + { + kind: "account"; + path: "mint"; + } + ]; + }; + }, + { + name: "associatedBondingCurve"; + writable: true; + signer: false; + }, + { + name: "associatedUser"; + writable: true; + signer: false; + }, + { + name: "user"; + writable: true; + signer: true; + }, + { + name: "systemProgram"; + address: "11111111111111111111111111111111"; + }, + { + name: "tokenProgram"; + address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; + }, + { + name: "rent"; + address: "SysvarRent111111111111111111111111111111111"; + }, + { + name: "eventAuthority"; + address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; + }, + { + name: "program"; + address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; + } + ]; + args: [ + { + name: "amount"; + type: "u64"; + }, + { + name: "maxSolCost"; + type: "u64"; + } + ]; + }, + { + name: "sell"; + discriminator: [51, 230, 133, 164, 1, 127, 131, 173]; + docs: ["Sells tokens into a bonding curve."]; + accounts: [ + { + name: "global"; + writable: false; + pda: { + seeds: [ + { + kind: "const"; + value: [103, 108, 111, 98, 97, 108]; + } + ]; + }; + }, + { + name: "feeRecipient"; + writable: true; + signer: false; + }, + { + name: "mint"; + writable: false; + signer: false; + }, + { + name: "bondingCurve"; + writable: true; + pda: { + seeds: [ + { + kind: "const"; + value: [ + 98, + 111, + 110, + 100, + 105, + 110, + 103, + 45, + 99, + 117, + 114, + 118, + 101 + ]; + }, + { + kind: "account"; + path: "mint"; + } + ]; + }; + }, + { + name: "associatedBondingCurve"; + writable: true; + signer: false; + }, + { + name: "associatedUser"; + writable: true; + signer: false; + }, + { + name: "user"; + writable: true; + signer: true; + }, + { + name: "systemProgram"; + address: "11111111111111111111111111111111"; + }, + { + name: "associatedTokenProgram"; + address: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"; + }, + { + name: "tokenProgram"; + address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; + }, + { + name: "eventAuthority"; + address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; + }, + { + name: "program"; + address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; + } + ]; + args: [ + { + name: "amount"; + type: "u64"; + }, + { + name: "minSolOutput"; + type: "u64"; + } + ]; + }, + { + name: "withdraw"; + discriminator: [183, 18, 70, 156, 148, 109, 161, 34]; + docs: [ + "Allows the admin to withdraw liquidity for a migration once the bonding curve completes" + ]; + accounts: [ + { + name: "global"; + writable: false; + pda: { + seeds: [ + { + kind: "const"; + value: [103, 108, 111, 98, 97, 108]; + } + ]; + }; + }, + { + name: "lastWithdraw"; + writable: true; + signer: false; + }, + { + name: "mint"; + writable: false; + signer: false; + }, + { + name: "bondingCurve"; + writable: true; + pda: { + seeds: [ + { + kind: "const"; + value: [ + 98, + 111, + 110, + 100, + 105, + 110, + 103, + 45, + 99, + 117, + 114, + 118, + 101 + ]; + }, + { + kind: "account"; + path: "mint"; + } + ]; + }; + }, + { + name: "associatedBondingCurve"; + writable: true; + signer: false; + }, + { + name: "associatedUser"; + writable: true; + signer: false; + }, + { + name: "user"; + writable: true; + signer: true; + }, + { + name: "system_program"; + address: "11111111111111111111111111111111"; + }, + { + name: "tokenProgram"; + address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; + }, + { + name: "rent"; + address: "SysvarRent111111111111111111111111111111111"; + }, + { + name: "eventAuthority"; + address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; + }, + { + name: "program"; + address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; + } + ]; + args: []; + } + ]; + accounts: [ + { + name: "bondingCurve"; + discriminator: [23, 183, 248, 55, 96, 216, 172, 96]; + }, + { + name: "global"; + discriminator: [167, 232, 232, 177, 200, 108, 114, 127]; + } + ]; + events: [ + { + name: "createEvent"; + discriminator: [27, 114, 169, 77, 222, 235, 99, 118]; + }, + { + name: "tradeEvent"; + discriminator: [189, 219, 127, 211, 78, 230, 97, 238]; + }, + { + name: "completeEvent"; + discriminator: [95, 114, 97, 156, 212, 46, 152, 8]; + }, + { + name: "setParamsEvent"; + discriminator: [223, 195, 159, 246, 62, 48, 143, 131]; + } + ]; + types: [ + { + name: "global"; + type: { + kind: "struct"; + fields: [ + { + name: "initialized"; + type: "bool"; + }, + { + name: "authority"; + type: "pubkey"; + }, + { + name: "feeRecipient"; + type: "pubkey"; + }, + { + name: "initialVirtualTokenReserves"; + type: "u64"; + }, + { + name: "initialVirtualSolReserves"; + type: "u64"; + }, + { + name: "initialRealTokenReserves"; + type: "u64"; + }, + { + name: "tokenTotalSupply"; + type: "u64"; + }, + { + name: "feeBasisPoints"; + type: "u64"; + } + ]; + }; + }, + { + name: "lastWithdraw"; + type: { + kind: "struct"; + fields: [ + { + name: "lastWithdrawTimestamp"; + type: "i64"; + } + ]; + }; + }, + { + name: "bondingCurve"; + type: { + kind: "struct"; + fields: [ + { + name: "virtualTokenReserves"; + type: "u64"; + }, + { + name: "virtualSolReserves"; + type: "u64"; + }, + { + name: "realTokenReserves"; + type: "u64"; + }, + { + name: "realSolReserves"; + type: "u64"; + }, + { + name: "tokenTotalSupply"; + type: "u64"; + }, + { + name: "complete"; + type: "bool"; + } + ]; + }; + }, + { + name: "createEvent"; + type: { + kind: "struct"; + fields: [ + { + name: "name"; + type: "string"; + index: false; + }, + { + name: "symbol"; + type: "string"; + index: false; + }, + { + name: "uri"; + type: "string"; + index: false; + }, + { + name: "mint"; + type: "pubkey"; + index: false; + }, + { + name: "bondingCurve"; + type: "pubkey"; + index: false; + }, + { + name: "user"; + type: "pubkey"; + index: false; + } + ]; + }; + }, + { + name: "tradeEvent"; + type: { + kind: "struct"; + fields: [ + { + name: "mint"; + type: "pubkey"; + index: false; + }, + { + name: "solAmount"; + type: "u64"; + index: false; + }, + { + name: "tokenAmount"; + type: "u64"; + index: false; + }, + { + name: "isBuy"; + type: "bool"; + index: false; + }, + { + name: "user"; + type: "pubkey"; + index: false; + }, + { + name: "timestamp"; + type: "i64"; + index: false; + }, + { + name: "virtualSolReserves"; + type: "u64"; + index: false; + }, + { + name: "virtualTokenReserves"; + type: "u64"; + index: false; + }, + { + name: "realSolReserves"; + type: "u64"; + index: false; + }, + { + name: "realTokenReserves"; + type: "u64"; + index: false; + } + ]; + }; + }, + { + name: "completeEvent"; + type: { + kind: "struct"; + fields: [ + { + name: "user"; + type: "pubkey"; + index: false; + }, + { + name: "mint"; + type: "pubkey"; + index: false; + }, + { + name: "bondingCurve"; + type: "pubkey"; + index: false; + }, + { + name: "timestamp"; + type: "i64"; + index: false; + } + ]; + }; + }, + { + name: "setParamsEvent"; + type: { + kind: "struct"; + fields: [ + { + name: "feeRecipient"; + type: "pubkey"; + index: false; + }, + { + name: "initialVirtualTokenReserves"; + type: "u64"; + index: false; + }, + { + name: "initialVirtualSolReserves"; + type: "u64"; + index: false; + }, + { + name: "initialRealTokenReserves"; + type: "u64"; + index: false; + }, + { + name: "tokenTotalSupply"; + type: "u64"; + index: false; + }, + { + name: "feeBasisPoints"; + type: "u64"; + index: false; + } + ]; + }; + } + ]; + errors: [ + { + code: 6000; + name: "NotAuthorized"; + msg: "The given account is not authorized to execute this instruction."; + }, + { + code: 6001; + name: "AlreadyInitialized"; + msg: "The program is already initialized."; + }, + { + code: 6002; + name: "TooMuchSolRequired"; + msg: "slippage: Too much SOL required to buy the given amount of tokens."; + }, + { + code: 6003; + name: "TooLittleSolReceived"; + msg: "slippage: Too little SOL received to sell the given amount of tokens."; + }, + { + code: 6004; + name: "MintDoesNotMatchBondingCurve"; + msg: "The mint does not match the bonding curve."; + }, + { + code: 6005; + name: "BondingCurveComplete"; + msg: "The bonding curve has completed and liquidity migrated to raydium."; + }, + { + code: 6006; + name: "BondingCurveNotComplete"; + msg: "The bonding curve has not completed."; + }, + { + code: 6007; + name: "NotInitialized"; + msg: "The program is not initialized."; + }, + { + code: 6008; + name: "WithdrawTooFrequent"; + msg: "Withdraw too frequent"; + } + ]; +}; \ No newline at end of file diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/amm.ts b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/amm.ts new file mode 100644 index 0000000..f48889a --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/amm.ts @@ -0,0 +1,88 @@ +import { BondingCurveAccount } from "./bondingCurveAccount"; +import { GlobalAccount } from "./globalAccount"; + +export type BuyResult = { + token_amount: bigint; + sol_amount: bigint; +}; + +export type SellResult = { + token_amount: bigint; + sol_amount: bigint; +}; + +export class AMM { + constructor( + public virtualSolReserves: bigint, + public virtualTokenReserves: bigint, + public realSolReserves: bigint, + public realTokenReserves: bigint, + public initialVirtualTokenReserves: bigint + ) {} + + static fromGlobalAccount(global: GlobalAccount): AMM { + return new AMM( + global.initialVirtualSolReserves, + global.initialVirtualTokenReserves, + 0n, + global.initialRealTokenReserves, + global.initialVirtualTokenReserves + ); + } + + static fromBondingCurveAccount(bonding_curve: BondingCurveAccount, initialVirtualTokenReserves: bigint): AMM { + return new AMM( + bonding_curve.virtualSolReserves, + bonding_curve.virtualTokenReserves, + bonding_curve.realSolReserves, + bonding_curve.realTokenReserves, + initialVirtualTokenReserves + ); + } + + getBuyPrice(tokens: bigint): bigint { + const product_of_reserves = this.virtualSolReserves * this.virtualTokenReserves; + const new_virtual_token_reserves = this.virtualTokenReserves - tokens; + const new_virtual_sol_reserves = product_of_reserves / new_virtual_token_reserves + 1n; + const amount_needed = new_virtual_sol_reserves > this.virtualSolReserves ? new_virtual_sol_reserves - this.virtualSolReserves : 0n; + return amount_needed > 0n ? amount_needed : 0n; + } + + applyBuy(token_amount: bigint): BuyResult { + const final_token_amount = token_amount > this.realTokenReserves ? this.realTokenReserves : token_amount; + const sol_amount = this.getBuyPrice(final_token_amount); + + this.virtualTokenReserves = this.virtualTokenReserves - final_token_amount; + this.realTokenReserves = this.realTokenReserves - final_token_amount; + + this.virtualSolReserves = this.virtualSolReserves + sol_amount; + this.realSolReserves = this.realSolReserves + sol_amount; + + return { + token_amount: final_token_amount, + sol_amount: sol_amount + } + } + + applySell(token_amount: bigint): SellResult { + this.virtualTokenReserves = this.virtualTokenReserves + token_amount; + this.realTokenReserves = this.realTokenReserves + token_amount; + + const sell_price = this.getSellPrice(token_amount); + + this.virtualSolReserves = this.virtualSolReserves - sell_price; + this.realSolReserves = this.realSolReserves - sell_price; + + return { + token_amount: token_amount, + sol_amount: sell_price + } + } + + getSellPrice(tokens: bigint): bigint { + const scaling_factor = this.initialVirtualTokenReserves; + const token_sell_proportion = (tokens * scaling_factor) / this.virtualTokenReserves; + const sol_received = (this.virtualSolReserves * token_sell_proportion) / scaling_factor; + return sol_received < this.realSolReserves ? sol_received : this.realSolReserves; + } +} \ No newline at end of file diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/bondingCurveAccount.ts b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/bondingCurveAccount.ts new file mode 100644 index 0000000..f2133e5 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/bondingCurveAccount.ts @@ -0,0 +1,134 @@ +import { struct, bool, u64, Layout } from "@coral-xyz/borsh"; + +export class BondingCurveAccount { + public discriminator: bigint; + public virtualTokenReserves: bigint; + public virtualSolReserves: bigint; + public realTokenReserves: bigint; + public realSolReserves: bigint; + public tokenTotalSupply: bigint; + public complete: boolean; + + constructor( + discriminator: bigint, + virtualTokenReserves: bigint, + virtualSolReserves: bigint, + realTokenReserves: bigint, + realSolReserves: bigint, + tokenTotalSupply: bigint, + complete: boolean + ) { + this.discriminator = discriminator; + this.virtualTokenReserves = virtualTokenReserves; + this.virtualSolReserves = virtualSolReserves; + this.realTokenReserves = realTokenReserves; + this.realSolReserves = realSolReserves; + this.tokenTotalSupply = tokenTotalSupply; + this.complete = complete; + } + + getBuyPrice(amount: bigint): bigint { + if (this.complete) { + throw new Error("Curve is complete"); + } + + if (amount <= 0n) { + return 0n; + } + + // Calculate the product of virtual reserves + let n = this.virtualSolReserves * this.virtualTokenReserves; + + // Calculate the new virtual sol reserves after the purchase + let i = this.virtualSolReserves + amount; + + // Calculate the new virtual token reserves after the purchase + let r = n / i + 1n; + + // Calculate the amount of tokens to be purchased + let s = this.virtualTokenReserves - r; + + // Return the minimum of the calculated tokens and real token reserves + return s < this.realTokenReserves ? s : this.realTokenReserves; + } + + getSellPrice(amount: bigint, feeBasisPoints: bigint): bigint { + if (this.complete) { + throw new Error("Curve is complete"); + } + + if (amount <= 0n) { + return 0n; + } + + // Calculate the proportional amount of virtual sol reserves to be received + let n = + (amount * this.virtualSolReserves) / (this.virtualTokenReserves + amount); + + // Calculate the fee amount in the same units + let a = (n * feeBasisPoints) / 10000n; + + // Return the net amount after deducting the fee + return n - a; + } + + getMarketCapSOL(): bigint { + if (this.virtualTokenReserves === 0n) { + return 0n; + } + + return ( + (this.tokenTotalSupply * this.virtualSolReserves) / + this.virtualTokenReserves + ); + } + + getFinalMarketCapSOL(feeBasisPoints: bigint): bigint { + let totalSellValue = this.getBuyOutPrice( + this.realTokenReserves, + feeBasisPoints + ); + let totalVirtualValue = this.virtualSolReserves + totalSellValue; + let totalVirtualTokens = this.virtualTokenReserves - this.realTokenReserves; + + if (totalVirtualTokens === 0n) { + return 0n; + } + + return (this.tokenTotalSupply * totalVirtualValue) / totalVirtualTokens; + } + + getBuyOutPrice(amount: bigint, feeBasisPoints: bigint): bigint { + let solTokens = + amount < this.realSolReserves ? this.realSolReserves : amount; + let totalSellValue = + (solTokens * this.virtualSolReserves) / + (this.virtualTokenReserves - solTokens) + + 1n; + let fee = (totalSellValue * feeBasisPoints) / 10000n; + return totalSellValue + fee; + } + + public static fromBuffer(buffer: Buffer): BondingCurveAccount { + const structure: Layout = struct([ + u64("discriminator"), + u64("virtualTokenReserves"), + u64("virtualSolReserves"), + u64("realTokenReserves"), + u64("realSolReserves"), + u64("tokenTotalSupply"), + bool("complete"), + ]); + + let value = structure.decode(buffer); + return new BondingCurveAccount( + BigInt(value.discriminator), + BigInt(value.virtualTokenReserves), + BigInt(value.virtualSolReserves), + BigInt(value.realTokenReserves), + BigInt(value.realSolReserves), + BigInt(value.tokenTotalSupply), + value.complete + ); + } +} diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/events.ts b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/events.ts new file mode 100644 index 0000000..bf001f8 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/events.ts @@ -0,0 +1,53 @@ +import { PublicKey } from "@solana/web3.js"; +import { + CompleteEvent, + CreateEvent, + SetParamsEvent, + TradeEvent, +} from "./types"; + +export function toCreateEvent(event: CreateEvent): CreateEvent { + return { + name: event.name, + symbol: event.symbol, + uri: event.uri, + mint: new PublicKey(event.mint), + bondingCurve: new PublicKey(event.bondingCurve), + user: new PublicKey(event.user), + }; +} + +export function toCompleteEvent(event: CompleteEvent): CompleteEvent { + return { + user: new PublicKey(event.user), + mint: new PublicKey(event.mint), + bondingCurve: new PublicKey(event.bondingCurve), + timestamp: event.timestamp, + }; +} + +export function toTradeEvent(event: TradeEvent): TradeEvent { + return { + mint: new PublicKey(event.mint), + solAmount: BigInt(event.solAmount), + tokenAmount: BigInt(event.tokenAmount), + isBuy: event.isBuy, + user: new PublicKey(event.user), + timestamp: Number(event.timestamp), + virtualSolReserves: BigInt(event.virtualSolReserves), + virtualTokenReserves: BigInt(event.virtualTokenReserves), + realSolReserves: BigInt(event.realSolReserves), + realTokenReserves: BigInt(event.realTokenReserves), + }; +} + +export function toSetParamsEvent(event: SetParamsEvent): SetParamsEvent { + return { + feeRecipient: new PublicKey(event.feeRecipient), + initialVirtualTokenReserves: BigInt(event.initialVirtualTokenReserves), + initialVirtualSolReserves: BigInt(event.initialVirtualSolReserves), + initialRealTokenReserves: BigInt(event.initialRealTokenReserves), + tokenTotalSupply: BigInt(event.tokenTotalSupply), + feeBasisPoints: BigInt(event.feeBasisPoints), + }; +} diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/globalAccount.ts b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/globalAccount.ts new file mode 100644 index 0000000..b422c50 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/globalAccount.ts @@ -0,0 +1,77 @@ +import { PublicKey } from "@solana/web3.js"; +import { struct, bool, u64, publicKey, Layout } from "@coral-xyz/borsh"; + +export class GlobalAccount { + public discriminator: bigint; + public initialized: boolean = false; + public authority: PublicKey; + public feeRecipient: PublicKey; + public initialVirtualTokenReserves: bigint; + public initialVirtualSolReserves: bigint; + public initialRealTokenReserves: bigint; + public tokenTotalSupply: bigint; + public feeBasisPoints: bigint; + + constructor( + discriminator: bigint, + initialized: boolean, + authority: PublicKey, + feeRecipient: PublicKey, + initialVirtualTokenReserves: bigint, + initialVirtualSolReserves: bigint, + initialRealTokenReserves: bigint, + tokenTotalSupply: bigint, + feeBasisPoints: bigint + ) { + this.discriminator = discriminator; + this.initialized = initialized; + this.authority = authority; + this.feeRecipient = feeRecipient; + this.initialVirtualTokenReserves = initialVirtualTokenReserves; + this.initialVirtualSolReserves = initialVirtualSolReserves; + this.initialRealTokenReserves = initialRealTokenReserves; + this.tokenTotalSupply = tokenTotalSupply; + this.feeBasisPoints = feeBasisPoints; + } + + getInitialBuyPrice(amount: bigint): bigint { + if (amount <= 0n) { + return 0n; + } + + let n = this.initialVirtualSolReserves * this.initialVirtualTokenReserves; + let i = this.initialVirtualSolReserves + amount; + let r = n / i + 1n; + let s = this.initialVirtualTokenReserves - r; + return s < this.initialRealTokenReserves + ? s + : this.initialRealTokenReserves; + } + + public static fromBuffer(buffer: Buffer): GlobalAccount { + const structure: Layout = struct([ + u64("discriminator"), + bool("initialized"), + publicKey("authority"), + publicKey("feeRecipient"), + u64("initialVirtualTokenReserves"), + u64("initialVirtualSolReserves"), + u64("initialRealTokenReserves"), + u64("tokenTotalSupply"), + u64("feeBasisPoints"), + ]); + + let value = structure.decode(buffer); + return new GlobalAccount( + BigInt(value.discriminator), + value.initialized, + value.authority, + value.feeRecipient, + BigInt(value.initialVirtualTokenReserves), + BigInt(value.initialVirtualSolReserves), + BigInt(value.initialRealTokenReserves), + BigInt(value.tokenTotalSupply), + BigInt(value.feeBasisPoints) + ); + } +} diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/index.ts b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/index.ts new file mode 100644 index 0000000..79f3450 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/index.ts @@ -0,0 +1,7 @@ +export * from './pumpfun' +export * from './util' +export * from './types' +export * from './events' +export * from './globalAccount' +export * from './bondingCurveAccount' +export * from './amm' diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/pumpfun.ts b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/pumpfun.ts new file mode 100644 index 0000000..2883cbd --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/pumpfun.ts @@ -0,0 +1,459 @@ +import { + Commitment, + Connection, + Finality, + Keypair, + PublicKey, + Transaction, +} from "@solana/web3.js"; +import { Program, Provider } from "@coral-xyz/anchor"; +import { GlobalAccount } from "./globalAccount"; +import { + CompleteEvent, + CreateEvent, + CreateTokenMetadata, + PriorityFee, + PumpFunEventHandlers, + PumpFunEventType, + SetParamsEvent, + TradeEvent, + TransactionResult, +} from "./types"; +import { + toCompleteEvent, + toCreateEvent, + toSetParamsEvent, + toTradeEvent, +} from "./events"; +import { + createAssociatedTokenAccountIdempotentInstruction, + createAssociatedTokenAccountInstruction, + getAccount, + getAssociatedTokenAddress, +} from "@solana/spl-token"; +import { BondingCurveAccount } from "./bondingCurveAccount"; +const {BN} = require('bn.js'); +import { + DEFAULT_COMMITMENT, + DEFAULT_FINALITY, + calculateWithSlippageBuy, + calculateWithSlippageSell, + sendTx, +} from "./util"; +import { PumpFun, IDL } from "./IDL"; +const PROGRAM_ID = "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; +const MPL_TOKEN_METADATA_PROGRAM_ID = + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"; + +export const GLOBAL_ACCOUNT_SEED = "global"; +export const MINT_AUTHORITY_SEED = "mint-authority"; +export const BONDING_CURVE_SEED = "bonding-curve"; +export const METADATA_SEED = "metadata"; + +export const DEFAULT_DECIMALS = 6; + +export class PumpFunSDK { + public program: Program; + public connection: Connection; + constructor(provider?: Provider) { + this.program = new Program(IDL as PumpFun, provider); + this.connection = this.program.provider.connection; + } + + async createAndBuy( + creator: Keypair, + mint: Keypair, + createTokenMetadata: CreateTokenMetadata, + buyAmountSol: bigint, + slippageBasisPoints: bigint = 500n, + priorityFees?: PriorityFee, + commitment: Commitment = DEFAULT_COMMITMENT, + finality: Finality = DEFAULT_FINALITY + ): Promise { + let tokenMetadata = await this.createTokenMetadata(createTokenMetadata); + + let createTx = await this.getCreateInstructions( + creator.publicKey, + createTokenMetadata.name, + createTokenMetadata.symbol, + tokenMetadata.metadataUri, + mint + ); + + let newTx = new Transaction().add(createTx); + + if (buyAmountSol > 0) { + const globalAccount = await this.getGlobalAccount(commitment); + const buyAmount = globalAccount.getInitialBuyPrice(buyAmountSol); + const buyAmountWithSlippage = calculateWithSlippageBuy( + buyAmountSol, + slippageBasisPoints + ); + + const buyTx = await this.getBuyInstructions( + creator.publicKey, + mint.publicKey, + globalAccount.feeRecipient, + buyAmount, + buyAmountWithSlippage + ); + + newTx.add(buyTx); + } + + return newTx; + } + + async buy( + buyer: Keypair, + mint: PublicKey, + buyAmountSol: bigint, + slippageBasisPoints: bigint = 500n, + priorityFees?: PriorityFee, + commitment: Commitment = DEFAULT_COMMITMENT, + finality: Finality = DEFAULT_FINALITY + ): Promise { + let final_tx = new Transaction(); + let buyTx = await this.getBuyInstructionsBySolAmount( + buyer.publicKey, + mint, + buyAmountSol, + slippageBasisPoints, + commitment); + final_tx.add(buyTx); + return final_tx; + } + + async sell( + seller: Keypair, + mint: PublicKey, + sellTokenAmount: bigint, + slippageBasisPoints: bigint = 10000n, + priorityFees?: PriorityFee, + commitment: Commitment = DEFAULT_COMMITMENT, + finality: Finality = DEFAULT_FINALITY + ): Promise { + let final_tx = new Transaction(); + let sellTx = await this.getSellInstructionsByTokenAmount( + seller.publicKey, + mint, + sellTokenAmount, + slippageBasisPoints, + commitment + ); + final_tx.add(sellTx); + return final_tx; + } + async getBalance(account: PublicKey, mint: PublicKey) { + console.log("Fetching Ata..."); + const associatedTokenAddress = await getAssociatedTokenAddress( + mint, + account, + true + ); + let accountInfo:any = null + try { + accountInfo = await getAccount(this.connection, associatedTokenAddress, "confirmed"); + } catch (error) { + console.log("Token balance not found"); + return 0; + } + // + accountInfo = await getAccount(this.connection, associatedTokenAddress, "confirmed"); + return accountInfo.amount; + } + //create token instructions + async getCreateInstructions( + creator: PublicKey, + name: string, + symbol: string, + uri: string, + mint: Keypair + ) { + const mplTokenMetadata = new PublicKey(MPL_TOKEN_METADATA_PROGRAM_ID); + + const [metadataPDA] = PublicKey.findProgramAddressSync( + [ + Buffer.from(METADATA_SEED), + mplTokenMetadata.toBuffer(), + mint.publicKey.toBuffer(), + ], + mplTokenMetadata + ); + + const associatedBondingCurve = await getAssociatedTokenAddress( + mint.publicKey, + this.getBondingCurvePDA(mint.publicKey), + true + ); + + return this.program.methods + .create(name, symbol, uri) + .accounts({ + mint: mint.publicKey, + associatedBondingCurve: associatedBondingCurve, + metadata: metadataPDA, + user: creator, + }) + .signers([mint]) + .transaction(); + } + + async getBuyInstructionsBySolAmount( + buyer: PublicKey, + mint: PublicKey, + buyAmountSol: bigint, + slippageBasisPoints: bigint = 500n, + commitment: Commitment = DEFAULT_COMMITMENT + ) { + let bondingCurveAccount = await this.getBondingCurveAccount( + mint, + commitment + ); + if (!bondingCurveAccount) { + throw new Error(`Bonding curve account not found: ${mint.toBase58()}`); + } + + let buyAmount = bondingCurveAccount.getBuyPrice(buyAmountSol); + let buyAmountWithSlippage = calculateWithSlippageBuy( + buyAmountSol, + slippageBasisPoints + ); + + // let globalAccount = await this.getGlobalAccount(commitment); + const feeRecipient = new PublicKey("CebN5WGQ4jvEPvsVU4EoHEpgzq1VV7AbicfhtW4xC9iM"); + return await this.getBuyInstructions( + buyer, + mint, + feeRecipient, + buyAmount, + buyAmountWithSlippage + ); + } + + //buy + async getBuyInstructions( + buyer: PublicKey, + mint: PublicKey, + feeRecipient: PublicKey, + amount: bigint, + solAmount: bigint, + commitment: Commitment = DEFAULT_COMMITMENT + ) { + const associatedBondingCurve = await getAssociatedTokenAddress( + mint, + this.getBondingCurvePDA(mint), + true + ); + + const associatedUser = await getAssociatedTokenAddress(mint, buyer, false); + let transaction = new Transaction(); + // try { + // await getAccount(this.connection, associatedUser, commitment); + // } catch (e) { + transaction.add( + createAssociatedTokenAccountIdempotentInstruction( + buyer, + associatedUser, + buyer, + mint + ) + ); + //} + transaction.add( + await this.program.methods + .buy(new BN(amount.toString()), new BN(solAmount.toString())) + .accounts({ + feeRecipient: feeRecipient, + mint: mint, + associatedBondingCurve: associatedBondingCurve, + associatedUser: associatedUser, + user: buyer, + }) + .transaction() + ); + + return transaction; + } + async delay(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); + } + //sell + async getSellInstructionsByTokenAmount( + seller: PublicKey, + mint: PublicKey, + sellTokenAmount: bigint, + slippageBasisPoints: bigint = 500n, + commitment: Commitment = DEFAULT_COMMITMENT + ) { + + let bondingCurveAccount = await this.getBondingCurveAccount( + mint, + commitment + ); + if (!bondingCurveAccount) { + throw new Error(`Bonding curve account not found: ${mint.toBase58()}`); + } + + let globalAccount = await this.getGlobalAccount(commitment); + + let minSolOutput = bondingCurveAccount.getSellPrice( + sellTokenAmount, + globalAccount.feeBasisPoints + ); + let sellAmountWithSlippage = calculateWithSlippageSell( + minSolOutput, + slippageBasisPoints + ); + return await this.getSellInstructions( + seller, + mint, + globalAccount.feeRecipient, + sellTokenAmount, + sellAmountWithSlippage + ); + } + + async getSellInstructions( + seller: PublicKey, + mint: PublicKey, + feeRecipient: PublicKey, + amount: bigint, + minSolOutput: bigint + ) { + const associatedBondingCurve = await getAssociatedTokenAddress( + mint, + this.getBondingCurvePDA(mint), + true + ); + + const associatedUser = await getAssociatedTokenAddress(mint, seller, false); + + let transaction = new Transaction(); + + transaction.add( + await this.program.methods + .sell(new BN(amount.toString()), new BN(minSolOutput.toString())) + .accounts({ + feeRecipient: feeRecipient, + mint: mint, + associatedBondingCurve: associatedBondingCurve, + associatedUser: associatedUser, + user: seller, + }) + .transaction() + ); + + return transaction; + } + + async getBondingCurveAccount( + mint: PublicKey, + commitment: Commitment = DEFAULT_COMMITMENT + ) { + const tokenAccount = await this.connection.getAccountInfo( + this.getBondingCurvePDA(mint), + commitment + ); + if (!tokenAccount) { + return null; + } + return BondingCurveAccount.fromBuffer(tokenAccount!.data); + } + + async getGlobalAccount(commitment: Commitment = DEFAULT_COMMITMENT) { + const [globalAccountPDA] = PublicKey.findProgramAddressSync( + [Buffer.from(GLOBAL_ACCOUNT_SEED)], + new PublicKey(PROGRAM_ID) + ); + + const tokenAccount = await this.connection.getAccountInfo( + globalAccountPDA, + commitment + ); + + return GlobalAccount.fromBuffer(tokenAccount!.data); + } + + getBondingCurvePDA(mint: PublicKey) { + return PublicKey.findProgramAddressSync( + [Buffer.from(BONDING_CURVE_SEED), mint.toBuffer()], + this.program.programId + )[0]; + } + + async createTokenMetadata(create: CreateTokenMetadata) { + let formData = new FormData(); + formData.append("file", create.file), + formData.append("name", create.name), + formData.append("symbol", create.symbol), + formData.append("description", create.description), + formData.append("twitter", create.twitter || ""), + formData.append("telegram", create.telegram || ""), + formData.append("website", create.website || ""), + formData.append("showName", "true"); + let request = await fetch("https://pump.fun/api/ipfs", { + method: "POST", + body: formData, + }); + return request.json(); + } + + //EVENTS + addEventListener( + eventType: T, + callback: ( + event: PumpFunEventHandlers[T], + slot: number, + signature: string + ) => void + ) { + return this.program.addEventListener( + eventType, + (event: any, slot: number, signature: string) => { + let processedEvent; + switch (eventType) { + case "createEvent": + processedEvent = toCreateEvent(event as CreateEvent); + callback( + processedEvent as PumpFunEventHandlers[T], + slot, + signature + ); + break; + case "tradeEvent": + processedEvent = toTradeEvent(event as TradeEvent); + callback( + processedEvent as PumpFunEventHandlers[T], + slot, + signature + ); + break; + case "completeEvent": + processedEvent = toCompleteEvent(event as CompleteEvent); + callback( + processedEvent as PumpFunEventHandlers[T], + slot, + signature + ); + console.log("completeEvent", event, slot, signature); + break; + case "setParamsEvent": + processedEvent = toSetParamsEvent(event as SetParamsEvent); + callback( + processedEvent as PumpFunEventHandlers[T], + slot, + signature + ); + break; + default: + console.error("Unhandled event type:", eventType); + } + } + ); + } + + removeEventListener(eventId: number) { + this.program.removeEventListener(eventId); + } +} diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/types.ts b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/types.ts new file mode 100644 index 0000000..e42c826 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/types.ts @@ -0,0 +1,80 @@ +import { PublicKey, VersionedTransactionResponse } from "@solana/web3.js"; + +export type CreateTokenMetadata = { + name: string; + symbol: string; + description: string; + file: Blob; + twitter?: string; + telegram?: string; + website?: string; +}; + +export type TokenMetadata = { + name: string; + symbol: string; + description: string; + image: string; + showName: boolean; + createdOn: string; + twitter: string; +}; + +export type CreateEvent = { + name: string; + symbol: string; + uri: string; + mint: PublicKey; + bondingCurve: PublicKey; + user: PublicKey; +}; + +export type TradeEvent = { + mint: PublicKey; + solAmount: bigint; + tokenAmount: bigint; + isBuy: boolean; + user: PublicKey; + timestamp: number; + virtualSolReserves: bigint; + virtualTokenReserves: bigint; + realSolReserves: bigint; + realTokenReserves: bigint; +}; + +export type CompleteEvent = { + user: PublicKey; + mint: PublicKey; + bondingCurve: PublicKey; + timestamp: number; +}; + +export type SetParamsEvent = { + feeRecipient: PublicKey; + initialVirtualTokenReserves: bigint; + initialVirtualSolReserves: bigint; + initialRealTokenReserves: bigint; + tokenTotalSupply: bigint; + feeBasisPoints: bigint; +}; + +export interface PumpFunEventHandlers { + createEvent: CreateEvent; + tradeEvent: TradeEvent; + completeEvent: CompleteEvent; + setParamsEvent: SetParamsEvent; +} + +export type PumpFunEventType = keyof PumpFunEventHandlers; + +export type PriorityFee = { + unitLimit: number; + unitPrice: number; +}; + +export type TransactionResult = { + signature?: string; + error?: unknown; + results?: VersionedTransactionResponse; + success: boolean; +}; diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/util.ts b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/util.ts new file mode 100644 index 0000000..fd14da8 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/util.ts @@ -0,0 +1,131 @@ +import { + Commitment, + ComputeBudgetProgram, + Connection, + Finality, + Keypair, + PublicKey, + SendTransactionError, + Transaction, + TransactionMessage, + VersionedTransaction, + VersionedTransactionResponse, +} from "@solana/web3.js"; +import { PriorityFee, TransactionResult } from "./types"; + +export const DEFAULT_COMMITMENT: Commitment = "processed"; +export const DEFAULT_FINALITY: Finality = "confirmed"; + +export const calculateWithSlippageBuy = ( + amount: bigint, + basisPoints: bigint +) => { + return amount + (amount * basisPoints) / 10000n; +}; + +export const calculateWithSlippageSell = ( + amount: bigint, + basisPoints: bigint +) => { + return amount - (amount * basisPoints) / 10000n; +}; + +export async function sendTx( + connection: Connection, + tx: Transaction, + payer: PublicKey, + signers: Keypair[], + priorityFees?: PriorityFee, + commitment: Commitment = DEFAULT_COMMITMENT, + finality: Finality = DEFAULT_FINALITY +): Promise { + let newTx = new Transaction(); + + if (priorityFees) { + const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({ + units: priorityFees.unitLimit, + }); + + const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: priorityFees.unitPrice, + }); + newTx.add(modifyComputeUnits); + newTx.add(addPriorityFee); + } + + newTx.add(tx); + + let versionedTx = await buildVersionedTx(connection, payer, newTx, commitment); + versionedTx.sign(signers); + + try { + const sig = await connection.sendTransaction(versionedTx, { + skipPreflight: false, + }); + console.log("sig:", `https://solscan.io/tx/${sig}`); + + let txResult = await getTxDetails(connection, sig, commitment, finality); + if (!txResult) { + return { + success: false, + error: "Transaction failed", + }; + } + return { + success: true, + signature: sig, + results: txResult, + }; + } catch (e) { + if (e instanceof SendTransactionError) { + let ste = e as SendTransactionError; + //console.log(await ste.getLogs(connection)); + } else { + console.error(e); + } + return { + error: e, + success: false, + }; + } +} + +export const buildVersionedTx = async ( + connection: Connection, + payer: PublicKey, + tx: Transaction, + commitment: Commitment = DEFAULT_COMMITMENT +): Promise => { + const blockHash = (await connection.getLatestBlockhash(commitment)) + .blockhash; + + let messageV0 = new TransactionMessage({ + payerKey: payer, + recentBlockhash: blockHash, + instructions: tx.instructions, + }).compileToV0Message(); + + return new VersionedTransaction(messageV0); +}; + +export const getTxDetails = async ( + connection: Connection, + sig: string, + commitment: Commitment = DEFAULT_COMMITMENT, + finality: Finality = DEFAULT_FINALITY +): Promise => { + const latestBlockHash = await connection.getLatestBlockhash(); + await connection.confirmTransaction( + { + blockhash: latestBlockHash.blockhash, + lastValidBlockHeight: latestBlockHash.lastValidBlockHeight, + signature: sig, + }, + commitment + ); + + return connection.getTransaction(sig, { + maxSupportedTransactionVersion: 0, + commitment: finality, + }); +}; diff --git a/src/Trading_dev/grpc-pf-sniper/src/streaming/grpc-requests-type.ts b/src/Trading_dev/grpc-pf-sniper/src/streaming/grpc-requests-type.ts new file mode 100644 index 0000000..bc8e52d --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/streaming/grpc-requests-type.ts @@ -0,0 +1,121 @@ +import { + CommitmentLevel, + SubscribeRequest, + } from "@triton-one/yellowstone-grpc"; +import { req } from "pino-std-serializers"; +export async function createSubscribeNewTokenRequest( + targetToken: string | undefined + ): Promise { + let request: any = null; + if (targetToken !== undefined) { + // if has target mint to snipe + request = { + slots: {}, + accounts: {}, + transactions: { + pumpdotfun: { + vote: false, + failed: false, + signature: undefined, + accountInclude: [ + "TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM", + targetToken, + ], + accountExclude: [], + accountRequired: [targetToken], + }, + }, + transactionsStatus: {}, + blocks: {}, + blocksMeta: {}, + accountsDataSlice: [], + commitment: CommitmentLevel.PROCESSED, // Subscribe to processed blocks for the fastest updates + entry: {}, + }; + } else { + // if doesn't have target mint to snipe + request = { + slots: {}, + accounts: {}, + transactions: { + pumpdotfun: { + vote: false, + failed: false, + signature: undefined, + accountInclude: ["TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM"], + accountExclude: [], + accountRequired: [], + }, + }, + transactionsStatus: {}, + blocks: {}, + blocksMeta: {}, + accountsDataSlice: [], + commitment: CommitmentLevel.PROCESSED, // Subscribe to processed blocks for the fastest updates + entry: {}, + }; + } + + return request; + } +export async function createSubscribeTokenRequest(mintAddress: string) { + let request: any = null; + request = { + slots: {}, + accounts: {}, + transactions: { + pumpdotfun: { + vote: false, + failed: false, + signature: undefined, + accountInclude: [mintAddress], + accountExclude: [], + accountRequired: [mintAddress], + }, + }, + transactionsStatus: {}, + blocks: {}, + blocksMeta: {}, + accountsDataSlice: [], + commitment: CommitmentLevel.PROCESSED, // Subscribe to processed blocks for the fastest updates + entry: {}, + }; + return request; +} +export async function createSubscribeTokenInSnipeCacheRequest(snipedTokenList: []){ + let request: any = null; + request = { + slots: {}, + accounts: {}, + transactions: { + pumpdotfun: { + vote: false, + failed: false, + signature: undefined, + accountInclude: ["TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM", ...snipedTokenList], + accountExclude: [], + accountRequired: [], + }, + }, + transactionsStatus: {}, + blocks: {}, + blocksMeta: {}, + accountsDataSlice: [], + commitment: CommitmentLevel.PROCESSED, // Subscribe to processed blocks for the fastest updates + entry: {}, + }; + return request; +} +export async function createClearAllSubscriptionsRequest() { + const request = { + "slots": {}, + "accounts": {}, + "transactions": {}, + "blocks": {}, + "blocksMeta": {}, + "accountsDataSlice": [] + }; + return request; +} + + diff --git a/src/Trading_dev/grpc-pf-sniper/src/streaming/pump.fun.ts b/src/Trading_dev/grpc-pf-sniper/src/streaming/pump.fun.ts new file mode 100644 index 0000000..56c2c2c --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/streaming/pump.fun.ts @@ -0,0 +1,130 @@ +import { + CommitmentLevel, + SubscribeRequest, +} from "@triton-one/yellowstone-grpc"; +import pino from "pino"; +import Client from "@triton-one/yellowstone-grpc"; +import { PublicKey } from "@solana/web3.js"; +import { buy, solanaConnection, sell } from "../transaction/transaction"; +import { storeJitoLeaderSchedule } from "../jito/bundle"; +import { AUTO_SELL, AUTO_SELL_TIMEOUT, GRPC_XTOKEN } from "../constants"; +import * as borsh from "@coral-xyz/borsh"; +import bs58 from "bs58"; +import { Buffer } from "buffer"; +import {createSubscribeNewTokenRequest, createClearAllSubscriptionsRequest, createSubscribeTokenRequest, createSubscribeTokenInSnipeCacheRequest} from "./grpc-requests-type" +import {handleSubscribe} from "./utils" + +const client:any = new Client( + "https://grpc.fra.shyft.to", + GRPC_XTOKEN, + { + "grpc.max_receive_message_length": 64 * 1024 * 1024, // 64MiB + } +); //grpc endpoint +const transport = pino.transport({ + target: "pino-pretty", +}); + +export const logger = pino( + { + level: "info", + serializers: { + error: pino.stdSerializers.err, + }, + base: undefined, + }, + transport +); +// Array to store Jito leaders for current epoch +let leaderSchedule = new Set(); +export async function populateJitoLeaderArray() { + leaderSchedule = await storeJitoLeaderSchedule(); +} + +(async () => { + const version = await client.getVersion(); // gets the version information + logger.info(version); +})(); + +/** + * Waits for a specified timeout and then sells all tokens associated with the given mint address. + * @param mintAddress - The address of the mint associated with the tokens to be sold. + * @param isJito - A boolean value indicating whether the tokens are Jito tokens. + */ +export async function waitAndSellAll(mintAddress: string, isJito: boolean) { + const strinToInt = parseInt(AUTO_SELL_TIMEOUT); + console.log("Selling", mintAddress); + try{ + await new Promise((resolve) => setTimeout(resolve, strinToInt*1000+1000)); // extra 1s to make sure the transaction is confirmed + sell(new PublicKey(mintAddress), isJito); + }catch(e){ + logger.error(`error when selling ${mintAddress}, ${e}`); + } +} + +/** + * Subscribes to a stream and listens for new tokens and snipe it. + * + * @param isAutoSell - Indicates whether to automatically sell tokens. + * @param sellAfterNumberBuys - The number of buys after which to sell tokens. + * @param isJito - Indicates whether to use Jito for buying and selling. + */ +export async function streamAnyNewTokens(isAutoSell: boolean, sellAfterNumberBuys: number, isJito: boolean, n: number) { + const stream = await client.subscribe(); + // Create `error` / `end` handler + + // let sellQueue: string[] = []; + let count = 0; + let currentPumpFunToken: string = ""; + const r1: SubscribeRequest = await createSubscribeNewTokenRequest(undefined); + handleSubscribe(stream, r1); + stream.on("data", (data:any) => { + if (data.transaction !== undefined) { + // sellQueue = []; // clear the queue after selling all + logger.info(`Current slot: ${data.transaction.slot}`); + currentPumpFunToken = data.transaction.transaction.meta.postTokenBalances[0].mint + logger.info(`New token created: ${currentPumpFunToken}`); + if(count < n){ + buy(new PublicKey(currentPumpFunToken), isJito); + logger.info(`Sniped ${1} times`); + if(isAutoSell) waitAndSellAll(currentPumpFunToken, isJito); + count += 1; + } + } + }); + +} + +/** + * Subscribes to a stream and listens for new token creation transactions. + * If the target token is created and meets the specified conditions, it performs a buy action. + * @param mintAddress The address of the target token. + * @param isAutoSell A boolean indicating whether to automatically sell after a certain number of buys. + * @param sellAfterNumberBuys The number of buys after which to automatically sell. + * @param isJito A boolean indicating whether to use Jito for the buy action. + */ +export async function streamTargetNewToken(mintAddress: string, isAutoSell: boolean, sellAfterNumberBuys: number, isJito: boolean) { + const stream = await client.subscribe(); + let count = 0; + // Create `error` / `end` handler + const r1 = await createSubscribeNewTokenRequest(mintAddress); + await handleSubscribe(stream, r1); + stream.on("data", (data:any) => { + if (data.transaction !== undefined) { + logger.info(`Current slot: ${data.transaction.slot}`); + logger.info( + `Target token create tx: https://solscan.io/tx/${bs58.encode(Buffer.from(data.transaction.transaction.signature))}` + ); + const pumpFunNewToken = data.transaction.transaction.meta.postTokenBalances[0].mint + logger.info(`Traget token created: ${pumpFunNewToken}`); + if (pumpFunNewToken === mintAddress && count === 0) { + buy(new PublicKey(pumpFunNewToken), isJito); + if(isAutoSell) waitAndSellAll(pumpFunNewToken, isJito); + logger.info(`Sniped ${count + 1} times`); + count += 1; + } + } + }); +} + + diff --git a/src/Trading_dev/grpc-pf-sniper/src/streaming/snipe-create.ts b/src/Trading_dev/grpc-pf-sniper/src/streaming/snipe-create.ts new file mode 100644 index 0000000..9b8e8de --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/streaming/snipe-create.ts @@ -0,0 +1,75 @@ +import {streamAnyNewTokens, streamTargetNewToken} from "./pump.fun" +import {AUTO_SELL_TIMEOUT} from "../constants" +import {init} from "../transaction/transaction" +import { logger } from "../utils/logger"; +const {program} = require("commander") +let targetTokenToSnipe:string = ""; +let isAutoSell = false; +let sellAfterNumberBuys = 1 +let isJito = false; +let n = 1; + +program.option("--token ", "Specify the token you want to snipe") + .option("-h, --help", "display help for command") + .option("--auto-sell", "Auto sell token after buying") + .option("--sell-after ", "Sell token after number of buys") + .option("--n ", "number of tokens to snipe") + .option("--jito", "Jito mode") + .action((options:any) => { + if (options.help) { + logger.info( + "ts-node snipe-create.ts --token --sell-after --n --auto-sell --jito" + ); + process.exit(0); + } + if(options.token){ + targetTokenToSnipe = options.token + } + if(options.autoSell){ + isAutoSell = true; + } + if(options.sellAfter){ + sellAfterNumberBuys = options.sellAfter; + } + if(options.jito){ + isJito = true; + } + if(options.n){ + n = options.n; + } + }); +program.parse(); + +async function snipe(){ + + // show the options + logger.info(`Auto sell mode enabled: ${isAutoSell}`) + logger.info(`Sell after: ${sellAfterNumberBuys} buys`) + logger.info(`Jito mode enabled: ${isJito}`) + logger.info(`Number of tokens to snipe: ${n}`) + if(isAutoSell){ + logger.info(`Auto sell after ${AUTO_SELL_TIMEOUT} seconds`) + } + // show the target token + if(targetTokenToSnipe === ""){ + logger.info("bot will snipe any new tokens") + } + else logger.info(`bot will snipe ${targetTokenToSnipe}`) + + // initialize the bot + await init(); + // stream the tokens and auto-sell when condition is met + try{ + if(targetTokenToSnipe === ""){ + await streamAnyNewTokens(isAutoSell, sellAfterNumberBuys, isJito, n); + }else{ + await streamTargetNewToken(targetTokenToSnipe, isAutoSell, sellAfterNumberBuys, isJito); + } + }catch(e){ + logger.error(`error when streaming ${e}`); + } + + +} + +snipe(); \ No newline at end of file diff --git a/src/Trading_dev/grpc-pf-sniper/src/streaming/utils.ts b/src/Trading_dev/grpc-pf-sniper/src/streaming/utils.ts new file mode 100644 index 0000000..3233728 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/streaming/utils.ts @@ -0,0 +1,65 @@ +import { + CommitmentLevel, + SubscribeRequest, + } from "@triton-one/yellowstone-grpc"; +import Client from "@triton-one/yellowstone-grpc"; +const PING_INTERVAL_MS = 30_000; + +export async function handleSubscribe(client_stream: any, args: SubscribeRequest){ + // Create `error` / `end` handler + const streamClosed = new Promise((resolve, reject) => { + client_stream.on("error", (error:any) => { + console.log("ERROR", error); + reject(error); + client_stream.end(); + }); + client_stream.on("end", () => { + resolve(); + }); + client_stream.on("close", () => { + resolve(); + }); + }); + + // Send subscribe request + await new Promise((resolve, reject) => { + client_stream.write(args, (err: any) => { + if (err === null || err === undefined) { + resolve(); + } else { + reject(err); + } + }); + }).catch((reason) => { + console.error(reason); + throw reason; + }); + // Send pings every 5s to keep the connection open + const pingRequest: SubscribeRequest = { + ping: { id: 1 }, + // Required, but unused arguments + accounts: {}, + accountsDataSlice: [], + transactions: {}, + blocks: {}, + blocksMeta: {}, + entry: {}, + slots: {}, + }; + setInterval(async () => { + await new Promise((resolve, reject) => { + client_stream.write(pingRequest, (err:any) => { + if (err === null || err === undefined) { + resolve(); + } else { + reject(err); + } + }); + }).catch((reason) => { + console.error(reason); + throw reason; + }); + }, PING_INTERVAL_MS); + + await streamClosed; +} \ No newline at end of file diff --git a/src/Trading_dev/grpc-pf-sniper/src/transaction/index.ts b/src/Trading_dev/grpc-pf-sniper/src/transaction/index.ts new file mode 100644 index 0000000..5c71111 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/transaction/index.ts @@ -0,0 +1 @@ +export * from "./transaction" \ No newline at end of file diff --git a/src/Trading_dev/grpc-pf-sniper/src/transaction/transaction.ts b/src/Trading_dev/grpc-pf-sniper/src/transaction/transaction.ts new file mode 100644 index 0000000..e6cfad6 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/transaction/transaction.ts @@ -0,0 +1,350 @@ +import { + Liquidity, + LiquidityPoolKeys, + LiquidityStateV4, + Token, + TokenAmount, +} from "@raydium-io/raydium-sdk"; +import { + Commitment, + ComputeBudgetProgram, + Connection, + Keypair, + LAMPORTS_PER_SOL, + PublicKey, + SystemProgram, + TransactionMessage, + VersionedTransaction, + Transaction, +} from "@solana/web3.js"; +import fs from "fs"; +import bs58 from "bs58"; +import { + COMMITMENT_LEVEL, + LOG_LEVEL, + PRIVATE_KEY, + QUOTE_AMOUNT, + RPC_ENDPOINT, + RPC_WEBSOCKET_ENDPOINT, + //PRIVATE_KEY_1, +} from "../constants"; +import { + AccountLayout, + createAssociatedTokenAccountIdempotentInstruction, + createCloseAccountInstruction, + getAssociatedTokenAddress, + getAssociatedTokenAddressSync, + TOKEN_PROGRAM_ID, +} from "@solana/spl-token"; +import { TokenInstructions } from "@project-serum/serum"; +import { logger } from "../utils/logger"; +import { + retrieveEnvVariable, + getKeypairByJsonPath, + printSOLBalance, + getSPLBalance, +} from "../utils"; +import { populateJitoLeaderArray } from "../streaming/pump.fun"; +import { sendBundle } from "../jito/bundle"; +import { PumpFunSDK } from "../pumpdotfun-sdk/src/pumpfun"; +import { AnchorProvider } from "@coral-xyz/anchor"; +import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet"; +import { printSPLBalance } from "../pumpdotfun-sdk/example/util"; +let wallet: Keypair; +let dev_wallet: Keypair; +let quoteAmount: TokenAmount; +quoteAmount = new TokenAmount(Token.WSOL, QUOTE_AMOUNT, false); +export const solanaConnection = new Connection(RPC_ENDPOINT, { + wsEndpoint: RPC_WEBSOCKET_ENDPOINT, +}); + +// Init funtions right here + +export async function init(): Promise { + logger.level = LOG_LEVEL; + + // get wallet + wallet = Keypair.fromSecretKey(bs58.decode(PRIVATE_KEY)); + //dev_wallet = Keypair.fromSecretKey(bs58.decode(PRIVATE_KEY_1)); + logger.info(`Wallet Address: ${wallet.publicKey}`); + //logger.info(`Dev Wallet Address: ${dev_wallet.publicKey}`); + + logger.info( + `Script will buy all new tokens on Pump.fun using SOL. Amount that will be used to buy each token is: ${quoteAmount.toFixed().toString()}` + ); + + // check existing wallet for associated token account of quote mint + const SOLBalance = await solanaConnection.getBalance(wallet.publicKey); + // const dev_SOLBalance = await solanaConnection.getBalance( + // dev_wallet.publicKey + // ); + if (SOLBalance === 0) { + throw new Error(`No SOL balance left in wallet: ${wallet.publicKey}`); + } + // if (dev_SOLBalance === 0) { + // throw new Error(`No SOL balance left in wallet: ${dev_wallet.publicKey}`); + // } + const quote_amt = Number(QUOTE_AMOUNT); + if (SOLBalance < quote_amt * LAMPORTS_PER_SOL) { + throw new Error(`Insufficient SOL balance in wallet: ${wallet.publicKey}`); + } + + await populateJitoLeaderArray(); +} + +// non-jito execution functions +async function simple_executeAndConfirm(transaction: VersionedTransaction) { + logger.info("Sent tx!"); + const signature = await simple_execute(transaction); + logger.info(`https://solscan.io/tx/${signature}`); +} + +async function simple_execute(transaction: VersionedTransaction) { + return solanaConnection.sendRawTransaction(transaction.serialize(), { + skipPreflight: true, + maxRetries: 0, + }); +} + +// trading functions right here + +export async function sell( + mintPublicKey: PublicKey, + isJito: Boolean +): Promise { + const Wallet = new NodeWallet(wallet); + const provider = new AnchorProvider(solanaConnection, Wallet, { + commitment: "finalized", + }); + const latestBlockhash = await solanaConnection.getLatestBlockhash({ + commitment: "confirmed", + }); + const sdk = new PumpFunSDK(provider); + console.log("Fetching balance of mint: ", mintPublicKey.toBase58()); + const currentBalanceOfMint = await sdk.getBalance( + wallet.publicKey, + mintPublicKey + ); + if (currentBalanceOfMint === 0) { + logger.info("No balance to sell"); + return; + } + console.log("Current balance of mint: ", currentBalanceOfMint); + + let ata = await getAssociatedTokenAddress(mintPublicKey, wallet.publicKey); + const sellInstruction: Transaction = await sdk.sell( + wallet, + mintPublicKey, + currentBalanceOfMint, + 10000n, + undefined, + "confirmed", + "finalized" + ); + console.log("sellInstruction: ", sellInstruction); + const messageV0 = new TransactionMessage({ + payerKey: wallet.publicKey, + recentBlockhash: latestBlockhash.blockhash, + instructions: [ + ...[ + ComputeBudgetProgram.setComputeUnitLimit({ + units: 71999, + }), + ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: 0.0004 * LAMPORTS_PER_SOL, + }), + ], + ...sellInstruction.instructions, + ], + }).compileToV0Message(); + let commitment: Commitment = retrieveEnvVariable( + "COMMITMENT_LEVEL", + logger + ) as Commitment; + const transaction = new VersionedTransaction(messageV0); + transaction.sign([wallet]); + logger.info("sell tx sent!"); + if (isJito) { + sendBundle(latestBlockhash.blockhash, transaction, mintPublicKey, wallet); // with jito + await new Promise((r) => setTimeout(r, 1000)); + sendBundle( + latestBlockhash.blockhash, + transaction, + mintPublicKey, + dev_wallet + ); // with jito + } else simple_executeAndConfirm(transaction); // without jito +} + +export async function buy( + mintPublicKey: PublicKey, + isJito: Boolean +): Promise { + try { + const Wallet = new NodeWallet(wallet); + const provider = new AnchorProvider(solanaConnection, Wallet, { + commitment: "processed", + }); + const latestBlockhash = await solanaConnection.getLatestBlockhash({ + commitment: "processed", + }); + const sdk = new PumpFunSDK(provider); + let ata = await getAssociatedTokenAddressSync( + mintPublicKey, + wallet.publicKey + ); + // this is where the buy instruction of pump.fun new token will be added + logger.info(`Sniping token: ${mintPublicKey.toBase58()}`); + const buyInstruction: Transaction = await sdk.buy( + wallet, + mintPublicKey, + BigInt(Number(quoteAmount.toFixed()) * LAMPORTS_PER_SOL) + ); + + const messageV0 = new TransactionMessage({ + payerKey: wallet.publicKey, + recentBlockhash: latestBlockhash.blockhash, + instructions: [ + ...[ + ComputeBudgetProgram.setComputeUnitLimit({ + units: 71900, + }), + ], + createAssociatedTokenAccountIdempotentInstruction( + wallet.publicKey, + ata, + wallet.publicKey, + mintPublicKey + ), + ...buyInstruction.instructions, + ], + }).compileToV0Message(); + + let commitment: Commitment = retrieveEnvVariable( + "COMMITMENT_LEVEL", + logger + ) as Commitment; + + const transaction = new VersionedTransaction(messageV0); + + transaction.sign([wallet]); + + //await sleep(30000); + logger.info("buy tx sent!"); + /*const signature = await solanaConnection.sendRawTransaction(transaction.serialize(), { + preflightCommitment: commitment, + }); + */ + //logger.info(`Sending bundle transaction with mint - ${signature}`); + if (isJito) + sendBundle(latestBlockhash.blockhash, transaction, mintPublicKey, wallet); // with jito + else simple_executeAndConfirm(transaction); // without jito + } catch (error) { + logger.error(error); + } +} + +export async function createAndBuy( + pathToMintKeypair: string, + tokenMetadata: any, + initialBuySolAmount: number +) { + const Wallet = new NodeWallet(dev_wallet); + const provider = new AnchorProvider(solanaConnection, Wallet, { + commitment: "processed", + }); + + const sdk = new PumpFunSDK(provider); + const mintKeypair = await getKeypairByJsonPath(pathToMintKeypair); + console.log("Mint keypair: ", mintKeypair); + await printSOLBalance( + solanaConnection, + dev_wallet.publicKey, + "Dev wallet keypair" + ); + let bondingCurveAccount = await sdk.getBondingCurveAccount( + mintKeypair.publicKey + ); + if (!bondingCurveAccount) { + // the mint is not exist in pump.fun yet + const latestBlockhash = await solanaConnection.getLatestBlockhash({ + commitment: "processed", + }); + let createAndBuyInstruction: Transaction = await sdk.createAndBuy( + dev_wallet, + mintKeypair, + tokenMetadata, + BigInt(initialBuySolAmount * LAMPORTS_PER_SOL) + ); + const messageV0 = new TransactionMessage({ + payerKey: dev_wallet.publicKey, + recentBlockhash: latestBlockhash.blockhash, + instructions: [ + ...[ + ComputeBudgetProgram.setComputeUnitLimit({ + units: 250000, + }), + ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: 0.004 * LAMPORTS_PER_SOL, + }), + ], + ...createAndBuyInstruction.instructions, + ], + }).compileToV0Message(); + + let commitment: Commitment = retrieveEnvVariable( + "COMMITMENT_LEVEL", + logger + ) as Commitment; + + const transaction = new VersionedTransaction(messageV0); + + transaction.sign([dev_wallet, mintKeypair]); + + //await sleep(30000); + logger.info("create and buy tx sent!"); + /*const signature = await solanaConnection.sendRawTransaction(transaction.serialize(), { + preflightCommitment: commitment, + }); + */ + //logger.info(`Sending bundle transaction with mint - ${signature}`); + // await simple_executeAndConfirm(transaction); + await sendBundle( + latestBlockhash.blockhash, + transaction, + mintKeypair.publicKey, + dev_wallet + ); // with jito + // wait for 2 seconds for the transaction to be processed + await new Promise((r) => setTimeout(r, 1000)); + bondingCurveAccount = await sdk.getBondingCurveAccount( + mintKeypair.publicKey + ); + logger.info("Bonding curve after create and buy", bondingCurveAccount); + printSPLBalance( + solanaConnection, + mintKeypair.publicKey, + dev_wallet.publicKey + ); + } +} + +async function main() { + const pathToMintKeypair = + "/Users/chiwangso/Desktop/beta-memecoin-cli/src/Trading/Sniper_dev/grpc-pump.fun-bot/test-token-keypairs/soC5qgyb82XUQiEPEYsHspNtiKYcYsQiKeNSoiihyG9.json"; + let tokenMetadata = { + name: "Juice Wrld", + symbol: "JW", + description: "YES, how?", + telegram: "", + twitter: "", + website: "", + file: await fs.openAsBlob( + "/Users/chiwangso/Desktop/beta-memecoin-cli/src/Trading/pumpfun-bundler-cli/pumpfunsdk-js/pumpdotfun-sdk/images/999.jpg" // change your own path + ), + }; + let initialBuySolAmount = 0.02; + await init(); + await createAndBuy(pathToMintKeypair, tokenMetadata, initialBuySolAmount); +} +// main() diff --git a/src/Trading_dev/grpc-pf-sniper/src/utils/index.ts b/src/Trading_dev/grpc-pf-sniper/src/utils/index.ts new file mode 100644 index 0000000..d90cdf8 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './utils'; +export * from './logger'; \ No newline at end of file diff --git a/src/Trading_dev/grpc-pf-sniper/src/utils/logger.ts b/src/Trading_dev/grpc-pf-sniper/src/utils/logger.ts new file mode 100644 index 0000000..393068e --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/utils/logger.ts @@ -0,0 +1,17 @@ +import pino from "pino"; + +const transport = pino.transport({ + target: 'pino-pretty', +}); + +export const logger = pino( + { + level: 'info', + redact: ['poolKeys'], + serializers: { + error: pino.stdSerializers.err, + }, + base: undefined, + }, + transport, +); diff --git a/src/Trading_dev/grpc-pf-sniper/src/utils/utils.ts b/src/Trading_dev/grpc-pf-sniper/src/utils/utils.ts new file mode 100644 index 0000000..0d22abd --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/src/utils/utils.ts @@ -0,0 +1,70 @@ +import { Logger } from 'pino'; +import dotenv from 'dotenv'; +import fs from "fs"; +import { Keypair, LAMPORTS_PER_SOL } from '@solana/web3.js'; +import { Connection } from '@solana/web3.js'; +import { PublicKey } from '@solana/web3.js'; +import { getAssociatedTokenAddressSync } from '@solana/spl-token'; +dotenv.config(); + +export const retrieveEnvVariable = (variableName: string, logger: Logger) => { + const variable = process.env[variableName] || ''; + if (!variable) { + logger.error(`${variableName} is not set`); + process.exit(1); + } + return variable; +}; + +export function getKeypairByJsonPath(jsonPath: string): any { + try { + const keypairJson = fs.readFileSync(jsonPath, "utf-8"); + const data = JSON.parse(keypairJson); + const mintKeypair = Keypair.fromSecretKey(Uint8Array.from(data)); + return mintKeypair + } catch (e) { + console.log(e); + } +} +export async function printSOLBalance ( + connection: Connection, + pubKey: PublicKey, + info = "" +) { + const balance = await connection.getBalance(pubKey); + console.log( + `${info ? info + " " : ""}${pubKey.toBase58()}:`, + balance / LAMPORTS_PER_SOL, + `SOL` + ); +}; + +export async function getSPLBalance ( + connection: Connection, + mintAddress: PublicKey, + pubKey: PublicKey, + allowOffCurve = false +) { + try { + let ata = getAssociatedTokenAddressSync(mintAddress, pubKey, allowOffCurve); + const balance = await connection.getTokenAccountBalance(ata, "processed"); + return balance.value.uiAmount; + } catch (e) {} + return null; +}; +async function printSPLBalance ( + connection: Connection, + mintAddress: PublicKey, + user: PublicKey, + info = "" +) { + const balance = await getSPLBalance(connection, mintAddress, user); + if (balance === null) { + console.log( + `${info ? info + " " : ""}${user.toBase58()}:`, + "No Account Found" + ); + } else { + console.log(`${info ? info + " " : ""}${user.toBase58()}:`, balance); + } +}; \ No newline at end of file diff --git a/src/helpers/.env.copy b/src/helpers/.env.copy index 5e3ccf1..f00fc2b 100644 --- a/src/helpers/.env.copy +++ b/src/helpers/.env.copy @@ -14,4 +14,22 @@ BLOXROUTE_FEE = 0.001 TAKE_PROFIT = 0.1 # sell when price up 10% STOP_LOST = 0.2 # sell when price down 20% SMART_MONEY_WALLET = "YOUR_SMART_MONEY_WALLET" -BLOXROUTE_AUTH_HEADER = "BLOXROUTE_AUTH_HEADER" # to get, go to https://docs.bloxroute.com/apis/authorization-headers \ No newline at end of file +BLOXROUTE_AUTH_HEADER = "BLOXROUTE_AUTH_HEADER" # to get, go to https://docs.bloxroute.com/apis/authorization-headers + + +# for grpc development +COMMITMENT_LEVEL=confirmed +GRPC_XTOKEN=YOUR_GRPC_XTOKEN # the shyft one is great +LOG_LEVEL=info +BLOCK_ENGINE_URL=tokyo.mainnet.block-engine.jito.wtf +# choose one of this endpoint closest to you +# amsterdam.mainnet.block-engine.jito.wtf +# frankfurt.mainnet.block-engine.jito.wtf +# slc.mainnet.block-engine.jito.wtf +# tokyo.mainnet.block-engine.jito.wtf +# ny.mainnet.block-engine.jito.wtf + + # for grpc pump.fun sniper bot +QUOTE_AMOUNT=0.05 # in SOL +AUTO_SELL=true # true or false +AUTO_SELL_TIMEOUT=5 # in seconds diff --git a/src/helpers/index.ts b/src/helpers/index.ts index b6b2146..4811d57 100644 --- a/src/helpers/index.ts +++ b/src/helpers/index.ts @@ -2,4 +2,6 @@ export * from "./config"; export * from "./util"; export * from "./unwrap_sol"; export * from "./check_balance"; -export * from "./wrap_sol"; \ No newline at end of file +export * from "./wrap_sol"; +export * from "./logger"; +export * from "./utils"; \ No newline at end of file diff --git a/src/helpers/logger.ts b/src/helpers/logger.ts new file mode 100644 index 0000000..393068e --- /dev/null +++ b/src/helpers/logger.ts @@ -0,0 +1,17 @@ +import pino from "pino"; + +const transport = pino.transport({ + target: 'pino-pretty', +}); + +export const logger = pino( + { + level: 'info', + redact: ['poolKeys'], + serializers: { + error: pino.stdSerializers.err, + }, + base: undefined, + }, + transport, +); diff --git a/src/helpers/util.ts b/src/helpers/util.ts index fd69a48..c78dd68 100644 --- a/src/helpers/util.ts +++ b/src/helpers/util.ts @@ -22,16 +22,6 @@ import { ComputeBudgetProgram, } from "@solana/web3.js"; -/** - * Retrieves the number of decimals for a given mint address. - * @param {PublicKey} mintAddress - The address of the mint. - * @returns {Promise} The number of decimals. - */ -export async function getDecimals(mintAddress:PublicKey) { - const info:any = await connection.getParsedAccountInfo(mintAddress); - const result = (info.value?.data).parsed.info.decimals || 0; - return result; -} /** * Retrieves the metadata of a token based on its address. * @param {string} address - The address of the token. diff --git a/src/helpers/utils.ts b/src/helpers/utils.ts new file mode 100644 index 0000000..f147c35 --- /dev/null +++ b/src/helpers/utils.ts @@ -0,0 +1,115 @@ +import { Logger } from "pino"; +import dotenv from "dotenv"; +import fs from "fs"; +import { Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js"; +import { Connection, PublicKey } from "@solana/web3.js"; +import { getAssociatedTokenAddressSync } from "@solana/spl-token"; +import { connection } from "./config"; +dotenv.config(); + +export const TOKEN_PROGRAM_ID = new PublicKey( + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" +); +export const retrieveEnvVariable = (variableName: string, logger: Logger) => { + const variable = process.env[variableName] || ""; + if (!variable) { + logger.error(`${variableName} is not set`); + process.exit(1); + } + return variable; +}; + +export function getKeypairByJsonPath(jsonPath: string): any { + try { + const keypairJson = fs.readFileSync(jsonPath, "utf-8"); + const data = JSON.parse(keypairJson); + const mintKeypair = Keypair.fromSecretKey(Uint8Array.from(data)); + return mintKeypair; + } catch (e) { + console.log(e); + } +} +export async function printSOLBalance( + connection: Connection, + pubKey: PublicKey, + info = "" +) { + const balance = await connection.getBalance(pubKey); + console.log( + `${info ? info + " " : ""}${pubKey.toBase58()}:`, + balance / LAMPORTS_PER_SOL, + `SOL` + ); +} + +export async function getSPLBalance( + connection: Connection, + mintAddress: PublicKey, + pubKey: PublicKey, + allowOffCurve = false +): Promise { + try { + let ata = getAssociatedTokenAddressSync(mintAddress, pubKey, allowOffCurve); + const balance = await connection.getTokenAccountBalance(ata, "processed"); + return balance.value.uiAmount || 0; + } catch (e) {} + return 0; +} +export async function printSPLBalance( + connection: Connection, + mintAddress: PublicKey, + user: PublicKey, + info = "" +) { + const balance = await getSPLBalance(connection, mintAddress, user); + if (balance === null) { + console.log( + `${info ? info + " " : ""}${user.toBase58()}:`, + "No Account Found" + ); + } else { + console.log(`${info ? info + " " : ""}${user.toBase58()}:`, balance); + } +} +export async function retriveWalletState(wallet_address: string) { + try { + const filters = [ + { + dataSize: 165, //size of account (bytes) + }, + { + memcmp: { + offset: 32, //location of our query in the account (bytes) + bytes: wallet_address, //our search criteria, a base58 encoded string + }, + }, + ]; + const accounts = await connection.getParsedProgramAccounts( + TOKEN_PROGRAM_ID, //new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") + { filters: filters } + ); + let results: any = {}; + const solBalance = await connection.getBalance( + new PublicKey(wallet_address) + ); + accounts.forEach((account, i) => { + //Parse the account data + const parsedAccountInfo: any = account.account.data; + const mintAddress = parsedAccountInfo["parsed"]["info"]["mint"]; + const tokenBalance = + parsedAccountInfo["parsed"]["info"]["tokenAmount"]["uiAmount"]; + results[mintAddress] = tokenBalance; + }); + results["SOL"] = solBalance / 10 ** 9; + return results || {}; + } catch (e) { + console.log(e); + } + return {}; +} + +export async function getDecimals(mintAddress: PublicKey): Promise { + const info: any = await connection.getParsedAccountInfo(mintAddress); + const result = (info.value?.data).parsed.info.decimals || 0; + return result; +} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..4a21e4c --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from "../helpers/utils"; +export * from "../helpers/logger"; diff --git a/tsconfig.json b/tsconfig.json index ca6b4a4..2aaa2ed 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -77,6 +77,7 @@ // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "resolveJsonModule": true, "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ From 342704fc94f9f3ffcbbc5daaa358eadea1946d0a Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 31 Aug 2024 10:46:48 +0800 Subject: [PATCH 036/140] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5fb0d6d..7429598 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,14 @@ - land transactions faster using Jito/bloXroute -- Fastest Copy Trade Program - - Fetch the real-time lp-burn percentage, pool reserve and market cap of any liquidity pool - fixed % tp/sl module +- Open-Source grpc pump.fun sniper bot (0-1x seconds latency) [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/Trading_dev/grpc-pf-sniper) + +- Open-Source grpc copy bot [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/Trading_dev/grpc-copy-bot) + - **_Got everything needed to create your own trading bot_** ## Credits From 2573fb764efc44355b28a45ab8a3ac9edb5e22ab Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 31 Aug 2024 11:05:43 +0800 Subject: [PATCH 037/140] fix error in grpc-copy-bot/ --- src/Trading_dev/grpc-copy-bot/src/raydium/utils.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Trading_dev/grpc-copy-bot/src/raydium/utils.ts b/src/Trading_dev/grpc-copy-bot/src/raydium/utils.ts index dac1445..3bd48f8 100644 --- a/src/Trading_dev/grpc-copy-bot/src/raydium/utils.ts +++ b/src/Trading_dev/grpc-copy-bot/src/raydium/utils.ts @@ -10,15 +10,15 @@ export const initSdk = async () => { connection: connection, cluster: "mainnet", disableFeatureCheck: true, - disableLoadToken: false, - blockhashCommitment: "processed", + disableLoadToken: true, + blockhashCommitment: "confirmed", }); return raydium; }; export async function fetchAMMPoolId(tokenAddress: string): Promise { const raydium = await initSdk(); - const data = await raydium.api.fetchPoolByMints({ + const data:any = await raydium.api.fetchPoolByMints({ mint1: wsol, mint2: tokenAddress, }); From f41eb3d220e8a6733e48fd69510a8ef810b3fdf4 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 31 Aug 2024 13:14:20 +0800 Subject: [PATCH 038/140] improve the copy-trade --- .../grpc-copy-bot/src/raydium/sell-helper.ts | 4 +- .../grpc-copy-bot/src/raydium/swap.ts | 13 +- .../src/streaming/stream-trader.ts | 184 ++++-------------- 3 files changed, 42 insertions(+), 159 deletions(-) diff --git a/src/Trading_dev/grpc-copy-bot/src/raydium/sell-helper.ts b/src/Trading_dev/grpc-copy-bot/src/raydium/sell-helper.ts index c52690c..9194903 100644 --- a/src/Trading_dev/grpc-copy-bot/src/raydium/sell-helper.ts +++ b/src/Trading_dev/grpc-copy-bot/src/raydium/sell-helper.ts @@ -4,6 +4,6 @@ import {connection} from "../constants" import { VersionedTransaction } from "@solana/web3.js"; -export async function sell(side = "sell", address: string, sell_percentage: number, payer: Keypair): Promise { - return await swap(side, address, -1, sell_percentage, payer, "trade", connection); +export async function sell(side = "sell", address: string, sell_amount: number, payer: Keypair): Promise { + return await swap(side, address, -1, sell_amount, payer, "trade", connection); } diff --git a/src/Trading_dev/grpc-copy-bot/src/raydium/swap.ts b/src/Trading_dev/grpc-copy-bot/src/raydium/swap.ts index 24d00cf..6868c28 100644 --- a/src/Trading_dev/grpc-copy-bot/src/raydium/swap.ts +++ b/src/Trading_dev/grpc-copy-bot/src/raydium/swap.ts @@ -102,7 +102,7 @@ async function swapOnlyAmm(input: any): Promise { * @param {string} side - The side of the swap operation ("buy" or "sell"). * @param {string} tokenAddr - The address of the token involved in the swap. * @param {number} buy_AmountOfSol - The amount of SOL to buy (only applicable for "buy" side). - * @param {number} sell_PercentageOfToken - The percentage of the token to sell (only applicable for "sell" side). + * @param {number} sell_AmountOfToken - The amount of Token to sell (only applicable for "sell" side). * @param {object} payer_wallet - The payer's wallet object. * @param {string} usage - The usage of the swap operation. * @param {object} connection_obj - The connection object. @@ -112,7 +112,7 @@ export async function swap( side: string, tokenAddr: string, buy_AmountOfSol: number, - sell_PercentageOfToken: number, + sell_AmountOfToken: number, payer_wallet: Keypair, usage: string, connection_obj: Connection @@ -221,13 +221,7 @@ export async function swap( ); return Object.create(null); } - const balnaceOfToken = await getSPLBalance( - connection_obj, - new PublicKey(tokenAddress), - payer_wallet.publicKey - ); - const percentage = sell_PercentageOfToken; - const amount = new Decimal(percentage * balnaceOfToken); + const amount = new Decimal(sell_AmountOfToken); const slippage = new Percent(5, 100); const inputTokenAmount = new TokenAmount( inputToken, @@ -235,7 +229,6 @@ export async function swap( ); const input = { outputToken, - sell_PercentageOfToken, targetPool, inputTokenAmount, slippage, diff --git a/src/Trading_dev/grpc-copy-bot/src/streaming/stream-trader.ts b/src/Trading_dev/grpc-copy-bot/src/streaming/stream-trader.ts index 10f2997..107dd9b 100644 --- a/src/Trading_dev/grpc-copy-bot/src/streaming/stream-trader.ts +++ b/src/Trading_dev/grpc-copy-bot/src/streaming/stream-trader.ts @@ -13,6 +13,7 @@ import { connection, quoteToken, wallet, GRPC_XTOKEN } from "../constants/consta import { sell, buy } from "../raydium"; let trader_balance_wallet:any = {}; let targetTrader = ""; +export const raydium_authority = "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1"; // ***it represent the person who extract/put the sol/token to the pool for every raydium swap txn*** const client = new Client( "https://grpc.fra.shyft.to", GRPC_XTOKEN, @@ -49,172 +50,61 @@ export async function checkTraderBuyOrSell(data: any, traderAddress: string) { const preTokenBalances = data.transaction.transaction.meta.preTokenBalances; const postTokenBalances = data.transaction.transaction.meta.postTokenBalances; const latestBlockhash = await connection.getLatestBlockhash("processed"); - let targetToken = ""; + let targetToken = "", postPoolSOL=0, postPoolToken=0, prePoolSOL=0, prePoolToken=0, side = ""; // look for the token that the trader is buying or selling - for (let i = 0; i < preTokenBalances.length; i++) { - if ( - preTokenBalances[i].owner === traderAddress && - preTokenBalances[i].mint !== wsol - ) { - targetToken = preTokenBalances[i].mint; - break; + for (const account of preTokenBalances) { + if (targetToken !== "" && prePoolSOL !== 0 && prePoolToken!==0) break; // make sure we get the target token and pool sol balances and trader address only + if (account.owner === raydium_authority && account.mint !== wsol) targetToken = account.mint; + if (account.owner === raydium_authority && account.mint === wsol) { + prePoolSOL = account.uiTokenAmount.uiAmount; + } + if (account.owner === raydium_authority && account.mint !== wsol) { + prePoolToken = account.uiTokenAmount.uiAmount; } } - for (let i = 0; i < postTokenBalances.length; i++) { - if ( - postTokenBalances[i].owner === traderAddress && - postTokenBalances[i].mint !== wsol - ) { - targetToken = postTokenBalances[i].mint; - break; + for (const account of postTokenBalances) { + if (postPoolSOL !== 0 && postPoolToken!==0) break; // make sure we get the target token and pool sol balances and trader address only + if (account.owner === raydium_authority && account.mint !== wsol ) targetToken = account.mint; + if (account.owner === raydium_authority && account.mint === wsol) { + postPoolSOL = account.uiTokenAmount.uiAmount; + } + if (account.owner === raydium_authority && account.mint !== wsol) { + postPoolToken = account.uiTokenAmount.uiAmount; } } if (targetToken === "") return; - const old_wallet_state = trader_balance_wallet; - trader_balance_wallet = await retriveWalletState(traderAddress); - console.log("Old wallet state: ", old_wallet_state); - console.log("New wallet state: ", trader_balance_wallet); - if (trader_balance_wallet[wsol] < old_wallet_state[wsol]) { - logger.info(`Trader is buying ${targetToken} using WSOL`); - let buy_percentage = Math.abs( - (trader_balance_wallet[wsol] - old_wallet_state[wsol]) / - old_wallet_state[wsol] - ); - console.log("Buy percentage: ", buy_percentage); - const ourWsolBalance = await getSPLBalance( - connection, - new PublicKey(wsol), - wallet.publicKey - ); - console.log(`We are using ${ourWsolBalance * buy_percentage} WSOL`); - const { pool, txn } = await buy( - "buy", - targetToken, - buy_percentage * ourWsolBalance, - wallet - ); - sendBundle(latestBlockhash.blockhash, txn, pool, wallet); - } else if (trader_balance_wallet[wsol] > old_wallet_state[wsol]) { - logger.info(`Trader is selling ${targetToken} for WSOL`); - let newBalanceOfToken = 0; - if (targetToken in trader_balance_wallet) - newBalanceOfToken = trader_balance_wallet[targetToken]; - let sell_percentage = Math.abs( - (newBalanceOfToken - old_wallet_state[targetToken]) / - old_wallet_state[targetToken] - ); - console.log("Sell percentage: ", sell_percentage); - const ourTokenBalance = await getSPLBalance( - connection, - new PublicKey(targetToken), - wallet.publicKey - ); - if (ourTokenBalance === 0) { - logger.info(`We don't have any ${targetToken} to sell`); - return; - } - const { pool, txn } = await sell( - "sell", - targetToken, - sell_percentage, - wallet - ); - sendBundle(latestBlockhash.blockhash, txn, pool, wallet); - // wait for 1 second and send again - await new Promise((resolve) => setTimeout(resolve, 1000)); - sendBundle(latestBlockhash.blockhash, txn, pool, wallet); - } else if (trader_balance_wallet["SOL"] < old_wallet_state["SOL"]) { - logger.info(`Trader is buying ${targetToken} using SOL`); - let buy_percentage = Math.abs( - (trader_balance_wallet["SOL"] - old_wallet_state["SOL"]) / - old_wallet_state["SOL"] - ); - console.log("Buy percentage: ", buy_percentage); - const ourWsolBalance = await getSPLBalance( - connection, - new PublicKey(wsol), - wallet.publicKey - ); - console.log(`We are using ${ourWsolBalance * buy_percentage} WSOL`); + let swappedSOLAmount = 0, swappedTokenAmount = 0; + if(postPoolSOL > prePoolSOL){ + side = "buy"; + swappedSOLAmount = postPoolSOL - prePoolSOL; + swappedTokenAmount = prePoolToken - postPoolToken; + } + else { + side = "sell"; + swappedSOLAmount = prePoolSOL - postPoolSOL; + swappedTokenAmount = postPoolToken - prePoolToken; + } + if(side==="buy") { + logger.info(`Trader ${traderAddress} is ${side}ing ${swappedTokenAmount} of ${targetToken} using ${swappedSOLAmount}SOL in price of ${postPoolSOL/postPoolToken}`); const { pool, txn } = await buy( "buy", targetToken, - buy_percentage * ourWsolBalance, + swappedSOLAmount, wallet ); sendBundle(latestBlockhash.blockhash, txn, pool, wallet); - } else if (trader_balance_wallet["SOL"] > old_wallet_state["SOL"]) { - logger.info(`Trader is selling ${targetToken} for SOL`); - let newBalanceOfToken = 0; - if (targetToken in trader_balance_wallet) - newBalanceOfToken = trader_balance_wallet[targetToken]; - let sell_percentage = Math.abs( - (newBalanceOfToken - old_wallet_state[targetToken]) / - old_wallet_state[targetToken] - ); - console.log("Sell percentage: ", sell_percentage); - const ourTokenBalance = await getSPLBalance( - connection, - new PublicKey(targetToken), - wallet.publicKey - ); - if (ourTokenBalance === 0) { - logger.info(`We don't have any ${targetToken} to sell`); - return; - } + }else{ + logger.info(`Trader ${traderAddress} is ${side}ing ${swappedTokenAmount} of ${targetToken} for ${swappedSOLAmount}SOL in price of ${postPoolSOL/postPoolToken}`); const { pool, txn } = await sell( "sell", targetToken, - sell_percentage, + swappedTokenAmount, wallet ); sendBundle(latestBlockhash.blockhash, txn, pool, wallet); - // wait for 1 second and send again - await new Promise((resolve) => setTimeout(resolve, 1000)); - sendBundle(latestBlockhash.blockhash, txn, pool, wallet); - } else { - // check if the trader is swapping tokens - let increasedToken = "", - decreasedToken = ""; - for (const mint in trader_balance_wallet) { - if (mint === wsol || mint === "SOL") { - continue; - } - if (increasedToken && decreasedToken) { - break; - } - const prevBalance = old_wallet_state[mint] || 0; - const currentBalance = trader_balance_wallet[mint]; - - if (currentBalance > prevBalance) { - increasedToken = mint; - } else if (currentBalance < prevBalance) { - decreasedToken = mint; - } - } - if (increasedToken && decreasedToken) { - logger.info(`Trader is swapping ${decreasedToken} for ${increasedToken}`); - let swap_percentage = Math.abs( - (trader_balance_wallet[decreasedToken] - - old_wallet_state[decreasedToken]) / - old_wallet_state[decreasedToken] - ); - console.log("Swap percentage: ", swap_percentage); - // we use wsol as the quote token to buy the increased token - const ourWsolBalance = await getSPLBalance( - connection, - new PublicKey(wsol), - wallet.publicKey - ); - const { pool, txn } = await buy( - "buy", - increasedToken, - swap_percentage * ourWsolBalance, - wallet - ); - sendBundle(latestBlockhash.blockhash, txn, pool, wallet); - } } + + } export async function streamTargetTrader(traderAddress: string) { From 5b87f4b24f46a98f0eb7f07fdbaf9cf7f292ac86 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 31 Aug 2024 18:29:49 +0800 Subject: [PATCH 039/140] add command.sh in src/Trading_dev/grpc-pf-sniper/ --- src/Trading_dev/grpc-pf-sniper/command.sh | 1 + src/helpers/config.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 src/Trading_dev/grpc-pf-sniper/command.sh diff --git a/src/Trading_dev/grpc-pf-sniper/command.sh b/src/Trading_dev/grpc-pf-sniper/command.sh new file mode 100644 index 0000000..7e81208 --- /dev/null +++ b/src/Trading_dev/grpc-pf-sniper/command.sh @@ -0,0 +1 @@ +ts-node src/streaming/snipe-create.ts --auto-sell --jito --n 3 \ No newline at end of file diff --git a/src/helpers/config.ts b/src/helpers/config.ts index eddde61..8b6cd51 100644 --- a/src/helpers/config.ts +++ b/src/helpers/config.ts @@ -13,7 +13,7 @@ import fs from "fs"; import dotenv from "dotenv"; import bs58 from "bs58"; import path from "path"; -// default path: /Users/{your_user_name}/Desktop/Solana-Memecoin-CLI/src/helpers/.env +// default path: /Users/{your_user_name}/Desktop/solana-trading-cli/src/helpers/.env // please specify your own .env path const envPath = path.join(__dirname, ".env"); dotenv.config({ From 904f834647d455af9c0dd4850218246f97eb9df7 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 31 Aug 2024 18:44:37 +0800 Subject: [PATCH 040/140] add README.md in src/Trading_dev/grpc-copy-bot/ --- src/Trading_dev/grpc-copy-bot/README.md | 42 +++++++++++++++++++----- src/Trading_dev/grpc-pf-sniper/README.md | 6 ++-- src/utils/index.ts | 2 +- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/Trading_dev/grpc-copy-bot/README.md b/src/Trading_dev/grpc-copy-bot/README.md index 5ec58e3..0fdf3b7 100644 --- a/src/Trading_dev/grpc-copy-bot/README.md +++ b/src/Trading_dev/grpc-copy-bot/README.md @@ -1,8 +1,34 @@ -# Implementation Details -- grpc copy bot to support any trades on raydium. -- expected latency would be in 1-3 block = (0.4 - 1.2s). -- expected slippage would be in 3-5% range. -- jito tips is decided by the user, to send to the closet jito block engine. -- Our buy/sell amount depends on the trader -- our buy amount using SOL = (-(trader's new sol balance - trader's old sol balance) / trader's old sol price) * our current sol balance -- our sell amount of the token = (-(trader's new token balance - trader's old token balance) / trader's old token price) * our current token balance +#*Geyser grpc Pump.fun Sniper Bot (Beta)* + +## How it works + +- It uses the geyser grpc plugin that subscribe all the latest slot that receive from the grpc server. +- It basically only consider the slot or block in "processed" commitment level to make sure the request can land in the next block or next few block(what we expected). + +- Use a grpc subscription to subscribe the transactions that including the target smart wallet address and listen for the swap transactions. +- Once the swap event is detected, it calculate the how much token the trader bought or how much token the trader sold by considering the number of token and sol changes in the liquidity pool. +- The entry/exit price is calculated by the formula: entry/exit price = post SOL in Pool / post token in Pool + +## Limitations +- It only works on raydium swap transactions now. +- It uses SOL for settlement, buy using SOL and sell for SOL. + +## Prerequisites + +- run `ts-node src/streaming/copy-trade.ts -h` to test the copy-trade command and see the available options +- to change the parameters, you can modify the .env file +- to have a try, run ```ts-node /Users/{your_path_to_this_dir}/src/streaming/copy-trade.ts --trader your_target_trader_address``` + +## Code usage + +- constants/constants.ts: retriving the variable in .env + +- src/streaming/copy-trade.ts: a cli interface to interact the whole dir + +- streaming/stream-trader.ts: subscribing any trader's swap txns of newest block in processed level + +- src/jito/bundle.ts: sending the bundle with tips to jito + +- src/streaming/grpc-requests-type.ts: different grpc request types for monitoring the target trader + +- src/raydium/*.ts: constructing the proper instructions of buy and sell on raydium \ No newline at end of file diff --git a/src/Trading_dev/grpc-pf-sniper/README.md b/src/Trading_dev/grpc-pf-sniper/README.md index b339f8a..761577d 100644 --- a/src/Trading_dev/grpc-pf-sniper/README.md +++ b/src/Trading_dev/grpc-pf-sniper/README.md @@ -2,15 +2,15 @@ ## How it works -- It uses the geyser grpc plugin that subscribe all the latest slot that receive from the validators of your grpc endpoint. -- It basically only consider the slot or block in "processed" commitment level to make sure the request can land in the next block. +- It uses the geyser grpc plugin that subscribe all the latest slot that receive from the grpc server. +- It basically only consider the slot or block in "processed" commitment level to make sure the request can land in the next block or next few block(what we expected). + - Use a grpc subscription to subscribe the transactions that including the solana account of the Pump.fun Token Mint Authority and listen for the mint event (https://solscan.io/account/TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM). - Once the mint event is detected, it will create a snipe transaction to snipe the token! ## Prerequisites -- run `npm install` to install all the dependencies - run `ts-node src/streaming/snipe-create.ts -h` to test the snipe-create command and see the available options - to change the parameters, you can modify the .env file - to have a try, run ```ts-node src/streaming/snipe-create.ts --auto-sell --jito --n 3``` diff --git a/src/utils/index.ts b/src/utils/index.ts index 4a21e4c..7afecbe 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,2 +1,2 @@ export * from "../helpers/utils"; -export * from "../helpers/logger"; +export * from "../helpers/logger"; \ No newline at end of file From 84271b3980326f7e2335ab1e490b8211392fc63e Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 31 Aug 2024 18:44:57 +0800 Subject: [PATCH 041/140] add README.md in src/Trading_dev/grpc-copy-bot/ --- src/Trading_dev/grpc-copy-bot/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Trading_dev/grpc-copy-bot/README.md b/src/Trading_dev/grpc-copy-bot/README.md index 0fdf3b7..7e832f5 100644 --- a/src/Trading_dev/grpc-copy-bot/README.md +++ b/src/Trading_dev/grpc-copy-bot/README.md @@ -1,4 +1,4 @@ -#*Geyser grpc Pump.fun Sniper Bot (Beta)* +#*Geyser grpc copy Bot (Beta)* ## How it works From 6f52cc70c4195e1be3077fd824f8f6b61ce0fbb7 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 31 Aug 2024 18:49:15 +0800 Subject: [PATCH 042/140] Update README.md From 24fcfbae6beaa9e8a7a48c0245e39d41460570a0 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 31 Aug 2024 19:36:56 +0800 Subject: [PATCH 043/140] add module to take profit and stop loss in src/Trading_dev/ --- src/Trading_dev/ProfitAndLoss/constants.ts | 34 +++ src/Trading_dev/ProfitAndLoss/index.ts | 4 + src/Trading_dev/ProfitAndLoss/stop-loss.ts | 58 +++++ src/Trading_dev/ProfitAndLoss/take-profit.ts | 63 ++++++ src/Trading_dev/ProfitAndLoss/utils.ts | 209 ++++++++++++++++++ .../grpc-copy-bot/src/constants/constants.ts | 5 - src/Trading_dev/stop-loss.ts | 0 src/Trading_dev/take-profit.ts | 0 src/helpers/config.ts | 10 +- 9 files changed, 374 insertions(+), 9 deletions(-) create mode 100644 src/Trading_dev/ProfitAndLoss/constants.ts create mode 100644 src/Trading_dev/ProfitAndLoss/index.ts create mode 100644 src/Trading_dev/ProfitAndLoss/stop-loss.ts create mode 100644 src/Trading_dev/ProfitAndLoss/take-profit.ts create mode 100644 src/Trading_dev/ProfitAndLoss/utils.ts delete mode 100644 src/Trading_dev/stop-loss.ts delete mode 100644 src/Trading_dev/take-profit.ts diff --git a/src/Trading_dev/ProfitAndLoss/constants.ts b/src/Trading_dev/ProfitAndLoss/constants.ts new file mode 100644 index 0000000..e001b60 --- /dev/null +++ b/src/Trading_dev/ProfitAndLoss/constants.ts @@ -0,0 +1,34 @@ +import { logger, retrieveEnvVariable } from "../../utils"; +import { + Currency, + Token, + TOKEN_PROGRAM_ID, + } from "@raydium-io/raydium-sdk"; +import { PublicKey } from "@solana/web3.js"; +export const tp = retrieveEnvVariable("TAKE_PROFIT", logger); +export const sl = retrieveEnvVariable("STOP_LOSS", logger); +export const wsol = "So11111111111111111111111111111111111111112" +export const usdc = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" +export const quoteToken = [ + usdc, // USDC + "SOL", // SOL + "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", // USDT + wsol, // WSOL +]; +export const DEFAULT_TOKEN = { + SOL: new Currency(9, "SOL", "SOL"), + WSOL: new Token( + TOKEN_PROGRAM_ID, + new PublicKey("So11111111111111111111111111111111111111112"), + 9, + "WSOL", + "WSOL" + ), + USDC: new Token( + TOKEN_PROGRAM_ID, + new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + 6, + "USDC", + "USDC" + ), +}; \ No newline at end of file diff --git a/src/Trading_dev/ProfitAndLoss/index.ts b/src/Trading_dev/ProfitAndLoss/index.ts new file mode 100644 index 0000000..01238e0 --- /dev/null +++ b/src/Trading_dev/ProfitAndLoss/index.ts @@ -0,0 +1,4 @@ +export * from "./stop-loss"; +export * from "./take-profit"; +export * from "./utils"; +export * from "./constants"; \ No newline at end of file diff --git a/src/Trading_dev/ProfitAndLoss/stop-loss.ts b/src/Trading_dev/ProfitAndLoss/stop-loss.ts new file mode 100644 index 0000000..f9af5fc --- /dev/null +++ b/src/Trading_dev/ProfitAndLoss/stop-loss.ts @@ -0,0 +1,58 @@ +import {sl} from "." +import { readBoughtTokens, writeBoughtTokens, getCurrentPriceRaydium } from "./utils"; +import Decimal from 'decimal.js'; +/** + * Sets the stop loss price for a given token. + * @param {string} tokenAddress - The address of the token. + * @returns {Promise} - A promise that resolves when the stop loss price is set. + */ +export async function setStopLoss_Price(tokenAddress: string, path_To_bought_tokens:string){ + try{ + const tokenObj = await readBoughtTokens(tokenAddress, path_To_bought_tokens); + const our_entry_price = tokenObj.entry_price; + const sl_price = our_entry_price * (1 - parseFloat(sl)); + tokenObj.sl_price = sl_price; + await writeBoughtTokens(tokenAddress, tokenObj, path_To_bought_tokens); + }catch(err){ + console.error("Error setting stop loss: ", err); + } +} +/** + * Retrieves the stop loss price for a given token address. + * @param {string} tokenAddress - The address of the token. + * @returns {number} - The stop loss price of the token. + */ +export async function getStopLoss_Price(tokenAddress: string, path_To_bought_tokens:string){ + try{ + const tokenObj = await readBoughtTokens(tokenAddress, path_To_bought_tokens); + return tokenObj.sl_price; + }catch(err){ + console.error("Error getting stop loss price: ", err); + } +} +/** + * Checks if the current price of a token is below or equal to the stop loss price. + * @param {string} tokenAddress - The address of the token to check. + * @returns {Promise} - A promise that resolves to `true` if the current price is below or equal to the stop loss price, otherwise `false`. + */ +export async function checkStopLoss(tokenAddress: string, path_To_bought_tokens:string): Promise{ + let res = false; + try{ + const tokenObj = await readBoughtTokens(tokenAddress, path_To_bought_tokens); + const current_price = new Decimal(await getCurrentPriceRaydium(tokenAddress, path_To_bought_tokens)); + const stop_loss_price = new Decimal(tokenObj.sl_price); + if (stop_loss_price.greaterThanOrEqualTo(current_price)) { + res = true; + } + }catch(e:any){ + console.error("Error checking stop loss: ", e); + if (e.response && e.response.status === 502) { + console.error('Bad Gateway: The server received an invalid response from the upstream server.'); + } + if (e.response && e.response.status === 504) { + console.error('Gateway Timeout: The server did not receive a timely response.'); + } + } + return res; +} + diff --git a/src/Trading_dev/ProfitAndLoss/take-profit.ts b/src/Trading_dev/ProfitAndLoss/take-profit.ts new file mode 100644 index 0000000..ff99e2e --- /dev/null +++ b/src/Trading_dev/ProfitAndLoss/take-profit.ts @@ -0,0 +1,63 @@ +import {tp} from "." +import { readBoughtTokens, writeBoughtTokens, getCurrentPriceRaydium } from "./utils"; +import Decimal from 'decimal.js'; +/** + * Sets the take profit price for a given token address. + * @param {string} tokenAddress - The address of the token. + * @returns {Promise} - A promise that resolves when the take profit price is set. + */ +export async function setTakeProfit_Price(tokenAddress: string, path_To_bought_tokens:string){ + try{ + const tokenObj = await readBoughtTokens(tokenAddress, path_To_bought_tokens); + const our_entry_price = tokenObj.entry_price; + const tp_price = our_entry_price * (1 + parseFloat(tp)); + tokenObj.tp_price = tp_price; + await writeBoughtTokens(tokenAddress, tokenObj, path_To_bought_tokens); + }catch(err){ + console.error("Error setting take profit: ", err); + } +} + +/** + * Retrieves the take profit price for a given token address. + * + * @param {string} tokenAddress - The address of the token. + * @returns {Promise} - The take profit price of the token. + * @throws {Error} - If there is an error retrieving the take profit price. + */ +export async function getTakeProfit_Price(tokenAddress: string, path_To_bought_tokens:string){ + try{ + const tokenObj = await readBoughtTokens(tokenAddress, path_To_bought_tokens); + return tokenObj.tp_price; + }catch(err){ + console.error("Error getting take profit price: ", err); + } +} + +/** + * Checks if the current price of a token is greater than or equal to the take profit price. + * @param {string} tokenAddress - The address of the token to check. + * @returns {Promise} - A promise that resolves to true if the current price is greater than or equal to the take profit price, false otherwise. + */ +export async function checkTakeProfit(tokenAddress: string, path_To_bought_tokens:string): Promise{ + let res = false; + try{ + const tokenObj = await readBoughtTokens(tokenAddress, path_To_bought_tokens); + const current_price = new Decimal(await getCurrentPriceRaydium(tokenAddress, path_To_bought_tokens)).toFixed(20); + const take_profit_price = new Decimal(tokenObj.tp_price).toFixed(20); + + if(current_price > take_profit_price){ + console.log(`Take profit price reached for token ${tokenAddress}`); + res = true; + } + }catch(e:any){ + console.error("Error checking take profit: ", e); + if (e.response && e.response.status === 502) { + console.error('Bad Gateway: The server received an invalid response from the upstream server.'); + } + if (e.response && e.response.status === 504) { + console.error('Gateway Timeout: The server did not receive a timely response.'); + } + } + return res; +} diff --git a/src/Trading_dev/ProfitAndLoss/utils.ts b/src/Trading_dev/ProfitAndLoss/utils.ts new file mode 100644 index 0000000..b77a2f1 --- /dev/null +++ b/src/Trading_dev/ProfitAndLoss/utils.ts @@ -0,0 +1,209 @@ +import * as fs from 'fs/promises'; +import fetch from 'cross-fetch'; +import {sl, tp, wsol} from "." +import Decimal from 'decimal.js'; +import {getCurrentMarketCap, getDayVolume, getCurrentSolInPool, initSdk } from "../../raydium"; +import {fetchAMMPoolId} from "../../raydium/Pool/fetch_pool" +import {logger} from "../../utils" +let sdkCache = {sdk: null, expiry: 0} +export async function loadBoughtTokens(path_To_bought_tokens:string) { + try { + let boughtTokens:any = []; + const data = await fs.readFile(path_To_bought_tokens, 'utf8'); + const jsonData = JSON.parse(data); + // the JSON structure is something like { "tokenA": {...}, "tokenB": {...} } + boughtTokens = Object.keys(jsonData); + return boughtTokens; + } catch (err) { + console.error('Error reading or parsing file:', err); + } + } +/** + * Reads the bought tokens from a JSON file and returns the token object for the given token address. + * @param {string} tokenAddress - The address of the token to read. + * @returns {Object} - The token object containing entry price, take profit price, and stop loss price. + */ +export async function readBoughtTokens(tokenAddress:string, path_To_bought_tokens:string) { + try { + // Read the JSON file asynchronously + const data = await fs.readFile(path_To_bought_tokens, { encoding: 'utf8' }); + // Parse the JSON data + const jsonData = JSON.parse(data); + // Access the data + if(!(tokenAddress in jsonData)){ + return null; + } + + const tokenObj = jsonData[tokenAddress]; + + return tokenObj; + } catch (err) { + console.error('Error reading file:', err); + } +} +/** + * Writes the bought tokens to a JSON file. + * @param {string} tokenAddress - The address of the token. + * @param {object} tokenObj - The token object to be written. + * @returns {Promise} - A promise that resolves when the tokens are written successfully, or rejects with an error. + */ +export async function writeBoughtTokens(tokenAddress:string, tokenObj:object, path_To_bought_tokens:string) { + try { + // Read the JSON file asynchronously + const data = await fs.readFile(path_To_bought_tokens, { encoding: 'utf8' }); + // Parse the JSON data + const jsonData = JSON.parse(data); + // Update the JSON data + jsonData[tokenAddress] = tokenObj; + // Write the updated JSON data back to the file + await fs.writeFile(path_To_bought_tokens, JSON.stringify(jsonData, null, 2)); + } catch (err) { + console.error('Error writing bought tokens file:', err); + } +} +/** + * Deletes the bought tokens after selling it from the JSON file. + * @param {string} tokenAddress - The address of the token to be deleted. + * @returns {Promise} - A promise that resolves when the tokens are deleted successfully. + */ +export async function deleteBoughtTokens(tokenAddress:string, path_To_bought_tokens:string) { + try { + // Read the JSON file asynchronously + const data = await fs.readFile(path_To_bought_tokens, { encoding: 'utf8' }); + // Parse the JSON data + const jsonData = JSON.parse(data); + if (tokenAddress in jsonData) delete jsonData[tokenAddress]; + // Write the updated JSON data back to the file + await fs.writeFile(path_To_bought_tokens, JSON.stringify(jsonData, null, 2)); + } catch (err) { + console.error('Error deleting bought tokens file:', err); + } +} + +export async function getCurrentPriceJUP(tokenAddress:string){ + // api: https://price.jup.ag/v6/price?ids=tokenAddress&vsToken=So11111111111111111111111111111111111111112 + try{ + const response = await( await fetch(`https://price.jup.ag/v6/price?ids=${tokenAddress}&vsToken=${wsol}`)).json(); + //const response = await( await fetch(`https://quote-api.jup.ag/v6/quote?inputMint=${wsol}&outputMint=${tokenAddress}&amount=1000000&slippageBps=50`) ).json() + console.log(response) + }catch(e){ + console.log(`Error when getting current price of ${tokenAddress} `, e) + } +} +export async function logExitPrice(tokenAddress: string, exitPrice:number, path_To_bought_tokens:string){ + let tokenObj = await readBoughtTokens(tokenAddress, path_To_bought_tokens); + tokenObj.exit_price = exitPrice; + await writeBoughtTokens(tokenAddress, tokenObj, path_To_bought_tokens); +} +export async function logTraderEntryPrice(tokenAddress:string, entryPrice:number, path_To_bought_tokens:string){ + const tokenObj = await readBoughtTokens(tokenAddress, path_To_bought_tokens); + tokenObj.trader_entry_price = entryPrice; + await writeBoughtTokens(tokenAddress, tokenObj, path_To_bought_tokens); +} +// export async function setEntryPrice(tokenAddress){ +// const tokenObj = await readBoughtTokens(tokenAddress); +// const trader_entry_price = tokenObj.trader_entry_price; +// tokenObj.entry_price = trader_entry_price * (1 - entry_percentage); +// await writeBoughtTokens(tokenAddress, tokenObj); +// } +export async function setInitTokenObj(tokenAddress: string, ourEntryPrice: number, path_To_bought_tokens:string, poolId:string){ + // if day volume < 100k, + // we don't trade it + let ourEntryPriceDec = new Decimal(ourEntryPrice); + let tpPriceDec = ourEntryPriceDec.mul(new Decimal(1).plus(tp)); + let slPriceDec = ourEntryPriceDec.mul(new Decimal(1).minus(sl)); + const mc = await getCurrentMarketCap(tokenAddress); + const noOfSolInPool = await getCurrentSolInPool(tokenAddress); + let solPerOrder = 0; + + if((mc||0) >= 10000000){ + solPerOrder = 2; + tpPriceDec = ourEntryPriceDec.mul(new Decimal(1).plus(new Decimal(0.05))); + } + if((mc||0) >= 5000000){ + solPerOrder = 1.5 + tpPriceDec = ourEntryPriceDec.mul(new Decimal(1).plus(new Decimal(0.05))); + } + else if((mc||0) >= 1000000){ + solPerOrder = 1; + tpPriceDec = ourEntryPriceDec.mul(new Decimal(1).plus(new Decimal(0.05))); + }else{ + solPerOrder = 0.5; + tpPriceDec = ourEntryPriceDec.mul(new Decimal(1).plus(new Decimal(0.05))); + } + + const tokenObj = { + "entry_price": ourEntryPriceDec, + "tp_price": tpPriceDec, + "sl_price": slPriceDec, + "exit_price": 0, + "poolId": poolId, + "number_of_sol_in_pool": noOfSolInPool, + "market_cap": mc, + "sol_per_order": solPerOrder, + } + console.log("Init our trade successfully!", tokenObj) + await writeBoughtTokens(tokenAddress, tokenObj, path_To_bought_tokens); +} +export async function getCurrentPriceRaydium(tokenAddress:string, path_To_bought_tokens:string){ + try{ + // Check if poolId is already set + let raydium:any = null + if(sdkCache.sdk){ + raydium = sdkCache.sdk; + } + else { + raydium = await initSdk(); + sdkCache.sdk = raydium; + } + const tokenObj = await readBoughtTokens(tokenAddress, path_To_bought_tokens); + let poolId:any = null; + if (tokenObj === null) { + poolId = ""; + } else { + poolId = tokenObj.poolId; + } + if (poolId === "") { + poolId = await fetchAMMPoolId(tokenAddress); + if(tokenObj){ + tokenObj.poolId = poolId; + await writeBoughtTokens(tokenAddress, tokenObj, path_To_bought_tokens); + } + } + const res = await raydium.liquidity.getRpcPoolInfos([poolId]); + const poolInfo = res[poolId]; + const baseMint = poolInfo.baseMint.toString(); + const quoteMint = poolInfo.quoteMint.toString(); + const baseDecimals = new Decimal(poolInfo.baseDecimal.toString()); + const quoteDecimals = new Decimal(poolInfo.quoteDecimal.toString()); + const solMintAddress = wsol; + //const solPrice = await getCurrentSolPrice(); + let solReserve:any = null; + let tokenReserve:any = null; + let priceInSOL; + + if (baseMint === solMintAddress) { + // baseMint is SOL, (this is pump token) + solReserve = new Decimal(poolInfo.baseReserve.toString()).div(new Decimal(10).pow(baseDecimals)); + tokenReserve = new Decimal(poolInfo.quoteReserve.toString()).div(new Decimal(10).pow(quoteDecimals)); + priceInSOL = solReserve.div(tokenReserve); + } else { + // Neither baseMint nor quoteMint is SOL, use the pool price directly + solReserve = new Decimal(poolInfo.quoteReserve.toString()).div(new Decimal(10).pow(quoteDecimals)); + tokenReserve = new Decimal(poolInfo.baseReserve.toString()).div(new Decimal(10).pow(baseDecimals)); + priceInSOL = poolInfo.poolPrice; + } + //console.log(`Current price of ${tokenAddress} in SOL: ${priceInSOL}`); + return priceInSOL; + }catch(e){ + logger.error(`Error when getting current price of ${tokenAddress} `, e) + } +} + //"tokenA": { + // "trader_entry_price": 0.5312, + // "entry_price": 0.5152, + // "actual_entry_price": 0.5152, + // "tp_price": 0.58432, + // "sl_price": 0.42496, + // "exit_price": 0.5312 + //} diff --git a/src/Trading_dev/grpc-copy-bot/src/constants/constants.ts b/src/Trading_dev/grpc-copy-bot/src/constants/constants.ts index c7a8473..9e410b9 100644 --- a/src/Trading_dev/grpc-copy-bot/src/constants/constants.ts +++ b/src/Trading_dev/grpc-copy-bot/src/constants/constants.ts @@ -3,11 +3,6 @@ import { logger, retrieveEnvVariable } from "../../../../utils"; import { Currency, Token, - ENDPOINT, - MAINNET_PROGRAM_ID, - RAYDIUM_MAINNET, - TxVersion, - LOOKUP_TABLE_CACHE, TOKEN_PROGRAM_ID, } from "@raydium-io/raydium-sdk"; import { Commitment, Connection, Keypair, PublicKey } from "@solana/web3.js"; diff --git a/src/Trading_dev/stop-loss.ts b/src/Trading_dev/stop-loss.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/Trading_dev/take-profit.ts b/src/Trading_dev/take-profit.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/helpers/config.ts b/src/helpers/config.ts index 8b6cd51..e28f93f 100644 --- a/src/helpers/config.ts +++ b/src/helpers/config.ts @@ -19,16 +19,18 @@ const envPath = path.join(__dirname, ".env"); dotenv.config({ path: envPath, // fill in your .env path }); -export function loadKeypairFromFile(filename:string) { +export function loadKeypairFromFile(filename: string) { const secret = fs.readFileSync(filename, { encoding: "utf8" }); return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(secret))); } export const jito_fee = process.env.JITO_FEE; // 0.00009 SOL export const shyft_api_key = process.env.SHYFT_API_KEY; // your shyft api key -export const wallet = Keypair.fromSecretKey(bs58.decode(process.env.PRIVATE_KEY || "")); // your wallet +export const wallet = Keypair.fromSecretKey( + bs58.decode(process.env.PRIVATE_KEY || "") +); // your wallet export const private_key = process.env.PRIVATE_KEY; // your private key -export const dev_endpoint = process.env.DEVNET_ENDPOINT||""; // devnet endpoint, if you use devnet -export const main_endpoint = process.env.MAINNET_ENDPOINT||""; // mainnet endpoint +export const dev_endpoint = process.env.DEVNET_ENDPOINT || ""; // devnet endpoint, if you use devnet +export const main_endpoint = process.env.MAINNET_ENDPOINT || ""; // mainnet endpoint export const bloXRoute_auth_header = process.env.BLOXROUTE_AUTH_HEADER; export const bloXroute_fee = process.env.BLOXROUTE_FEE; // 0.001 SOL // const second_main_endpoint = process.env.SECOND_MAINNET_ENDPOINT; // if you use copy trade program, second mainnet endpoint From 41a2882a848645a7a6c73d794129c95398ad102f Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 31 Aug 2024 20:35:16 +0800 Subject: [PATCH 044/140] Update README.md --- src/Trading_dev/grpc-pf-sniper/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Trading_dev/grpc-pf-sniper/README.md b/src/Trading_dev/grpc-pf-sniper/README.md index 761577d..35f7882 100644 --- a/src/Trading_dev/grpc-pf-sniper/README.md +++ b/src/Trading_dev/grpc-pf-sniper/README.md @@ -6,7 +6,7 @@ - It basically only consider the slot or block in "processed" commitment level to make sure the request can land in the next block or next few block(what we expected). - Use a grpc subscription to subscribe the transactions that including the solana account of the Pump.fun Token Mint Authority and listen for the mint event (https://solscan.io/account/TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM). -- Once the mint event is detected, it will create a snipe transaction to snipe the token! +- Once the mint event is detected, it will send a snipe transaction to snipe the token! ## Prerequisites @@ -29,4 +29,4 @@ - src/streaming/snipe-create.ts: a cli interface to interact the whole dir -- src/streaming/grpc-requests-type.ts: different grpc request types for sniping on pump.fun \ No newline at end of file +- src/streaming/grpc-requests-type.ts: different grpc request types for sniping on pump.fun From 740220e4faf30c592669aeab551bcac2a2c71f66 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 31 Aug 2024 20:36:20 +0800 Subject: [PATCH 045/140] Update README.md --- src/Trading_dev/grpc-copy-bot/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Trading_dev/grpc-copy-bot/README.md b/src/Trading_dev/grpc-copy-bot/README.md index 7e832f5..519c25e 100644 --- a/src/Trading_dev/grpc-copy-bot/README.md +++ b/src/Trading_dev/grpc-copy-bot/README.md @@ -6,8 +6,8 @@ - It basically only consider the slot or block in "processed" commitment level to make sure the request can land in the next block or next few block(what we expected). - Use a grpc subscription to subscribe the transactions that including the target smart wallet address and listen for the swap transactions. -- Once the swap event is detected, it calculate the how much token the trader bought or how much token the trader sold by considering the number of token and sol changes in the liquidity pool. -- The entry/exit price is calculated by the formula: entry/exit price = post SOL in Pool / post token in Pool +- Once the swap event is detected, it calculate the how much token the trader bought or how much token the trader sold by considering the number of token and sol changes in the liquidity pool, and it follows the exact swapped token amount of the trader. +- The entry/exit price is calculated by the formula: entry/exit price = post SOL in Pool / post token in Pool. ## Limitations - It only works on raydium swap transactions now. @@ -31,4 +31,4 @@ - src/streaming/grpc-requests-type.ts: different grpc request types for monitoring the target trader -- src/raydium/*.ts: constructing the proper instructions of buy and sell on raydium \ No newline at end of file +- src/raydium/*.ts: constructing the proper instructions of buy and sell on raydium From 7a912de9d7191c4a1c520bc6c22109d44b383f0a Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 31 Aug 2024 20:38:05 +0800 Subject: [PATCH 046/140] Update README.md --- src/Trading_dev/grpc-copy-bot/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Trading_dev/grpc-copy-bot/README.md b/src/Trading_dev/grpc-copy-bot/README.md index 519c25e..58086c1 100644 --- a/src/Trading_dev/grpc-copy-bot/README.md +++ b/src/Trading_dev/grpc-copy-bot/README.md @@ -11,7 +11,7 @@ ## Limitations - It only works on raydium swap transactions now. -- It uses SOL for settlement, buy using SOL and sell for SOL. +- It uses WSOL for settlement, buy using WSOL and sell for WSOL. ## Prerequisites From 876bbde99dae65db13c5f6771586386c8ee8f189 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 31 Aug 2024 20:38:17 +0800 Subject: [PATCH 047/140] Update README.md --- src/Trading_dev/grpc-copy-bot/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Trading_dev/grpc-copy-bot/README.md b/src/Trading_dev/grpc-copy-bot/README.md index 58086c1..55acb60 100644 --- a/src/Trading_dev/grpc-copy-bot/README.md +++ b/src/Trading_dev/grpc-copy-bot/README.md @@ -1,4 +1,4 @@ -#*Geyser grpc copy Bot (Beta)* +# *Geyser grpc copy Bot (Beta)* ## How it works From 8e2c789aafcc966aca36dc76212fd1620ea97965 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 31 Aug 2024 20:38:59 +0800 Subject: [PATCH 048/140] Update README.md --- src/Trading_dev/grpc-pf-sniper/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Trading_dev/grpc-pf-sniper/README.md b/src/Trading_dev/grpc-pf-sniper/README.md index 35f7882..4f594d4 100644 --- a/src/Trading_dev/grpc-pf-sniper/README.md +++ b/src/Trading_dev/grpc-pf-sniper/README.md @@ -1,4 +1,4 @@ -#*Geyser grpc Pump.fun Sniper Bot (Beta)* +# *Geyser grpc Pump.fun Sniper Bot (Beta)* ## How it works @@ -7,7 +7,7 @@ - Use a grpc subscription to subscribe the transactions that including the solana account of the Pump.fun Token Mint Authority and listen for the mint event (https://solscan.io/account/TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM). - Once the mint event is detected, it will send a snipe transaction to snipe the token! - +- it uses SOL for settlement, buy using SOL, sell for SOL. ## Prerequisites From a04c35e9decd5153d0162aed0b928b19ef89de7a Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 04:26:10 +0300 Subject: [PATCH 049/140] declare node.js version properly --- .nvmrc | 1 + README.md | 4 ++-- package.json | 3 +++ 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..0e4f87e --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v22.2.0 \ No newline at end of file diff --git a/README.md b/README.md index 7429598..6baa342 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,8 @@ 1. `git clone https://github.com/outsmartchad/solana-trading-cli.git` 2. `cd solana-memecoin-cli` -3. `nvm install v22.2.0` -4. `nvm use v22.2.0` +3. `nvm install` +4. `nvm use` 5. `npm install` 6. also see the command examples in examples/ diff --git a/package.json b/package.json index 2897a6f..ba146a8 100644 --- a/package.json +++ b/package.json @@ -57,5 +57,8 @@ }, "devDependencies": { "typescript": "^5.5.4" + }, + "engines": { + "node": "22.2.0" } } From 0b19e3bfa44d35b85c6deac3b2dc5f48a0c3d018 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 05:00:18 +0300 Subject: [PATCH 050/140] Improve README.me and fix some markdown errors --- README.md | 113 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 62 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 6baa342..5273694 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ [🔗doc](https://outsmartchad.github.io/solana-trading-cli/) + ## Main Features + - Trading any token using Jupiter API & Raydium swap function - Create your own Solana **_SPL tokens_** on mainnet | Pump.fun @@ -19,6 +21,7 @@ - **_Got everything needed to create your own trading bot_** ## Credits + - https://github.com/raydium-io/raydium-sdk-V2 - https://github.com/rckprtr/pumpdotfun-sdk - https://github.com/Al366io/solana-transactions-wrapper @@ -26,7 +29,7 @@ ### Installation 🛠️ 1. `git clone https://github.com/outsmartchad/solana-trading-cli.git` -2. `cd solana-memecoin-cli` +2. `cd solana-trading-cli` 3. `nvm install` 4. `nvm use` 5. `npm install` @@ -41,6 +44,7 @@ ## Features ✅: ### Developer CLI: + - wrap/unwrap solana - Create a new SPL token or zk-compressed token (on SOL mainnet/devnet/zk-devnet) and it will automatically mint to your wallet - Integrates both **user-defined priority fee and jito tips** that land transactions faster @@ -55,6 +59,7 @@ - monitor real-time pump-fun's create, trade, and complete bonding curve events ### Trader CLI: + - Optimized Copy Trading Program with auto-buy&sell ## Features in Development 🚧: @@ -72,82 +77,84 @@ 1. Specify the token symbol, name, mint keypair(optional, will help u to generate), supply, decimals, path to metadata json file, path to image file, the cluster you want to use, and the file type(png, jpg, jpeg). -``` -ts-node create --payer --symbol --token_name --mint --supply --decimals --metadata --image --cluster --priority-fee --file_type -``` + ```sh + ts-node create --payer --symbol --token_name --mint --supply --decimals --metadata --image --cluster --priority-fee --file_type + ``` 2. Specify the token address, the percentage of the token you want to burn and the cluster you want to use. -``` -ts-node burn --payer --token_address --percentage --cluster -``` + ```sh + ts-node burn --payer --token_address --percentage --cluster + ``` 3. Specify the token address and the cluster you want to use. -``` -ts-node revoke_authority --payer --mint_address --cluster --mint --freeze -``` + ```sh + ts-node revoke_authority --payer --mint_address --cluster --mint --freeze + ``` 4. Specify the token address you want to query and the cluster for boosting the volume of the token. -``` -ts-node boost_volume --token_address --payer --cluster --sol_per_order - -``` + ```sh + ts-node boost_volume --token_address --payer --cluster --sol_per_order + ``` 5. Specify the token address, the amount of Sol you want to swap, and the cluster you want to use. -``` -ts-node buy --payer --token_address --sol --cluster -``` + ```sh + ts-node buy --payer --token_address --sol --cluster + ``` 6. Specify the token address, the percentage of the token you want to sell, and the cluster you want to use. -``` -ts-node sell --payer --token_address --percentage --cluster -``` + ```sh + ts-node sell --payer --token_address --percentage --cluster + ``` 7. Specify the token address, the pool id(optional, will help to find the pool with the most liquidity using the given token address), the amount of Sol you want to add, and the cluster you want to use. -``` -ts-node add_pool --payer --token_address --pool_id --sol --cluster --priority_fee -``` + ```sh + ts-node add_pool --payer --token_address --pool_id --sol --cluster --priority_fee + ``` 8. Specify the token address, the percentage of the LP token you want to remove(1=1%), and the cluster you want to use. -``` -ts-node remove_pool --payer --token_address --percentage --cluster -``` + ```sh + ts-node remove_pool --payer --token_address --percentage --cluster + ``` + 9. wrap your sol to wsol. - -``` -ts-node wrap_sol.js --size -``` + + ```sh + ts-node wrap_sol.js --size + ``` 10. unwrap your wsol to sol. -``` -ts-node unwrap_sol.js -``` + + ```sh + ts-node unwrap_sol.js + ``` ### Pump.fun commands 9. Specify the path to your mint keypair, the amount of Sol you want to buy, the name of the token, the symbol of the token, the description of the token, the telegram link, the twitter link, the website link, and the image file path. -``` -ts-node createAndBuy --pathToMintKeypair --sol --name --symbol --description --telegram --twitter --website --file -``` + ```sh + ts-node createAndBuy --pathToMintKeypair --sol --name --symbol --description --telegram --twitter --website --file + ``` 10. Specify the token address, the sol you want to buy -``` -ts-node buy --token_address --sol -``` + ```sh + ts-node buy --token_address --sol + ``` 11. Specify the token address, the percentage of the token you want to sell -``` -ts-node sell --token_address --percentage -``` + ```sh + ts-node sell --token_address --percentage + ``` + # Code Usage ## Token: @@ -193,7 +200,8 @@ ts-node sell --token_address --percentage - src/helpers/check_balance.js: check the balance of a given token in your wallet ## Project Structure -``` + +```sh .solana-memecoin-cli ├── data | ├── Image_file # store image file (jpeg, jpg,...) @@ -305,21 +313,23 @@ ts-node sell --token_address --percentage ``` ## Contributing + - Contributions is wellcome!!! - Fork it -- ``` git checkout -b feature/YourNewFeature ``` -- ``` git commit -m 'bug Fixed/added new feature' ``` -- ``` git push origin feature/YourNewFeature ``` +- `git checkout -b feature/YourNewFeature` +- `git commit -m 'bug Fixed/added new feature'` +- `git push origin feature/YourNewFeature` - And Please open a pull request ## Apply Latest Changes from remote repo -- ``` git stash -u # Stash your changes``` -- ``` git pull --rebase # Pull the latest changes``` -- ``` git stash pop # Apply Your stashed changes``` + +- `git stash -u # Stash your changes` +- `git pull --rebase # Pull the latest changes` +- `git stash pop # Apply Your stashed changes` ## Disclaimer -This software is provided "as is," without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software. +This software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software. **Use at your own risk.** The authors take no responsibility for any harm or damage caused by the use of this software. Users are responsible for ensuring the suitability and safety of this software for their specific use cases. @@ -328,6 +338,7 @@ By using this software, you acknowledge that you have read, understood, and agre ### If you think this project is useful, please give us a star🌟, it will help us a lot. ### Discord channel: https://discord.gg/hFhQeBCqWX + ### It is a work in progress, if you have any suggestions or any problems, please let us know! -### Stay tuned for the updates.🤖_** +### **_Stay tuned for the updates.🤖_** From 4ce83f35fc18f4244bfc8e5698026f2e9a43acb2 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 05:05:53 +0300 Subject: [PATCH 051/140] remove unused file --- src/helpers/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/helpers/README.md diff --git a/src/helpers/README.md b/src/helpers/README.md deleted file mode 100644 index e69de29..0000000 From 30e15af29a30a2cb38651a88060d2f287c7665df Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 11:58:47 +0800 Subject: [PATCH 052/140] Update FUNDING.yml --- .github/FUNDING.yml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 5e39575..8b13789 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,14 +1 @@ -# These are supported funding model platforms -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry -polar: # Replace with a single Polar username -buy_me_a_coffee: # Replace with a single Buy Me a Coffee username -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] From 5998ebe971d0d44a74a40d7c38550d80cce05c02 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 11:59:28 +0800 Subject: [PATCH 053/140] delete funding.yml --- .github/FUNDING.yml | 1 - src/helpers/check_balance.ts | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) delete mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 8b13789..0000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/helpers/check_balance.ts b/src/helpers/check_balance.ts index e54d8e9..20dba17 100644 --- a/src/helpers/check_balance.ts +++ b/src/helpers/check_balance.ts @@ -3,7 +3,7 @@ import { getDomainKeySync, NameRegistryState, } from "@bonfida/spl-name-service"; -import { main_endpoint } from "./config"; +import { main_endpoint, wallet } from "./config"; const connectionMain = new Connection(main_endpoint); import { getAssociatedTokenAddressSync } from "@solana/spl-token"; @@ -83,4 +83,4 @@ export async function checkBalanceByDomain(domain:string, connection:Connection) console.log( `💰 Finished! The balance for the wallet at domain ${domain} is ${balanceInSOL}!` ); -} +} \ No newline at end of file From 9b4798b0b0783cfbca5c2c9f213094159e21c28e Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 13:55:20 +0800 Subject: [PATCH 054/140] move grpc copy-bot&sniper-bot to src/grpc_streaming/ --- .../grpc-copy-bot/README.md | 0 .../grpc-copy-bot/command.sh | 0 .../grpc-copy-bot/main.ts | 0 .../grpc-copy-bot/src/.DS_Store | Bin .../grpc-copy-bot/src/constants/constants.ts | 0 .../grpc-copy-bot/src/constants/index.ts | 0 .../grpc-copy-bot/src/jito/bundle.ts | 0 .../grpc-copy-bot/src/jito/index.ts | 0 .../grpc-copy-bot/src/raydium/buy-helper.ts | 0 .../grpc-copy-bot/src/raydium/formatAmmKeys.ts | 0 .../grpc-copy-bot/src/raydium/index.ts | 0 .../grpc-copy-bot/src/raydium/sell-helper.ts | 0 .../grpc-copy-bot/src/raydium/swap.ts | 0 .../grpc-copy-bot/src/raydium/utils.ts | 0 .../grpc-copy-bot/src/streaming/copy-trade.ts | 0 .../src/streaming/grpc-requests-type.ts | 0 .../grpc-copy-bot/src/streaming/stream-trader.ts | 0 .../grpc-copy-bot/src/streaming/utils.ts | 0 .../grpc-copy-bot/src/transaction/transaction.ts | 0 .../grpc-pf-sniper/.DS_Store | Bin .../grpc-pf-sniper/README.md | 0 .../grpc-pf-sniper/command.sh | 0 .../grpc-pf-sniper/src/.DS_Store | Bin .../grpc-pf-sniper/src/constants/constants.ts | 0 .../grpc-pf-sniper/src/constants/index.ts | 0 .../grpc-pf-sniper/src/jito/bundle.ts | 0 .../grpc-pf-sniper/src/jito/index.ts | 0 .../src/pumpdotfun-sdk/example/basic/index.ts | 0 .../src/pumpdotfun-sdk/example/basic/random.png | Bin .../src/pumpdotfun-sdk/example/events/index.ts | 0 .../src/pumpdotfun-sdk/example/util.ts | 0 .../src/pumpdotfun-sdk/src/IDL/index.ts | 0 .../src/pumpdotfun-sdk/src/IDL/pump-fun.json | 0 .../src/pumpdotfun-sdk/src/IDL/pump-fun.ts | 0 .../grpc-pf-sniper/src/pumpdotfun-sdk/src/amm.ts | 0 .../src/pumpdotfun-sdk/src/bondingCurveAccount.ts | 0 .../grpc-pf-sniper/src/pumpdotfun-sdk/src/events.ts | 0 .../src/pumpdotfun-sdk/src/globalAccount.ts | 0 .../grpc-pf-sniper/src/pumpdotfun-sdk/src/index.ts | 0 .../src/pumpdotfun-sdk/src/pumpfun.ts | 0 .../grpc-pf-sniper/src/pumpdotfun-sdk/src/types.ts | 0 .../grpc-pf-sniper/src/pumpdotfun-sdk/src/util.ts | 0 .../src/streaming/grpc-requests-type.ts | 0 .../grpc-pf-sniper/src/streaming/pump.fun.ts | 0 .../grpc-pf-sniper/src/streaming/snipe-create.ts | 0 .../grpc-pf-sniper/src/streaming/utils.ts | 0 .../grpc-pf-sniper/src/transaction/index.ts | 0 .../grpc-pf-sniper/src/transaction/transaction.ts | 0 .../grpc-pf-sniper/src/utils/index.ts | 0 .../grpc-pf-sniper/src/utils/logger.ts | 0 .../grpc-pf-sniper/src/utils/utils.ts | 0 51 files changed, 0 insertions(+), 0 deletions(-) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/README.md (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/command.sh (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/main.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/.DS_Store (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/constants/constants.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/constants/index.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/jito/bundle.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/jito/index.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/raydium/buy-helper.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/raydium/formatAmmKeys.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/raydium/index.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/raydium/sell-helper.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/raydium/swap.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/raydium/utils.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/streaming/copy-trade.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/streaming/grpc-requests-type.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/streaming/stream-trader.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/streaming/utils.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-copy-bot/src/transaction/transaction.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/.DS_Store (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/README.md (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/command.sh (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/.DS_Store (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/constants/constants.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/constants/index.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/jito/bundle.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/jito/index.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/index.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/random.png (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/pumpdotfun-sdk/example/events/index.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/pumpdotfun-sdk/example/util.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/index.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.json (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/pumpdotfun-sdk/src/amm.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/pumpdotfun-sdk/src/bondingCurveAccount.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/pumpdotfun-sdk/src/events.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/pumpdotfun-sdk/src/globalAccount.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/pumpdotfun-sdk/src/index.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/pumpdotfun-sdk/src/pumpfun.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/pumpdotfun-sdk/src/types.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/pumpdotfun-sdk/src/util.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/streaming/grpc-requests-type.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/streaming/pump.fun.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/streaming/snipe-create.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/streaming/utils.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/transaction/index.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/transaction/transaction.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/utils/index.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/utils/logger.ts (100%) rename src/{Trading_dev => grpc_streaming}/grpc-pf-sniper/src/utils/utils.ts (100%) diff --git a/src/Trading_dev/grpc-copy-bot/README.md b/src/grpc_streaming/grpc-copy-bot/README.md similarity index 100% rename from src/Trading_dev/grpc-copy-bot/README.md rename to src/grpc_streaming/grpc-copy-bot/README.md diff --git a/src/Trading_dev/grpc-copy-bot/command.sh b/src/grpc_streaming/grpc-copy-bot/command.sh similarity index 100% rename from src/Trading_dev/grpc-copy-bot/command.sh rename to src/grpc_streaming/grpc-copy-bot/command.sh diff --git a/src/Trading_dev/grpc-copy-bot/main.ts b/src/grpc_streaming/grpc-copy-bot/main.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/main.ts rename to src/grpc_streaming/grpc-copy-bot/main.ts diff --git a/src/Trading_dev/grpc-copy-bot/src/.DS_Store b/src/grpc_streaming/grpc-copy-bot/src/.DS_Store similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/.DS_Store rename to src/grpc_streaming/grpc-copy-bot/src/.DS_Store diff --git a/src/Trading_dev/grpc-copy-bot/src/constants/constants.ts b/src/grpc_streaming/grpc-copy-bot/src/constants/constants.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/constants/constants.ts rename to src/grpc_streaming/grpc-copy-bot/src/constants/constants.ts diff --git a/src/Trading_dev/grpc-copy-bot/src/constants/index.ts b/src/grpc_streaming/grpc-copy-bot/src/constants/index.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/constants/index.ts rename to src/grpc_streaming/grpc-copy-bot/src/constants/index.ts diff --git a/src/Trading_dev/grpc-copy-bot/src/jito/bundle.ts b/src/grpc_streaming/grpc-copy-bot/src/jito/bundle.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/jito/bundle.ts rename to src/grpc_streaming/grpc-copy-bot/src/jito/bundle.ts diff --git a/src/Trading_dev/grpc-copy-bot/src/jito/index.ts b/src/grpc_streaming/grpc-copy-bot/src/jito/index.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/jito/index.ts rename to src/grpc_streaming/grpc-copy-bot/src/jito/index.ts diff --git a/src/Trading_dev/grpc-copy-bot/src/raydium/buy-helper.ts b/src/grpc_streaming/grpc-copy-bot/src/raydium/buy-helper.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/raydium/buy-helper.ts rename to src/grpc_streaming/grpc-copy-bot/src/raydium/buy-helper.ts diff --git a/src/Trading_dev/grpc-copy-bot/src/raydium/formatAmmKeys.ts b/src/grpc_streaming/grpc-copy-bot/src/raydium/formatAmmKeys.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/raydium/formatAmmKeys.ts rename to src/grpc_streaming/grpc-copy-bot/src/raydium/formatAmmKeys.ts diff --git a/src/Trading_dev/grpc-copy-bot/src/raydium/index.ts b/src/grpc_streaming/grpc-copy-bot/src/raydium/index.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/raydium/index.ts rename to src/grpc_streaming/grpc-copy-bot/src/raydium/index.ts diff --git a/src/Trading_dev/grpc-copy-bot/src/raydium/sell-helper.ts b/src/grpc_streaming/grpc-copy-bot/src/raydium/sell-helper.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/raydium/sell-helper.ts rename to src/grpc_streaming/grpc-copy-bot/src/raydium/sell-helper.ts diff --git a/src/Trading_dev/grpc-copy-bot/src/raydium/swap.ts b/src/grpc_streaming/grpc-copy-bot/src/raydium/swap.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/raydium/swap.ts rename to src/grpc_streaming/grpc-copy-bot/src/raydium/swap.ts diff --git a/src/Trading_dev/grpc-copy-bot/src/raydium/utils.ts b/src/grpc_streaming/grpc-copy-bot/src/raydium/utils.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/raydium/utils.ts rename to src/grpc_streaming/grpc-copy-bot/src/raydium/utils.ts diff --git a/src/Trading_dev/grpc-copy-bot/src/streaming/copy-trade.ts b/src/grpc_streaming/grpc-copy-bot/src/streaming/copy-trade.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/streaming/copy-trade.ts rename to src/grpc_streaming/grpc-copy-bot/src/streaming/copy-trade.ts diff --git a/src/Trading_dev/grpc-copy-bot/src/streaming/grpc-requests-type.ts b/src/grpc_streaming/grpc-copy-bot/src/streaming/grpc-requests-type.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/streaming/grpc-requests-type.ts rename to src/grpc_streaming/grpc-copy-bot/src/streaming/grpc-requests-type.ts diff --git a/src/Trading_dev/grpc-copy-bot/src/streaming/stream-trader.ts b/src/grpc_streaming/grpc-copy-bot/src/streaming/stream-trader.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/streaming/stream-trader.ts rename to src/grpc_streaming/grpc-copy-bot/src/streaming/stream-trader.ts diff --git a/src/Trading_dev/grpc-copy-bot/src/streaming/utils.ts b/src/grpc_streaming/grpc-copy-bot/src/streaming/utils.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/streaming/utils.ts rename to src/grpc_streaming/grpc-copy-bot/src/streaming/utils.ts diff --git a/src/Trading_dev/grpc-copy-bot/src/transaction/transaction.ts b/src/grpc_streaming/grpc-copy-bot/src/transaction/transaction.ts similarity index 100% rename from src/Trading_dev/grpc-copy-bot/src/transaction/transaction.ts rename to src/grpc_streaming/grpc-copy-bot/src/transaction/transaction.ts diff --git a/src/Trading_dev/grpc-pf-sniper/.DS_Store b/src/grpc_streaming/grpc-pf-sniper/.DS_Store similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/.DS_Store rename to src/grpc_streaming/grpc-pf-sniper/.DS_Store diff --git a/src/Trading_dev/grpc-pf-sniper/README.md b/src/grpc_streaming/grpc-pf-sniper/README.md similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/README.md rename to src/grpc_streaming/grpc-pf-sniper/README.md diff --git a/src/Trading_dev/grpc-pf-sniper/command.sh b/src/grpc_streaming/grpc-pf-sniper/command.sh similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/command.sh rename to src/grpc_streaming/grpc-pf-sniper/command.sh diff --git a/src/Trading_dev/grpc-pf-sniper/src/.DS_Store b/src/grpc_streaming/grpc-pf-sniper/src/.DS_Store similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/.DS_Store rename to src/grpc_streaming/grpc-pf-sniper/src/.DS_Store diff --git a/src/Trading_dev/grpc-pf-sniper/src/constants/constants.ts b/src/grpc_streaming/grpc-pf-sniper/src/constants/constants.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/constants/constants.ts rename to src/grpc_streaming/grpc-pf-sniper/src/constants/constants.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/constants/index.ts b/src/grpc_streaming/grpc-pf-sniper/src/constants/index.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/constants/index.ts rename to src/grpc_streaming/grpc-pf-sniper/src/constants/index.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/jito/bundle.ts b/src/grpc_streaming/grpc-pf-sniper/src/jito/bundle.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/jito/bundle.ts rename to src/grpc_streaming/grpc-pf-sniper/src/jito/bundle.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/jito/index.ts b/src/grpc_streaming/grpc-pf-sniper/src/jito/index.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/jito/index.ts rename to src/grpc_streaming/grpc-pf-sniper/src/jito/index.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/index.ts b/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/index.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/index.ts rename to src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/index.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/random.png b/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/random.png similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/random.png rename to src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/random.png diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/events/index.ts b/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/events/index.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/events/index.ts rename to src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/events/index.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/util.ts b/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/util.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/util.ts rename to src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/util.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/index.ts b/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/index.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/index.ts rename to src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/index.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.json b/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.json similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.json rename to src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.json diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.ts b/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.ts rename to src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/amm.ts b/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/amm.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/amm.ts rename to src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/amm.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/bondingCurveAccount.ts b/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/bondingCurveAccount.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/bondingCurveAccount.ts rename to src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/bondingCurveAccount.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/events.ts b/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/events.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/events.ts rename to src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/events.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/globalAccount.ts b/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/globalAccount.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/globalAccount.ts rename to src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/globalAccount.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/index.ts b/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/index.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/index.ts rename to src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/index.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/pumpfun.ts b/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/pumpfun.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/pumpfun.ts rename to src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/pumpfun.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/types.ts b/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/types.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/types.ts rename to src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/types.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/util.ts b/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/util.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/util.ts rename to src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/util.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/streaming/grpc-requests-type.ts b/src/grpc_streaming/grpc-pf-sniper/src/streaming/grpc-requests-type.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/streaming/grpc-requests-type.ts rename to src/grpc_streaming/grpc-pf-sniper/src/streaming/grpc-requests-type.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/streaming/pump.fun.ts b/src/grpc_streaming/grpc-pf-sniper/src/streaming/pump.fun.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/streaming/pump.fun.ts rename to src/grpc_streaming/grpc-pf-sniper/src/streaming/pump.fun.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/streaming/snipe-create.ts b/src/grpc_streaming/grpc-pf-sniper/src/streaming/snipe-create.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/streaming/snipe-create.ts rename to src/grpc_streaming/grpc-pf-sniper/src/streaming/snipe-create.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/streaming/utils.ts b/src/grpc_streaming/grpc-pf-sniper/src/streaming/utils.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/streaming/utils.ts rename to src/grpc_streaming/grpc-pf-sniper/src/streaming/utils.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/transaction/index.ts b/src/grpc_streaming/grpc-pf-sniper/src/transaction/index.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/transaction/index.ts rename to src/grpc_streaming/grpc-pf-sniper/src/transaction/index.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/transaction/transaction.ts b/src/grpc_streaming/grpc-pf-sniper/src/transaction/transaction.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/transaction/transaction.ts rename to src/grpc_streaming/grpc-pf-sniper/src/transaction/transaction.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/utils/index.ts b/src/grpc_streaming/grpc-pf-sniper/src/utils/index.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/utils/index.ts rename to src/grpc_streaming/grpc-pf-sniper/src/utils/index.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/utils/logger.ts b/src/grpc_streaming/grpc-pf-sniper/src/utils/logger.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/utils/logger.ts rename to src/grpc_streaming/grpc-pf-sniper/src/utils/logger.ts diff --git a/src/Trading_dev/grpc-pf-sniper/src/utils/utils.ts b/src/grpc_streaming/grpc-pf-sniper/src/utils/utils.ts similarity index 100% rename from src/Trading_dev/grpc-pf-sniper/src/utils/utils.ts rename to src/grpc_streaming/grpc-pf-sniper/src/utils/utils.ts From e1b9b4a7375782a7e5b36fefcffa651b074d4878 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 14:23:19 +0800 Subject: [PATCH 055/140] fix path issues --- .../market-making_dev/boost_volume.ts | 28 ++-- src/Trading_dev/ProfitAndLoss/index.ts | 4 - src/Trading_dev/ProfitAndLoss/stop-loss.ts | 2 +- src/Trading_dev/ProfitAndLoss/take-profit.ts | 2 +- src/Trading_dev/ProfitAndLoss/utils.ts | 5 +- src/Transactions/index.ts | 4 +- .../grpc-copy-bot/README.md | 0 .../grpc-copy-bot/command.sh | 0 .../grpc-copy-bot/main.ts | 0 .../grpc-copy-bot/src/.DS_Store | Bin .../grpc-copy-bot/src/constants/constants.ts | 0 .../grpc-copy-bot/src/constants/index.ts | 0 .../grpc-copy-bot/src/jito/bundle.ts | 0 .../grpc-copy-bot/src/jito/index.ts | 0 .../grpc-copy-bot/src/raydium/buy-helper.ts | 0 .../src/raydium/formatAmmKeys.ts | 0 .../grpc-copy-bot/src/raydium/index.ts | 0 .../grpc-copy-bot/src/raydium/sell-helper.ts | 0 .../grpc-copy-bot/src/raydium/swap.ts | 3 +- .../grpc-copy-bot/src/raydium/utils.ts | 0 .../grpc-copy-bot/src/streaming/copy-trade.ts | 0 .../src/streaming/grpc-requests-type.ts | 0 .../src/streaming/stream-trader.ts | 0 .../grpc-copy-bot/src/streaming/utils.ts | 0 .../src/transaction/transaction.ts | 0 .../grpc-pf-sniper/.DS_Store | Bin .../grpc-pf-sniper/README.md | 0 .../grpc-pf-sniper/command.sh | 0 .../grpc-pf-sniper/src/.DS_Store | Bin .../grpc-pf-sniper/src/constants/constants.ts | 0 .../grpc-pf-sniper/src/constants/index.ts | 0 .../grpc-pf-sniper/src/jito/bundle.ts | 0 .../grpc-pf-sniper/src/jito/index.ts | 0 .../src/pumpdotfun-sdk/example/basic/index.ts | 0 .../pumpdotfun-sdk/example/basic/random.png | Bin .../pumpdotfun-sdk/example/events/index.ts | 0 .../src/pumpdotfun-sdk/example/util.ts | 0 .../src/pumpdotfun-sdk/src/IDL/index.ts | 0 .../src/pumpdotfun-sdk/src/IDL/pump-fun.json | 0 .../src/pumpdotfun-sdk/src/IDL/pump-fun.ts | 0 .../src/pumpdotfun-sdk/src/amm.ts | 0 .../pumpdotfun-sdk/src/bondingCurveAccount.ts | 0 .../src/pumpdotfun-sdk/src/events.ts | 0 .../src/pumpdotfun-sdk/src/globalAccount.ts | 0 .../src/pumpdotfun-sdk/src/index.ts | 0 .../src/pumpdotfun-sdk/src/pumpfun.ts | 0 .../src/pumpdotfun-sdk/src/types.ts | 0 .../src/pumpdotfun-sdk/src/util.ts | 0 .../src/streaming/grpc-requests-type.ts | 0 .../grpc-pf-sniper/src/streaming/pump.fun.ts | 0 .../src/streaming/snipe-create.ts | 0 .../grpc-pf-sniper/src/streaming/utils.ts | 0 .../grpc-pf-sniper/src/transaction/index.ts | 0 .../src/transaction/transaction.ts | 0 .../grpc-pf-sniper/src/utils/index.ts | 0 .../grpc-pf-sniper/src/utils/logger.ts | 0 .../grpc-pf-sniper/src/utils/utils.ts | 0 src/helpers/.env.copy | 2 +- src/helpers/util.ts | 6 + src/helpers/utils.ts | 5 - src/jupiter/swap/swap-helper.ts | 34 +++-- src/meteora/Pool/swap.ts | 4 +- src/orca/Pool/swap.ts | 125 ++++++++++-------- src/pumpfunsdk/pumpdotfun-sdk/src/util.ts | 109 ++++++++------- src/raydium/Pool/swap.ts | 88 ++++++------ src/raydium/token-filters/volume.ts | 2 +- 66 files changed, 219 insertions(+), 204 deletions(-) delete mode 100644 src/Trading_dev/ProfitAndLoss/index.ts rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/README.md (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/command.sh (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/main.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/.DS_Store (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/constants/constants.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/constants/index.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/jito/bundle.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/jito/index.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/raydium/buy-helper.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/raydium/formatAmmKeys.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/raydium/index.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/raydium/sell-helper.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/raydium/swap.ts (98%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/raydium/utils.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/streaming/copy-trade.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/streaming/grpc-requests-type.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/streaming/stream-trader.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/streaming/utils.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-copy-bot/src/transaction/transaction.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/.DS_Store (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/README.md (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/command.sh (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/.DS_Store (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/constants/constants.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/constants/index.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/jito/bundle.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/jito/index.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/index.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/random.png (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/pumpdotfun-sdk/example/events/index.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/pumpdotfun-sdk/example/util.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/index.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.json (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/pumpdotfun-sdk/src/amm.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/pumpdotfun-sdk/src/bondingCurveAccount.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/pumpdotfun-sdk/src/events.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/pumpdotfun-sdk/src/globalAccount.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/pumpdotfun-sdk/src/index.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/pumpdotfun-sdk/src/pumpfun.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/pumpdotfun-sdk/src/types.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/pumpdotfun-sdk/src/util.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/streaming/grpc-requests-type.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/streaming/pump.fun.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/streaming/snipe-create.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/streaming/utils.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/transaction/index.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/transaction/transaction.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/utils/index.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/utils/logger.ts (100%) rename src/{grpc_streaming => grpc_streaming_dev}/grpc-pf-sniper/src/utils/utils.ts (100%) diff --git a/src/Memecoin_dev/market-making_dev/boost_volume.ts b/src/Memecoin_dev/market-making_dev/boost_volume.ts index cfb8362..263d03e 100644 --- a/src/Memecoin_dev/market-making_dev/boost_volume.ts +++ b/src/Memecoin_dev/market-making_dev/boost_volume.ts @@ -1,15 +1,8 @@ import { connection, wallet } from "../../helpers/config"; -import { - simple_executeAndConfirm, -} from "../../Transactions/simple_tx_executor"; -import { - jito_executeAndConfirm, -} from "../../Transactions/jito_tips_tx_executor"; +import { simple_executeAndConfirm } from "../../transactions/simple_tx_executor"; +import { jito_executeAndConfirm } from "../../transactions/jito_tips_tx_executor"; import { program } from "commander"; -import { - loadOrCreateKeypair_wallet, - checkTx, -} from "../../helpers/util"; +import { loadOrCreateKeypair_wallet, checkTx } from "../../helpers/util"; import { ComputeBudgetProgram, TransactionMessage, @@ -17,10 +10,10 @@ import { } from "@solana/web3.js"; import { swapForVolume } from "../../raydium/Pool/swap"; let slippage = null, - tokenAddress:any = null, - payer:any = null, + tokenAddress: any = null, + payer: any = null, cluster = null, - solPerOrder:any = null; + solPerOrder: any = null; program .option("--token_address ", "Specify the token address") @@ -31,7 +24,7 @@ program "Specify the number of SOL per order" ) .option("-h, --help", "display help for command") - .action((options:any) => { + .action((options: any) => { if (options.help) { console.log( "node boost_volume --token_address --payer --cluster --sol_per_order " @@ -61,10 +54,7 @@ async function boost_volume() { `Boosting volume..., buying and selling ${tokenAddress} in one transaction...` ); try { - const res:any = await swapForVolume( - tokenAddress, - solPerOrder - ); + const res: any = await swapForVolume(tokenAddress, solPerOrder); await error_handling(res.signature, res.confirmed); } catch (e) { console.log(e); @@ -81,7 +71,7 @@ async function boost_volume() { * @param {boolean} confirmed - Indicates if the transaction is confirmed. * @returns {Promise} - A promise that resolves when the error handling is complete. */ -async function error_handling(signature:any, confirmed:any) { +async function error_handling(signature: any, confirmed: any) { if (confirmed) { console.log(`https://solscan.io/tx/${signature}?cluster=mainnet`); return; diff --git a/src/Trading_dev/ProfitAndLoss/index.ts b/src/Trading_dev/ProfitAndLoss/index.ts deleted file mode 100644 index 01238e0..0000000 --- a/src/Trading_dev/ProfitAndLoss/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./stop-loss"; -export * from "./take-profit"; -export * from "./utils"; -export * from "./constants"; \ No newline at end of file diff --git a/src/Trading_dev/ProfitAndLoss/stop-loss.ts b/src/Trading_dev/ProfitAndLoss/stop-loss.ts index f9af5fc..f5a17fa 100644 --- a/src/Trading_dev/ProfitAndLoss/stop-loss.ts +++ b/src/Trading_dev/ProfitAndLoss/stop-loss.ts @@ -1,4 +1,4 @@ -import {sl} from "." +import {sl} from "./constants" import { readBoughtTokens, writeBoughtTokens, getCurrentPriceRaydium } from "./utils"; import Decimal from 'decimal.js'; /** diff --git a/src/Trading_dev/ProfitAndLoss/take-profit.ts b/src/Trading_dev/ProfitAndLoss/take-profit.ts index ff99e2e..1280eef 100644 --- a/src/Trading_dev/ProfitAndLoss/take-profit.ts +++ b/src/Trading_dev/ProfitAndLoss/take-profit.ts @@ -1,4 +1,4 @@ -import {tp} from "." +import {tp} from "./constants" import { readBoughtTokens, writeBoughtTokens, getCurrentPriceRaydium } from "./utils"; import Decimal from 'decimal.js'; /** diff --git a/src/Trading_dev/ProfitAndLoss/utils.ts b/src/Trading_dev/ProfitAndLoss/utils.ts index b77a2f1..76ec1b3 100644 --- a/src/Trading_dev/ProfitAndLoss/utils.ts +++ b/src/Trading_dev/ProfitAndLoss/utils.ts @@ -1,8 +1,9 @@ import * as fs from 'fs/promises'; import fetch from 'cross-fetch'; -import {sl, tp, wsol} from "." +import {sl, tp, wsol} from "./constants" import Decimal from 'decimal.js'; -import {getCurrentMarketCap, getDayVolume, getCurrentSolInPool, initSdk } from "../../raydium"; +import {getCurrentMarketCap, getDayVolume, getCurrentSolInPool } from "../../raydium/token-filters"; +import {initSdk} from "../../raydium/raydium_config" import {fetchAMMPoolId} from "../../raydium/Pool/fetch_pool" import {logger} from "../../utils" let sdkCache = {sdk: null, expiry: 0} diff --git a/src/Transactions/index.ts b/src/Transactions/index.ts index 6fc74d9..671c8db 100644 --- a/src/Transactions/index.ts +++ b/src/Transactions/index.ts @@ -1,3 +1,3 @@ export * from "./bloXroute_tips_tx_executor"; -export * from "./jito_tips_tx_executor"; -export * from "./simple_tx_executor"; \ No newline at end of file +export * from "./simple_tx_executor"; +export * from "./jito_tips_tx_executor"; \ No newline at end of file diff --git a/src/grpc_streaming/grpc-copy-bot/README.md b/src/grpc_streaming_dev/grpc-copy-bot/README.md similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/README.md rename to src/grpc_streaming_dev/grpc-copy-bot/README.md diff --git a/src/grpc_streaming/grpc-copy-bot/command.sh b/src/grpc_streaming_dev/grpc-copy-bot/command.sh similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/command.sh rename to src/grpc_streaming_dev/grpc-copy-bot/command.sh diff --git a/src/grpc_streaming/grpc-copy-bot/main.ts b/src/grpc_streaming_dev/grpc-copy-bot/main.ts similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/main.ts rename to src/grpc_streaming_dev/grpc-copy-bot/main.ts diff --git a/src/grpc_streaming/grpc-copy-bot/src/.DS_Store b/src/grpc_streaming_dev/grpc-copy-bot/src/.DS_Store similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/src/.DS_Store rename to src/grpc_streaming_dev/grpc-copy-bot/src/.DS_Store diff --git a/src/grpc_streaming/grpc-copy-bot/src/constants/constants.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/constants/constants.ts similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/src/constants/constants.ts rename to src/grpc_streaming_dev/grpc-copy-bot/src/constants/constants.ts diff --git a/src/grpc_streaming/grpc-copy-bot/src/constants/index.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/constants/index.ts similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/src/constants/index.ts rename to src/grpc_streaming_dev/grpc-copy-bot/src/constants/index.ts diff --git a/src/grpc_streaming/grpc-copy-bot/src/jito/bundle.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/jito/bundle.ts similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/src/jito/bundle.ts rename to src/grpc_streaming_dev/grpc-copy-bot/src/jito/bundle.ts diff --git a/src/grpc_streaming/grpc-copy-bot/src/jito/index.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/jito/index.ts similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/src/jito/index.ts rename to src/grpc_streaming_dev/grpc-copy-bot/src/jito/index.ts diff --git a/src/grpc_streaming/grpc-copy-bot/src/raydium/buy-helper.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/raydium/buy-helper.ts similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/src/raydium/buy-helper.ts rename to src/grpc_streaming_dev/grpc-copy-bot/src/raydium/buy-helper.ts diff --git a/src/grpc_streaming/grpc-copy-bot/src/raydium/formatAmmKeys.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/raydium/formatAmmKeys.ts similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/src/raydium/formatAmmKeys.ts rename to src/grpc_streaming_dev/grpc-copy-bot/src/raydium/formatAmmKeys.ts diff --git a/src/grpc_streaming/grpc-copy-bot/src/raydium/index.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/raydium/index.ts similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/src/raydium/index.ts rename to src/grpc_streaming_dev/grpc-copy-bot/src/raydium/index.ts diff --git a/src/grpc_streaming/grpc-copy-bot/src/raydium/sell-helper.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/raydium/sell-helper.ts similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/src/raydium/sell-helper.ts rename to src/grpc_streaming_dev/grpc-copy-bot/src/raydium/sell-helper.ts diff --git a/src/grpc_streaming/grpc-copy-bot/src/raydium/swap.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/raydium/swap.ts similarity index 98% rename from src/grpc_streaming/grpc-copy-bot/src/raydium/swap.ts rename to src/grpc_streaming_dev/grpc-copy-bot/src/raydium/swap.ts index 6868c28..45b388b 100644 --- a/src/grpc_streaming/grpc-copy-bot/src/raydium/swap.ts +++ b/src/grpc_streaming_dev/grpc-copy-bot/src/raydium/swap.ts @@ -13,7 +13,8 @@ import { } from "@solana/web3.js"; import { Decimal } from "decimal.js"; import { BN } from "@project-serum/anchor"; -import { getSPLBalance, getDecimals } from "../../../../helpers/utils"; +import { getSPLBalance } from "../../../../helpers/utils"; +import { getDecimals } from "../../../../helpers/util"; import { DEFAULT_TOKEN } from "../constants"; import { fetchAMMPoolId } from "./utils"; import { diff --git a/src/grpc_streaming/grpc-copy-bot/src/raydium/utils.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/raydium/utils.ts similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/src/raydium/utils.ts rename to src/grpc_streaming_dev/grpc-copy-bot/src/raydium/utils.ts diff --git a/src/grpc_streaming/grpc-copy-bot/src/streaming/copy-trade.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/streaming/copy-trade.ts similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/src/streaming/copy-trade.ts rename to src/grpc_streaming_dev/grpc-copy-bot/src/streaming/copy-trade.ts diff --git a/src/grpc_streaming/grpc-copy-bot/src/streaming/grpc-requests-type.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/streaming/grpc-requests-type.ts similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/src/streaming/grpc-requests-type.ts rename to src/grpc_streaming_dev/grpc-copy-bot/src/streaming/grpc-requests-type.ts diff --git a/src/grpc_streaming/grpc-copy-bot/src/streaming/stream-trader.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/streaming/stream-trader.ts similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/src/streaming/stream-trader.ts rename to src/grpc_streaming_dev/grpc-copy-bot/src/streaming/stream-trader.ts diff --git a/src/grpc_streaming/grpc-copy-bot/src/streaming/utils.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/streaming/utils.ts similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/src/streaming/utils.ts rename to src/grpc_streaming_dev/grpc-copy-bot/src/streaming/utils.ts diff --git a/src/grpc_streaming/grpc-copy-bot/src/transaction/transaction.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/transaction/transaction.ts similarity index 100% rename from src/grpc_streaming/grpc-copy-bot/src/transaction/transaction.ts rename to src/grpc_streaming_dev/grpc-copy-bot/src/transaction/transaction.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/.DS_Store b/src/grpc_streaming_dev/grpc-pf-sniper/.DS_Store similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/.DS_Store rename to src/grpc_streaming_dev/grpc-pf-sniper/.DS_Store diff --git a/src/grpc_streaming/grpc-pf-sniper/README.md b/src/grpc_streaming_dev/grpc-pf-sniper/README.md similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/README.md rename to src/grpc_streaming_dev/grpc-pf-sniper/README.md diff --git a/src/grpc_streaming/grpc-pf-sniper/command.sh b/src/grpc_streaming_dev/grpc-pf-sniper/command.sh similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/command.sh rename to src/grpc_streaming_dev/grpc-pf-sniper/command.sh diff --git a/src/grpc_streaming/grpc-pf-sniper/src/.DS_Store b/src/grpc_streaming_dev/grpc-pf-sniper/src/.DS_Store similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/.DS_Store rename to src/grpc_streaming_dev/grpc-pf-sniper/src/.DS_Store diff --git a/src/grpc_streaming/grpc-pf-sniper/src/constants/constants.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/constants/constants.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/constants/constants.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/constants/constants.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/constants/index.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/constants/index.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/constants/index.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/constants/index.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/jito/bundle.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/jito/bundle.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/jito/bundle.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/jito/bundle.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/jito/index.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/jito/index.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/jito/index.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/jito/index.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/index.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/index.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/index.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/index.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/random.png b/src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/random.png similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/random.png rename to src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/basic/random.png diff --git a/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/events/index.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/events/index.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/events/index.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/events/index.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/util.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/util.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/example/util.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/example/util.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/index.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/index.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/index.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/index.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.json b/src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.json similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.json rename to src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.json diff --git a/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/IDL/pump-fun.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/amm.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/amm.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/amm.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/amm.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/bondingCurveAccount.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/bondingCurveAccount.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/bondingCurveAccount.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/bondingCurveAccount.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/events.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/events.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/events.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/events.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/globalAccount.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/globalAccount.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/globalAccount.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/globalAccount.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/index.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/index.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/index.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/index.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/pumpfun.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/pumpfun.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/pumpfun.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/pumpfun.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/types.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/types.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/types.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/types.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/util.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/util.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/pumpdotfun-sdk/src/util.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/pumpdotfun-sdk/src/util.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/streaming/grpc-requests-type.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/streaming/grpc-requests-type.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/streaming/grpc-requests-type.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/streaming/grpc-requests-type.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/streaming/pump.fun.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/streaming/pump.fun.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/streaming/pump.fun.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/streaming/pump.fun.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/streaming/snipe-create.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/streaming/snipe-create.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/streaming/snipe-create.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/streaming/snipe-create.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/streaming/utils.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/streaming/utils.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/streaming/utils.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/streaming/utils.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/transaction/index.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/transaction/index.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/transaction/index.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/transaction/index.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/transaction/transaction.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/transaction/transaction.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/transaction/transaction.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/transaction/transaction.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/utils/index.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/utils/index.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/utils/index.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/utils/index.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/utils/logger.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/utils/logger.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/utils/logger.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/utils/logger.ts diff --git a/src/grpc_streaming/grpc-pf-sniper/src/utils/utils.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/utils/utils.ts similarity index 100% rename from src/grpc_streaming/grpc-pf-sniper/src/utils/utils.ts rename to src/grpc_streaming_dev/grpc-pf-sniper/src/utils/utils.ts diff --git a/src/helpers/.env.copy b/src/helpers/.env.copy index f00fc2b..c41d09a 100644 --- a/src/helpers/.env.copy +++ b/src/helpers/.env.copy @@ -12,7 +12,7 @@ MAINNET_ENDPOINT = "https://mainnet.helius-rpc.com/?api-key= { + const info: any = await connection.getParsedAccountInfo(mintAddress); + const result = (info.value?.data).parsed.info.decimals || 0; + return result; +} \ No newline at end of file diff --git a/src/helpers/utils.ts b/src/helpers/utils.ts index f147c35..d5961b7 100644 --- a/src/helpers/utils.ts +++ b/src/helpers/utils.ts @@ -108,8 +108,3 @@ export async function retriveWalletState(wallet_address: string) { return {}; } -export async function getDecimals(mintAddress: PublicKey): Promise { - const info: any = await connection.getParsedAccountInfo(mintAddress); - const result = (info.value?.data).parsed.info.decimals || 0; - return result; -} diff --git a/src/jupiter/swap/swap-helper.ts b/src/jupiter/swap/swap-helper.ts index faa2e1a..85a7a8a 100644 --- a/src/jupiter/swap/swap-helper.ts +++ b/src/jupiter/swap/swap-helper.ts @@ -1,9 +1,7 @@ import { VersionedTransaction, PublicKey } from "@solana/web3.js"; import fetch from "cross-fetch"; import { connection, wallet, jito_fee } from "../../helpers/config"; -import { - jito_executeAndConfirm, -} from "../../Transactions/jito_tips_tx_executor"; +import { jito_executeAndConfirm } from "../../transactions/jito_tips_tx_executor"; import { getDecimals } from "../../helpers/util"; /** * Retrieves a quote for swapping tokens. @@ -15,10 +13,10 @@ import { getDecimals } from "../../helpers/util"; * @returns {Promise} - The quote object containing swap details. */ export async function getQuote( - tokenToSell:string, - tokenToBuy:string, - convertedAmountOfTokenOut:number, - slippage:any + tokenToSell: string, + tokenToBuy: string, + convertedAmountOfTokenOut: number, + slippage: any ) { const url = `https://quote-api.jup.ag/v6/quote?inputMint=${tokenToSell}&outputMint=${tokenToBuy}&amount=${convertedAmountOfTokenOut}&slippageBps=${slippage}`; const response = await fetch(url); @@ -33,7 +31,10 @@ export async function getQuote( * @returns {Promise} - The swap transaction. * @throws {Error} - If an error occurs during the process. */ -export async function getSwapTransaction(quoteResponse:any, wallet_pubKey:string) { +export async function getSwapTransaction( + quoteResponse: any, + wallet_pubKey: string +) { try { let body = null; body = { @@ -52,7 +53,7 @@ export async function getSwapTransaction(quoteResponse:any, wallet_pubKey:string }); const swapResponse = await resp.json(); return swapResponse.swapTransaction; - } catch (error:any) { + } catch (error: any) { throw new Error(error); } } @@ -62,7 +63,7 @@ export async function getSwapTransaction(quoteResponse:any, wallet_pubKey:string * @param {number} decimals - The number of decimal places. * @returns {Promise} The converted integer value. */ -export async function convertToInteger(amount:number, decimals:number) { +export async function convertToInteger(amount: number, decimals: number) { return Math.floor(amount * 10 ** decimals); } @@ -72,7 +73,7 @@ export async function convertToInteger(amount:number, decimals:number) { * @returns {Promise<{ confirmed: boolean, signature: string }>} - A promise that resolves to an object containing the confirmation status and transaction signature. * @throws {Error} - If an error occurs during the transaction finalization process. */ -export async function finalizeTransaction(swapTransaction:any) { +export async function finalizeTransaction(swapTransaction: any) { try { let confirmed = null, signature = null; @@ -92,7 +93,7 @@ export async function finalizeTransaction(swapTransaction:any) { confirmed = res.confirmed; signature = res.signature; return { confirmed, signature }; - } catch (error:any) { + } catch (error: any) { throw new Error(error); } return { confirmed: false, signature: null }; @@ -106,7 +107,12 @@ export async function finalizeTransaction(swapTransaction:any) { * @param {number} slippage - The allowed slippage percentage. * @returns {Promise} - A promise that resolves when the swap transaction is completed. */ -export async function swap(tokenToSell:string, tokenToBuy:string, amountTokenOut:number, slippage:any) { +export async function swap( + tokenToSell: string, + tokenToBuy: string, + amountTokenOut: number, + slippage: any +) { try { const decimals = await getDecimals(new PublicKey(tokenToSell)); const convertedAmountOfTokenOut = await convertToInteger( @@ -135,4 +141,4 @@ export async function swap(tokenToSell:string, tokenToBuy:string, amountTokenOut } catch (error) { console.error(error); } -} \ No newline at end of file +} diff --git a/src/meteora/Pool/swap.ts b/src/meteora/Pool/swap.ts index 97588bc..f1e784f 100644 --- a/src/meteora/Pool/swap.ts +++ b/src/meteora/Pool/swap.ts @@ -17,7 +17,7 @@ import { ComputeBudgetProgram, VersionedTransaction, } from "@solana/web3.js"; -import { jito_executeAndConfirm } from "../../Transactions/jito_tips_tx_executor"; +import { jito_executeAndConfirm } from "../../transactions/jito_tips_tx_executor"; import { jito_fee } from "../../helpers/config"; import { C } from "@raydium-io/raydium-sdk-v2/lib/raydium-276d396e"; const BN = require("bn.js"); @@ -139,4 +139,4 @@ async function main() { const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; await swap("sell", tokenAddress, -1, 100); } -//main(); \ No newline at end of file +//main(); diff --git a/src/orca/Pool/swap.ts b/src/orca/Pool/swap.ts index dc6a6f7..0f929ef 100644 --- a/src/orca/Pool/swap.ts +++ b/src/orca/Pool/swap.ts @@ -1,11 +1,5 @@ -import { - DecimalUtil, - Percentage, -} from "@orca-so/common-sdk"; -import { - swapQuoteByInputToken, - IGNORE_CACHE, -} from "@orca-so/whirlpools-sdk"; +import { DecimalUtil, Percentage } from "@orca-so/common-sdk"; +import { swapQuoteByInputToken, IGNORE_CACHE } from "@orca-so/whirlpools-sdk"; import { MAINNET_WHIRLPOOLS_CONFIG, WSOL, @@ -13,14 +7,20 @@ import { tick_spacing, ourWallet, client, - ctx + ctx, } from "../constants"; import Decimal from "decimal.js"; import { connection, wallet, jito_fee } from "../../helpers/config"; -import { getSPLTokenBalance } from "../../helpers/check_balance" -import { jito_executeAndConfirm } from "../../Transactions"; -import { TransactionMessage, Transaction, TransactionInstruction, VersionedTransaction, PublicKey} from "@solana/web3.js"; -import {fetchWhirlPool} from "./fetch-pool" +import { getSPLTokenBalance } from "../../helpers/check_balance"; +import { jito_executeAndConfirm } from "../../transactions"; +import { + TransactionMessage, + Transaction, + TransactionInstruction, + VersionedTransaction, + PublicKey, +} from "@solana/web3.js"; +import { fetchWhirlPool } from "./fetch-pool"; /** * Performs a swap operation in a Whirl pool. * @param side The side of the swap operation, either "buy" or "sell". Default is "buy". @@ -36,9 +36,13 @@ export async function swap( sellPercentage: number = 100 ) { const tokenMint = new PublicKey(tokenAddress); - const whirlPool:any = await fetchWhirlPool(tokenAddress); - let amountIn:Decimal, inToken:PublicKey, outToken:PublicKey, tokenDecimal:number, quote:any; - if(side === "buy"){ + const whirlPool: any = await fetchWhirlPool(tokenAddress); + let amountIn: Decimal, + inToken: PublicKey, + outToken: PublicKey, + tokenDecimal: number, + quote: any; + if (side === "buy") { amountIn = new Decimal(buyAmountInSOL); inToken = WSOL.mint; outToken = tokenMint; @@ -51,14 +55,18 @@ export async function swap( ctx.fetcher, IGNORE_CACHE ); - }else{ - const balance = await getSPLTokenBalance(connection, tokenMint, wallet.publicKey); + } else { + const balance = await getSPLTokenBalance( + connection, + tokenMint, + wallet.publicKey + ); amountIn = new Decimal(balance * (sellPercentage / 100)); inToken = tokenMint; outToken = WSOL.mint; - if(whirlPool.tokenAInfo.mint.toBase58() === tokenMint.toBase58()){ + if (whirlPool.tokenAInfo.mint.toBase58() === tokenMint.toBase58()) { tokenDecimal = whirlPool.tokenAInfo.decimals; - }else{ + } else { tokenDecimal = whirlPool.tokenBInfo.decimals; } quote = await swapQuoteByInputToken( @@ -71,46 +79,47 @@ export async function swap( IGNORE_CACHE ); } - // build the tx - const swapTx: any = await whirlPool.swap(quote); - let ixList = [], signers = []; - // extract the instructions and signers - for (const ix of swapTx.instructions) { - ixList.push(...ix.instructions); - //ixList.push(...ix.cleanupInstructions); - signers.push(...ix.signers); - } - - // send the tx to jito - try { - const recentBlockhash = await connection.getLatestBlockhash(); - const messageV0 = new TransactionMessage({ - payerKey: wallet.publicKey, - recentBlockhash: recentBlockhash.blockhash, - instructions: [...ixList], - }).compileToV0Message(); - - const transaction = new VersionedTransaction(messageV0); - transaction.sign([wallet,...signers]); - const res = await jito_executeAndConfirm( - transaction, - wallet, - recentBlockhash, - jito_fee + // build the tx + const swapTx: any = await whirlPool.swap(quote); + let ixList = [], + signers = []; + // extract the instructions and signers + for (const ix of swapTx.instructions) { + ixList.push(...ix.instructions); + //ixList.push(...ix.cleanupInstructions); + signers.push(...ix.signers); + } + + // send the tx to jito + try { + const recentBlockhash = await connection.getLatestBlockhash(); + const messageV0 = new TransactionMessage({ + payerKey: wallet.publicKey, + recentBlockhash: recentBlockhash.blockhash, + instructions: [...ixList], + }).compileToV0Message(); + + const transaction = new VersionedTransaction(messageV0); + transaction.sign([wallet, ...signers]); + const res = await jito_executeAndConfirm( + transaction, + wallet, + recentBlockhash, + jito_fee + ); + const signature = res.signature; + const confirmed = res.confirmed; + + if (confirmed) { + console.log(`🚀 https://solscan.io/tx/${signature}`); + } else { + console.log( + "jito fee transaction failed when swapping token in a orca whirl pool" ); - const signature = res.signature; - const confirmed = res.confirmed; - - if (confirmed) { - console.log(`🚀 https://solscan.io/tx/${signature}`); - } else { - console.log( - "jito fee transaction failed when swapping token in a orca whirl pool" - ); - } - } catch (error: any) { - console.log("🚀 ~ error: ", JSON.parse(JSON.stringify(error))); } + } catch (error: any) { + console.log("🚀 ~ error: ", JSON.parse(JSON.stringify(error))); + } } //swap("buy", "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr", 0.01, -1); // buy 0.01 SOL worth of the token //swap("sell", "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr", -1, 50); // sell 50% of the token diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/util.ts b/src/pumpfunsdk/pumpdotfun-sdk/src/util.ts index e216c0d..f3e924e 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/util.ts +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/util.ts @@ -1,4 +1,4 @@ -import{ +import { Commitment, ComputeBudgetProgram, Connection, @@ -14,12 +14,12 @@ import{ LAMPORTS_PER_SOL, SystemProgram, } from "@solana/web3.js"; -import{ AnchorProvider } from "@coral-xyz/anchor"; -import {PumpFunSDK, DEFAULT_DECIMALS} from "./pumpfun"; -import{ PriorityFee, TransactionResult } from "./types"; -import{ jito_executeAndConfirm } from "../../../Transactions/jito_tips_tx_executor"; +import { AnchorProvider } from "@coral-xyz/anchor"; +import { PumpFunSDK, DEFAULT_DECIMALS } from "./pumpfun"; +import { PriorityFee, TransactionResult } from "./types"; +import { jito_executeAndConfirm } from "../../../transactions/jito_tips_tx_executor"; import fs from "fs"; -import{ bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; +import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; export const DEFAULT_COMMITMENT = "finalized"; export const DEFAULT_FINALITY = "finalized"; @@ -37,7 +37,7 @@ export const calculateWithSlippageSell = ( return amount - (amount * basisPoints) / 10000n; }; -function readCSVFile(filePath:string) { +function readCSVFile(filePath: string) { try { const data = fs.readFileSync(filePath, "utf8"); return data; @@ -48,20 +48,30 @@ function readCSVFile(filePath:string) { } export async function sendTxToJito( - connection:Connection, - tx:any, - payer:Keypair, - signers:Keypair[], - jitofee:any -){ - const blockhash = (await connection.getLatestBlockhash()); + connection: Connection, + tx: any, + payer: Keypair, + signers: Keypair[], + jitofee: any +) { + const blockhash = await connection.getLatestBlockhash(); let final_tx = new Transaction(); final_tx.add(tx); - let versionedTx = await buildVersionedTx(connection, payer.publicKey, final_tx, connection.commitment); + let versionedTx = await buildVersionedTx( + connection, + payer.publicKey, + final_tx, + connection.commitment + ); versionedTx.sign(signers); - try{ - const {confirmed, signature} = await jito_executeAndConfirm(versionedTx, payer, blockhash, jitofee); - // let txResult = await getTxDetails(connection, signature, connection.commitment, DEFAULT_FINALITY); + try { + const { confirmed, signature } = await jito_executeAndConfirm( + versionedTx, + payer, + blockhash, + jitofee + ); + // let txResult = await getTxDetails(connection, signature, connection.commitment, DEFAULT_FINALITY); if (!confirmed) { return { success: false, @@ -72,20 +82,17 @@ export async function sendTxToJito( success: true, signature: signature, }; - - }catch(e){ - if(e instanceof SendTransactionError){ - let ste = e; - }else{ - console.error(e); - } - return { - error: e, - success: false, - }; + } catch (e) { + if (e instanceof SendTransactionError) { + let ste = e; + } else { + console.error(e); } - - + return { + error: e, + success: false, + }; + } } export async function sendTx( @@ -113,7 +120,12 @@ export async function sendTx( newTx.add(tx); - let versionedTx = await buildVersionedTx(connection, payer, newTx, commitment); + let versionedTx = await buildVersionedTx( + connection, + payer, + newTx, + commitment + ); versionedTx.sign(signers); try { @@ -153,8 +165,7 @@ export const buildVersionedTx = async ( tx: Transaction, commitment: Commitment = DEFAULT_COMMITMENT ): Promise => { - const blockHash = (await connection.getLatestBlockhash(commitment)) - .blockhash; + const blockHash = (await connection.getLatestBlockhash(commitment)).blockhash; let messageV0 = new TransactionMessage({ payerKey: payer, @@ -187,7 +198,10 @@ export const getTxDetails = async ( }); }; -export function generateKeysAndAllocateSol(targetNumberOfKeys:number, targetTotalSol:number) { +export function generateKeysAndAllocateSol( + targetNumberOfKeys: number, + targetTotalSol: number +) { // Generate private keys const keys = []; let sum = 0; @@ -226,16 +240,15 @@ export function generateKeysAndAllocateSol(targetNumberOfKeys:number, targetTota return allocations; } - export async function generateWalletsAndDropSOL( - connection:Connection, - masterWallet:Keypair, - amountOfSol:number, - numberOfNewWallet:number, - pathToSave:string -){ + connection: Connection, + masterWallet: Keypair, + amountOfSol: number, + numberOfNewWallet: number, + pathToSave: string +) { // Check if the file already exists - let existingWallets= []; + let existingWallets = []; try { const fileContents = await fs.promises.readFile(pathToSave, "utf8"); existingWallets = JSON.parse(fileContents); @@ -297,7 +310,11 @@ export async function generateWalletsAndDropSOL( return existingWallets; } - export async function checkIfBondingCurveComplete(connection:Connection, wallet:any, mintKeypair:any){ +export async function checkIfBondingCurveComplete( + connection: Connection, + wallet: any, + mintKeypair: any +) { const provider = new AnchorProvider(connection, wallet, { commitment: "finalized", }); @@ -308,6 +325,4 @@ export async function generateWalletsAndDropSOL( ); console.log("bondingCurveAccount: ", bondingCurveAccount); return bondingCurveAccount?.complete; - - } - +} diff --git a/src/raydium/Pool/swap.ts b/src/raydium/Pool/swap.ts index a58a416..adc8d64 100644 --- a/src/raydium/Pool/swap.ts +++ b/src/raydium/Pool/swap.ts @@ -27,11 +27,7 @@ import { wallet, jito_fee, } from "../../helpers/config"; -import { - getDecimals, - getTokenMetadata, - checkTx, -} from "../../helpers/util"; +import { getTokenMetadata, checkTx, getDecimals } from "../../helpers/util"; import { fetchAMMPoolId } from "./fetch_pool"; import { getAssociatedTokenAddress, @@ -40,15 +36,11 @@ import { createCloseAccountInstruction, } from "@solana/spl-token"; import { formatAmmKeysById_swap } from "./formatAmmKeysById"; -import { - simple_executeAndConfirm, -} from "../../Transactions/simple_tx_executor"; -import { - jito_executeAndConfirm, -} from "../../Transactions/jito_tips_tx_executor"; -import {bloXroute_executeAndConfirm} from "../../Transactions/bloXroute_tips_tx_executor"; +import { simple_executeAndConfirm } from "../../transactions/simple_tx_executor"; +import { jito_executeAndConfirm } from "../../transactions/jito_tips_tx_executor"; +import { bloXroute_executeAndConfirm } from "../../transactions/bloXroute_tips_tx_executor"; import { Keypair } from "@solana/web3.js"; -let tokenToPoolIdMap:any = {}; +let tokenToPoolIdMap: any = {}; /** * Performs a swap transaction using an Automated Market Maker (AMM) pool. @@ -63,10 +55,10 @@ let tokenToPoolIdMap:any = {}; * @param {string} input.side - The side of the swap transaction (e.g., "buy"). * @returns {Object} - The transaction ID if successful, otherwise null. */ -async function swapOnlyAmm(input:any) { +async function swapOnlyAmm(input: any) { // -------- pre-action: get pool info --------\ - const poolKeys:any = await formatAmmKeysById_swap( + const poolKeys: any = await formatAmmKeysById_swap( new PublicKey(input.targetPool) ); assert(poolKeys, "cannot find the target pool"); @@ -147,7 +139,7 @@ async function swapOnlyAmm(input:any) { console.log("jito fee transaction failed"); console.log(`Retry attempt ${attempts}`); } - } catch (e:any) { + } catch (e: any) { console.log(e); if (e.signature) { return { txid: e.signature }; @@ -159,8 +151,8 @@ async function swapOnlyAmm(input:any) { console.log("Transaction failed after maximum retry attempts"); return { txid: null }; } -async function swapOnlyAmmUsingBloXRoute(input:any) { - const poolKeys:any = await formatAmmKeysById_swap( +async function swapOnlyAmmUsingBloXRoute(input: any) { + const poolKeys: any = await formatAmmKeysById_swap( new PublicKey(input.targetPool) ); assert(poolKeys, "cannot find the target pool"); @@ -193,25 +185,25 @@ async function swapOnlyAmmUsingBloXRoute(input:any) { if (input.usage == "volume") return innerTransaction; const latestBlockhash = await connection.getLatestBlockhash(); let tx = new Transaction(); - tx.add( + tx.add( ComputeBudgetProgram.setComputeUnitPrice({ - microLamports: 305290, + microLamports: 305290, }), ComputeBudgetProgram.setComputeUnitLimit({ - units: 312750, + units: 312750, }), ...(input.side === "buy" - ? [ - createAssociatedTokenAccountIdempotentInstruction( - wallet.publicKey, - input.ataOut, - wallet.publicKey, - input.outputToken.mint - ), - ] - : []), - ...innerTransaction.instructions, - ) + ? [ + createAssociatedTokenAccountIdempotentInstruction( + wallet.publicKey, + input.ataOut, + wallet.publicKey, + input.outputToken.mint + ), + ] + : []), + ...innerTransaction.instructions + ); await bloXroute_executeAndConfirm(tx, [wallet]); } /** @@ -220,8 +212,8 @@ async function swapOnlyAmmUsingBloXRoute(input:any) { * @param {number} sol_per_order - The price of SOL per order. * @returns {Promise<{ confirmed: boolean, txid: string }>} The confirmation status and transaction ID. */ -export async function swapForVolume(tokenAddr:string, sol_per_order:number) { - const buy_instruction:any = await swap( +export async function swapForVolume(tokenAddr: string, sol_per_order: number) { + const buy_instruction: any = await swap( "buy", tokenAddr, sol_per_order, @@ -229,7 +221,7 @@ export async function swapForVolume(tokenAddr:string, sol_per_order:number) { wallet, "volume" ); - const sell_instruction:any = await swap( + const sell_instruction: any = await swap( "sell", tokenAddr, -1, @@ -264,10 +256,14 @@ export async function swapForVolume(tokenAddr:string, sol_per_order:number) { let signature = null, confirmed = null; try { - const res:any = simple_executeAndConfirm(transaction, wallet, latestBlockhash); + const res: any = simple_executeAndConfirm( + transaction, + wallet, + latestBlockhash + ); signature = res.signature; confirmed = res.confirmed; - } catch (e:any) { + } catch (e: any) { console.log(e); return { confirmed: confirmed, txid: e.signature }; } @@ -279,8 +275,8 @@ export async function swapForVolume(tokenAddr:string, sol_per_order:number) { * @param {Object} input - The input object containing the necessary parameters for the swap. * @returns {Promise} - A promise that resolves when the swap is completed. */ -async function swapOnlyAmmHelper(input:any) { - const res:any = await swapOnlyAmm(input); +async function swapOnlyAmmHelper(input: any) { + const res: any = await swapOnlyAmm(input); console.log("txids:", res.txid); const response = await checkTx(res.txid); if (response) { @@ -309,12 +305,12 @@ async function swapOnlyAmmHelper(input:any) { * @returns {Promise} - A promise that resolves when the swap operation is completed. */ export async function swap( - side:string, - tokenAddr:string, - buy_AmountOfSol:number, - sell_PercentageOfToken:number, - payer_wallet:Keypair, - usage:string + side: string, + tokenAddr: string, + buy_AmountOfSol: number, + sell_PercentageOfToken: number, + payer_wallet: Keypair, + usage: string ) { const tokenAddress = tokenAddr; const tokenAccount = new PublicKey(tokenAddress); @@ -423,7 +419,7 @@ export async function swap( if (usage == "volume") { return await swapOnlyAmm(input); } - swapOnlyAmmHelper(input); // using Jito + swapOnlyAmmHelper(input); // using Jito //swapOnlyAmmUsingBloXRoute(input); // using bloXroute } } diff --git a/src/raydium/token-filters/volume.ts b/src/raydium/token-filters/volume.ts index 58c5e32..66b91dc 100644 --- a/src/raydium/token-filters/volume.ts +++ b/src/raydium/token-filters/volume.ts @@ -64,4 +64,4 @@ export async function getMonthVolume(tokenAddress:string){ } } -getMonthVolume("GiMsMKgMq3cX3PJwPZCxh6CsrsVTc5P975eeAMPLpump"); \ No newline at end of file +//getMonthVolume("GiMsMKgMq3cX3PJwPZCxh6CsrsVTc5P975eeAMPLpump"); \ No newline at end of file From 7c50b3cdba90e5fe2bfbc4d3f3f61b60a5459324 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 14:26:47 +0800 Subject: [PATCH 056/140] add .DS_Store to .gitignore --- .gitignore | 3 ++- src/pumpfunsdk/README.md | 0 src/pumpfunsdk/pumpdotfun-sdk/.gitignore | 15 --------------- src/pumpfunsdk/pumpdotfun-sdk/.npmignore | 1 - .../pumpdotfun-sdk/example/basic/999.jpg | Bin 220374 -> 0 bytes src/pumpfunsdk/pumpdotfun-sdk/images/999.jpg | Bin 220374 -> 0 bytes .../pumpdotfun-sdk/images/download.jpeg | Bin 10981 -> 0 bytes 7 files changed, 2 insertions(+), 17 deletions(-) delete mode 100644 src/pumpfunsdk/README.md delete mode 100644 src/pumpfunsdk/pumpdotfun-sdk/.gitignore delete mode 100644 src/pumpfunsdk/pumpdotfun-sdk/.npmignore delete mode 100644 src/pumpfunsdk/pumpdotfun-sdk/example/basic/999.jpg delete mode 100644 src/pumpfunsdk/pumpdotfun-sdk/images/999.jpg delete mode 100644 src/pumpfunsdk/pumpdotfun-sdk/images/download.jpeg diff --git a/.gitignore b/.gitignore index 4345ee5..23d12cd 100644 --- a/.gitignore +++ b/.gitignore @@ -136,4 +136,5 @@ dist .yarn/install-state.gz .pnp.* node_modules -test-ledger \ No newline at end of file +test-ledger +.DS_Store \ No newline at end of file diff --git a/src/pumpfunsdk/README.md b/src/pumpfunsdk/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/src/pumpfunsdk/pumpdotfun-sdk/.gitignore b/src/pumpfunsdk/pumpdotfun-sdk/.gitignore deleted file mode 100644 index b3e7071..0000000 --- a/src/pumpfunsdk/pumpdotfun-sdk/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -.anchor -.DS_Store -target -**/*.rs.bk -node_modules -test-ledger -.yarn - -dist/ - -.keys*/ -.keys*/** - -.env -refs/ \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/.npmignore b/src/pumpfunsdk/pumpdotfun-sdk/.npmignore deleted file mode 100644 index 4949f09..0000000 --- a/src/pumpfunsdk/pumpdotfun-sdk/.npmignore +++ /dev/null @@ -1 +0,0 @@ -example/ \ No newline at end of file diff --git a/src/pumpfunsdk/pumpdotfun-sdk/example/basic/999.jpg b/src/pumpfunsdk/pumpdotfun-sdk/example/basic/999.jpg deleted file mode 100644 index b7f4ea6ee6a7fbc7448c34206032c98ad5b12086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220374 zcmV(LDxHLD1O&;0@Lv*8P%t0C9)3FGx@M{FnGDp#KE?Tbk?t@cv_e zjs39scjLa%J+1fO^I!5m#(wL4wSOc32l~Itk2C$h{onqN^>KU)9ne~JH1`%(0p{?G1Tzt8d? z_PtDhY5!~ceg8AzTmGl*$NaC0AJ@O%fA;@z{_p?)(6{w3^xyhFKmYT6Y=7V2>M zd;H)1fAb&gzi7U|znTA6|8M>a{OA5}^FROp@%``rPxlMVv-6+wKl%T__yYc;{uln& z`M>qQwckxY;(zJ?TmHlL@Bjb8PpQB2f2RLu|J(hi|Ns0yp+C+)v;W2a3;vJ)Kl$JP z|NOrDKmLEs_{d!|9|&p>{UqRZX^Edum>g-qCEZ|ruIrnbo68?=3$D? z9eU!Ru)ymiMNypyX-=IFp^f7kARN+i1OCk?Ti{$hDQW8`%85*GPqf`gouzTMH+5jP zll8a)pdi{VLT?DZxhKaZ>d$Sc&(fyTfhJ*YSas5RuL#3)FUWFf4!uBTi)B0*E3@>p zLA4XppT5K=k2@OR!At$$zze9E$|(04)pSVWqoiuU<=?STDZr@)y_5GHGh?{^IhWoH z=jOnxbP#T81BeTYOJ8yhdoY-~rTr8ntY7XaC&`W)d%CtJ=FT&w^Ua=sQBx*;J`E*& zMY8j%gDMGM`Op56y@cyU&1b+oJ~XyB*`UmI&t>?}1zN7ybt@PvP5qKF@6HTtl8ZN< zB#dO-4rVs^JeNR{os_=kvu6U7NnHT5BwW>mFiI)T*xionlnJ$(wh_gNO>DQ>46cs^ zFgkIRAgGOQ40dv_igQSrBEHuLl4#53G6@qOxwP!br#}@_*H2Ep_}|&_NE`l3P0m52 z@bC&!kWol@nLvpaRQk(2a@H5AMhwnzg&>VO0MEQw;Vb+0uGE(Y=FwknEyshn-Jql( z+dKKtD`8brRx9Wn@ScA;tj$_UM%_pHKeN zup(onyS}*Ic9J!mbM9O*XJsxl5N?5C!YZoaysPNCV?CJsZuCCpBVindYt;+(sKp-u z`X!QX5j9vq76mhvtaqW!_Ls}Z78u=BGtx7Ftbga<4$C@oeo;=p99DC)L+bgd+IS@X zRB8N*6r-Friks$@=n3xf{suvH;^(qTq~4+t%t#KBvhgd_*L}$LJ-2fWKDBxE=oK?= zI#}DI|93x#EJ;I&;y(V>eBeD2l-gZ;y`(3~UVJh$Qv8jN8?)#gI|H5o)kCD~SZW)@ zuLf{;t@AyV-GX5)L*aCI5I4)!ReeE#ig18qV@jhB}a?VN|-glh{~IEq`Q)b z8h^H@FZM)!VMPCGf33!*ioMaudEU#r$Rb})Uf1tr{MVqjpo`>7G|su5IpX~twp!En zH@)JL5fSVi^+<-5BjSGFx|fGaE`ylWr^0$3NCx{Qa!Bbb2@j2HV5eW=CRg$AYK~NT&Sy#OgkP*g*I>dCM&b+6* zkRoN5f{NX8j`@U~!BDP4@+{`hqrLthpk7!gJ(Au%>UyeHX6q^cb<`;WD9l;^^~N>3 z)v7Dk-q3md5(zuPU|o@Vw^zdIu${C3+IVSymF6teZF5)fm|vXw>4W=}9Yx6Etge@f zDh@&u^}aHTr{c9sZM~2v^IkjhBs2g$gKN<^xpn{GU)I=jSZ_u}_uyXthy$(LgGNH~ zz^L9W{Xd9FZ;_c1y#P$xy+;YMINPVb_LHdch*jIJ;*`2NYI^Tgm;I1a@9FD$YmmD& z8C?bo*@^+FMXmMkbu%!T(4*Yfor7z$39E&fpySA20Xjk^S<(ey`Tw5oQAA~@yBq6} zRGfSL>4-Ost}-_&Egta2f6j(>>Zrifo&dl!5$s*fkdYij$0h3$eNy*oT<5y9RxTeF zykEpCU%R$Y$&%btPuB%W(+($#ep9I{;?XZylSVLTvUI}EWQP^cN)}?O>d}R3;W@=0 zckM<)e_+X6q|3at9^=?e6rG+pitjR%-I&p8iu~cVfX*f|6Wwd>)>2goz;eW7=;ft= zt3DinqdIxpR)RJjQc%Pw;+*Q_KvqiDzvUL#{k(*CsyX^s?y6Qj?gQxX?e=mvYV$UD!u}`)em`k4o_fjuaW16}QVKNHRmAI4j?`fp>Qx>ysp02Py#0n*z06V&xIg1_k0%G|mr?fH+L z^3iu!u+p8v5o5&}5-adDL_9DJQY64lPZ=6O4yw|Z32R-1SS>36R9$P@Qy(!!UxBzP zzG!u#(x-xSNu$jeYLaV}!Z}QuFPf2Oi%RMfNzr?qWh%jG`kuBJEF}UBai$j7Tq?Bv z2F>p4Pn&TjNBmM!@I$yNJ|DeU8fPpB`}L1ONgZb2y^ZxV`*uUQt=)Q`{EZ_ol-A;$ zs_{|wNW|i|KIR7g8;FYx={Qa6x;s?Gzu548peT)v{`Tz*zt|p>8OVNM+onHv62`0Z zdiC1tryFFTG7)8bdTZerzbATzSoGwQpNPdbN5&fWEcZ}#` zL&oKsVmJm)@8%ZDzH>b5P2@99t-7(4bV`@**YfLx1p$o6U)f!s$V z{e(Ub{+cu)YzkEg0p%)3QWd%7eiJB9JUoSUV@gp4++36w97G>CT*Kgk{;8{hDlS8SRsq$ZMgz@)j`UZR6j}F-jdr-cZFjIr4~*QI@{AwZV|FJ-4zU9kE|-JPwK<8W5+C zIv}?Al_(ot7GFSPqKgGkc(Z5_${pVC*f0`ksxmS>{3ABKEARLp>uR|W`=t(&;`1Mx zv4Nm=)#$(eoQddTOK2!%T<6lqvhBf^dL8d4l<7f@>+A6Wb(|nSICBlADKLp2j`SHX)}o zRWV`qY+b9;X$yb%(P`>K-0ZlEj1^WRo^c2`k-SPFE+TaWD)w#FA#(2X0=pVu`Yfd~ z$zHSinNgAyFW}5}K9?loW8z;?3H#_RL;6m-6owK=sbCR5_MO}Hxx;&|6!u_9u$cdq znxNjAEqT)g+v`SOU>r^?(DH9QYS38Z&#PC@(WQzNzwc;IK}rk0_YsfD`5)^B_c3zw z8TAj?Yol|*48Ob7+YyxHEbS3 zRV$`hdE=EaFt(ak1c%mhj(SP&J!C1|ta3E(ue93G3fnSts@~SUD0ZY2nl#(yRu=+8 zxbel1TkP4kVWJC1N85a- z*e%8b4<4H4=dk}?nudy3BmxK~&`!}S@N;QC&%t`r$OaC{mkP$EjOJ$3S~vpGT`O70%q$1tZL>8T6HfKymrVu*%6-T%S2*6-$S07~A9* z)x{B0>`wcrx~^6_$jo8rt{rDKoo#X`878r5-}9uM`WlS;fGItJWiYTIEmv`$eicTv(>F(18uA1R&`}Wy*V58!{-wYSC zVub)@p0ao6*Hg_M?`%+g1*@vEs5l~LOmViD&J%QagObN;#V!rfd&_{JmC5X>IMqt4 z{M?ll;oq4Kf7V2moo-SMw9B*}QFC-lQDK;PWt43$iAXKAO{0{`C390kh)sriBpSzM zuK$&?Y^~>bB-EPm`43P?aLyZnXyUKU5*sZ20;Pd$WUNmrEo@fL-u&tL&Vm)?Gv1Y? zO`WXcisS-|htIK>r^c@7wXe&IiQ}_QG3eVa438I9fZoYnnWhZG-HDDWyl48nxaZ>> zb6&Q6UHdvFHb29AXJ+^%)7p_s)0AS}gM(|LEtaf}QS6*bX4HAd;YP1DKCXeNC zejsv+!@^-I5K(~QX~!{mw_`{W$4Bi)gB6^lV7u$RF`EP%+Tp0wL*nMZ+v3m@!Q%?v zA&Zzq=R4_;mD_I5E{P8$hqg!0Se8bm=Sml{$Yx)(PlX3~cjd>6%M!{ANbq6EpluJ6 zv>PP2mnbO$Xkc1=7&*XyQG}^imqR=1`g(DW>J~F!>F1qp>)wRS{-vP< z+wzDgXBJ<^dgZmc1NJ2lJI(s<<2DJqN{v>Ur+C3&;OKo;n zH4y`!SNPbbi#^N9r!Y0>0JZ>@j6E}Qh_Q9{Te~nbrh!^`Kvc0-wX><+{%QA~(Gs&! zsx9c3eX6k{kh`IAu&2)3Vd#0y>-y}F1e#wj4u>wtc6Jw|8u$Gx5_>2XJVW^;lpgv!0{~u5%^3=M|x2j7+8`~)`6Wo?9xqxK3*=eAf zJwP3y4OqCHfc39BJlFv_lO-M`vdZIv4JmdFhz8O!%r_nQM(nakGZNC0g-6^?#nwmC zJjvb6s!<8qCfra6Wy=wdV{R@5FWM(hjS?7*U0g}sU6Sy^*PnCfMK3`zzz?@pkhK zE>5pSO5M@{P}s?|{U!H+zs^&**rxVChh61hY!0GoTIk-{;@XzFx&!YD*YaBq=iG0p z-RZcIvs+xz_jm6Y$OrYGvMa|oaQz_p*d0IgQVZ_g#oS%~!yqB@-P%R_3poLe@tAxQ zUcWPfLX#y_#F(Q+`3c`L=ECGlf#|h;=29vcozOja)B~@tZV|!+`PD3jbbcHz3EB&Q?{japd`^vdxFC2X9WEE z&c(Mm`1xyMzBGGJI)B1X3lHWP0#t{8P(R>YlG*&5;cQx^gX@s0ouIBr5djO&Q<1>g zQP&5_J2%`13-r_ySRdj)9cJOpnBSscrDE{z=pL4o>oe%2E0EZu?+RPo`pVBwh2L|F z=%7(jGRv*4DYo3!V#_F(jwMd;*C?m02Mvp$;kaM;ND8}H8~BFqHHl1y!r@R(dnc^s zJy~b2y7Du6f&6~5_Zike+Tnm0l4oNE-@%kiOaA;F6?t#SETnw*Q3GHwFIH{4KJP@F z5>Z6!D|;Pi^oW$D|8vhI%g1|K)JOf_gPvVdtY8LWPi-?w0uz|o;E@m0Tv+B|vf!%6c1gpd zMmw3$qx`A+g2t>h!g(^8wd4r zfum5Z>LwLyma%Y6ZT0m@cbMgK_!#TNci41Jz1I4qG(Yb#V`;b|clCN1Jf(&uIHxW# zNqZMZ&$P5PogNt<^S}l@ag)y18u8t+9Lffpp_F=O&q+J7IlVgims&`sgk@Ly`{nFy z2q00bPTF2wc5NP0cqp4`mtDZm-s(}wtUslrr;!F^t<9m0mefCtv6xuoE4(#{3m4Kv z4&*_)^L=nf`bZLZHnx&byMmZ4L$t7@mH~?{~bOXB{cEX;H`kgyXajLk^ zt&Yqs)U3t(~ib? zs8m>r@Z)!AE3Csd(q_|T+i<=-xx8stBCsclzJGzQ9aUN4f%@2SD3nBH_6iAnzE3j@3$}rXUny@VCec z5YRpE7J@RX*kV*^>_$!CB4+^}-}iCaXuAQX=yzl6*C8pvGvIi+V@~UN%UWPckuzF%ngL(RoIu2|O`tJ~e1vPp^O}?DhlhV;1dG|vydL4|psd5S zb}bB<;^iwQcwqBPGx-6mOb9nZ0oAsmP7Sv}=RxAC)*?45ZvZ47qd}-XGmdbW68P$+ zK!!JP_@tUUV0JD#$>f28E^zo$$HqVBeCrA6;P@Z^GaO=WkYQs_StsK`%jL?uk?UZH459YrFd{cRdug(Yx?fN5ef zfkRsAsH^HqeaUWeu^TYwbO&$=4_T2=T=rmbH`O}FYojv$w*h8rm6bN8Mo6g$L(GzP zmS2Og)}dgTQP~3Bq*=rXptIeAYZ2z)>~HM?TYr-z(=KcyMaK%FkLC?k7dnS$ z>Ve;QaIN2*J`X1OKlzbZSb-C={MMGOD1TkEola8c(MJc8evQ$uHyXsKliTOa@TrKq z?nV`o82&#;fqHoUf2%Y>#w~)=u8UX&d%#*}60TJawMZ}|IbUMAc|ciBl&(Z#=R?{x zwER*-4xVs|VSmlwk6+e+Ksu^SX&EgR8u+(Q;TS%P!MNY9BHta{!g&^r%y1X5_8-MWm$}V! zI>dYdeuxtg1jN;)dij&IiCjT{?8Wrqhv+!4!ds>pGKlUHej#2YzL#*dF_2H|49@nj8>74ZXI$3O!J)NiS0TE@kB&NVD8IuFdpT;IT zlk0H1rK>QH3`poyfnsVh}12k~!()%6eJZ z9GG3{BANNHo^$`LB*yEC;;w!qiZVP{+piZqUdA7#1tO8@Atl9cnP`eSEp8*QKSUy= zptA~?0i0jlFXeXyz;GNg1P1ZcZGt4FO~KY8DYlQxbX!Rnh*ggTb0h0%=D-oLp@T8| zO^iCIjuhF`>pjS*`74^Te^!gJJaIw5<>yC}IT9S3C+*c-$r&UK24a8=E}0b>yYq@e zGnS`DyW#%N_8sl0x^~57lZ`1HSfQ!UNUhv)9 z*>SAjv-?Rmq>A#FUzrzGYQuBoW@~n?0Mu#Gcwa-7jt5ejnm|;TZXg= zNr46i*#gZHmSEfNwjQBqpIsbKHy9lqxxm95*$N}(Sv-Q>e_q+dKFq{8vO3KTrnUuj zy|Q!(p0n}?@+gJbjB=;QT{_x@LO{DeXdFtn<%GulT7k4&S(sXbT=**YkAI~4&96QU zcnMvU0CXCot5H|l+o#`^g_(Wony7xjs!zK8{xpHUQu6mn)p^^YO_x*CB~dk~o~vmN z@a(}SN{0V4^t-lp@=or#n&O5Z9rBA;jrUU;E;*~v8JK7MHhmR;u>V{BzV#j@Zi|Oz zgFEpT5r%;?#OXSi71k=E=v=ZH56f}z!pRd~@CFOg&St6?ih_&R>XeRdYFCUr0|kmw$SZIoc9bq6Ckr>+hqHnF8>e1(C>73X}ukiaQh3~ zNt%x4Du0YmXF7^OeL=UgEQ@Ni&o380)OIn9B2`pNrE{&T*OX_hCFY@XC4&(d0@`n? znX+oeAb-hMv-Ta`DVd&TcKR>u9A=<5I@ErFvC~+7{n9LLG)Z__l6vT@Op|&v2CnOs z6Bbj^gqM%Jukz;D(7KF!#=Yxv|Kqna3L=XLJWW=?ZSHsZ3<}m~Zz)mfl~UcISzv)o z60DjDbO$(R-WM$`!{$hg5i=g=u%wk5 zQ0K>!nwwu5;0^};$*@pX#r?n!9W`5E#cCE3*}bz}=Wj(h6+BGT4C!Y`>4Ocb=z)r^;ha6^KMd^SQ9)|0hQaNv|npvVV_FDp4691ULQ-wc5ev*rq*dQ zkU@1Vn#H!3_X1w5z{=bH0YMDz&(5!wfG4|rPZWEcQ?s$Fy&Gr5c|09X{#B`<>-d;XNXk5kE2vJ&bKYL{4A?u9V1ntRoxk5m&c{~YIWMa`$F_Nm!u!p**88KQhe`v)N5ozKhBO^gBL6$Pma;CF{)6kYX3-?&-Rf-PwT@wKp9SV-oU!FHgq(4mBm0>Y!5ngXot3;Awwt)Ira0?E!cnZ z@ag~F)4s}Z4Si{f77i!`D{u-p`&8V_Fm4W#Ty%N;nx?>WjT3vCTr+|WirReCkOSsK!^_jUkNycPvQZA zcMIKWZs|)@QvV0uCb{(M1hD@T;7I~%uFRm0ar8-U4t-r~RvzGaXy+SyeSho%gD!$< zVpx3(Q!$K5Xp<5qvqjEyk}r!=BiZmxhsA^X(VsXBn*umFDVDSJq{5z%mEjgj*V6z| z_-=WXpZDc0BKW(!H6Ji4X*-6l*Pd4FRUA+Da6Woy**?_1$wMP|h!eC&CY|vMLwA@= z8p=ebrkJOw`HeZ{tGr^LGo?=JJc1YWgdgN7a1P{d0rL`lnEn4pei{eWr@KuJx=`a;++$^K|tTPR$+qA{(Xi?-3cL?U|LllD!thAt6))7e@ z2#ef4Y7U!dj?<(4PAiex4N~)6yB$D)MIVRU{ellQ8efvNevyB{#(U_G0}>TUb0$o_ zo9}0lhh|CT7r=b>iJpI`7`9(Qo$ZJHMRcA?-+xftF+~UUgS}*lkJfl0&dX<75@iOz zee{M<{+v#q{J6Bx%#>gLEIOi3KTO|e7>ijb83H%rm#i2Wl)qa<_x*|^)4Se zc~DQHf`<1*mtM>SQ^v%3{ROozZ-m^Kde@h9dMW-$!u}?JkzZvsSEf5JT$@;WTu|(l-u3 z6TBFlYvpx-dpa{ZB1Db9H>~JW9;z?|D2rax;XjRWkaEieA6A;Ipp`1=>v}HA$-f4Z z18b^z(~nbIo*S#7JK3jA+nb;7x&Y$JiU#b21AL@iax9i-SszB|(Aj2rdxt3Nl9Fc6wc z5lbP-zP0)Y@LY@Wa$qw-74~`~&<`X9*ptc{S|9j*WK>UTmDRgD!h%Dw+W zk#D{$D-#5pURsu?D8E}QZPMyMZ~Y);q4marDWwOQOT5pf>9>Glw?qwoDK-7mDG{g5 zZ=FI_;a2JEZY@Z*bdI)eA!&g@a#3xB%&S3CPPx+H-?(zr$~5%r$~DY62y2*C%kIsN zFXUe(0&-KwHKHqvqyGY_9xLpuJkE`$C&*mQ9P+f*Q)Q5>*-jLeu676hS{i7@ZQ72+ z^E9}5{uM(K)I>e!dV|NM^+<)A6h+Er=^6c7pD%!%6qVCZlrK(Ug8s@QJgP2ZPt%b_ zG^u0Ym>3!3*Nyl#HJ6v_>-=lR^cZG5CulglCDYqBO z$^AFsi{FHAwu7gaO_990g7m(LU|&E_G&&Np0nmqiqjP{jJkCt8wIRJa?>z z8tTBQ8*f_4e1cOVdVA1|O;?-@SzWEK@si;b#E|a)gNIR?qenUL0-JZCuqXVIU3If{ z_vzp7i)0R;FCpA$#-2YT10B!Pb&BR?3&c-$5|WhPW$wcK4~x^qTp%NVKjc6|T3hcP zLM2X33-n0g0R7SYkXTl&*nK-gagU>5`vrHhg(S6McG_Ws!;cu#{rVArv*gw9gmY** z;Shxv?Fl3uB2cF*jZ>wsKlXLJ=S_zQ-}K1toFZs`6EN+aX{z207F z7y)^3+DPVTJ)p4=8VV8z4KANKdA^vX-hFa6&eso#*8=f@}n4 zzuJ$CYlbbA_JGc7${+0M=($(pnlcbB)UO?pJ+}T;TC(;%1TpA%U1v}XULf!OhS!nW zXyqpsv1-0$F(*0mKl>4WUq5H>M%e&!fPC=rpFc#A$@DtVYxY>-(j!N&5h6lcdcK>9 z4vIka0YIP)jK;`cjkn-3&)+ETyGz&=YI^>?Y8mUwa zg-gz`sBx(BBTXD@)Z`;3-p8~=gpA|TILEadV{TOI+|dGHif!9IjUb|` z(?T7GSWK!R7%ysf&tVKn6OcUah3ehXOG?&-IoAD{c8u)Qlp;ZD@adNnG&I-kVqIm5 zT3K^r@Fgi>O2u2$7gmaI?=@OXU7*GKFQRE=))^^uAo>qJ-+r>3o6&4ExPni1{=tpl zJ1rYm+6m_?M847U#@b9IOWAkYHZkbZFE-p?p-&Ar>uZjhgqc;UuVIfOr-D$gP$Z2N zd@0-$F{m=SHJ|Feoj;caei60G1EY zm>_EPa;UtNde`gC0!PR48{TlSE)%!P;Cp2AX`qWx zyqD(Vf2mFB>0ueDymyf=?#0;c%6QVSvs`j+)J4&yrg_%O!wMW_N+qrCQa&nR-)%aUT>)O1B1AWy_lf|tUjnZo(G3ji)a-SzTC-(5!C9I>5 z#&6I83Dcx}l*5Y$H@!ywvcKIoyggyUsGz`6&{DqH)h&cE9z*e<_RMD8svfEjJe{<< zA+JCo1useO?2j+#7a9LJz15uPYQp@0zK7iD66p)k;P#` z$;WeE_mw_-Lov=TgXSkRR!mM2ZCTn#YFjD;Y&lg-D+WnneZnv4(9M{g#_C@+1B66c z?%9z}<*($E3~?1(LuZy2fs-7-JNB+2>y?}ppF3MbF}-+kso7rBR)_wcBEbuv@R|zy zziJCqSQ~X4;TMvBvxaP-@}8Jybm*d*Y3VgU4e8(*kEm&RRH`9~uIh3uo3`bFmowc> z{sdzAjk(Z0EX^G@`jNQ5^StWgfvFmw7u&&jRvUO-_r3;~X;VA>6ulbz)1xn1vFktW zq8h#Vgu9D0^6DuK4B|;3QD6MiCL--+KWOLHvH9SQh8!I#nPKGNCf>?(2^ij0PT`HG z?yViN#iJyF1#t0E1fxd@mlFiq&?|Q%w2G+yK5%G4cRHzMhF#1)NZ&}?g;cQ&fxMy` z+MNAv{k~#9ic^5k&RCh5#j&_NcOTNDHFWhPE3j}N`ObXl>O0HyRc9*d$t4l9?<%57 z=7o2qyCG_y`J>`&`o>IrE#d1810tYvcAfTof}5~o<9pn7h}Zg+f)DujtF;wYNQ8}3 zzF7@fj(duUxEX{l3$7yPGq2ay^zRxpur9r>he|??ukRM9;IDAjF7@T^7H^~RO~1nJ zo*7Zy0n8_suiGHBh&(_aObsWe9RDC6g+AAszH|LXkFh4fPOFic;w|{M9d*D98(ZEg ziB-p&(fKcf7+`L3Gz+VZh0qF?HlUkj z_NMiNOZY~8QQ!i+uMz8=16Y_Jc6O=)hBwLc3deXVuD+@dNvZo~8|%riFQibwESVWz zSJ`quR+~Z?F37Pmug%SNc)$K*Et2DXN0o9(5wV{W7gn>(e%ia97ja*?3m=-s!wC7f zUoR&PUYih5ri7c!8wLqf9OxNueT?U4hSX7kl#b2g#z_DE;wM0?PKy9lt*PrHrbuD2 zdJVVv0m#!|0EJ=CvITtcoxqo!5$S`q!W-}3GeQyJ(*M31EE#L|Ic!+z)fWg?_CSMx zf?Tqch|s_vs)j(}OYtY=tv%#8+j)IKH$9#s+tp4Qd$w?HOm5f`di3WTU2 z7s0!gsDxBuFC5xbN4{)5okozE_UZ#`yp1gy*+P%fJer*^>>O z*vF33MKj)uC!EhY<4SQXMSTP&X`?USIj?=)n8(X|>np+ip!OO{see+76fTgXFdMrh z*O1jauJ_*}?Zk{4Msd-5asKgsT6QtAx$*SFb@M@`Pu5*R845q_jI5%JlVI1Gy8$^aNE$4Fq6# zv2ZBT{nB0p53dG8$b?dnK$(8w(w%K9GhdC(Grl-Ax)CAz!CgtA85)FpRlkD|N+7yS zKDb{v?ves;@qE_pfb)7ASFOOyJQx~w76ZCp+>VR0Zx`qsL+9`o0dt>wu)h<1+)E#Y zv)lWTk0+SQ24kY!)))l7H|&O9z94erY7wIez~^7`u6gbjM|+G^JYNf@p1?xK%9dm! z^G51(Uv*OQ+s44du=OTo{b(9KBh7ekGHOmhl_hqk z1%U>!k+t2{ysKpsKer4u=(2ftzS?Od^kiC!+!ScfMg7cL!Fil2CD#_v$>4_$R|y1l zQQl~AYJwf4jho5Yk_0e{F=eJ%hh*0T})WW7;?IqK3m$-x!(zd5#lz>DX zcb%l=k$PX)7#C0YOMJ(&9asR4+^_v2P_ITZdsCwzNIL*tJPeDFlI%H_zjfMcpYR5` zXtCd71yLP<$2_oC$HvuU{J;6Zs)bw|_Y;-Ssk<&h@Qw#>TY}=o%`=DxvqIb84fgIW z*h>Hwq6FV#xE-7ByT0o7iKNdP z`{kk@JJy6e1a|N;7tg6(8ittGWlyp;MipRSx0=Q>6A^BaQ3Hz+IiI7Y;#86 zkpnwE5{T8K9cWc;OBx`GU56_j`kQLe8B8=lDRGO)nNQ%{CvI@`rv_sRzoJ!L3lC-p zn`We3ozEq;ALk5P2ycyFhSy+Ra@y^txIDG2r0+L2D*k*7@Yh*gP<)a*mX5aX-9E-ZFWb}WbygfAv4#tsHl;yC zT61-@So1{Gg)|z(vE$-)7}^5H80!FT4P+J<9{a~7ND&PpyOtUi+Zsd?B)L!49oc81B?r60)=lhx0q18 zvm6;>;q)b;FX0i>NBVkt(!GQ-w6X;IFWxxAq}&1^r|vFrKTu%-bIe-7_Bp}A<_2vc zx{rcC<)#1h<9Cs<42k#Wh z8z61+{C(-kW?K6;B1^yXguh~(Q(5-CoNao6x*gG`5{J@%`T`9Vkdg}P&kDh^c@+7@5Dur$AeqjrUyzp%IfO$ zJ&V5VmUuwx>>xQ_zg`Gh8={1xW@%~J_x3B$|6MwRjQZDEAFpT!>-C0C(NvO0ZJ0j% zzyaeI(+9TDn7tRAO)}o_r_ba-xy5J5` zIG#@dmR-F6dx-y9CS_hyi};@p>d)HI8U%%D^^K38}Q2rXh0xwUY}K1F#3F3CmkR z1b}0=|Jt%NJ65SUX|PQEvte<|h7XO*&LmRa4^ZX5`KMFr)q`B(u1AR~?3*KeFFmJg zsORm06|D4-f|o^rGw(kziC2Oxs4$Kr7#VU6F`JC^Hwse*f7zb0g|wWel7*L_A`UKB z7zKUwWO5k;E$I{ik=(xZq z-T4StUMH=J5fduY#IEBzuojlQeuH<+Nxc)Ns8|2U`I*-BR;*73n3tDNq4L?6iXbgi zdCM0XzDYr)=r%@Mcm-l2>qG>oz$AxqlvBU>XwSUQ6z|@gL`P&j=Tn}9;Pw@Tu3Xc) z*(FG@1tRzTd1ZbZPX&UIek*-yaHanJ`rNES+*ILs{*PwIyy-_KYJy>-5LzV%9-WTO z7bp*o?s_DxY?89F1p+(O369YCxKkjhq zup>}aK5?ujEg?LZyfe&@ke%z=&T{A3Tj}dvquUCr8dI%Tb{l_3y0J`|AF2{+@_vkX z6tMW!TjIkMAo*UMvlWcSf~CSj_(7F3+Y7<}gs~b^Fq{ZPk@4_1x|XED7>$d4_e|+> zecD~1Z|u5J)pAxXTCYuHodx8^T28-CY9G*iKarTjn>fKP9T2Y^jA#m&9kjZ>cQzw_ zw$ldu@8z2JD2ADi+V7qCi4{!K7lPKKN8hO^568OJKXLDJ8$N8P<&)F@V{)Wcwa~Z< zQwQq<4ORiDdK9{C?q%}Pg8(2$=` zZ2Q`)b4x9+48FpL;T}iyO1R8}@d)RX?hwg2QFrJI7y5g$hxAJzc;#@Oq?(xF9q7AP zP>)6crgYGFB*}s=QE`4PAT0kDg6&$L1gKY1^NSQKWUkq(q^JzPmIk*Crd<) z^C)3c6hqK$urb$Q28+h(CF9q{c?VU`?Y`&!UJtj3l2A2@cFlK57?MTZk*Dm#7|+Lw zJlxO5LDn+|-hcTW`fmZ=g)sx@oZ0_fGJE7XqJni^nk^V7{|1SgahS zh3L9b*G=Cjp9S}=84p`$e7LXD+bCVaFFa?%@Z7w$#qSumnhT}%m|atL4Qcv%f969L zys^^9d zWrp1$0%Bkg@JRSd2AF1z$01$EE!SHA(6B4|O8d7WQh9H)tlzd2WZSJrfF%80DQ;j_ zNVK>|KskCI@;H?9?JyC*#HLIKu3 z{d6#O7Uv?7o(6D5Sps;WixXfsKm&)D@36Aypw)zHys zR5Ch5b>xt*imgW)1_ zd!ebr^GjlPx9SM_`NQw|Q+$S-HX8S=Mh$d!4p#hN;cDDihyUrlF~{pl18EHkm=Snt zEAvK}0{Xf=B9b;}|8o+)N55$wB$WPR&`Z z#*J+a>MVMl-O#*WME-Vf%EgYNB8#%^r~6LFfHECOXeGZQwdOzR6HV8N3el{RzcmA0Sajv! ze54{VPOBz34vNsUVovZLEl~*yzMy_5P@F@8yRV>fWFDj5hL$scJ2ZrxQ6LCg1B%zrLD4F};+XXExbo zne2n0ff#>KKJTGp_dM6{qp$NOj)nnWK#f8s1=WTfD6Z@_$(+0|v(B*~iI6xoWp-*Q1E36!~1)t8fe4kKeoRMC_&Uz0Stf)W`hQ6GMa-yD;h3TOPCSbp9wrFo( znERzB>o%QHjZ&M}w47|EL_LO{fIabXpsv(f+BMNsf`DhA^!(cM`R8HC`4St5Twg<6KrlVL7iiO@$$|end3M*Gu zH=xLkKfA>wRP6CzqnjS`07oFDDc{_LA1}xUp|P>>a?AA__6E5be-b>>--p5oc9L{h&CCyb=_?lLDPZsuf2Jf{~dl3x8I zJ_$ZxQ4>!S)U(Uzf~t9sLaoq=^EI{q%2y(X0-|p9gGSmn&Jcc+_&TQdTbL^U)t4+M#gn`IJq*AjNWc(xbzQ~bTrO~`5&Q1z(``18C4CeNE;6yh5cK8SDM;7R)P>YyUdX-yr3r^St z61^*$b?`NGIPyTO8CZ2&&~gA86|$Xh19oy3t})bV^GEgwu_C$jcd7k1p}Gf!jqG^Q zQSXOUgg&FqUR0fN)k_^g4-6mETm`P576$5~GbCfEo-Z5A*KiOlbTk{5wW*ho5H*AT zb-wjEUD3k#k9dhX%|dMGv2?NhodRS%IXosE*S$?{pE979A-OB}qB^E9O3`xM| zVx8Av1LTA}h0V~w#MAQa&Av8tRnU$#((t76gxt7>tq=UsmG8a#C1i6ZlFd66ZO+dzNwz(lEY;5OJ$7yJGpWi!-)U%S3q1=b0n+>jg?9s$KR*P19JOIGSKhKHS@2W_3u zT&OvHu#qc4+H1VLNFA90_Efy~;&ONNDRk(}CLSOF{*lPfXJv5tLoNs%#6Xg{jMUF9 z&G6CDh`Qz@G`6IR|M-Ld`1XJJzCXvZO?);YESjw+`;NOn^$2Um9bid5*Q5(zQSgNP zZz8VvD0ZP6wnpX~annZ(GMu*jqG4N26bXS;L)qnSr>< zyYmP1%rOl@sbwl~>9Fol*t;3&83JB~bEOX|D2JTI2>)&ql3Rpu<4@`#9zUUPPoq`g ze7;ty!AupP;zs2Ks^L9~-kI#9>+b5gJExB^Ljv@b4Ybw&f>&5RDWCWUxww{0%Jn)i zA;`=2H*XHQSnMIXuG)LQ3vA@7j=-^7bqGhaSGMxTMHj3qy9na{RRjSu_(c#}Yg~g8 z&=z%%SnJseE1eO=`gkCL3CAqqO#wqg={PN}-ZssY)T=J~Y$v+~brv;DAP9QmfV+Uwf++Q!VJs)9`CP5k@$?)tc_+_Iu}l|cD|Fi*wU4> zsW^Ya=q?>Zi*;%aCdubsumx~T1Gl`+k8N`({XPZV8)+dydga01FDS&R$n*PZ(A~JALf6UL}xXOYXGcl%fbv-;d zsJw41R-SGW3tV%B#_qEhA_I$B9$)XMfeC}7GZ-A{One&xfxXY2oP1tC?Z#_kSgVPn zWe}>53JcnnC7gDlq&XMVz?*aOv=7fT05d~jgxhC<5Mev;j4T*9o?TQPQ+l;&t$RlG z96?o?9A@7MKE2wlZ}F&`?y-_R~WPuAptj!m?b{V;d1>HG};M z{Dk5AzNy~C+$U^}&51L+#CJ&cI&WeVq<-|$Kl2EnDzXFp%h~bRrqk{PrFw+G&%8}g zaqX=H?8ZtYyL&qvz(KN#;I18LHESdJNteztI#7R-1ThDT0f3aZgeD(g7V+!a$}qI) z_LALFOE!!;{uLY@PV`Hh0x^YrQzK&;sheP^v9F1ehponq-&)y{Gpu+;#zC2zE!GZC zyw0nNpm0|cVLMLTVd(|6k~_bI5KO0?Skd_#{>K*F@2b_RnuBoNE+-$ejJCTp!TZum414hJWrYOE@@Yi z9%f`sNMdz*T`@hbs8;eU%m(P%%oR;8zv3Q=FUfX>hgXFlTh61iLwH%B(jI8)7f)ly zUuA2G8Gx)i)b>y-q6^E>8p2u)E^R&F#+^}I@SJ%$8I7S~e*gSlH zC&}l^YCLQ)QvcxUIo`X5Sswp(1Q#L9V+vs&=*Zk*zMBWgSK%g4TJ>Atk6RiFPEO!n z5|arakTQV#02ZS`35x<(_vVl+h!%6aCfkj6Y;{f@)nZm1nU(zO*EeJYi`Et zz|`-n1?13!c=WSgfd`PT61|!7*6#$&f%%tP^jd(HyN)Iv)O-H5j#`ux0dBwZQ^7}R z3k3}INuEos_2wwNYz}I4i5;l6ahs$-fjo1UT@lAMfp{HTJiwCN2Xtrbscwu z?3kk~8N)o+u0%*J{c*$!rp1-KRT!O}g+)7sdGFq>*~8s31wkQm3!epY`8(J=8a=3I zVBEaRSm)Z*Ft$w*v6a+lRG;_2^zeqz`31ChOi(F^xWP*q!l54p#6{cik458;ln^(u z21UZ&ErwdpBEU!Yi`5%M^Bti}rx@OkOR9QLq(XqyEb$WA_P~SJosNxtrsGAOpr7;B z(P~Q$0zyE)b4YWBu9eiZnVme7yQY|*5=8UQ9^^Vhpu=|Xl!_L8Pe`o54q~ub$IEZc z7q;e%k0_oqZc0ek8iuq;D{f#dsHEoFI>mFqHM;y~k z;Q-In5+1K_3s!k(w$OS9%`?|D& zPm%>%{|dr>?*8ZAtg5rmz}S5NP^r*HJl~Z938+-n@9j5iHE7f=MYkXkB4!CBbfIcA zmQd890Uq_V5U7^vTDo2n@;>i9mLILSAF|Edy6qD<uiI zun=3a5k9P?A*&pcv|kO~LE12_YOwsFD8_DDAAp`8G;I<8kK2dA1;K!Q2W$(1IzJ(Z4)dn1r*d|p#FE>(kJ4Fo~7x`w_S#aeIKwbL5~lHM;B zXZa&THkdA@+F{y#dXAmiDa~sEp)^iz($N)du8l{k3 zO@jUR(%)$fs|#tNP?8b6|0bBl1$P!p>!w+AP8IR>ZabOL{xq)Am&&M5>75?+fz#}s zH_8l=!cD&Ti=bl|!1eG;k!iEcG?r#=Qn*f7I=)MfT390jV1;M{-Wgb+h(bLgP@xRZ z7vhiG7{E$>dGmZdNL|XzJqeq5%hYCgn?5iM3W%}!HCms6#fbD+M40E5Dp(s?bEX6XzISc9fj}F#t#CyOnE)ZNN zgmrAkOO%oR(I}O_D>nVG@LEBzbOW%kGko#%a{SK-cgUVQ*i}K7gXt6RDl~WOs@+8Y z=NVX@skBY}H42ayH(UDvC!u1eEiy48|Bqs}A||Z&R%gGr7|~Px`Izn2bawl$gu9;> z9Y~+vdtcjSJY!SKSh4{gXy#$+{`4ZSFXF0eMQW6!BeN);IpT(=TC6oqRusE>Ge`h zDPkL^8bGoEWm=ox%M+05$tfW^|XYjLrNJ>C5XA5C=*LezetmQ?iS&qah^8S0o0 z6ly3I-XyveQ9e`M@Rn`BBzbXoOAG&RK)=GrPdyzs@&e0p||M1DO8mJkYlX-51@sr*&(6s=ooaI?@Wf zRnZp14|y3wB5e?x3#zz15t~5xe_jt)lpi(wZA4jJxv1c4?D|{r1_t5l^9a(|)bAoU z_%(HAq}C%WCSE|c>*zRH(iXgBq@j#J*SNXGeK^u>wqquU&B@gmv-31t_wWfwDgvbV z|E~JII~CeqOr&ELLD~{*-HAY%ui&_w_CXZbU`ve2&wC};f1aGu4e=tM;Mq8XtKM}R93E&Z~6(y>%@~6@g_hA;r zX0lUuJndi5yK>mXX7Nb)q@1xXzobGbwX*)-A2iN1ps_R7b^l;Toy9E$iHAjaSg+rF-?XZo^h)duEUQ6671rw0*i9E)B*2gKY@V5l-Df= zGhLka{U=?zlrSf)VGR)CFzQee8y{xC)6_5MK;cq@Tq76lYG4IB9SVgUcHvHG24!L@ z%hn_RykkUg`TWLcHC8ts|fEA>l=Qa+Q_bS+dM0AF zs{P9Wh&&#Og|q;^=g~9Iy#x!b?L&?egqW2paG9U!f;(9?vh62J354jU524<)&@0 zx1PAU!ZNb_AQ~R&VBLx@3tbV_8-SHr{q5`b32+b9^%_iA7++l^Ye><2eyXtd3ihks zIz!24P4BV}Iy9MV!~) z@{5qpEC)p?t8jH7Pyt87s7q7~t)OAw^+%}TaYOKk4v!*`AbhA6Y@Ggf!BO zx{*XRN4Z^$x^^OdIs}y(E}flq3_?u_*?W?Ruz*j z6QRr$K4f&spZtt6kYU(T-RF|I1*np58Zar1TFvT#kL!bH9 zP8iDPP-#*ZX0MbZ_w*I&t!YB5a4#~|m**n!UeRIu_qF1@*-F2-I)wFCp&|KZ7|o77 za4K3kxMB08$W!wu_}OK`-Q!}yPS-j^L1A{f6CfLt8>1GGjb5NMKDgtdL+}YOfZIfu zdmY8GSE_yys&oThe{{|;;A31m^j7)$$sNEl$mMy4MlHus*POwI3(h*>w_w^azt$WJn=Ms^v6q@AxEaZ$t zDJ!7c#`XKCSpzPbD&sL!(|wVmC^uCsQ>|celZUxy;P;f>5;pq4w|5~dCr%|zbk1izWu_eyz4vwiZ_NXKgw7gy2g&BPNa~$WB0R2 zu5fp31K;$*8xp;$>w2FX*eI+%I;sM&q4SpeqBAI zF2quwNsGI=m4b2yH09z)b;fkBp+wE3p&93d;eY$iH4Eoln<-_&<>!Us8kEEP2M+x? zaF%zthQnA>=#=xY1cAg~nwv!tlvFr>Q1t_4cUI=LSr!d%l+4DT5)rYNc#gf!-3W@X z6&%?*;_=Bp_qRk9I2RK=8Gst?$dYW>V<9`MxCK7Tw5hAgL3Ox%ARCXQI(rDozMhT8 z9{U8@73+%A{w07PGnawc1p3s`t@jzdf$qRpD=JuW%1-ut3o1wUC0qbNh)Oad9(z|Se4qZ*1cQj6%Z3|}#h1ELL z@#3{(%(`ANGv6`wTfsmyG3DX-z&_-I6ya5M$UO9ak$D;l1Cpf5G&Bur1U>yYtfGrg zw7J`i-%H#D58{}+{T?o#vkEmDigA4~l-s@%D7|kn&1DJ6Kd?}lK18>k=f`$?lNnqg9n?eL6D9XBJF+s(x5~3}r0ic?0 zuq`U+AY@YbEuVF0I;98{AIYTtNv1R=l56?`^V=EY=ORtHQI0AQ+nWm*%M5O%0;9hcEVm zM5qsl6;V^W{KQq}Ss2?%3({WSJ@Vf53)H1eT6}*>%Q0YDlHPEN9{E076iNN2+N7-w zAXANF7!D}M9Lh5vO>+JcG+OoU$zPMo3yC8_bGe=Uz(+H>|6XoUDh`oH0=ua|_SV7^ zKX%?mct8|8or=1{PgPmJBOq-M14~<|t_Zu?+b;qzG*esF%nm7}q$_Jj`&=|~HD?E0 zIr2;C3hFi;M}f54x_Q+7&>hneG68$CTH*NZ=ct6fxA*wa|0NF#Ku#GgJz%Yu0~X!0jdpk zMkOa1hX(I|`M+%3sMx=~!vtFEq6{1&^o50vRE}exTD__q5JeUwk6yMP zT(OSXQ7}FU%8qnk^mD3dPU6GRM_dqTi@NoLC6R8!Z%VLVCk319wicujCIkmAR{0jT zJY9$F*Jqh2V4U&acg}23RQI2$z?GIuHuD9S;Hk+f-MkEE?$?;fz1QH;!k^HRcHAsh zKlj@FczhJV#-3=FADbnEfmi|V{5y}1C}i`9cAFWqh(4`XIQtVP`k!M%wO_%h$~(9!gF0otgU1!b5PDNz^wLuN;tJPQq!AatcIAYI*vEi90&K@D41NEp zvX^=thyfBXc3B3y!d5CJoE{Ax?!6F0ah|qj@KzDso);G4ORPzs7>49=s)@?M5*Tgj z9H@=ZfmO#I#y7Yk!B_1%2$D~nXP+)*u`&;`L z_)|`qHRxX*9umJ!f5Jx<5+@tVkwRzQkZY?b=lT-R1f`Z$Y+)TbuY}encE);1&$V+q zrv9;#IS|#bg>{JBY<|9S`CxA!jvD$`*5pV}T#xhY@bLk)T5p>IR7tQFTGRu<0fwkC z>AeaCF4x@&fl8l%p-fQ+6-4Ia0$&~)ft^m$CDHE`YQ;z%E9#)rvC+(kOA%>50S_wH z0CJi9!4?R1IOFJESiSJe6sk)7HES(foh3r{YMj^gd9e~6&I(#NWVEfWKlQ_IVuKef zsk{dZOM_rx;PsKi8U`F0ZF}M;qG$dPzSxV5U9uMX1vXhvn0AWbzvrWDlDBFR!DAPvh=U9HpSqMEZfHx*-aAVG2Z%c= z4p5=sQ@KwA;@2e*y%3%uzHKm=9eEut+g7{>`<#JHf|)TOFRf{McHQSsX(n^RXxD9j zCV@u{WSY942XMlM_J6%(UwF5El)fc?Ms!fgR{5LJb7_Zx?JTb@dWb1`xdya z$#C}n$Qo>18k9yFHOki%M5q;^{y??3qH>mP6;J*5foRo*F|2tIZELxa$_fi!CE2 z7b<5t_MH4d>_T7kljb|`ThivhhR>rYfk72`#(4&b44sFRTWp5SUe74v?-sLK7`pQO zE8@%R=1+Pn=G*T~P>4*hdz(OeXL9{uE5xvu4x*QXc7Z?YTiefvz1CLB?tY2ZqM+>)_}Jst$wwwPo-q^nN{s&q>z!i z!ul4<2DVj4nr=q$?y&Gh_igOVfP}EUuM@V4$EZ~mHmCg|fgAO?Csc|`nsEq&Z<^x= zI}O%UhRALd2g^Mk$0MacOjVb>uVZx4nto;Pl2iNZ0&-T-E^OB;u3u)*YiM1Rs0uS+ z5n@g{Y!31bPT$;G^kU|v6~#u89x zziWyDY7ypX5jfhz>Q6D|j|wn&MvBK}Ge(gA)qFJ{F+VV8%+@MCTgGDhmVopghxN|2 zGvLO!gPX=r0R{~5f9$=GzMp4t*5F6&XWo}N5Fd_gn_LT{bOYg3BXz2;zf2*45ti6C zPfvPb-}G?#VU^K~E10(77(*xHFgyvfRgdXo142TA95o@H;~xCtddb6wpUi(?+j+{$6)L%ux3$FGMBqq znh3%uY92LRsZfF|rLv|Dh<=+9T%Lw?MkprB^q881G$|OE%yZ18eH2B!{(>Ru zQH_w*<}_=~o(N??bGDu;EENTs&IPiR_|b+)zWezC4ryAD#+<^5k;-Q~K~CK4l6yb9 ztwr7jTo;PLB=9Pv)1e%D5C|~XI*r0_gXc0hR8tR8x8QqQKQZia_Ce3iUc2ULE<h&C&yx~_>N4h0B$$Z8 zoTBi^l?1|fQ*t;-zoR`U(c&@MLc(yBtH?dx3Gis2AhT&kkOW|=n{|pCK*NSUSElD{ z0NX|}OhBO4!iwQ1{Z5b&i2Vd>baEG4$c2MmGR8FVf)(5d7+&RJ@FnAsl>B?ucbUJ+ zd$@hM%2rZfIb{)Whyh+La-_wwo~L@&xxk4Ct>rA}ydwt!h`T`cLTPA+i%vV~P}J=s z4&uo^-O8G!iliC4mFnIASB{*6&vs)52B*1%gRPK>ljY<{J#k!R9Ytpg31%x!1C!wd z=_cCG1uhxM9PqKGh65}qw&cv7!*MGzrbhaU$F5_0J`ezCG4>HOzY8LOfukdGkXune zEu(Af>=(>iM4jklXPJs>q)`awcQ~_QNpzB)4O5XitLY9PlIa|UcebX7XwTSnZ8r>R zi?E%;l*aUev?5S`f&(FKo}s{f;7CSam)B5kbm$79YKaP6;h+RuprL$XM9+z|mAHSU zQNb+kiqp2Iig+8$HAsrt*lD$z+ncQIeNqY-nruU1f=x1Dfma5(t?LjRJ5*l>a&%=| zE@bN^txg{i)0=9;Kr=|Y*$AZk7U}3xHP<$xcIi=ZNf!YOo=nM?Vb|7aq9n@5bnZRh z%xICwl3eDbK^*-UrL5pB59HwO8rScazxzox5HxdO*ItT`S4Nw1AAym^U7I>exC6w|`^IF?gKHozv=`=o>142r!ws<3Jh8+^*Gx(&rIXaVt zk+k2X$7dbW{%`P@*T}Xv>=qwh#q)eyBQ-z{c<5(gU@xezmmkj%5%b#r0-RxXe-8CK zfH>qLe6|vcm*uv^-rG0E6fGNVx#@RgqmhVfRYxW>&gW%6486#(dDow<`}zrvJ@dbS$#thZ z4giVz0YQAu!VD}Ay)ZcTO>^#=IDDTIzR4VU(4*}^&fOEX%L1l4FTgz zeWCh<#B;N-XU%wmf@u{43>-rz4XAWMEdqSXJ8Dy;-Iu9wKeKF?Zv$dh;}thIst_A* zwDB=N;V+ac^k5({VUBJ>wV9n?M;7#sj7dJ5r+6jzhaP)A!6{iL9A%1aesb_j)&a#TQ?id}r>^+4xh>>!+9jEXq&JPBKUzJ-+sXm42Ed zq9L4A7ZKyuhxrUNW&3lWZcSN8#N6>47?zs(z2?d6qVcP%mHq&r8@V&>h_?f)`^A{_ zBB5TAW#io2`vGz$4mSzYqOB=R)-}}FUgm@GA?VCGmo!-^uzxldgqyHY2>>qyOZUQ>%W;q zz(0ZPN<1&v6lwdL;Ap(v?HiNwE^JgwZDTBA#r}-UQ>h*@`l?R6y8{IB znkony@tb6_wuHR_t5_qAg!2kXdNE3;22|ZX!#1i+;$E4d5yU<`*u(p+U67NpgSm7Y zR#q?k4!m!pX|%AXr*Hl-S+hU^Y(pW2AF!0}f};eKJ$2=Zu?!&cJ;OBn01^%Hyt18S48H>;{AM~G4G zd7q{~RZ#St(KImLZDKi_wSUIZb6jaJVw;{Aw01OPoP{?p)Byt1KHUMh#dq`pYQeh@Z-z< z*qSKe<{%8XjP6>+nQP-cSuEL6j|t6-V=O`_#v#p)W(oz+$~@nISGnivx>Lfoj=HM_ zbC8>wQ;}vEDaVLfTSFUN+k*<%JjR74Z*XcdG9r$OsrY^ph4Ye91l~(SfuwGNM60M# zkH9Y!z>?D?XFO#PGFl)%5a(2KK{7cPtU;)5sA8_bk1*yRM_v$=2tE8mrF|Ua2$PZZ zk!-fWJ$wt5sn#ewd*SnX9cUam@ZoKMI+TVANh|_zSM!D{Z&>B>^I^G!Qx0RLulZdV zfP+g_gzOnDT+`G$0W7y;jug&Bw6{!2EhFD37MH-mf(nOHyU+ftsm>;*$RLxagh6d- z)N(R+-3NM`(@h{5m_KQL9cw!-U|k!6BHTMfO%2Oz2MdGQPp1wCfJOh$6Z<>c;`BNW z#ccpZy*uSYBNlF&?5PqfX#b@3L@fY6c<8YAEjG69M?ECoW?D%d^CfW5z)+mtU7@bo6?4bLWyt}A}lgC@3_dNm!|70OUR$75B>1=y`(26 zEIg;p_Sv_YVJXJPPUpKpWVkk?NdcT%k#F&F9{7^#$9I6HFiD-#?pCu@(pVI?WbEA| zHfb~@%$uaC3x{D^AN^vSN+Vhy^+75_&6}`95aGBTqO?H=&Vk5q)(l(O=2)duDqvip z-e0k}D&=Fa<<#UWhcyc>kw2oIDZUa&-NqoYaaVu?T8TPqT(<|3K=x6@E z5HR<7GDW=P4$Efyf}>j+>y+WhL~`TD>Me{Sly6;A|(KT5Z7!D|h*Hj}5{jswa$pZaM18U)DLSuyN zoa1yeTgZ`U-6m4`_S@t|5xSiJPKWQv$_31l)^}jl6A&9WYwiKEsf@BRe<{XC2gv=-G%^R>oA3@d68;F{NQtTm@I1Gs$!!S>D_x5~TJ=H-tWV#iL zb4>!V-o>8Qo7q-v$j50g&rKYt(Zyn^;ki{$N`hchSSEs{GOe-!%tYc_gnev)!%}Ie zj8|4ISh%j?czzRv3@9#XnzIX#mupN56M#f7Yg1RkL#sg0w55hl;xj^mHGXXLbK`P!kXKH>lCA}fD`Q~ z4ZUfByW4%4!$j(T7RAj#&u{wX#UM|dK#7@!`=%;-bjwB)6Bj6>!qpx5o+eF@3HmoM zBmpGIS;w$g#}pCtZ(QLZ$)JW1Xgsp(1~mjYb4(0#^nJh7{#`(qWh(9@&@4=On60Fz zwMHJt{cm;614PuM<{=AW27f8ktY3z?np7K`Cop_Vi@G{Fu)w4(>H9HCoh-@!-J?3F zzQBlnpLbl6T!C8Du9TcoDhCi#Pxh0>A&t!O#73(pHUZ6PRcxkd{Y~s1`S^ww{!=uT zXY`8#({r!&&+2Df8b70~1fnz^Lim7wfxhj#FG4}Xfb9+mEkhinr8UYMyqvJq+YtF2 znH7?z>$4hh=J$6#2%0_ej57g-EgHLe4O;*x^z4sz`$EZ&GEOMgiTCKWFF=dl=WOkY z?7l`=ET7?5?Hlf6Kw0*Fol#M&Hbg|GK%5te7I?|Y3hj}5#nybr`_qJH8QZ#mxE=(}#3 z4|A&G$?Bd4tfvx%I$5mWb(eGs}z;$jF!i#JI;PWSPgR*Ez7zmbxJ0 znQ4+&)A$Q&mr_Y)2v9prQJi_%1YR_*PI z*vPeADMi9M(W{Qp8ETlyhAx9+jtFt8UjX^(D!5k|di}dxL}LCbP(0j`+HzafqeDWO zvy#9&^jKawaTJYY0HZYGhX0OAaSX@=7IpQo+^Shc4o8-%{C zQzR1}1A{MpjPAhHD>PBBCh&&d7agN|IbgKR6u^T()14NlpBnRmU0t+3*^c8tWWY59 zGUmgQIX%yxLyVAS637^4&$^a<&)uNkbMX*V=Ro_iSM>`2oDylgHz9%b^vWgbD3TS_ zOOAeW_@{|;=aFN|!y@8X$`$!EJ@M5D$D{~+gd{s;Ahr_<0sS{?1>eo2=U~srIKX}4 zz0}Ow5)(lpV(kPaIXg!%O_ljCq;az{WxBVr0&fY8Yz$r9K?Gz(&oHGflxVDf`W;)` zk66!wVCxi;PfchIKa!cCXlv=(!nk)Pu)%+2BC#lgg>mD*SSCV=$0bP80Ro{c)L#>q z{_j50YP)ZMI;%CrhLh@I3Pg1Y%W4HNH(-V0u-(N0C3#5bO_IQAs-@lD?q((z5DN*zKNDqc&YC!oMV9Is@?h~ZXAr6*iUahaT8yt-bHXtXmWI1tefrhQ*|1ueK0-)A#^!BZsQnJ!zIg3JB8=Mz!~(;R zxT)~vw=ztAL|#0~D|jm8BR@YPY__#mv#=A?HD%XqW|{eR`%DM{@_9@;t&DA+sEtE=mL9`RGnEQ;20 zm2%G5{l1kmO*3Nw99P^t7@4-UhRA{gAd}aok~v86an$J{=lcvx?#WI+*>(6< zc5;k}T>{3!6ggK;IGj0a8?w3SyGhPkt=K0`UqZI`>dOGG(Gk&{IeG>cJL;~YLR{t~3c(mM2;~!}JQF-Z@N2pxgn`^=9 z5vBT&qre3{x9*9nzp~RwQdBLITT}?}r(I)=ub_Tnm-6zkNm{g%>g}KfZ>;fC0t?84 zK@GNA;}-hwQMI{|M3_uTBu-iQLgbcfG!Rg{wrt>~20;@pJ4h7L&HPZ5rJ=j^T(&kG zG-<4Vu_H&UeuL%vei^cx_&Ew#?ty}Uwuat;vK!-zp>e6-Ey zhl~C85^69n8lD2OrH*gA|I}>SxC#;!^jEJ$Vzs__iE$q|Zf0enV7D3hh5Cr*!fwfk z;atxj;|Vng-cbrakTS*^$Upl*Hy@*x$|_X*z5jAxK<=|0zei0W9K!c^X6?ckn3=&> z?Sxx}>K1@t(vosZ%tsB0hVUn2j_>M~y8^w&MI*VFe@ZDzDI*$iNMAkQEOsHvDZ!<^l$NtO?Fi zt`ud|44ww&sfw#?cyAYf_FZN!w zh!WyFbc959sp0xW=^8z6tnOJzlFg}(ghN6C^(@h#+L(Q)(XeGQgKm!DBvB1l%&3wc zRLMg}O|bIqg@io?`s~eGn%CE5c#CN_Bq&1oO?ch07;0kW2yO!_qdT8X4H=}@rsn~N zTOBzJzZT!y7O`cGVKAyYA0)0E_&W!F*vW`cyc}zstFtz#V_R&HHw}*5`Z53^OlC6$ zRyj=ciH|J*QATgKh&XGqFO=CesWm{`r}O-!59bg!hUDAmq0y<20q^(GwcNX*M5O(a zjuXx!Gc?bCKj?C*NBDUnFiKsS?%QL;TAKtr{8yEpTv5J?$eUW3qXuDurGqT4n5x@C zqV<#?cpLAN(Sen5nGuwxfN8}+iDX=LgSLNDw8X(!k) z6cvS)@BIfug)CT&wQ|4N6nscD&CrY(7_mShb8FJ@3%vo`7^-N!pD#KZnln{~{jBPN zF+{X>L8rjz=C4I8V%+U==)YZRJHbgD z4@d*#-QR&d0N6OLvMwT8O7H`JkCLn{+b>mD3#LL4Eo9aJ1tr1?2oFBHqS`u@ss^Qq zU@g&Y+Pqd}Ao~SEw{qGX(z$LhvR@|^=0`(^tv(KxFjYq}Wr-rqR(1mgxZBq|_4b)z zHh*X16sX|Nw`@yxqoI|wf!@@xfKEnR$AsswO}tVe(gT+I#ohzUjpU+_XFb1=y)XzG zHB(BDjeGTykr>iPcfA!;6KhIFhF+PG4FHYsFp>p7Ow-H)qW(ka5)q6eifNjWLh0M)d94jG*L76Ulf3we7A_-Twtq6z`(l8MN; ze>#XZ?NpQR9%YhRH}I|oBT*l!sxy0ODwut-0|+HU3G?hpOwk$|u;~k7o$@L-A-5=y zUIaOKxoujmHgufU{X01?n2rAiUs-~}wE8{fa$6Dxfq!I>VeK!gS6c!HHEUo&rnIQ! zM8k;WqGKaw4ucIOYkX*YcI|W=fHZIwz0%}R$F=`8k(=jq2IHbhtgM@z}1Qo5iE9B|n0zQVTnC}735Mi4J4C|^g4 z*5W`s2tigcWGqzcFw!9OWXO@G?dU}#9mQw@l_x?uAB72?_rI*5%g9nXY!~fX_ru>w zV(#1B^G}) zE+s`+5uQJdgGCyQCFLSD#V#ozcta3+Qp=BE3Q_hPMh!A!E)!p2)q^wL!x9%wa+Y}l z&CkFaWA2Re*iUTCVEW^Uk2o7!1*RA$5eC zLi~wn9#|;?aTp{mpK`BHsMN*d*@*@ZdRl>bQ>qNZ8o!2-CqWyR^}fy-@Zf0bYICj` zZmc&^!fA|gm(ETZJx2hDr2r2l=BFtmuX?@I(ukbF-@6l`!2`$q{*$xX81Fr}9{f@C zhkx^eH+nzMmLg`F;3@*8aZQ`2d1Q`$#=bqf8V6T4Km12PRW&tu7a90v7cAUKO{${$ z+!2J7YlP+^uKj%l{<2J~>k>P9CSuh3>ldzG={wv49y&k!fpS1A5y3a@P{Y;|F*2(O z7OWv{69h*=FcIrhNNBcf(FH5HF=na3}q{&!10t-ZbYVogWGqg$D2UrRRCGXe4 zl#i5zZ0Ns8P{QN~KoAe>HXHo#NX}qzp2cGJWCydsARkbj&{z&-;kzp{5EugeD$ec9 zAQn}ve-=N{4pIa_Q5aA()^}J(6{0+!HP`CUf|E~=?OTeOBW#!)<=4u4ha-iocU(Kz zbFhSyPe3HA=9<9RRJ%!p_EDQ=&H8R>Hev*b!xawiONOB>3Tni^w41&cg_gPS?JL1PRKhLLg@EzQu}KdWo}Yp2@_czZYM z_9ht~3Rt`*Q|!7>#p&xEy&-jv5QX|9ewEZ0NdkdbZ(?wGduY4BZplUgPlXW14nLZ` zF1#aQ)s%RO16v9y6A*CgnV$2%+Q_Y`y6Uj;whXh-Ca_9A_3E0yhJCV{LHck|Mv&HU z5+YG5F)VPp);v+7YtP*#Fe#3u7OpJ@Uy}^HSI+nq!-&nQ!c+jvod<8WD^L=enuUXMvbGnF!*z}io@g>)?&VKXH6pwWrEDjE8= zBB+&?dP2tP_=#st@@nL=5RCTN zyPftVt2N62@z0nd^K_m^6`JXzU%9G3u-d-pvL1K$Z-p$*x`Va;K>IQ}Y+HwBAwhfHuJuLwlIuV?<&VSb@|+ z#Ffl=R(|&GWu(Hq9QR z&MP4-f!P{K;lUfN+ePwP$D^i>7V}0WmRpB{k?5XOjPKdDFz~IZUk9EDf%yYwuAB^& zi4iezquWlROo$>BFyHrW%-u`{4)34Txd={=|6tgP@Wi3q&}(2PerV;HQCrH8ec6J^ z0N2y8x`iqXiHZB$+&tB@^ZF^8)XWI=Vu4J}=PJ)5X;XcP1NMWb8uIMwJ6!y#xM9w2 zqKXk@xvA3y^|q<1hTK*LBmhH~(-^V;2xdiZDyVJmntLft?bVn!;;y#w1*eFqLIt#t z=c3wYA=J(4_^(w^3I%vdUdymL;;N{0|9= z!8O%2){gJ9{P?`u@R*9L=QXuOMaL=$4ak?hlC|iNru#% zt@ryV_5E^x)u43V{r_x-RL0bpwGNft)Is`{jZ_?}iEzv4%ZIWVETmPv-MR0Dg?C*g z-FzLCj_!h+w>663Jfh}}!#IwdptdaeP^|gToL6N(kN(bnt=&LGqB<2P<{({jGBR)H#Sn^1a(bkw6I`q6xpPZ2 zbTeJR)mTEZ`-~54yPw)-_duYdf`z3O7uvfl<(xT2D-eH5V0;a$c+V-v?X5Z`T;a$Y z)8+E+6IUog!;=3n+qX`84BF9EE8(s^GqV33v1E8Ji2f%|dt26`V9`QA%V|=38XHAx z-+)k%gq$tf9NXrMYD$cEE^uX$X>WtIN=I5aB!_CC+yw9m(7j?Hp9k&{)q$)7H9TJ9 zb~|O#bu&f+lN(agpn(#Pl4nO9v7zdnN^#n50qRtWsrbo1@qY|=+`{acf1)IiW;G=O zj)U!_Xm*}4Q2kX1M|+3yiFsvOMQWmW4c$E@;y*`=940Ftw`&3QwAsYR1trRT!{|F> zC3ZFM$0}#PkPH?yn}nnv+Lm52cy-yC08jq{Zk8Jah2GNy9a2xn3GT!FMPA?Ow@xB7 zj8nvD?YMhQIDqWBU&k!$lrV_2rT7-nBVfXNVyaM-$y05AYyAf9$qz}4`-MygRPl{* zx$z91oT~D*q`1JAJu|dqZv&Bt!;cpC@WHn+4UVu}4*x0*vu!cP#issRlpY^sGbG2( zXvO$tjJQm&zV%wHQANW@Y>&JH@PfEAFeB>OtnN^Z0aV(V;&+cnGjPlnL+QB(mEjF} z{(IK7ViH9RcJY`W{=O3Mp=RHiJXml>n&Hf^bda|xWuwdc>{YnN-<3U$+r25q%b9-b z?WJ?hHL3Y<^i1+xQNTp7&1Jw{7I^S%haDUM#P#@8f% zqjof@lw~Q)<@#TFI26`mV2eBytDMUHyDr5E4vfSduyhWpaTLrG_znUej19kcO$q#fSz1iR}^G=m?O5s>v)k<7x+Q81}6yl$3P&Y&_aYQz++JewuvNvzK+ zchbpxxK7iVOp4W%4MTq)Vb!-~rvE8q5{bkjZ7I>PR>)C^(5GmQS&{d6pmFuU)TJLl zfU^GBD*BoZ1zdT>u+lW)3T&9X$C6q)TnQ*1g>JbzmD zJf?BY>Msw09v4iwX*|yvjPAU+wG|4`+K)y#FuJn0Q#e{COo?H;nC&ct!IZy35b5?} zCSwh}mI5}V?^gJ2@-M68GVy2wyYCV%ki2oCh7yrQt1?NSD4Azk;sna-V8tkoB+)#o zV?!d74*jZ=h9Z~uT$6YbrCI-+Yp`tk3MSYq^w9~B5IvNSyCwWCK+`nnc<*acBR7IF zg~Yu@-%l1+bge=?i9t)N)46OE1}E-$+LTn}gIw*Ju&RsP16q#xkrNQ}0_!gypurxM z792LTk;>_kYL0&=5$sJWFYRM>kQtl|N-t4yjM=;V5=kOQ4xs~r3Vmm0;2~H(xC)~YjpDXXr#a}$ zB=Vo|d%nWbcsm-;ZFN+chyQsf#K7M|Opee+uwZv|;^H-`6%BpqY=~!k%6t-qQRili z!zpj$3nFEXBGrq==>SW3C)35M3=+QYrOo`#b=aNcB(_4t+}c_7pbDD#10ZP83dA(*+S<-WV#;-PW58DYxOo zz!BRvx6_CFQ_Fs28zG}XSx@5Gv$7VWbo$E{NC`7Owk$2p1h%VLs`d31iAb^J;Om1Y zwyDE)L41tv1|^S0kPCm9ZUZ95BH}(G#jJUFiWtAzwVF4-NeffX5*n5LAU$vJayo&D z?uEZX2wY`YhD>vjMHGJ}0&|r5X?IW^$2I^|=!R>vS7UsZj-~ zn2{^pKhD+^fq+Nx7>GXgBwnW1U)XROIXP`TlWs#pMw-b6bg8^PRg3i<`r-QXI%U>B zwKlsC%6xR0YBki$uYL0HZZqkA)ayF36=9nU2=pB&AQ|0;SGbRMAq3B(aU~1?(BD*_ zgW_Dw);T%%IGOxu>5=0jkgkec6J>AjF)uZP#DH*MP4YuT-QzcVi4Xe55ZQQpM$H$1FMA-SW}p9j)XvS(|X>>7YFRv8LCZHPN}Xe4f?M8QXxM>{@@lG6=& z>GUWm*nS|<`c@sMdI7}YG_?CYm|3VkEfW(flmdD1ve-)6DkEgU&4yk*xlRzh#u>d9 z#o$6+4Am7L+=(k2B{+;93gO^UaPzbB+*DR;zqxUVMRP+fhkLPdj3jdYD`Ovsr(v)Z z7?l{J3(xyVxmUT4S_yQ&z(y$VXHUXEe5tN$yKlDd(l~Gi;pU?PqyM=x0{AL{G69Yn zOTC_HB*A%u0f?$#0JBlsa@qQ$oJ{}SmXna5PeJgtq}gihbd*}dVj z0|>10SiC||txgTWZTL-(S>J>EbWUY9iQ7MDIxUrrz6V_LesR6=8AyKp0OQSv-s2BWu&C)*P(5bSRSk%~ zxj5zPUY~A3@Dps?2FE&o6og-}8DzB7Qxfd8MY4|!NIewo)w@}1I@SfygU$4`OB$l1 z^9|mme+l`RF3~2D9E;nBZGGjz3ND{E$sKE3d*d`0EIRdmw_MWoY?q_*d#Pf6UeXDk z!H6(*PwoZfta$+4jbNflK8ojfkwL9<`8z1Xktd_AG*tETY@?U#;AvEkA*ARYU@kE^ zp3zWBegvdx2ble@g!RLAj}2Xo!#qyVFboDP(je zOF*W^hk|#blzsJKGx%7jk!wpkoV>9z>Vr4J(D1IndP7Y|_$aVyKGQpWB5F?4^g?H1 zbibrB&TcxM69$oJ;TDru+V=DxDb%{S&y*Br1RUMQ6fVvR#6|oajQLF(V-MGF@J_%- z%oplu3~c`QxS$BxK3W85W^3jk%a}p|QaO}?5u$|!w%cPL>54F2-qbtn;D3jR{edgV z6Tn|cNDj0Sr&8MW!PgP!XHe@2U?MUmgD76B)h9%2UjDi$stE5+>xXoAnkX6P4|3-kmsn8w0xLb`*`{qZ$TekcQjoBTS{JOxqKB zyu_tF(@D4m!FR2DyDeSUTM(-B|FF*emMziK1cIza=b%wta$3O`$QS(1R|4fO&u~slcgYbF6Wx)cJ^=fW)~Y2j}?7@=L^t@lEH)38K}!i=eYz!JWhyTO|@(zF_1WN^4$%%x(v}5cAFp?-x zsSc7_0C!l4M6_+#=}g>s5|v0WtT1+k+-d~`W?m`WX+m1%AU(Z!kc;Ss-UG7-sBN(U zaK~R)Kb7?Sw7w!qqXOn%f+A&3n!e)Ha4eiz&}yu=@<5RLdEu{Qh4itMJgGivW?Hw! z40{U`J-sVW_zo|VVq7wFp*@i}cubZ4V_~UFI0kQFn?T|3qP_6ocSUGUyC6Ju_sd3#H*qh^4sdOc= zc>6Ra#ggP*7sjPJemW+n3R%AJdnQ^VG)pz z0c6O=g5O45UBtR5@K=vs2b^?!>W*Q5Wt%nPYUQgyULgb-#9`*MBT3dU%^Zb``RKSa z!JA><~?w#*3&`=Sh?ZiAX3z;g<`NpWArF zky<_vi62psPib=$q}S^)N*C+Mu@YeK{5XS+{x982orGrHLe4rCWa3M3H{|@_Or9p! zro?(-D-`J-F#e6P1&9LJ!3j?Z7Nl*cB$wLFiP|Ts`3BBCI#moqYJj=qQTzO=sq|xzd_5aBr{>WF*LxL znE_3mEG|tZ3$V52*P-F}&`%Gtq!mrQn%<_WaxnBSRMx`8vHt}KRg_kJfHIjl^q%Qq z&KrMK6RTOy-!vsUH-+g;CLg-m95HnF!6ics_i^Ki6STi_Z*GFcF1Y^L}ra* zF>0v0DF~V zQ&<-h+Kv9cXSZ8;O;{8O!je|`Hzhi z)8`27e%Pi|zmT4cJP<(AZ)azjs~ue_P=_XX_oe#=q$L-h$7lY!iP)MzdzdgXn++&z z#iO)1>F>frL!CGbIAVa64wi4jxvnCkLr0*K)N3z~3j2Yrjm&G!bhFyQ5zQV^s;*%P zf4h2DkS5JJSs0W}BL|g5D5J4a8xDIIV143zb<^P``FF{uZ=3lAbm#VGIag?xY@N=p z8ASIGC3+ROfIxi2?j6- zS^E0eezYX@P^UBl!mI`jkvJ}rsE_J$E&icmTxM!D+Y-x1Z2ZNa9MSX0Qa1aj9Z}R3 z{lF0oGv^=z{?J1A=mUO_AuUiQR=rXHDI0E1 zV?qNGY-gH%HfOkvMk5KjeFP9>uG!#cpL4-qD3kU+_Q0Bt9JZ-*6v!fFE>ySUAmf?y zN9Ccp@_aV7PPc-?am#W{e^m)7GYCRLkm(>>*E45PB=k&M^ z{SXgq^Fil=^2aQ{Y&;|XbKAugApnRqzTOF-V-Whcg6ANZ|$e)A^hxSSxd*dhi`6!T&_R2fXPR80mt_o)6jHjOJ@ z`~2VdVhQO`EJc?Dp!|@w)rlHQG9Et*I5yepu?bRwVw#?-p79s;LO{=LX38)jRCgjS z|JGe0Lh&qc8I^P;kntypQ*BDwEoE+z3`=#!?zsy*_Iw1?l{^RpA2c3KhCA4zahbHs zsvCqi@C6Tuo8z@@t*9U>uYgeMf0Sg*srQHd#*A9xali5vW*fwy!Kldi@zN6-GDB+b zjCZf|5q%dwTr^Ar=YN)=LtR>2-|ZEs_Te5$WiD*e8*&csDZw+3Lvd3nhl4=7Q1c=G z`P0@N7Q1W{Ocpyv^@u`fWooe+iS;i~>VE4jNzIn|w$KrK)P%IP%&_sMa485_iv%YJ z$O(l#Z5u6Md99rdgUE>sOtXvRt*M-qG-##k@wPQcIYp>HbNANf~ndPlDFxY9~Dc$eP^$O_YV%84=bzFq4)Qk~rzAmu3a)KTD z{Q$|&vw!ct_ublQY^tzE1je~Ppwy3;Q!LRK|4ZnQQJJ7K_Kt4*k#X_flF(2B3kYH{ zF#&&L)`uI@HmT)C;3Pz%bmck#<T!})g7S`3ysLbpG+U-lCwBNGsH z09W}?x{Lv6e~P&VpE}a0Eo~Y@c*UgwgVi-j&3qb*e7Uw84yb$`yz|W@XNNQgSB9J5 z!jdf55bR_}2-88G;cUMpBlW?vm6@j?zm@O^A%E~wMVGA`v{&Bw;4q7qu82=1z+nOX z+Zslplte~Mjf!?nK`%Peo|E`;{xL7gQ#EkBzj(j3Vhrs+VEb*eO(4mVXr+fSg!DU= z6$>TdYX5U~%H61qfXJN8!oB7_&!ALqVLCzKG!@99sEPGZ7}OeO<~v8H`h=xIB8Gy` z0eP814ah$4#9Z$kIDH+%9yP!G8c6?zhkdWSDUU4&( z?^`n_vFTA~yM!9=U+-ew{0Hhnd>u$wc$@`Yr(a@sRKq-EXDiVTzM2SjIIYYS zsvCSV!5)`1Gc&{5QiMmVY)-h!rgqSIT}U^ga*4uwI*MlyAtNr23f(YfMwkC20<@s7_-asL#8!|}Z$WvhJsA2K&?j14$QYA?EL zPm%QGaf>R{(dR`BI-^sWE@bJIoR8WEcK=$+x&VdeKbJ~W0XroX4`{oQEcI-2@J zVdonl+`r377R;kgR78AbugTa2zdL{bKta0g4!xAAP7UxzhUL*r{-uIP>VqwO_~tr^dAXm_@$5 z-@tE0cO_MD^sm|o@kG3QyJ1k|bsxmj$C!#biEKr@A$AW}E^09Ze}b29RALZ2mrwb} z2|5ABd*%8vle%5m+|dr@FK|f5)PJwQ@aL&ti%VrPwIQZdYUu*98KxDwInZY(#gR7k=WO1pohnlqPnJTm-W17}Gobjsj>U z^r}t;K%?FeBnCZCqcYBVLdYyBsLacvbjPyC zoMirSzrsNg7iB>vUT+;q%`VIrw1LQVEUJZG{e=zvUr1AhL-^G_5+RIUon_aMGx%m| zI%bgBid^ArXqR?c_7-@axB8>p>UNKD1e-VR{(} zygVhOI%-yjK?FaA6e7vwUooH~L>ThNM%?u!HMd^mO7>kwN`0NvaD)Be6Qs8$ZYWG` zFnKZ<4x8adN8zHL5sM=}8;0J7FZ%@clSWrR#kYGq^AiXWP6~A3jEj}zwvFnJ=a9yr z01WV-e}dx>LQpsJ$06{5?+IbGk;kYlV{6ax<{X&zv)z^-lnB>MyXQ(9w3g2~`diUr8tJ0Mc|K^2D>IO%2#~Km$>_Cqq z#C}W`-qXDqa~t?MnDibRzH52(Ho(lSrD@Z+f~&Jo@h!DIXh+l`rGz`A104$T3XQCd z3YL`~yv(=EH5uELDg?Pz?@~f|EN4giiqD;D&ZKMUd7UnO83b76q_GxXsA*1oOECzL z+Y#b~r(KFlRiH!3kG^Q%$~}3zPjz<&@QBaH)u_^obVu6^1AHqZVtMeqXU!14-;GTh zZCz#bi^qh0GQJ`xQ1_2M`f~DIjUQYN-COF0tQH3vUUZRH{8zv<0Z-mw^iwQA)SS!* zLWcK-CGM7`t=X6q7QU=;QiNBI$~YPEoeON9fMX$v=mxYFl&A@9fklM$@0GI|SX*z& z!f&XbUi4FdIaw}g@|&?8Y15WilGR6TQoSEhuA;6$VX;TlhK1@4!8N-?np8~4J}()I z`iDP|7QW29eRjTm8DVu%n038#CBiCI?#icyeA<=>i=p)xYlhx&)9)>XxXv!afe(FOT5@7Q9n z@(g$5{-e6WBs(*MZ9IHGPj|tpXuu6aW8KbS)(PV+JJ{;Vw1~bkAR4f^x*R73W=B(A zIZ%h3)`6>=b{{XGFk~e@8-`nuE26OGc9ysSoV2VimNVFY7!^vCZOj=xVMenNAK!8$ zpQSLx-2Fw%kCAE}ax1Qm9UqTUF&@v|lO!`F^Ja~y;y@0Hm@MgVQK(5;0n8;w0U;;1 zF_KTVP>7Eo>ae2()O_>de5-p199d1B`q#A1^$c`Jq25*({(?bRL!Vwle)jPnl7n+l zGb5(CNWg?*l9f>2@j6|;$ds5w0dQ&%^#9q@qo88mS%%m6h{O|H^#VQwj(B^1OpMxI z{S;{W@Y&W&iknoIg&Igs^M5@%WPt{oCYd8h4aYr9JNI{8@`Z@VCsGs;v^}jQKp9Gc z4VTZ1Bw^T1;EfWkqsI;TKP-QBZ#1LEXbq- z@TPz9=oab`1&w4$pTru7hD-|TmAnO1Wj~03zNCyV@XRqQxLV_#gu5!K=m+x*Ba3S7 zg86~^UHE%Jh;i4a9{fzE(05wd*82)F>mqI>aZ7U0-b%#OMn6e4)ea-4DXhCfVODMJ z6RHVY7~R~5QpWv3)WD}CYpVvagViv+haLzx-zK#k=J7|nGvD7VX&ag=!lr<6VI)WY zApT0{p!d1AF#JL9V{z<~@NLH4eh|o36UHGq82)km6WgHJ6#Y@g0ObE(mdh%d}@O4M3SR5Vf^Hlmu;a@}Vtf!8Le;&Y? zdc8A%k}fHlWTuY?ob$dr+V0}{-+FVo`1JUIleuHY6QDupJ3(b*J#&ExWoS>B4a>Gd z5F}OBF^<1)y5)r8Pes6E2Pi)^DnIo0@4A1GMOq~f_^5U!p`D2ug!R@cKFl3!Oo#ZC z-*R~ICNSG1gNV@WtT<_Ka%p_9-rq>*!Gqt zpzS(Zh2XQVw2(U{YdU~F1@e8d#ywF6e;jZ6Le#>oYK>Hlk_wt!^R|6hjgUagrXLJJ z$Pkn%t(*ow4e=^P%L-BXmFvd7*w*HKdXU(}y5}wl7>aU|R`px4@$BQcdS%|ml4j>G zGf?Klu*cFGXL`@^dh4+c3XNYX_942VF+UA8S4b?6@0EFXhT!3efcE$FZoF*0&+%cr z2gR%FrA_mmCs01Sy;yJqz3^@HjnL7bET}g@2%ZGog?QI$DpJB0ZZ{=3vAH6cnMkM- z6+)vQ3P2iw#d;f-2704h@dX=?&O(FqWj!Q(hz0Aa`DLx*jvsK&g1wH-F^Z>Rn#dCr zTe@8PcgV3_v@}Zh_Z1!sHmmU;BiM0(dM#>t{wUocGhPv|*c8nRu^FFj$@X$LspiB3 zYo6Twks5}h)L|1{qj)imuzcia zv7FiAl%w*wfLH2>=++~G9diFJdo_Vjl@d#uh7);0j&{d+^v1%P|Mb%y@2%FirS(4j*kY#g~kgblH~4rzZPAuTE5&bx2UB` zZXxFMXEbcl)mea}iSKj7r`wU4DJ;-UEmOcqhZ&PZ|1&KoQT~p8wyaaua=#>t=KKSq zdKt?!{`%J-+l)zXp4A^Pb`CHayfi<$p`qhU0VF+=pTudH3v^o*eSE{9gBjs26(ah^`6By*EIs(nzOi z9T;O4=rTJ%%R||dd_F_gS^N$e2Q2T&wou~V9lR!d;oJQAygW>^cLi3+IQ7Lyq#0AJ zn^8KD*-bw-iKY2NQwIJ`7fy>x)=ERSu%a>bTmD^!SfX<`9Zw4pl}v!QSrnporKtZO z>bI~Nyv$vOY@Wz$sXsv}SfG!I>#?lHPB;odVk=$z`EDv1G-AAX@ zj#BWLs8HFircMwgWENzM%0-|r#rA`*TLMF5{D@v_f$9){5x8bcxaB2U2+_RlaiwO~ z%Vr8$%rFJe_Vd>}JnG%+%+M<~d3xWwqYPTWO;nYSQ;1QCWacc4jsh=ZE2Jnb3+ts( z?ES^V?KdP8E?xESwvq1&6n2Q~BTD7N{jsgD?sCiw2s;}d|{hCi6-7p6TE-Jx~ zR=#;2^&f_o?NCxB9e{)!+tyj>SyB52uDvm(A74h$0cV$A)4-$ zd{PwAxz9iri$Zy%YUh6Jw|$^EWqEi)*LB+Uh*NaVOAz-<((|cbJG54l9ty@>XpgY29j0_bzMF^j34|K@j>;Nh&DC88R;v`RkCZbN= z`JoQrn?J?X{+f4*0?I#dC5a~J8ZU`jBg~*yAaV6$B0+>DJ28B0$$UFA7(5!iY#<7J zwuGy~@yAzvO(XyDc-5A&p#P>Eu3)*Nys#Vo>Q8Bw3|Puq-;548$#js)7{F_J*IQqH zVOW=(>{NSh*ADb?sI^09OhVpbXE^+X?Hkmt3sWdwbj%#ATbvN_M}?Mq%A{W^a+<5%5P}ObSfAr+Cs=cNhR~j)9{H5~oCnlkD)ME!ptb=v^#L z_xNGOqVdW47-6SwShv*<1s*3y%|gZf$1?Dthig;6OzubMkKbS%ZXF4W$5-W-(~yS3 zh!8@J=4r*?*Fk5B^E-;txsJ0tNKm?q7gS|tP6NOQnb^66JXP(lL}zeyXrGJgz0o>p zBU)ZbP)SaY8Q~7=<8oG1cuy@4cfjEe62}-F22awkb_Zfcu!gy{ge}^8R|RwPFlOcH zlB}eAnXn_}l<5eaQy;U+kr-Y|!nbfngITGs=SuAVy3B=eM76(GNNUTL2T0lL2b&P5b zuB+a*}%N?c+UGX?gZ?9 z$L9#n(u%ROAw>-`Y=WU`u-Z3Km9zJcog`2kYnno9Bc*(;JTXv9dTN)A`G|e)R8}~N z?i2v4JF@)&rMVD7<`E<%*Q{~?0Aoq=!?LC*q(O1}jXkGw6BuoLmpB0X_rer}aunXa zzAGEJ)S3bnks_9>%+8+eR0Ng4)(nSNeh4RIXf<(y!4^AK=FJZRM! zq6BD%PPvps`Z+C$OlOAOvy%F(G|J89Ms{o}d8OkIZXCDLg7@xs5AmyTJDu5b!DcCq zi}BPc8;$IQ6n4?nN1_wJ64u9$(lUu#zbpVAoN@pkh*i(7wW`Nf;rEP@%v|DY>S)=f z^VOV;b%ef{?1e4vx}P>g|Ynv-ga7R(1#wT~8qZSqr(u8{Xch!;z1XR#W@zt~k$qpZjED0BC# z?CX0XcA`tp{A94zMX4dxSWhrmR{Y=_|Bp&sV*uD&?oymx_$b^%ELzxo2;6Eu z+kfl4=9^V&E2~mkTW%LbAW6dwFkqi?R0}!#!+=FNU_N=e%sRB_&u(~ z`ngIR{a#4?4-2&?J~{zyYU?X(25Z6UWG-a>zmSn&l(Lc1K&sB0=o_LX10`6tH*HV3 zGYc9YwajJFGU=0m-Cb2-bCLJ|Ciq6%{=N8~GPwh8i8B>wC}~g)VAJHp$xN9~Trw$5 zDdhFzb^Pn#r+JcIMqhuTOkMz!QijkD`eVZ(;uT5W2+!ZY$bs1YNp%?eIDe`rjW#e$ zPS%DY=a&el?qqozDK1q&nBAe4MlgsQ$&12z9nE_2&NsfqMA{R|z zIcTo>wYQ6e{P|`7(%7}6+7!prV&r?u91@iagrMkzFh+QO`zEDtgh#w1qtJ|P_0RgV z#}NN^1OTXuh{wbU_rY4ebjIXC6!;YBabf}V-0)^yW8W2?qY{hm!>ARU8nb5$6EmER z!Gs^2c~7i6qPO_#uw=BC#d*I15t3EN&`D|e%&Uio(1s~9d~bwU!w#?kb@CYpxr*|v zi{YK+ly}3mS@rUz$`1@X)86I!1icX&;hMnwk~luK3mZ)Y58)(OYsf@KaZw&wyB=5i z+)q);-Tv!N9sH!ysWgPL4^e~T!!;>U(m3yje6Te1JUsPLUq35{)Su!ysn2BBph1-rYG0m? zDaT{UhUM4E-Yx^B2TgN~^4R&b2&OZ~u8y=gJWIdZ2qKAYExy3|w@bsLlr}mhYS^(| z+6woKr3CKrIt5e-eWLGHne2ZtQ3`cuINu>s`$So4baH}OXC<%=UBLH>_eXKIyi}!zEiyvi9C+@Q_8`sFcQ3(Uq(0lAnt%z0Z+d^s0oUCx_=jspDyEZ zH{tf`EMW~i?jY7J-{I$eT3fkfmySa>;7`7G{7n_ApAyR)f~u`x6|8oX6Z40zv913U z*S6GsJ#k?msr}De-BY@+?;}j0jwsldWNHZzE^#H{|)Sfb3u*hl)x8UeEmaCjHod*Xq45*=zL)-`xIDAhn$1$!QY7+-?Mv*2fbv9w z)FTAc9?8kGFHMXM*)Iqwq#cvC2|tx*e#vNkbNs-nYr~rFeu`oMI$JRT2Y)oV=` zt{A{H0E2rRl7EEr^&vnA=9ULt2*{- z$`be8L;@I{2wgRxEEznx17HOQ)e=J5lHN99gv5Su7e`=!n0z~-!^15OgsCVVVBl*DG!9sUP01aTelp4crgMstsCGE0VOk3aXaB5^Y|d+{2j7FmA6HzJUA zOjn65(rGT(FXId#obip>R*9Mfd2W5P6i#qIL-%NE8jG>Xzc;X<){_W{X&-)yJ8oW$DoH_@Y;=wZsEY?%Wk4&f!MUo{ z7TdhZv5l*#I3OBPS~?3W|I(r%G{OK}cL=Sxsdus`S>7!2SBz5yb|j^lz;y!+K5aCzPj? z4(3oZ{*J(%vK~#t0rKY(VMd8bioXnrhm7MHztqQo@5bEv zIaHBGBZOb-`Fv*UeQd{i*6jMnByJ05;hLUJuFK{A|NnRo3@gW?j0vfHNz z6y0`V^uSqeOnof!@t4HMS)k}5E~C}ye5XUtB=zupy)Pi@M3R^W0eW(KoFC1&H*pF! zy@YPy>jURDzR-6$BC7~-jEf0d`s<07D{n&jY0GbTwSpK~xw3_FCig6K*90lh!J#qI z@YakkJmJ1DzbDt8lgh*olnpga3eJZBUrPlDZUYkj?nuyH?s9D00J@74x)i$e|oRH6-Bq8uMjJ79{?)<2Q2 znJM}0lmN`jqhVZRgM|$J=~AQuyk*fN;jj{uceo7HbSGqq(r{i)K9gbq9tljwb;raheU*E1NV4D|#;qHUor!*=NLCfjpy_wiF!eJvSpEL_Qc4E%mgv*1 zee&H7Zo3_v!m$Wyfe5zsD6{Jq0tttu=(-uf|B=z5aQR_aAJfKWH4>MnkOpz>P1)M< zZ{o9z!5{t^4ZSrg-CiOOnQZ7zan1~qQ}(mro0ZlbbnO-!JXX@ztNz2@J2M{0ttBT3%fFb$pk1Wkw5y=0irVSO@pbLtH3kmGz%EJu7rbQCZs zrO!WGYk)`HPi1Snl&-G&Ik0s@S`@u1{^|5n)7v!?j;2lSUG0={dIL*qp+SL{y6};r z8|=3;Md&4gz+NMeFPA`)8oIM?K0R^uf58<;$@n&vq!fa;_0%G}?qI|Ckkbs(-B}CY z8cgAK@iRAQb_A=XRAwaRJY;c{8jO?6{~BBlN#BBDto1fjD?c`o^1Ba}cx`F1BZ{vu zjc9`#Tz9#QB>?tX^zj^)&L1#1i|G=t<*D13MSEITi~st1(c*3yLxMw&JA51{JV8JC z!%CkgBbZ;B?RleH!RX((!iJYMLHL^*Bl{yy)GmZ2uoh8001zkn zE|kk>f*UBJ+$NWZzUdB5*iu&q^xp+QqMruA0)t?`Lu*PG2?qc+u!`WS?O)Ln`SXsH ztil|l<8JG_e=M%c=aGL3!~d{8DREn&F+O6Ix@dRfBD)i!*+}6?ucm8;L}q>`I^jf= znrK#`C40Q4f2A2SRj?(lM3+p2CrXMc>7ekKM2|rVdZ51O;;2`8gB8;}M=q#O*_kI9i|B z3`L{M=2Q!M38W#(X2Q6f%+3n>Nr6r_2I@r;TiE;wg81B5=OXv3@(QE_`}}E^zjRqh?nzs+(@-M^wfeMzx?l1?WOX6;Ud zA!z&q@2)#>GGedz2ESHFf=RZ|VozuCKyJ;9Jf3C)PJ$cgF!$W-0+NA%Xp-(g3*xd} z0SwB3GT*ZWcd_JQ1JhZgo2^i`J-ern-U2lOrcxNt4`foS3AsMxs8xXyzsbh7zvz!v zwRJ&vk(L+?-+LZf1~mkn==_+uYW7c?d-`)e$dHc)82=lw)Z)^SyG1H~ft@;^8>;2^ z>#4%B#TKi&C?@v;sTvf*zMtqB$Gws4biPF!d#_J<#*kcr87Zclg2n|~W$lLQ*eZJX1B>Okr9DZ%)#t~ki1+6m|k(muv#XK7gP>TFJDt0-u* zw)%4H@;Y%qKvR!LRJmZ9APVlX)LnO#EyT4bEPbB$jSiRfWO67bT`kNeb|SY+gnGrc z>X>YPsSBjp9{sB6&t1f{#fNWy+QlTTgQPj^nB|SGmEd0GdCa%|FZ56`(!xCtbjWwVckh6?{oGJQ^tu6v^ZtLRN2LNkXByarK&Sn>Kv ziI9z7MJ$XSn-A{=Z6j|~uHPNbF(L!kYKF(5$dDRUb5TihBOB3umdHIoh}DD$I`m5l zks+hjF8P2KYE*!{BrssY-${7LETxM8tsJVKnd|Rf)5qX4BQn~&ewf}dUE;Z7Z1U>Y zJUm_amPQ@v|0U-8Oz%CtedJmXu6HX&Y0$Xv?6u;8qC#V|T&=pOWE*t=1j5Z3WDbee zx&7=vLAHwOKIixNlk)jEH3=gr;S^L>SUgt`9eQXRnLt{4T#QU^*4wE`YmO+;Z}%L5 z=n7wfumNa}67-a`);BHDyJX1YHpgN9p=Tt_Hk$)ScZVPAbMWVG4hX_&hHy@og$bJ= z`+XgVKw6{|z{hfC6T}T=kB@gkc-%to%@5P`&9@xk5@jDpD}xjTG`L3;_wDzGRl7g_y+r zUM-h`-Rx$}gtm{Ro2eb_F{@J$XZr?t0QZ9tqX?`5tc**Jt5N6y@n?(E*?|0hpMZp_ z-jdjACpHvEO)b|;a-28HTYKWn!TAc8eIjkl1!-0p&R^mje3KSL*NfD8cbiLub(p{1 zz3M5bWV=;ZxPlxqnPy{f)X5t&YG}g+YcS(otgeKyaGUM9{^4|pkeOKl9BLt-Gg7L7 zxx%K|H>iAvij`$WKg$S0I)2dKTsF(daOs`<)YgM6c8l37uJ4n0HElDrmHJb?k*^FE zJo3=g^ThN|?>_KBi{!O0GS)Y=!|dsDc&tuVr5+0jv1hvjp?0v?`I=!~aIGw`E&~<^ zSM?rSWfjDxMW;QayflZK^|-1D_Y0UUSzfx74uc8f^ihTXFlV{#qw%~fN% zYOoj(35~(j)~E?MX%S_e27SMHJDX!x)lB{WC#RmG0sYmni6?u#l7vDcf_h8fbEbGhgRJ(p3-HC-<*5RB8ujy)+ z^2dz5Wz7pFS(hh}H1x9nIs%-;N$9v6P+^d~6DjNx4U8k)j5CLw3g_^Y=5zuKA$Ol} zKP5Acrh!`tb(NWn9@IOpBI$R6n8Ar5sZN~!j1UR>gTKd60--+ycC0e|jDjhAUArhD zJStmAUw5TY<3N0(?+vo}F~-qfX#~GEL|e*z0USw>#GgnlSe&@iaH(r*53bpx9W8pX z1=IJJDqn^PC9;nWf3xl`n_`DhIDaS7$=c_7tPZHfFDKhaabXsc{^AR^Jc5Dq)K3pnxL0Z z2GplqhAnofS)RY_(LvD3`^&OC(P}fk!LbJE@Xerm-lo30CuZp;K$Bb_#M+Y{2#Na4 z3v{GOl6Rx)5@5zl{0=9_K-HJliJ~6Lly7j&3KaenwTtTzG34zYfhvlT+Y0s9e}xG| z=4w&;nX#vw^p(K}uY!%*t$-Fn6pDeg)d$Msz$?4+{V)daQ;NRYNSpYS($QK|aG z9nmQ&%)nxekU28Yv9YLr*P3dd@_-8i+>ACG#B6C_6gq1#D$plc)pRs3zP_-as+_AWOD&Q|@RU;#g+vn?BM4_4}mNP`J^uIuQ zX%pcJ{Zf;yw`R^#bCaF?@k<@M;}TJ}IeZ*dh^x2wXe18B_CYdQGuk1;3uXF+&S|)$ z)O)`V;^aw{815lDK8~p&+hL6*ta715fs)w~AW$?Nz?g2?} zp`z_0#^QF%f^39iwZHMKBM0>)WG~%I8~gM7*MeL47Lq^!J={)GWqH7NooLPpY2_wb zLgX@Ok_Y@u3sG@+7@DQJ?-5qMjAqD#jNa28CY>=nO5JACc>Aizj=X4lL{B-J+zkgzE=t!{*pIVXq3c?%)Y3xeE;lqvD^tqNYpZXC6r0-yYkE z!JadB{-W5;wWdc*fri+TQY9!d%JUo)mPBpY>4y)d&a5Fu9nCMdr6=j)#+T6zJMEY> zi^Sdf2XaG}72k9gIKh9(r(a0u(=_TmROTdxb_b+o`Q`y;5?M=9T6!EkB#%SdJj0{z zbHz=7{`r2`?^&BH?dHRMH3V4$HkinH@eacaE#70Ks5FS$IQi`#TcYWm3$=Pa^` zeT+9x;HqKY)m-Gx$a?4LvKcVBH5UfuGDc$J!8b@FEIt6}Se-pQd*tdE`zMBeTG4A` z@w(yx!}$i?0Mbx$Qdr@c*mo$(AA-sN9*OS9Ej*_9t)b*}QXf}k1O+sB47o$VgUAsu z8)xO4YEGIYk(eAFGs#1eykV&6xI{@IWW+*p>$K{STRS@K(7iAMK@#l*1#}M9UyvB> zjhXz*+qRHuNg#T!1{r4yhlEQ01=`MWP85WQ{aLD=0ugV^Yi1k#4y-3(?g1uLgGb%s zQe*^vK8Yc>j1F0!W*q*#CHGk@eGoqzOg4+wVi;l5^`Le@M#4OUc|9(TaUSF~l9T6U z_$`eqwd4yBHYKZgxUO_28gi zMcj8x>sXy@X7=>Pc%?s>8(C_dV}$xdfJzT=CVvyB;oHiqm1nt64#@UI0qL!#Z^Id# zl!b$yUO}?kb3S(iAD6Y48$U3}aHz$;r!%(Ug95Ad{-(l83z6v~k}HhNg{B4yN_`Y) zrXHCYGI4zC%+l^3v&iDQZ2W3CFh`<}j5-cF83gtD1zGrx45aZlDQyT!3Q-+T*TECj^m;8{~AIcgJ&ZAWOWj=8Hi zbW;MFGER7nA~z%46?HeJEcv_lV(EXMJ2Q8H_tmfy@D1t0hRkv-nEh~kBOX5H%**6z zyu2T6mw^FRD$@W!>IG8Kw7~91vO4AXJX8Dpq$%tt?l2frd}~*FbSXikU2^?=LP~v8 zg@l!Kd(+V%Nc&51c+y%i~IBe`9@=9uT z^5xSjAb$KLgojK`8I~))`Fh?>z`d+Yh|Q*;(e*o@=tu6{=LRAc0M!IN2nBok6Eq@q zPkPrz8K;=ABUYo9gy7Rw+^=y^dILL&8nyfoW-zg4XB}Gv63DAv+rjT_*sQzu0Nlyz zyo2gc9QqGr=fdLaB!Gqd2pciQ2I@tUiQMqUkgeg3%gnowKN2Y5gqelOBk>dr9f^c5qT6^Jo!L-!^)e-hm{(Y~+!namZs)Z^IIpP)1HCP)x=r>_lh9 z?0woT@eqQ3AKU3F@&3=qAdhK<*g^e6Y^_cI=D6G;oG1PHk(*Evhsf4H0Cn7zh*$uN zvE29m+1_6&{LbX&|3_72g4S5WywXpprfWMMQoyf5UP+atXy6DodiWrD$n+Jf{Q>A> zGJa2!Fao__78bfJTU9AxpkpskGOy5{G}jO}D9+Qve(z;-+sOcOMJ)`mktZiFQ)W70 zoDPYJFaVov1o%RLwm3yPZyi8OPyvq6^}+!7An8i8wk93biI=av-_3;AQ?yCe{8wZd zNNm#Q$=fTIr9PA089BoCOh=T}mt7y&wSnBo{y$q|>v+a&b`NR6QVhL-3uSn#k??O8 zTmW*&)Vc7IyA_d$j=?(irGh;Gq<^LN5~{C!X`&lzPW#E4WiS*Rv_;{}J%3}Lqt{2Z zMNT#?%BPX_wU{B~Cs!GyDDj_j6i^uK)gvwnCoFj4XtVP-QryfyOIqtkzGz4--)1;O|RRy{8>sbcCyXikWjuyJz0z zv55W*%NgDphdPP~p7p?%e3kGV*tjI=e0qWpBw3`AsyDnzAe2-wWSX975OqYEXE;?3 zDhMqNW0xLntFQW@t`HAFO=HT%m*p-PrdeuoM~Dp?+X&9!SrlJ`Tm}3z3^urM+2`w1 z4s7UnJS*tXt!M|~?2&ohKSI{16*rbf%uD~k=*5yaBs}d!qBY@A|1G1h)GQ)UUa;d> z*~g7n9sZ#tDPP>ZO^~j>^KBaIS)s-Ton@pjY(B0wk=0*~SKzFPw#_5W9=*8k#B#yZ z(M|^iZNNfcVloZC4ah)32OOKnw&P=`<A?(_E$VqB{j9W!Ve%kgF=?*aMA0Z-gof>t0difoG8pAj-zJ%F$LZUP=W8tt?; zF219jg4~++EObh5e<+Pe&A;PIoy!6$Kf)XIt6l+}NBDC#nD3saW<%gLII>5HAOsrx zYSn>(GreFRXPt(H>@pajsk7F&$#r5c8YJkRcAJP2>k_bVW`3##s@T|ZC@c2FF3D*= z?=ZYeO+a#)MYtdBFK2%}U(api*%$hE{iHfn*Z=@%yuIGrVMs1+lhij^T3Oyu^&}R+ z7%5I~0Ao#rA*K4Ef7=XW5ku&E#3C}DrijiNp&s9FSGxGnOtz*;vFRk zFJLFa^NfR74yw~S7qFqAFvU4HxTc3c!wct^0@C?r9BS%Ht1g=lFcmDb+lmSlj%hO( z4V}h-tZUXK3L@6>@#t$1F=Yapp|K}md9?Noaw;*^u^-j1FzMPVSr`%!aSOk6U$CWZ z1zH7ltwVu1NSv9npDXwh0wx~Fn=6}4e7pBZu0{k)n&QQgNkx*cy6RA?##qrH2)?1(z+r$1Hne+m~f+5UX7B+BW{;9yQAPSpP%J`AIR9lv6Ax8e#z1INhc3yD6{ zms$DOkJ{b|R0QzhgI{bIr|$b4M2E&=RrhKcN$5#Lt~aoCIrwCl^WpL10;OtQ&|+rK zFDI)w{(M&}8e=e-anoZk!NU@bi3|a4XYDh9-O`ZsVb$n3gsO~g7}9J>w;2b7H&;R& z(+xv^H)oq?ymuA~vtukV@rsn-emQQGdG5raR|^&fcOq63 z@`*FbMApPgs~Dw+_F2w*z4Lu$&3T>Iv;1VdriJ&AIB$7e_Q|p<9AKxmjm|J8bt#nu z^0|rT2oe)!S>IwUYjXxj&zfshx+xjwXN1a;6d`T<$P)CH{9zmYvU6xjR;H$%G$YT& zYfvhBd^v3@P?hnzWa9geRJu%@@tUbU$&gfOMc40L8E&olnrRH&Q?P{## zXVCyD{lcbo>z$vw*Aqc9Zb*yQ_z~yI(h#R<^@&%xQ$K-gs+?>DxW%p|4 zR-#SG`&Op@20T&LDke1^CQjI_DwVstpWKOXLN&)GBuz5ig5i^p@jl(k$acQq4Xq3^ZJ(c3M?;J?rL-rtHQ0Rwt0qRKwOZ-0tth`=8h znyhWU{HkoXB*-QAX2AF$fqX5v9gDyj{epk6m=bjeR&gHv=l8}S3>|zx1X0X>dGRj> zazDONWv46gz0mD9kB;YxNg0acff+=8dz|}YHl`1CY|%eQ{f%0K%Vb)6);{G-<^MV& z2XTmz5P=C%)T?LLa0}L(LKSl7+P|VD?LV;=>qxnJkfd^T?z+d-{A8w$oZkiArLhYk zQWml55*os6@$mLz&H8CLCKR)|w{n=;*PWf)Hgg4rbyd#|?X{wkSv`-RU+STq0e_#c z#WImMsh)2ruLr;mps`DS1p5BUZgyejKFPK~Y)RzyFA|#Vkh5_?mp8XIk4fDOWIF3d2ZaJQykTt)G=gLLw$o3EOdS79m4j+({YVl2gmTRV^67+1 z%W+Rz?erUZB?2}S(@{&DAHj#Y_C>Y~CIXWlQ7S9UO>dIZxnO6%`{c>TKk-k!l@XGK zn{XsB8AU*8vSFc(?i6vW@2VYOU;Ck^l1$BH9~{Kyb15e3TstLi0vmj$Ec{XQ=1XqK z>lRC_$iW_(qg9Te%tmz?&-ezsWuxdAfc~{=0th-wv;Ve4*bm+g<9`nI|fuXrpE9#LUm^Bl|w9qg0exKj!(+cr&I z4u`9&#aTiI@Sc$Bzh!9ceHMp=x|@*YBJRl#xo$O+rJm>ZUw&O9UChRJ3I7soi1I=S zPo(61EsvbL;L9RYG{#NDIDy9`cnCq-Ot3<-nj&WO=YygC(~wPp-JibOnrONx`!7BM zL8u*?2|)oyyak?6thj03cMYR|lr8%>bGuqH;$tlo(^}6~?z{zlv<~5M1+R#PrQ`oW z;W0r~Y8ok&i9#A2Re_SuWz-_bCOcL=wY>o5#CgH+GM7 z-oJi|I4KT6eMA=b=#?H?a|={HG+{5D4sv7Q%3)xbFI{+K3=w3Dw3~CCD?fk$Q_o5u z(sPGUZeMxE{Y%kBARTDwV*p+g>918etT+6BZG)unT{!?FO7+`7R-Co zns=JxW{X}5?(QybDkw+2UUy+*ybsJQ$4TYmhXIC{JdXSjUQjZ=_Vq_AcXwPNfiSC8a>O4`_%o!cwSe?>gF$9I~}m z5&IH-p#o@NKm~xM=yA5(E7{rM4YGHRvS&NjIqiS3Et2J=X=4qe!}R%!o~-yxAPTUC z%|%O?xYf-2T!4By@eUXzfQAQtH?_DCi5V9+bcCYbXHl1xT4mT?#dsBxMvpy9V92)! zPh7_OQ8y3Q(B)@8BE{X9-KI7S+l&}&|5c5JT_f774uE+#JAzPt7gNq|%16g;*kV1; z0pC?lobqr@M>h^01Tshntdkd`ors5O=NpuiQVDd5( zdDC{p5g7u@J;nA*h1y3eJ8V#j&`K>Q1=wDJ)I4IucyVi=KK-Mv^+MyKFiHT{|R}O=|RMX(SGuNYat*3j=;h}(Nc2VTM|w7HBv<KA<-tdL0p@LFPR=@+yCXfu&p&p9$?V8^i)CQksx z8>Nxc=W*&MV}q^+c!J))39}yp#6ccBP@>aeL6=;0H>7$+na~zphH;i+_7_y;2xhrDZJBQ4e2E`5M0>; z1q$KUK%Evqz-k#ATzZeK^(Ri#M6|8JJ`dk(o0 zR;d5-lS=6I`<8)m3xT*|#dQ;ij|yD|XHs>>VmjgrOd1ua1He%U>GND#V_8knu-o~= z>PSSZtn6}?N`+#<_)r9i!VJN;BrsrqJ&(&~L`v$)`R3gbln0ZNJfJxqOWdT#?d9v{ z5=;8u=%k=}UG=NaRD&elX=g@n2UlUi5CLg5t$C4z1 zE1KXvN_aS{7RK97dyEI!cSjvc6_Lv_ym9VJw+QzX^6SQDi5;`5I?|E^!K(8A6HMd8 z%`nYe%U01%qir8_{?m>YJR~!0cfr?bH7M#y>+6X#9oEgUKEBMX7Zl4(EM+39eKR0J zTCX`EYeimBk*^N5n(1fc(TqJt(>~)+zI}8imOpWYz5Cd@=6CFQyt`g(&zdg?knom9 zB04N^mvbEjumM}jflB+1^+AJ0C{!7%Xwnq{YVu$S7)3h+U zN?*?t$x@Zq*wnO@v4!fH6_TejMB?-7gmP}$ivT=(P8Vol$i`c((Kj&oTuRva;W@oo zOmI(>Ql*I>#Ox10I~N#euBFTxulWghAKsXIY^YW@s(pA)Y8y z@MndjmnVlVFyeAv%0OL$LU;}4y&oqlq?I1<3U)oE>xHTx^wn

ykF&mn3on?xbporbF{I|YNq&Eq3i(IY{Q1@tdhoAWqW6IHrp`#43``E1e2Yx>_ zoTcT%JNX@)_us9Hfm`~DK>eO)Jm{l{9M5_Rn-^JfANeCyx?!j_Ggk6nb9n->A%l^< z?GwZKsD{48irAF!)|)Nn=Yi-!BcJHu;tY6&Wl>jfbA=3(=O7Nfw>8?LuY@B}y0X?} zs|Ctof*it0xC|})CZJ9H2t3FCdS$JiA1PWD1`WL{yfoLe;H!ElXK*{5z?WP)Qa*@N znO`w0n^?9w@~+Jg!R9Liuj8)IvRQd#iqcX=3@(;6U+(1k=48H6f6;f5kbo=Nbkkpn z2O?|201+l8t7iuJaPq~VzD{ieu)NtJ61^~_`tv0wMUpY()lK#=$d5xf!QkLHtYXpJ zWV{cU_)Y}7?ssIHJC)geU;;?kCVyfg!EmP-!=PIZv+h#E1>tYO@>$0?_&4tg`&3hEY$HbUB`~k>5e(4%2 z{~A>HN{c?$0^1Uu>S)&?K89i34dUvA%_TwGDBR;c?y!5f8U}pz1JZACT*EGLbtlv4 zwD-&Hen?=y(dp%b8mmNI5GwUg8oURyAZ}ICYp_Ovz~{pKTj}=YM{P|`G-(=HF(RKL zBjpvJANi!BQY7Lit}2n@4W;j;zwk{p96M$Xz$>;l$sGQX{$WNYHU>xUz8wUc>4HkJ7mSTlV1%P2+&prL_Fx#z*mgpt zgVd7W%NP8zXNp5tK5*w8^VF?mZXwBg>Ud85e){^ZSOm#I5>Yd-j=;v1n8oM#*{(wQJ#+>ywcudi3tVr}#Z10AGsgV9+X4q7 zsPkhM*=|3ksOTr!;QG5BDeXPElN8o zo9X<)G03z{u*A)UR#=*`-vryJky_#VPcpIRIZYfj&?4vjco<8AGzzKJQR@D93hlR? zna06)n|fgjo&(2|^U9Y1OQa`CQfG0Xa!_b~WTiB3xSFIgVi-jzI&^Jr@E*J}}2Jr>o#&Lvx{fqx}SP8 zb{fcBsJVQmMk@)_3cC(q&4+53D5N*@4JdYIbTTreA~WG7KvPrnfi!e2e=^J1#@*mC z$Ka0`9&Nzjj;RAdGdBax8)u`6AkYzU3hoFkriucjdA>*3Cw?kohkW_q7AhGmzDrQQ zXGdSrK#ke$Sb1{lsEh_taHD|2ZyK$+_B@>U9M8&%6+@OF^%a1PaMYg3+Imo(z@;hN*R2D8m)dI_9MpJY#=NQsjHC5dT{=B(-M1ZXe^p9ppJv ziy53e3nlnsvg0>q8$jJG1jOsnhE!y&?tY8-UxE(6w7jQ`@{7LR2nt9|WBIG}eQ*pX z_WC<*e3#}4ttLo}@@o5%I)5H?$%s$YPWKzcMMo+Ul~U|nxi;>YTM`5?V*}DB6G8@e zKhCLA%>ue;5xvS0hN>+NF^S0>!qM-{fqLe@-Qxv~za)KYg##z%0Y)Y^+U^6{6L5xw z2$!#-Ef2%k>NKgY!RZMC2Ur*3Rkig3Vl1HL7FU3N?ms`dwhOZ*dI0gj4JR$nWF4}Y z4K_oHTxB&r%@NPmu1h+#V^A#Za2m_aOwfRR&#EN2AjpfGd;aITF|c?HZs(m7auIa< zV7oAAGEG24zdv+R(seULWCukwgC-vEh*(=4lWGUlYosbvKr#c&#$}AVuOp(dh!ylf zyuTze8p^m3At=fl=mkg}+MqO}Mceoe zS@na+L_*yK^yJwyyr7buDfpETS~L%`XXOFSFdOaJn;WeOI3O9M80h8_=wVpf^2F1O zAYncF=7JTC!AsaJ2dY5*+h33liD=&Xg6IW|MJFZjaq-Y`!Aq%nKCqW7372JHk4d@~ z-C}u!;>=_Wg;mE^tchsgn(Z4=#fY;RvLw9IX{Ya>$}@WjpS-RQ>;7*h^3Ayc9>4ln z5^{^CxNn0QmpMRfezp`-jPPo}KnAN?QA1eRoGl4-7P@~r`9jaGGQ?ETsl7VRNHuoo zKREZKckeqN*hKw4ZOl{e5>Pg8`rPTXbyp!@`=NWw>X;Tbro0!3c1@M(6sT(y0IH1L zlO&m%P8y3PVcUy+rj&boesWM)kMa zFEH_j;b7ten!uZd#bwWsx{2@CxZMsdmdk@2>cs9z^N&%gF9cvx;Z;#pZsrOcwjTX0 z&#)O_fZbSKbMhS9s;$J1og{?JA{Xc>QnW8i?QS~;Ie(1t66!6G7zg>h1;8asrwMOL zd;rB7J-bHB9MqB3y`ujX;6Aykf2G8@b$G7kP_?VbYL<=i*s*j|*L42II*5hcILlX# z-x}q>w>)421Z{PSB`*~(zUM7IizRl!44>Cf_@}hW92p#B*b?N;hCamTg2NYHF)*%N zGaSgz_K=^dyQIOaZ&V$`Mk$UmtO|*x6$+GD(r=ApWi_Z7(J^)L9W0JMSB8d7oX)BC#zVt;ZCWpYLHP01gtO9v1m52r(nDKw8y&W zluNn!=L-lOksKPn`|(Bf1|!^5Q=MFQ*;n4Q50;4ev)EgS$p_T$!g5YUlv%LIqfs0j z&9)y$^eRvZ{w7zCi3)O?Z5E$a))>K(H6$p>t&Q)L!iloF!9*UEuW6GS8zJegVp+&z zF%SXB4QOJGuEF{pi&&*H$DC=Fhll?OeC$-9u5t4;I%3O~GT1fdGUUPNlp}Q5_pUma z|5;F(otck*d=Ig{=Tabg-9$UvYg;f(Q-68InzkjetySy`Gtp6C;MBgcf^3bHYXzc0 zVrm+Ax0e16x0^(Uuxbw-4%&zK0irdNqd*+zF^RP#gtskQgl=3MEr%|oz zJ^mG`Rb*jH<_e<(*HJW#>F#spbC|});mw`3T@;Pde6uhAj`3M-(K~^KVoFd zWSDdDk7tXQuc*l=EKIC!>#N3qgz~4xQ~bid$9r7WwVvk&XPrxurYfA=ky(5MB)oKo z!i6HUI z%E)03@^puSdQv3o%2!UBx}dLtbDY@o$ehS1;SUAy!}r_8FwdhzV2F^LmD{=8-Wiu= zUY{x7>ZWDmmktzI+V(SyxmQc-KX+bUZ>ak9soCiSOgjj%WlFg9RdPUmUm(bK+YlYzq_jOmK$ zOD=i+rTP@lHa4|$2Y+AHXc=@{?+D9wU<8`{65cLW<-;^J3sDD{SANkK(Vt(?CbpEY z2jY|+f&6;;zWbg@B6a+0=dUx5Bjr5gFVTJ8$7pd}M9fzr!C0#`Nl4=$yPMl}Bp5;6 zBE5^fj723&fh6U5?-9+J30iB6krX0ZOU!=15n{+EO3sXFu3V}<@m!0J<#92(EC|MG#63|8L3$(cDao3Nh#x7bC=vu19I!y&5p4bT)|CL z#N9=LIS99_BO+^#qk2M&S}7rnW}BMUnUid=x_Nh+WDOQE`KNB=@jOE)pDHJw0uJHN zLZcBWMLOSUoQR1-Os#1lby&wROW z_>+r}yV$D0#a9`o7bm@aOU;7~T~Gq7zS&*s0hvO#o3iMPQtbit0p1mKy`ZzUFnkFh zqZ(LG$b`Fw=6XN8qND}mm|ttwj}OEJE{l8CJ&I8^%xJ~!j}4Ik326}N9g#qk&W;+= zZI!!-ja&+29Q?-!1m(|J0Wvz)hVx;dw(s_rr(>H-qz|n~-Q_PAhT=*AypN3*!BDR{ zPRvMb90PR}d3b)Q`)-<1`%pkh_iZ9QLqu4qVEsw!9V_$32~~zxJBumYX0X* zm0 zXdDWQQ9Et`ei0yNEr6&45)WN{yf{SPZK*~2z#GUTx_zu~p9tR0163GGYs3|vPA6bQ z!N~pa(t5A|Y-qF;iue^b9k^kq;lMrS;|5vTU?!$ip!iTd8BfmOk-IQmXjZO+wxn)> zry!Hu>0D>q5yHULZujbW2^Eb|I`u9OPLbbkN^rM)al`aBka3{|XjB2R66IeE9axRr zjh28I+-i>K534PN<`ry1t{DokX@~zw<6p!8y58lo8>EK&`apD1sqHn?g^+>429eEt zUdQCXSmTAK-kg0?LF`GYNeEL)gA)98^*4e)gq>zYf*2-G?{P|?A)psW zF%nY!@3-((6&4CmGJNeh!^-+5)D830oq%YHgI?EVd<6X;`(%Hv6hBn&An^ZcA( z^CUDY3_a9S37qQ?nqofv37diWSLphwZNx7XfUOF9*wvtR zMV#yt=3$wa^2oy`;XPZl&Di&sB88fiy*IZN<~mpnqfceBD~%kCCg(a`T|KR=-){3L zy-rh_xP~@~(83M6B&V#V%dY&91H>$i^qQWkG7>TVkiP4=G{&Q$dL8T-r&?c(N-zj7 zt0Pj5fG0?Rg1zCZUY(u4`NIW!35xhOIs8`!_dqL$eCz6C@Hds(!D3Tw>81bRz+e|= zC6JyvP*viW9XA5a6(AqAwE|^4NM-ca;^z`5j2xLH&gkqGrKW*l_aGOC|{>Geggl z0yu;%w6MeL@DC?E24US}20nz+pd%b{UzXUU`nKEA2@)pZHgZzvWA=*y8tPzjP>CkAAs}UP+&cD zKBwHn0dLV3D$E1qHhXbgjRp!4&uR$Kkc+{e%96KX#oP@G0vDd)tp0vu0^ z16uZD>AYalybjZYAb~*tfPER>fa~4t%IR#2m`7Hi|E!%?2ZCrjUt-!+i^`$m{t2uO z3*{}D7>-%xc*2!-83>g3W-Cfe+Yv>oHc%&cLTS#;VZj4pHA)WYPYXnjy3Qb$Bz|h_ z!G~F}{#jg6VRckkFe48MC6LBEjrg0;M~gbsvV5sp_hUE!xdy0#Zv?mp=PMm6qt4Ks7V5Y=B0=4O154Y+9+=KM8)NIL-e zCT=Ko=IeFtXb-37u1Eb4F3Ly#s-G0sD=x^Hi zB;A0IVYp;phBakl{Lr1P6b}t~ZXZ)Ee1L6}MdsP!8l1(u)!D)xpb0~!zl5>=_b6w% zi-^u*qH8PYCO6{r_XFnGT&A)Pux;sDe-+YI#P}EkoSg4|E$OmDAbUzy zavrm+54L0!>y`MnuZ@RWx3LRkd7a6qQ6aT&a}|H~7t|wum-z)!?kJCr6B4g61Nw`X z#wnz_cjGfJbRqM=r8S_ym&RI8bkC&x*9GB^SjQ4P$b&8`ogBVQ3sh zg|b%~|9IN8`~eEG8ro1CzFTT#Bn0Qi#;^!%@>5zPRxQkfnzlTnajw}K12@>z`qeQxF+XFvN50>=&1%1R#`s5~_ zOpu$C+iGg6>uO!O_7bt|`c8A0=bI^dBf0@fNrq^>WU{6&S$W{j(~*r>REdZ(qcTSX zqsQ;5Y0Gn$GTZ;`X?7>!)<_vU12t(>+gHi6h&zmHr!Rt9VD}wLD~j&wdXZ3rgTl-o z;`!X)AanpfK)}B}O;H^gXEaq%{du{78lqE5U$B%-X}yAp;88f_x@<+4N?qxp(@5cakbEQ_@gg#oOWOLs8AUaJmuJv^AqNji>6s%(z7VT<$#$pNTS08+GV z^?JYr_D$^VahAn~b4mf{0@#3=1eVL;h~N!q5SG@=lXsGLN)fCV*p;QxaH$Ko34n*_ zyIF=cI#a))^|LzN3I|;qzJ5Ue-n5lSh1nd4j?xU) zG4`h2mxJ}c^!TV7H;LD|!&2%++i#|OBBjo86g`7Bhl*I7td-_4bM$i^3)lHPf@dCG z13J@0Dd|oKiQ;2mD-N+x9R# zdcjSzypaD@c_ivFfKE?&t;*+3%IRx%1uBE*CKeffuOXijKo`iZGzpnm?LW|=$*T`w zSS}y724>~t*&Qg)bL_-j=oL>9!zcSup6J;WrLIwCDw)uH%0%GLVvk1ppFIzSeV=6J z<)l&7&~AMG)&vKJ4p^jUJ6Dp!nT^VcEOU|3EWQ2Im?PGiU0rN#d-8slJu8SLQ^VC2 zOY2+}_DuI@^P1X6sGE`CM9z;qxO!(e_Wcyxb#&gmLgBCi8$RgQy{qHlKE$<1+T|og zMS4qBLE(uMh{XKOnuYCyfxqs?n@-sMomXJ$9ND6xWnpZM9&RYFdC^nVNfGL=z%oqscdYdat z1M2knPGA(#XK^Gm=~MlYpb)gUYhcB=#mYkPa0{7C(3YaMjKYJ`%)Fx*hinUxqPD%~ z&+QD}=z7fYH}I(}(k5+36$8n#$7?;#z+d07+VY3Zh8x zHFwx}tDUpHW47hQP1qk4ZQ$njl;y=PYdEI^+e)S`zeNLte18V$N8au)A0Dw2_^9WLy`M4_} z4SfKN*Y0VMB?4frkMkw5iaVKN;E_zF`MJ0~Tri?lXAdfyIAHf3sf?;@1)pQhA7Jct zjs=U?c*X65Xp@ z`u*hdC0XfJF%xN#3ZN`CbiEpaYP%9g&PGH=QU>TIsp*zZ)4{VLQuEy$fNi}jTiG~z zNvM`K5y-!9K*Y4T|-ZY3_>y z*6+eWqWMIv2o{&YQtZ`wf@DT0MjTpI;%ErUM1fgNBR9DXP5o4u2;fDFZ}@5xQ5TQn zuXukhm;-UFA=LJU&O;U9$O|Vtwm2MVh>OTICul{y>SH_OCK4VSIVF>PezW2v7Aga6 zLW%QpUxp4G$zewM{ANvEv0G*b-nK8jHvy}lu~>A@x}^ouD?@>P>E;uYo&p<$?1J~s%`+E_vJOGrdsV$*fkFAKmHu0xA1-7! zVP)I!`(UUd$lvx%=fqqdtq3vep#6MeV+i=0K4FlO;s^1ESvmGRNlMk3F7?SYFw(BURwlNa~rZ1$WW2YpBJ1M(^xT znwAo6QUlqR$^c{nfy+HVIUnT`z8O{z01obDju{Ab5zT=U;L@xgK)g8fvrjM@cN{@< z&${oK|8qk?>6v}o6&|^RPt1#%{d5@@IF z#$IMQjjTcB1O!IYJRN;?O`VYM6HYvqr#6zxk~6>9;V@m=iIai=8#FqEKxbb9-k&)% zZ-5afElciAyat6-iK=fhzUx}u)vT5XQAD|Y9~f0n;pB{y+G-({vz(Ie{{U$;sR%^J z#!729JZXFZM=aN43{=&;kJAn|%!Je6$D)XVw^$7&>pkV%N~&Jsrb%5h!?Uaw#rKyd zXz`Y|cSqgCl|2&U)~i}J^s>7SdcgDpc5@BBT_yL8ROGh=shlHn!E$Str0G*Bbo^Qk zedzzyHO*jzlrKE+Fb68y1Wr}2@(?vkYEm;d@GykL$P1v_dt;tC81PzPKL+3lFX{|} zt02-?I4JnhZd8&fBwKIylz)xwdj*n&6RHACR!%sCq@}iA49OFCoig6d_>!H(z7UG*kXasp>#+`*9UX(^DP@s za3oS@Ioh&SML_NRK+|h1+N?l>ALHp;wCp4``J*p{5limcJW<{TQd0^(X%S0RBw>&M5YBf7y5r$P}=@J zmD$`g&W;Wj|5>Gg0LBW&)C&wo+X8DH{Of5X;Yw!*w>nISq)BDvbfp?uC}iwG48MmL zP__D}xS?HjW2x$kc}|yf9w8v5L3a2y9ucdZp}V73<_D}(x4Bwmw%t@tjaZrH*O-6T z&`tdTo}=9JI^0@D!DvgZTYsB8>La2L{8Nsv0RT$64Bj;Vi}_dnp+-(aZRq3 zvFek;4|HtP6XK<^QD16QaxF;$3a(0F%0s@P&ebEw0lU*`$W|@Wz<-?L)3UZe1{HE@ zcovLrQKN4ckAH<~WN>=u4%pB(;x-MO|Jt)vLK7iD2<&d5jx!IkE+#|e| zrn+uKtlv=v&KP<2gw`rgnZhSHM2rTV=b#UejyQ5j5E{mT5Q)vVaXWT_lkSxJfdru* z=ZEtx69Q_^?_Af{%Ply7^OcW{y}8t5K2W^?2}cGo5cO;ED1#c-$vRiA2wYNUBw?-b z4(ey~;tcMZe+fJV$z+ZF-!=)k?Fe_B@raPzJfq;Pz}~<1JVBm04vI^{{Op^=#JeQHe2ck6JC`d1GhZ ztYN`h%TYD5$vkp%npOGs(VuwC?{(u??MU0`M^We6+HI1=(}_i&G?JU_Z9f>N}=#=;Ss@=fjso zBU)90rUgMe3YdIaSL=;K&@ISg{2-LV2DdZT(&=PD*R*!p9tnYlxuhMuEIB zIdfK>vdU$xHT#&VJAPMktGL+Tv&%jkQ|TlTs>xIEv888a00KJ7%8*YnIQe>;oh*RH z1funZuA}L$JTm|`Gu#nq2s$LU<`B!1kl(P5_7Bn9u543Ix)8J&{^jtg-&*&>56nOa z(tWBrqQLrR{k`-!0)NKSO1wDU$7)WgDwhWE{%%T~kvm|k`!#)%i8Rby7vWB5&xUL~ zss^n0bnt7MPrR{>vLP;ncIyY)^cR%xGUx5;2^~AkBseDmV!zi_vN(kMZDNroceqXdf{b?+qUWnS`3RhTgoE9|iZ0bz`cp*0)nV zQ?ni|pFLxP=Lyv6;Q8IQoi{(gszMgvO0`tTszH;-y#-&5eWH~!lHK5pP$i=*f^7#) zt#Et$6W_MC=Tv;d=ic+NARA?dk$qtZ-l!tBHObq;fLL~&M`k|l$e z-?Mf+I#B=Hh!^7w{IbU`wAG@U&{8(7v_h8+p5SLeE;G~Rz0`u2G}&JPMVqv!Vcx0< z5CTv+7en79xzP4O`;Mz(->BqwtUUj(3H!Mnd&4YIdP%2b@adV3LVN!q;UD2~Sb3Dd zD^Kf_dVg?GRhyjaNPDJaW^7cc|tHbH%m_ zRWg;LnC35&b8_Vq^$1pgKqC4h|5WElAgB_bw|RO|3o%euAE{;)s-g#}6!_`t2Cw5S zP-X7CH+o6f;<9ppo*!eKK>kD_2acRRZ~ujN-yG33jOY37%UXBemsoGxuN{*m@s6X3 z@r(54Iu+4ymka9Q|LH@fscSk1%XjtHZRCwmMkGIu1xE3l_(1=b8)p6u1^EqB#}Q1r z5FuEsLB3i-BK3Sga4J?8Twu39-I1;RIzs5=LO06{KTE&U4Do8pExn^4MYz*IRk%)q zWYJ*DE`xhfpdiYbtga1x$KWpGb$V!{si*P17jG`T{WTuVB6pW*gb{`9(p`a3nm2v| zd3#^eI=}o7t6Y3fGrsg~9L!?145viR{-=Y3@T_M>-;Pw%3jCzsh=*A$=%B zYPG!KXaI$+S{kQ+Uq2WK!lP{~iw=@Prsumk(pN z;kbPTr#CAF0EOQM^fg0{1pftqtpGorp#Knc#yKmjJc(vfqZ@QIGSpK|B=U$ghM;;8 znVN=V`PA$Z5RQmp`#?fcy1XW%tLOyANnXF{jt;6*_83h}&|1VBh2_QsWcxlO8F~ni zy{@IG0W`Nb4#~&-8Q|njG5YO9%rt}2vuUTLdapOmaf_LtT)FIXA7cUq>u70{Q#4QN=?@tT8mBA8JkV16_j2Or^&tp3|0*wifiN*;Zv%?Ogakb@b+5#}Wk(e0c;{+e_3*{`zherB zqVY3BYx7mB4zB_}=Vi#8;Cj+nx>pc~avMOc)9aK4#ghd4mIGa|2?^PZd|kox4P64` z52`*J!QkyE>uML|Ecn(gZ9a`EnAl6@)@}n4Hyvyhx^dScdIWFR%K?sh5>zUBG1h}} zf1hc+Y?M*)(Mgs+QwBcWX`ccDR}$U`Gm6ErC6}nginq%f@=U*tfXFo$KNe zZiNk9JniGqC@NBGa2{~VgW2v~QY?d+LxBjWO|bG z4b!(V>$wBJCv}rM03W^9nP7!PsE1MG1t_vT$NB%#mC5)Z*yo%BneWCG8aRr}WIjB^ zsfjY`3Vzg|LXv#le36nOqfzgMhH~1A{Xsd<6OJ7XRfP@#1Hu;`!-fgV?&wHG4)s0a+ zBIr$(lc&r9e3Z*X-kC(s-AzkXr7KB|OFGtz&<~!73L$C$l#A>4F@&1=vUwKOFRNyx zdCYwbc+G?TP_PuRRBcoe`l+i}S3e#GhCJo|ZdJzCG52w-v)@uIs%OqWkcQ4|k2_Fo z+BpAaX}~Waj@Sc*O#;5^_0D<$RMS;B@{te>kHYZ-fz-THY$Sl?G~CoDC|;Z&g1D5u zqi?L*>E3)~Bnq5IlF6La7y!}HvVH<#+j2cJ{fy1k_vo{;fe{YBM}F?4-5>EhXwjskFY1kO5}P$ofrs<3N)8X?VCBW)zz}3r3xpRhj7ikCYXH)^ z*}@4Pm8#UcVb0fqAS3_d5~u>pT{7mHNd!moO6gu6sIJSyBGTAqj7$sJ?(3&}B}htA zl;GeVi!?7^gPy|nNMW89Cz5tqCF5m@8x%fiD5*W0=fG=GcPcAUQ&q%^&_o{+SXC_F<2ok0VV+|fpQVlPY-p#p*;X(6@Ils z)=1NbU* zMvf!t9f*(J5?zESn{N7K@?lq(ey@Vxn+Naw9`8l;2UZoFO$Wm8QBC2eVO;;h=-#dI zZf;ZbKb95)2qg`ewgHCncnuF9nULL>%F-}ih9^jRMZr*j|I6zyXm48*?FzX4bf;G1 z@u&^;v<974*HUDcsA-8kD3Ba;t7SdY=zkf$4bR+$K;52V z{l*@jU4ANu^w05Zsv@wK53?ZX=rwe|`hI4``v0$7KfPup>Wi=F&&n)lLy;5?WjnWnHJgS{FNZ@O+na9 zNv*VS88m0WQfHQeje4?=zfuyl!cCaa1*U1clYFFvw1R=;lZ+CU((cA``0Vs#Z*bJ) z=BYfOu>EN8!j306UC!5CVxk18S@G>hBRLjJ&pOA=VOksLjN|L}wtYI>$eHqJ1$o{I zd8CHY{X5(du?*!Y?5Sw?n9X#8+PPR^h6g7mQ5D1#S&wDFvYXm)>1~}2?y$$!(f$E0 z07-I^Y*~Ml*vTVq;9cO2FSb3Q0xMtnVD!qtF>*k#oiDRn6XLvDq&6#6FVt67+zzP~ z0_p*Qj`aS;CL=LP5P)vJYOdNn(#wkjtt`LQi8c?pd;LG)tWe-RxLzJ>X?kg!T(_LP zU9SMmOy}DlF26f%6*23HLb;$=gDX5cJ6%_a zT^l=ufb3eKPSppXYL~@BH4kr!F9ZYMT}9CfrQtp{6orz{WX3f)jSos5LT14^#WDK!BL(tJCXB5;ViIXS7Mj_4#)-q>Qs2o^#%BAfV^?< zY%?syv3+~wz~5iq8!_$u+-XqbQiB8@yZGeI;s~U$_yUV*GC*~uW$IZ!?1yOaVoX7& zT@W$PUAM~-m%)p5Qeihm(o8d<5b4*EB?{u*uETs3&bE=AIpj%=VVn*zV;=B3m&(xF z;fzsc!Nvd@Zaw0SEV7<^-=RYV5Hug zD`hi}Go^&E3k)TMQ0FvZos|yCnKshzF&eD9imgAD;Mwp6pVIw8PJn9cH^Ey_Nk-5{tFz)|wN!D}XPpH5X6DsGr{(F$t5VX;O1<^)P zKeN9iHrrA{nI37osT)%YY{D_CbV8bu*}{0E{BudGkGrH?9$YElgDB#zIUO%?l?9)< ze?8ksrX9Cs*1EZXYi;`=_5CX-u=0?b0I-mK zBE7i6t&emzZ>YzTPz-Y@W}uDq;GrhRwFxvkld-qBK@{JjLHhXH94`NWJZbXMnz?dqg;hP51D%c1XiGNwDAu!-g z?`XP~rs6NOYktNxSRWP}>jeQlPn|gM7-wq@2qe)3U)*ou(YZC;s!YW>^tlE2Jj~X3 z_KkzcAH*Hvo`pWaiz!NhxsdX9jqRlwdRNyf;8erDaXXgK_#4HOY7tS`@~gggU*4O= zRs6hOjHpvYlLo0tweSnNF#DjPb%q4B*BU||iIEVzvu>!Zqrq`w8U1xW0oU5|NlD+h zlkhFXtKE!(Xs2cNTWV3bMV=plX*K)vqaB&P7k6mRN@eC&AzehpMy{#>WyM}Wj4|2! zV?O1jWh$x0MA47RA0C&qrzjJwjWA@7lh%ue;knn7D{M_dw~E^_oWb3aZ@h431YO2l zftRAKL<9G?nE}wJF3xDS0>Q|uL^F8U+M-L$xn>c$?figv{JGT1aR~u6c*+jxG#3%r zJ~-6?P)wRUU$VhxhF*6$*Tm6V&95sILtHqT!s@GAoGzV{gUt9y1RsEQi(u^sf1?Bj zUb#StB`)wmFkM`pm~x3F>8$Gz>BC~oB+xAc3jv=@(+3DI)p`}; zv(=vqY9;pA;mIsZfjP2WFXzKs`6TCNLJnTUVqlvqnU-`}_eR^1w6#-UF96gG6ST*4 za#$h#3<;V_w_D{|c8rssgs>rO`fZ=^#>mG0S#~j$QAkG^l#oR_jJknDlyPk**i7XB zlTHTQ*b^2Z@wQiuQ64XoXyQzT%pnzONwSpHZsU`$6iLmMADItXQx`WX2g-S;40 zu|+-68Yp}%+ChflG!cNsn+Y-2!zID<*7I{32YopKxzaf*x+k;noGw6F0n8K)GRRAP z*Q!)f_>;!xr&i;>MX?x_=&}p`AA)gtzgX}ti?$<(+ih9*a%;pOD1ZXRV(4^9&?m4i zW*dJcTh8l8y-(zX(fkK_z}3y<5S>fKe!u|k-*KZ=!nR38(nqvU!7yJ;7jSv)HvrXI z9s^}eU6Ft|xi3~!eHDw-A&Hd68A()iyXFtV>?|)6_h@zMCSEF&@saq!No&qx zR%J_9YN%{1f&3V2B+X| z0VEKcP0tvPQCAzA<-a)b8TAwZQrGuA;2~3yOf5h^xg3SQX~#HcM6$xgP7Y5x^SJXs zG24d|+V*i&5VTpT|A*=Or)rlg1je97u1adgsIo8E!zA}kD2vUhJUUB$mro+B+Fc}R z{nLH2EIAUBz z*j4wEras(~=sNDyOxk%$)i)qQN^TS5{Wf>cd$iX3APZlEc27%+eOzHhYR`9^1lPK8 z;FEBY5aIRR_0pB*gUg!BP?}^=!d=cM!b5J?-&fF!=?omjbQBVHI{;QLQ22o(ArqF$ zP7M28Fu)Hj`|_5Z6AF)L_6Gxbfk4B^tnQhMJj7p8e3109NMbl|)w(jo7jbRFjPJ#|at>iqDg zymhe1n-M*}Mo)DJN`el-?KWj9DpLKYYle#*xIzpHHAAoY^UUv^7)wYSH`);qbj7ihWd}{ojgp(B-==TLNS=^^ z*~qKOfMH5iVv=KA42a3&y|!3F2KNl3J^l-3?&VY<5Z_`Zz8(MX=~goTSfKuwZ|{mB z96$~?tMA1Qwrsa1SyhnAnTY*9z~`F_@3cN4SzG;~?W`iF0KZ@y<42mEx62NGB-6Z?x0x`j=zBPv;raT+H}15pYTA;RiUEb@X+QKB3s$@q zW=IX-rBv&2{basvYjYgE0Mc9qJkV+F<1uT>EL_AJ2^_TNr!MRAVP^TzklowVpak_R z{|t?Acg~t@o-I$#w-PmUlSRABVn(I;MQkXw7O)C^bmCccj*LK!lstm2Aqg#Quz6qB zg+DMCftk_TC)qzT85Ml1QxJqEqbrs*D5hwJ#VQ#1XU;cVkDOt}rES_9mdf_Rg{a7| zy)~xEc`;3rhai7YR!w-ZUwhRYvmjGi@kK%c@m#p9!BAUAyt~!kf^;Y&N8Hz$UFk6h zBmHRdRSZK-Sx5MZM51l|e}Ej(pF+TE8(psH=sRr)L47#)l;GdlZqmT5E3G5%&0Tge z8T3|G;0eFa@%y{-RpF*v9)jrVQ}=;75dgfMo_*QXn40#p14N;Cd|WIodn&$(ntt*F z<8RJUQnL!(t*#zOGutg6$MPC(mB$g7Sj2nALz)DR(K#9yNqJn0EdMI;s9VAl?H%uDl8? z30RJ}*+>-s+z#iPpiCfVG#gNk-uyIw8$4r7jAb!&cBlXAwf&w#a?WZ0e6{BV(JJQF zl8H+Dn_mr}e_8bSp0tCtXkEWHi73qmQg@yp!V4cpQ?Ovq7adT53t$K9W~^(XGVHki zGf6ENKBPCx+TNGrFr8B+x87Q~@nG<6Hx1esPOJeOD9p*J$_~JFATSyLwp_)A1PI7Q zV0T~vBzoiicrvELO&}6B9W3EDh0a?jdka8IJF>y#;w~*Se1GLCXqI*%kod#QOrcCj z$IcXKxU)GJ!+q)?+7y|LlK83@Ae9d~yj5jesECjY^IAD_>N<2ixE%G`=le!mwJl%cy_syCbSg#698W&d@UMlUd~Kpp0%!+8q!? zOk6llRPoR&K0^&H>`=sj0dwd7#Jsh_K4G6EqA>}x`kIfxDYowSwral3^UE3{qi9Nroco#=QI5v z(7r&rQX3UzCtreZyPF{pHT|*Fk3hL{Z=;VC0kQ=pIDZumtRe|C=B#esj^Cr#LMxR7tV54 zQ_jO2&}6$35g-KRt1^N_W1T8&<2M*3L)9m@v8JfjDt4qiJhr7pe7VGJP(C6*wn zZOG$XYT!frfTdXkdi`X>lczHar)!0(+NHn_Veg`@HFL}p8C>*>I29&Cl@ad?Y2%+r zp83OwXhX9XWX{UM6kV>V$pM|&X8fkK_J);N>jA%4 z(9(3V_xAh9E9`X;hlN9aFd9+W965|(%|`~hQQM6|kCs`0bftQ5NuWs|w^Q6T1Y@JV znd)0NrEM{7!vt-E6Vi4T!T*<=x$MURo_a!AOoYKsGCKzit*vVjw`sNb3Poa&BBjR$ z?_e1v7(0#L`Wtjrl$8jJNR}VAVUR)?M%Gq}?-mv~b3(=g++|a?!P%u; z_?IRKUyBO!|3dNbCj5OygB;4)>QHE;&aK-1tLyv~THC^>LgkDf_)l==@FNyGov!%g~=NBr!Z*d1Y9OOcF218q%LCL;ErD9D9d7_;bIoq6S?7XR7Y%|V?6LfonEn8b?ajx>++olbr$g6 zZp_;9q1ADGgTExPo%f-9+yViq*o$_>xEy^14!!i8kwaGGnX?{faO|)E{f#$@Vtp#Musp>c8U40v*q0SOeI_!;>F?=a}%)^nYHqO z+s{rXquax8H{Jokm=-cWO?|Tj`T$>5eeaj+Ys=SdntZKgu7Oc6+`OulT`qwsN4&v* zJqK1zi3i&d$DMat0Op7M>#g4W99LkOq zwR`m|qB+5Wy|v^YH$w|iQ2~PS6H)QI?HN(zW!7qq8OLVrV~gzg`)9c_xvlO>dg`Lb z{U$_A*KI?=ehG&fmMfCp_0{p_w#Uud<5b4YPte#S-I$xz4g#Q5Bm$3PY~0bhL#N~v z^E!wWd0_M&Gfc4eoq}GU<+Bj0)~uqdl};9W{UKjA?tPM4`UlwP+$ZEte<%Za)$N?3 zjsPRFxl3y0jL~0MAKL)}g`!$+V0z&%u!fhmKT!PH!5Gfl-%6swLsd}F;Jk~|FMJ*X z!DyP};Go`fjN-E_)Ke_Yowr|dTJ1tLpZA&aFuZ-voFWk5-8kK36&5;9~ z>)}EymR|*p(oH3fJ8>G6QY_n(k>a5+3+ER=VZs)ujpKlm81H8Pj!` zQJm4NQ+I>H+Km2Lsf34Ke^QlX&`84;^5#`MOmK(L>l3Y*Why#9)(E;07FY4E*zFoF zeRNlM*19YMK?oUrc@*I>5dcaE1<&Ae-|4R4ZEi`L@puhxx{}Y1_;J{jZeP+|Z%qB# z-Zw#R2@(}KA&yTBb1Sl;6cqpRLzT-e7nU;ex)m>z0ZF0?{NXrq4DgYA2pWbgGrxd( ze@TY!#{Ub?rG>z=2bf;VV&6U>r1OmL;lh^3C0uTs76!$jPqrgiZ6LZqPS*zykuS#@ zJgs)J6boVDTpCSnls9t6-9Oyyn(^dkW*;8+WlIMdX@XIaz;Q-`bYSy=*9q`O00BJR z_zy1x79(W99m+Gzw=!x7GhAuus)HhD#pR?<>&zLZKFyGz0a;oVUy-q;@@!P& zE*vPyAB4S%cJz%|E?cYqy7reo#eQ%phIfO0pJ?g8SVWyUAB;CtkJbnJj=$gArdw(m z&f4T?DXAP#fJglXrp_toCAuuP!f-nJs#AJtM1yX@plD$dPj9Z2?$U_MwITxm6ukMG z&NoX&0w|7CZ6yl(F0E@7R)H_UH}cGQ^D7D-rE+Laucat0dBJ3C7tBJw{9DbkbXJtBdR z2@Q$5+PjQL5ue3nRR?AW;c8t0(<+PUy&7sTg6BoCy0YslP3H?o;biqU9egv${BM8ryxb{@l2uOTsWzJC;Hs#Jf z%5D@MsuGm&Ve?AgJiJNl7U@ex{BN9aD>gnZ2BM z(CsGDv+!dn4F<&KMl=A~q<53<12}h;e<UU2Z`8ySL=?fW2GI`PzVB;wYb}HC$zX!3UJDOe;&< zUn3j!?{+V%i-a89N&^5aw3{bW0EN9i-(+bdHV~h%IcJDe)v)DE1OEJ5U)z)F`GKap zX1mv%o+0APB|(H2t2hxJ$bVK@NQwSUw_iTP*Ou<@g?t)y1viNUX-rqG;HKV1;Dy-6 z_15#ZiaQFjMSRgrd5fDH*$mngr7a-$Bnd8(W2&!W>R7Fgk{N)cO&s&DsSojY8}MMV zI3|FYoO42x^>t%YgEz_v`%GePhg6>4e^-}r?Vo=GaJmmy^N2sxBJBcdA`O6Pc63}9 zqUVd9zW=>T)MeU+O;j z`jz2vPR4^3t7pj>@kC&ih#<^i1EFI9@dM~mJo9ZmIpieYB(NGM9h7NW8XV&ESpe_6 z$2n;aB_NI@KI34U0V9a;tBOSnSKi8BV%!GO1kEb*2O=!n6iPPZR!BQxy&&H&Qa?0Si`vUz5+SB}?a6M6iK$MX6IsxIlS>2%WU0ca z<{IX^9Okk!pP0UAGB+NcVcq}$LXi5}4TerZA|Bl@Ui!~o26OY3{X$DqMDK=zRn1KB z_17_b%S%kQFksPo+n@&RVP?#4%!??>V5NBx3lhPV+#|Imege%tYh zBdz5lvCSR@9!IU3Jl(j$yfVlv3kk7TFR!#{hik5sNO(vhiD-UD zYD-K-;SWBMbL=0m6IgN~Wa6#k@kg@Izgv&2yTyzFpSz56Ze&7n;A;)|a=k2p!CVrw zIYY>>8!6V@>Q^Yf^K`pMHc1)RYjjpmub{lfUgM|;b4>1=MI#16GB1|pf$5Bwcd_eXsmng|#& zs)Wfiog3{ySRCamuA}p`ZhzxoK)2un1N0A&G4E*K&2wny12{}wA8rFoJvOquQAv&EP#^}+Ktx%mltPOJ;pZxz@8IW@YWGG+FQ`Al z6j@(!i^HWgA6Wa@;UDt1mQlU%`{eq3mQfm5{Pm3VY60nZQrY=xuibLrWbGi>NXZ)wn6^Jz-l<^J02^V2m2?FLI?^m1cv814PojOW%ep}QmO z-~(x*D|VQMb)F?E_wzNL+2$hG!MbklzB>SF##+8&T+BW#$M6b80y@NY7LBRV`Hcw% z8vD4B94oF`2f$+w?zu0c>M}^oE?1Vn(AXt>i;X*AOUuunV`&8Tt{|8}wW(^M4;!OYw`=kfC2}xQxdUiv4 zkLWf&+{urxR4ffdC_|DGV+J9PZH8mbBS{RKT9XBnE;sWLurbXq^kXt*T)@3_QOQgB zYy2_OS#dgfPDAQaUEnvMTgIm+Fwyqp3-8qZmbZhr8=KS7TdcM~jFRW`{J{}f7*Es#u5z{;+ zWPuuV`PfCZ#C2=YI}n{@a9|Ij-a)-2*_4CK4!LrjN`GrSdkwJ=N5DicKB@HTe_cW8 zsk0@BxzjA~kT^u;6OE7Nz$DnW;C6wb#WmnTFXEe{T$ykY-^UW zLh4rqEugr<^bh0lX{;pm3Jm(SM?O8i(!LL zOcfA1BVmmwyCHCPT_QO0%OQ|D}RGTTCzwrJ?5v2TmhzY;N^ z$sA8HkJoy7)QhaxOGLN6W#v(8V;B&tL!C^daG}X59;CrZZ_QHVBYe0AsSoU2&6Pes z++O)t0kUK>0QNCRS>`D8fu}jsv90N=p z2+@+5cXtM<)a)t4ghS0l815QU*jrUlP_Jks)0n(33KlH82)DvEXE}KIJ}8#rpA4%q zw^Yso3?0K!Lup?z)nkX=9ivOe-@ zYDUXHLNF`e=#<;9r2WGrr8l5&Fh9`@)aYZr#1{WFV7mbVbCFrTy!A_7XUF4;N5|Qz z28E!@(B_h|AH=UQudEZC)-wf&i673iyE?4$(@7fo{EjrkD$z%b?|_710HA7@^Xe^KP#Ob#J0ObWj{PW~0b*JIPNh{Ox$ej7|o$2x2=E;*8nifK_i z$Xn+4$Toj7KMKB&qUUTlr~52F!uW>=*`YA(c5L9~rEHaN>B-;@-fo{>uB?JWBj7-x z(U4HF)E2Lj1DovcD2LGwZ_Ii%~^mf=+Y5 zrMMPigItE2(x52=x)boYs=BH|g&R?^t!9)a3wX7_00L7dfLs7uM=;RPtG8tr0E$~% z$lguNlgbnHwIA<+`TV=mcib#f!ht>vYbiaLs?{j$kpit_-RS}FXH^>qr-kWJyhCGZET zDne?f{&M__9&NQCV2w$ON(Jhn{!Sc8sM*c5#AwWv@W> zZ-1s+9YCLM;nxn172!`OV$d`nObdaI2}}g^&4Yf>q`uA*y4#rd`t1zU=d(Afk=zIkh68?@5=ACVeq4)9J{o7M9FH?&-(F=AAxYwABCNOO#2w@2au9_B?!yBnk?u ztV}2mmk~3!NCSf&YbGv*pXKKcKm3d1r$D=45V;qUvJ|Ay2y69vw*NH*n=bOxmid3& zn2m#=nuPiAOZ&5BLJUylKckO9)a%;rofpkZ%_wmRi8;sOVqD#w;{OZ?y@Q(cD`$K{c}C*(EZAZUW2wwk z-O<>C8k6{MS^@-^d|2jSsjk#EfzMgv_h` zN(zqoQtmvW8ZgGaLq9o0IX?nKyCIL1QE(;?h%0-BMtPoy71yFj3>Jht*wKI{ z&3IOKKE?MyTuh)VA~IV*XB|I9M`|qAaZA-BVu`+wbjUxbaQTDr#gWFNbOJpu-xz}3 z*Z{1NNWe&RxpSbq7ukI@8s9YVuurwu&LD%`nb5eLyxT~G&&|H!qU5Vz|@ z@W5va!I~_j4MXawwuv6L>|sFw00VP{fN+h~dPlw4qwuSbVH!`;H~#EdG5qXKaCD73 zZ#2W7kK0h`C^8RH+J6*}YvGIin=40-epYk-*C>P4NGWYp{WfH(JmXhSKN~2?p40?W zfzj{VdY@Q&YasV$oHcZY?cTEaOKcf$fQ&ME)}7;6G->CpxNEBjJ(WF>%Os65GBNxy>rjK810n{TM3j5ruFkV*a8_!DHA^|zB?0%HrI$~A z3@sa{4NEneNd^>=s`;IoUk$6KiQ#bcxn;Hv`(-a(~AD9uHePBGLZJSo`!HE%>+OXbFAqAl7S~pnEc)&6KYh-hH zA62!UbGr%WZ({^S{i+bY#E}snPj9i2(%BF`HENbR>z3R<8F;L`w!Kk@vKtH?4Ba^%s zavTwz^b1j7!MN~fC1t1yTT+3goNB1H?E}tAlZeJ7ud4{Ov@X~qaz|&QkQ6+`p#5-w zl(HFkHh)nMXVWx&1POHdv<~D{BOX2U;a_AUM`*7?k`1DGv*CcWgjk(WcB29)%8Ci0 zGCF~rIW+U>=n<$-ctNTE5~A$r>+)p*p3)%!@CIU6cf9EU!|q!FICRU0gSsE39K#PH z88@PU&{1X5+fx+4%sSN9Ul7?(Y6j^pkj6w$-_JkE{VlQDq1ezX(4jLSs5R!%`>+A6 z05jXOoK+#o2zVx5X?!EC)#&(sTt>`D>s3auZgWklo7|HLWfM|be1b-!%4M0PXj;R6r; zrJ)Z*ILF-If#x^h6dlqy&AX&KX@4UTNN_v*$~-c8{eTjTv~@>#f?(k{Lw_aU@gIW6 z*@ms7Afrto1wh2l16z8z8qtqR&Oj$9aR+rh#jXnf4iJ4Ol@6VcNFU)qEICGK_@^v! zce{n>{E0Wzdp*bGC}`*fcD9qTUS#UMoeL zU~3WM`=yCd0Z(oJh@wTHmTIs7Ej89d`-RWazw1lrQ>n6d#HrFwmTE`^2h%d;Q|H(@ z7dF;-!f~C3N-N0~ox>yF7l61bKe{Mw=-LVdw>XD#W7P&D*d?4LwYK-zxy75?>Cy68 zcRQ5WM(Lk4Lr4#V@cvZ4sH}Fj98uNybyKx*!w4-p!b>(PUqz!!c0PdiL@KFh9~?OX zLl=3q;|RIXaONQ3^$r|;UZ&0dR#v07#lSPgWBQ?8_d7M&3aJ;?=otY;?ag7clEfv6 z>VEF^j~%(qB?fnX8Z$%jy2}OlGUTO%{@}IFQB6m9qlKsxf6zo0G}odrB2k$BS-p`3 z_BdTAhELmYXRkA@(7*{7bOyyi4%t;uQ-Idz^&{9;?UY`b*<+rjWjLa-%346?OtBs` zGaxqhc*jMzbjqh4vc#DDFChmwW^r|Y{n_b^U?(=~d-n;PpGuBho{WV)zR!E#u*$gn zcg<^5YM6RP#x02g`Ygc)uJVJkavaAe7aU^eBfcL8AUi5a4ya@WU6B$w|Ew)TQWblp zc!k+qVn@W^+KN!3-)KQ$1SBa~y`w}KWvu=zxj0tu%aU8hLyC||T?_CIANe(Fj~z!bXC2(y z^0z#NC@CIzXW{OL7C>`xqR>jNprY>pIW8wH)9@7857|37; zO|s)zS;26#(EWs*1kfXzp5D zq$Pj@Z!(F&-Bt5RDww+p(p;XMA8Owt!Idtl!Qtz#cblq1wK++7nf^lO4$y#15?X0G zFy|UOr(W`3cyQKO6DY7V(ig(AESSg3#O;rPD1EBEg!6y(WYV2bY66}~rUKJX&IbpDXh*_VZ$%K6g8^uzVA*k3#4DNyay@3(1bvFbpGS@E)u&WO&>N@M zb}9H?ESgLwgWI7>!|5!(SMrvt#cgyVJwStb!m1Fx1~9fyk?0FO0RKcSKi}H^3&P5f zqjU!`z+$E|p^n_bi>IQ&BEic-TyTQl_XRx1Y`CphDl#I9Eyx6Iu#XO#`lt1cf)gN9 zfA5e1J@M+~2j>d@s)L2;k2WEXKm21bRIu1wOW0fAloo#dtbxe}9W=ULf7IRj0xPhD z5bR->lXI>){1BOyxXY!-`mRqBSZ9L+9y{hb7E{$WA@^N!6Hbu=g$2?pckrN`MEazAzOJBkfVRfgw z6b^y59xHxCvjgnJie$2h*3=^4yj1jVBeffJOJ{@2Z=g(cu#ga&2Ol?dFar&&gQ0cb zpepIaNKT7rf&Sg?{rq5g;_KGQl_6NC@i4n+JwJ%G-5#Q3>cqXr47Fd41cx(HDSF?T z_VGX8yks6PVSlY=RiMnb;1sylhfagDt&S=i{z$FzL z>A#-OtIE&PRc^*lk4zg)61MQwoN#-`g7;#}^8aa>3C3ZM3IYw`vvz#7%plnAzmrBf zgby;rv3pBZ)J?aVZKTWnA)YX;UGax`EyE%aI1%|$x0MDB$b^7{6JG=ticVd315Qo) z*_SykilSNJ)yu34DzSDTR__ob1QfaqjE2Msvxv>yR5#A*RY{7G&qUJOWL?8~=8JYt>Y(-*4R# z5jpWJDap~L%j)%x48Q3Iykg{2dR+xbL2oKvQz>tDXO$zZ3)L5c@_sx5D@3iw zi^2b=W__P|ALisdPaO^c;0`lde>M<{0=t|)X)twZjaEt3RbsqwF5ttFp6d}tcPbMY zM}2aS;S^{TTGB3i9C_>)82eBWs;T-|xR9yv-LC0z=!oo^$h|$8CO(B;`jspElUkpT zu(#PST4;JQC+x5iMscTKiVT5 zjYlBX19zu1b5zLqUv5Ct1?E$nR$IIKJ-SXAX%lFkmBDD=7CMV3hlc|n5BOE?--pJX zEuxKr^@Od|E*k;1vZ4}YJ~TbAR~hHH5_FzX^o;BCbusKz10t~c<)<4I%Xujkpym6Z zzqkmoYKlF6Zt`m3SXqeT>A?rp0O?r!Nxz~Zm${t6s_W!xFY_TI+O&yfKA)yzvn5PK zB1)wtacuuyC~mmDE{@wb-qsl0z)AtLWE$AR-5ThnLQX^DQtV}?gxD<4OyjTbKI9LX zbDa$GgXZW=Vc#)nLmHDg_}hWu5hG)|{{Br*HB-l_U$cuRnc-2-)1 z$ZyAyrx5-Gr(LBPRI?KW*2uIxM>)?2MhG4tjSk} z{e+a4m-n?~#zG7e1A#pqJWjfKtvSOQ0nHT}z^CxBGV(onpp$$Arl?c?$|<7i2fRv< zZe9uQ5571%``-ozLvQ2QT!ZR!`3ZIL4d?{A_Sz^RYSQJdA;hMWdPKPl8&7p8`IA9} zaae+a2)z$xR2P-fnk2PWf-X&lnzJPbK)zz|i8pHyi!Ivnb?RAT1LhgOMPxmF(Xo_M zeN=qWhrzDdZTX;C3NhGxw{u-7WsGBG6H3!>)75A$B`Ob8EzK~m;f;656yB$%CH(9> zzdN3bS(3gS8e&kY7XseyNNEnAiCi4HC#ddSv8=Ywz;1ApZpDjU_gpGDWxGK<4YJp4 zmHbhdr)%+!2Q5eWJhKc7oe7*FgMInGa+&^I6PibF>mXk}OM@ZU_Qe$H23ZwZhdm4X zLrjy?TZ&FI!;_0D@NjbhwEg;Tt|V>|fGD<*1j{mdCT$jWk|T*SY7bcum>USQ&Eq#3 zz@brQ7+_QMtTC)3j21ZUV;QEmbi659G6y($9K6*iG|fEK*+QctpP{i1JeBy+F`Kj< zl2eN9S#uEe^79QCz_*eI-8rmeF5iC&Pcu(moj`h_ zK;NaxYLl{?fORj8n9MGv;s0DSo{g0%IcfHBI6F+?=aJDFnWya`Lu$;TyD zZw(GWgYY=mG@iqR9<2D(5|UPVI-p;Qu^oLVYhqG^LtoGVE$Q8i)L&^#;8B&?Tz^-&4&;Z|NPQj^GnDvBpWh_iY@ELtvTW&w7e51Ckm zs+R-(2EYKEP1WoPlm{?2&%d%ECC&x`f_rsH?!$`%uR|=TxEDGi9V8?G4=@hG^w6*2 zy|H{@w9~k_vepEE_UhmqZ;YKdJ~fQ>2#c=Uac*Ra2oU3x3hOFcm=sxkpP^9v8}}si zAG9I8ONBPFDQ)Zc^|p@|s#anY%hplJZvX%S0;Gw%DfRiKH9Ua2E?R*p+>r-u_vG53 zv_#r`zYErIvRVi*=;$3YJI3fffln&Ke*%g3bz(GTwK>k1--e-<;C|;a<{Qrq;sv0a0{1YiR+GioI;& zCyU)8XB*|s_bC*!p?-H^>p3qu%V~BS}bTQ zbRmxPldwq3Nt6sTbvEEzb~P+JFLB=r{_zDwl$gW+2GrH;x;|zoiot9ud7Czt zW>ppRRnZ>J0R4VJMw($fpCX_DDxq1HF>d$9H;z?CL?$Xqb-V;UHHYo@W5m*7AFJ>f zIOD&rqGS7_z4k-%gP0r2O? z@&okip_B0WJOky*1b&lmTez?u8{M#>g!%)~sBL{}X+L`}(0|1QMbty`hraBuRJkc& zhORKQcU97Yx!C4)n=#>9vzT7D;0esV{g*$h_k} zXiR-ktuGUC{iI==uXtIIK!Ew2D?+ZU1V8@jUF|)6Y)wLaP(&*(H!Si4P`WA(}=tV($ocqdktz2}xpCUo- zzmQi3O|bYwC{)MO+OhAJd!9wfVCb7I%)y%65Yej3b9u6IW_uLsD{|9#Jf22Mkk}C!SYpi56q2!F0!!?qPGs1O0){kMhW~B=0004{=KR>)UbS2(-D*lCbLA$aB0;)Jvo(*W z`PQMx_K*1m&{h1N{V)935a#`w-Ezia3jTT@vBN8XdEdn*ey-sQpb=Z@gmaT5GN;Ns{5u0BmRew$Fu@^)lot)Zq+% z`2Qb-mX*Aq)3`Wgg*D=GVn1ATdMlx({e`lpcA{zRHCGp$`Tv<)929T=4Ssbo*hyth z;_URq$RkHmUmnR|e6GX4FEX9cCt0OwYI$|?b{lt&KEZ_*R=i5x_CFF>Kw3NmKyYpT=g;JqUd~|HLe^EarPYZ|s$+>s4Y${HH}(YI z-3KFn=FxhQ?5aLxh=zLlRMP!_b{Jy~tvF85R?MRF^gb!+0OwHgT0)n@L0BnDmYT1DwD=gUj4!EaD{T&5ilW5b{Xg> znl{S=ZFqgxO{5WoAK!HmZjG2Pl3i&0E}sZ>)*C5AD)_M6d3{q;FHse0OH47dgBTMf zTNru=PfxYt)rWQD4 z-$Y2XseU?WLhuT-#-{a@cHY!qmQC^}enNj!gP4cS#WZnu@UAEt8KQqz&w1pc+TpxB z0sQu-d&8R;Nu>d@=RJF$!$uT3?)V50fJb@<7ZIYjUbbP7WP0W4GLWj05l#Wda%sOn zS)FL+t$oYd4b2=||J?2U_ls3n$#vD?f=pKzJP&|_uKg@I&O}Cb8dhLhHn*C^u=A-S z8pZ}PnlzKny?ds0*hJo^8VCl@v3oVN@ml(;^r8;4mAyN`kedNTzj8i1`BOyQiNVxp zI}(+SUP^pXm7>+|^wp*LkC@o=p2)lywlIsA2CEb#-5XfzIl#@tXSwUD%ht&1zAe$^ z#^U<}2sl6zQ^=VDlyUfIChAt|v|@Qm``f9Xb++B}5DiWQvx4%ad_oMmRUH%I#rq34 z4(iQCtk1+8>X)q}Oy3rnV&VBVS?02!uJxVjieTz$SV5?EGorf=zk+Afz{TcKcsK`m%W85RAYvy^%hOi^2gM6OUc{{YixlOBTM_!F?` zi`rF#0mr|~-O==T((^_Xf)NsQf6Gyj?(hRE=r9^yfUp!7JirU@MB(9t_!=in0rAdv zPiOapA{3MGcQ&EZ=d z9aazA5+xhiCx^L4i(FL!vR!(Wn~&MJ%R`4)TaxnR?>TQArPpgujj3rlzvMh^%iyd` zIs5B9Q^TR+h>95`ih?s2^VV<)akwgLj5j#2IY9wII8O@lTfKfa=m98ThS;p%lSidW z2S`5~)>2v2i;9rtb%r{C+XdhT@H<}&j0_e%28|lO9uBor{Qr@*x9E=7!ngl{D)H{% zJ-HiXxlT`1*m+H7ThfPOLJ$hL39I*`eY`I8_7^AuPgRWpwYy+I&r7rNtDCW{*BOqsq{f>G~voHi!zT#lln&H zL$>$>qHx#O+S|i&j%Gg7O>9WEX8ru2Bi%odJPu9PfJE5+;Wnc@io$XO?N(cszkbzM zn{u?h?~w{MVquKDlN-heU1H|c_L38+E5&lo>_wQ>O31BPYNeME)5%9S?0ukD7%1gv zrw7)_;OdF)U2=VWF zC}LtOP^Z#vN=O}krNStpQBjRu)!3Fxvk+^~B%tw-RZ7@0s}T4O+JK-Ki`cRJSWYE{ z)g_+07l;vdUqItl!ZBU$2>%CG8~%C5i|nlPzvVl{&t9;4)LAKpY2CHN;QXN3Cih^e z)m{A#m@9xr^yL5c63-&m`cLwYonedcHspIfmt9B&pH+wWx_A`;U^NjH}|+B zAz`OqRk=f3j}DI*h;m&1ked&tWeFETZidaInUka{QwF@zLR1c4YjnZ4*kd3e@>eQ7_Q&-MoavR@zl+U z>jFJT&~E(z+?!ogPxw$t_Vh(FPq_v3v%PGmr|)$f-2Kt0!RFJS4uvXFmzZe3Ufue` z*%NDBrZ?=zmQ9YVvrO zz$Gp4ksrR4xG`S6qb#bFv`S{;^0AI&3b?B<87)ul2>|_WQJ#xRuQWkpuYt8&D0?x3 zbt|vG_$FVe&QfMpS|Wuxgl7eSly&{F<6q`<)dl6Ik`m<&*wb=Jo4#vSVZD1Ide11K?*`Tr>0Z7Hf#HVJfpw1_LE!OD}y39=n^cW+!F zdlv$jQC=@xdSLa>k;;#x$q~~Rqe=8#4HZ)-x4H@UZeeGehk^TAYnX^lmF_9i*FLad z&64=?000;800C7vZX2g$+lqW%lHNqZVaYmITEx0&MvY1Ja%#6O1zGfm8`Zu5o`fT} zKpt)Y2x-p6W1|+0d$1H+%;Qg|Fz2i}9K!OcL59R`?Z7e!4ZKx62d;)TP`+BVpzq^X zPLq!?HggFAjCJX@t7IfGIH!b=12e8)01FmYf@j3kbF8sP_BkWEJ(EVcxl+u{ncRH= z@pZSb4wqZGvDAuP*TLpEI5TZ-KF4giNy0Q=ZN!*#EXDa z`aQQ#!Z*5_t%!P7K2}%T$$WCTB|{fb%O7vxX1|?Xv!vzT2lJh zLTHtSHZ?O*s018`0_9+a!?y@ev76Sfc@y$XJ4~}nzwir1Pwj^-q-nvdQ^%)T;9>`>jZvwQtN*Q= z0*9pRA2EFe4`-SHi^Z2GqBm+y*GQCJfg)cJ*dLvTo^y@f#nS>riY@+;cx*3|9KOkU zk@%0A7N}0>MqegPH$qwVd^2Xpt_6I7JL3{?H)qHl@Y(5JUroUQF`_F&WW}4n^Is~h zvO6Tpr`94Vm4+P}CiFv>OClI1J|~wfT_&o?;iR&R>%<90z7`q}KOcdyZ>5`_t97~j z@B)?uJbym>Xlb#U!&kHQnveV*TYjqUysCB34f&lv7BQ;WWO7g&AYUL~5M|UA6q>A6 z{AVw0ZXa*1kdl?@LvOqp!=s%WD-l}!6I56{`&WqRM|>t&kcu-{DG=jaih?I0Fq=JfS>3D1mdKvv z`?vhbjALMX)Zb>@bYIoiR=dn)1FmwnMOfnrm|Sc*-xuh8n6> zH3)4Y9#gI8S(t=*b>^;!%eIGA@L{KfgW#Mo_~oII)R7>}Iydf>DT5%TK#BazWKa`7BNV76XTKnoFs!?>2eA040 z_(D^_t8tl8;=Gar8$Z6HQrD8iaYw%SC7Od~M?EDDG!I_my5fj-sL~gOGyk8Kl-z}b z_-z6bLA!!u*;kr1)DXNX#8}!#)0C<>aendf&y9-i=SWuX0~fxhUYnlTlC#W_EbXzgbX(XT-OMGBE=H$Hdz>;Azb>dO3? zDKrK_aNVf$rpV$F!gGjg4Z;XZRA%3)WViOtvTMIqxO{lj%iBk*v!DMFOpLy2C$PR; z4r!k<59T3Zn;rKYKG94ld!bFOO^^G6a_qyG&X#MyxclQ0HFx6~5H-RK4D!M@z0-U~ zsJc$?9KwKqC8D9@1jT}**MVxNY7uE8DoF*j8Hf2O(i#JaN8c_|!BC!@p{8zvrll(3l**)JzK|JH6 z1uxFx7)*Ka)=%UtTkt-og*Wmur6waSHZ(O-eh}=S52MKk9a+m9Th;GDCzs$X^pFfU zIGv&VBIK$lsRs>*zj&_AzKk+iDYnq`QJ42X`FHwc>n^VEN@a^NzFPUku9FrAYcXhL zt>^+C{>tbBqI{|s`EK1+75G4o^G<=W(hVE+g(!H^84w^3%m9;VxG`hg24j_>(6g`L59rz*Xc{2@%8HnwJCX&P-mL{d;H-AAm#E0=r*44AScjVLQ~ zTb7fL+uK64Wu^^Qg?ft`lmg%j(=TEx9P5@Qg4^PpsC4DO z#lF?a8x*ziJR#e)!R)eraz-G3;bl}{z+r!6p+>wP&0@X@q zX)|vvZp(piIP}JB_xf%$P#)LMGQ<}bb6fDQTmM&(mLfA&h{0Jj9b7bz1+W&)Nr70p ze|L(yrqs*i^F2eI!?~o_Sf7D=?rB#}QiWmJ(g`0D9Tu!} z!2Lj)6$RwlDot#c^8RCrYWtOuBCgw7!hqoq%AVKl)Q8!j!pr^}b{L?FpO^6t-GTua z4)uhcf*C3i&kKKE>K@?cR7u6iN{kJq`cN zMM}CN%9c+T&+v*HHqVZD;;*y7)m{|)J$lrv zpS@#o^c_QqvX1PnI>wyXTvs%AfXDTY9dFX{PGe~N3*DQv?59k2bYXXd%U}U7{Rpv-vl#fc+;LUpPtSSN17nHR)<3w>2a_qf)(A^#?ZVjx ztu3WM#*sCAOBsks8cT5UbrRxafCmhpJ3$$n65A@3MEx#(UJ{LEQlDe4%K8)7x~BIp zIOy--9B$^#hS!~Ua@EWw{w9JQ?PJ5(r>db;NW~L{?K7PP;WOz!$7T|Qt>|_d>l|71TSQVM; zMSd1Ie&a@zHe5>G+#Nbml;H1Nok;c^Dw&2i<^on*Z3DkdN6w3Y6b-Q~E^g@+s~dWr zJ*-iSn+U?@%kig#yeP1e73qa0eV{YW#(?0vu?G=2(B+{DJemqC>_1 z^CkX#Kg#gWR=GG~wBHsNun}xWAhbK#*$y+rJK|!<|Cr@G=^>xDxymIR=q@ute`-v< zDm13-Da7|}=2-a)@o^)`nMioH8VyBGB2Ie6zin0}4t)|t>p~<)NB`(JThFgOwZ*98 zmqtt^+{AzL&o}~G7Vi1XT&VJMy6O^%!Z&}|G;tsFBh2O2TbD;KgAKSk>hy-qkm+0^ zvrAIo7A*M6((EbQ#OcR<+rs%*!HATe*yqu%n48aRUHUf;_G|`lF03Zw!vHW2~un!8x{hi)Jxe2GFBE3YQZI5^Cytj3@E1@C}(_# z8io9FX79RlJWg-V8R5~Oxe3~@y6$^)-{}>)%Vq_^Wy5YsDHcak+|CwV4^S{&5v!CUx6ciCZp0z z!90m3mQ%Wf2Lm%;K8X?k)(WC!N5*95XHK~rmCsr1oC5h~1W|t}v~psPNNguyo_4o& z&)kEdmvw!IFxKI98QkmRLRoZ{mx+>ohfI*F@vA|8_8?;WP=16{eG%g$M@~JU&tkfm zyDK0jfk*${JgWk-9VUHYO>l;F-Gw?W@V*tiP!vtTrlhwGt3{U(7V|7nJ<` z-E7x55I zhE}e6bH&tmj%RBz8%&@*%{AWNNs~~xh@g&?0#6(7%nOgvB0aNU+8V0)rGjSF42<0X z0097_fB*mh9W1fAt&e5v-+BL-VV}#Dn$*G=HSJq=6Pkxm5>UemhaWrHafKYhkT+bi z=SVu}Ocgjti(qzXyd$y%T^pD|5oW{1qlCzAb!6!yF=hL#cuWGt>@@SX*0w846Ap5x z7&0^D;U!xTvxNQWj$H}_GsY1XNqd#Zm3x%u_$pg2P}oFmlQC_XvBV;VZ;h{1EhFki zsdFf%dC@W85DK1jSYqAD9bp9?7-8ahtN_>fGAgG4|Jo2vannW~^$hnb1%d19Dy5`% zT&x!o1;Ak)Y`+*b*h&OZv3N$?)X zBaU*O%q%UoHX8F)rYBg#jv*KaJTT2+HUM)G5T4a+T`px0Y)&aXEIizkg=L!yM>B6BMXN=Q_zB~n2+Ei-EF7Ow@-~S>rwxi7%*vXzBi9WSS z^1FE2d|I+F*!YML;^suU;lzwCd0RU;iyE;i(luCpUpPN4ompJu9NT5(tg&Pd17&&` zoYbyEcusm@;4PIEv|OaVfjVw`tJVz=UOZ!e{xFKUV zm7$3dO12wEQUFpr|H$cxfb24S7l<)ur+6-mjC7#3EGN~9U@-uQE?444t`hy1Q7I`F z9Vccgx#h|ZCYoohEXS2;1-tfl_2kut?@EambouzA-p{M~t1=3@a$`*L-Uz4!J*_*c!?E*K`2h zh&jDlP|9P&OspEgM_=L`+8LzFP1SBKE?L^Bw?1EBi7qI5?stazF)4&vg$+jREcpS& z_hS2DZ?@vV7A#ua&gAbjt+04B)K*6NunwGrJN2`b(1A0Kqh;Oc(@uSLyXDhDluUs~ zHB9ko_oCUwkclyjbF{Ux2P<1D$k!6@{fX0^bbPT4mG{L80$1PiIHgSR=gqINU@fbN4=PJ`A_-UPtG%eQ?zM|u(l**jLbMLrvY zKfBf=;w*AvAF231E2Pm z)N=xN-t=gdS8hE4eRxxYL_x;EB}AlhF)87FPY7Wx{mG5Z^7i@8ftZO0I!38XC8nHVL}ZIL;t?z5lL}ay&IJn?;^n3GDZU7o6sW8^ z~`rPDv61oA`CiSvvS7pwXqRc zt5;SVE54vb!|Zn!>GPaX(8Jf|~7HAw!{U@~>M2XrsYntbM)UCy2Vst?$$q5gtw_&r!?8>_<;HR~9l z#b1=s6#1;e*;s%HeEpu{#G=^a))Ib(4Lf7(7-57)L;8Ab33_u*qH29K!-)TIV2G0- zKm}OJC(MNtvx*BtQ(=Vj-uWkyB|31Ixj_5OdePca&qN306uekG{ZTm5xJ&Cv-GYdr1B7)Ml_q?j>n8{K!56+;>0PWX&cOJKCo5nOI#Nu+CD>kB*foT(t?yBP`jcO4I9LDITx>iz^XwFt;`idRxQ zXB}wMU@xP`r(=#`&O-Q@9Cbz853{IYN+DHXghoIbXS%5-Wn-Jp~v`<3V?Z zwOZvo!gB|#%s&o>(#6CyB6MuQE#Q%BxN1@p4Ha&f&U^|rQVJJ7-!Q5d(ab6fK|^{O zs7G7*COU8tGRBPi09qw}S#(PRb*&xh^{K(O=2skK1BKeZ}76@8Tn?AA+Vw@O9=UMj~ zrSYx%P&UF6wduEq2?)4Lu`l`B6byeFe(H+MAU`6glL59#R}+9lQ7Fvjpg2rVc(6L~fibYmqH>4sIv(E?|}0>y$Xnsk=Z%2r(&@5{}9A*?Z; zl#crk3N78vK}JhI#OJfu3=^W-H>dI2IZj$~OLdhY~17tM|>bpZrNHVD;sN`s=Z;}n1ytWo@MsV888G$wD;?7`#NbMOid+Zl?b_YdY*;%S2kUbSf6MwMfkbSVgEqP zDNypdlYr?Uu&LHY5Vtg`W#=fB6-jVdKj{nLOu69f8zr@V|3l-EtRZC*`)RVx+k#P1 zEM5Gyd9odEFZHI^#9GzHjEo8df$xJqrGi`BYTJ zL6iE+SE%R(4T6Xlex`!`{YFvdqky_nQEuA|xS``dmj8KxVbQfb2D04^0RQAwc9VcA z#!SO5tsJw{ty_Liq@tcyZv7OTlf)9|Zh-KCpiRFTYBgg9lYO~5>E>B$cF)uU zl}Exv!-RHGAaxz7Ii?{^N>Kb5N{>C%3CeA523(QQPFO!94LcaD=&bf+U{wiT)zK|yco_p~buXFwxR%aU*BzH4+(W)b< zq=(1g*A(BGC(w_M7o9BUos)b|a;dz7b1A!u(Qf~&i%%TI<#0_rWt zjyp<{lW5jnDxd#Xq&LD&^*eoRbSMzO2#IFAs#&$wcB{GwwW=QOM<6$8%tj$RR#h-& z%v=}GTC0kcF5~{T$HYU0A>B}XnG(%N=l!Mg!T1A*9z5S7y^y&eD)G%tg2Do1CPs@;~`atStK+rNC)AViQHrVoout=)TD zL?SfZ;trD3Xe=x4BHrI+4@tk#E*va0$?zd)v9k_v`=o+<6~I6|x!JN^jS)>V*B3MV zId*p2C~ZSxHj+_aN|gddqKTG4!~O9ggB!pH346atvDsj7R@7(}ca%VOQXU~Y0L@w8 zy^PfUsG3;}=ia!@y9POp1(ZF%!<92<&#pAV0jYQ0%OGC-jG?rlR_JU$Rdc2Bhb5ab z31R3BR7v}&mkw%qrNa9Ay}ZE+MQUWbDnJ-2%piOjPoKTNlbrE+?-+G0ji;zB01tvg?+5Bryik*3i>fU>Ch zh%b4By>x}7GFP;R*a$wSU1VhA_M(x##@fvyk;|%Z^vRXzvrK>sK;}k5BK?M(6Xnn8#Do|b522dzcW`~`p z^C?Fu`HK?6H{Ep7&Kh`0H`qBo`=mVYq=e}Slt^-p z(m{$R$I3^1R#h*C=gm2iCW0z?veam|AnGvm{A7=0a+oIa2u@y0 zybe25L_fQsaWT_7W>@8z=3Ef$XBy{gM+WE3y1A#M0=gG{2<%_fDJz3$AmKfI5_{PQ zmb#L?7=xSO$lXyN02#fV^SU>}S+xNM;m6)N8*=Bg2V0EUZpmA-t>3W1_~8d9kKgQ@wPj%lZ#P%1dMZn zC^pxiMLM|eVC17CE@yxWr)iamDtwkzGAas?m?Lw-d(tpM(9lg17BgE#Y zpg_7miLA7BV+DgH%Rh}^H$K9F821a(x00`nnDN0Y2?s-?-q_i228q2gcUI2YiVUZy zcHWs$JudbMmTuS&E@HPc5^p2fGS*=!iQ?g2vN;8u;sk#@trz`AJ^zE4wZAj#!k9e9 z&j<*pC=E$fM?f80tZ27s$HufJQ zW-N6BIkg*{`@=tJ?ucZQhrm7iaMj(8RXm9{@lse*>0{<+4h`X?9Z|+gYl-6{Duo_Zml?+Tvc7-G*vajD^H)?S~z zR=&|z@MIoRY;yd*S&AO=34S+l!LWX^@yc2P7uj9y@)L{&tGd637BWm*7lKo9x-M^(qcfMSK?on;?bT37PLn)vN-^ZH37dNLH$it~ko7Lv`!EK>Em^GA$qp zrLm_}qwYQ;kiL$~c5|1*j0(}Xg$*mBFPZaltZmgaVS3&YgqnB`12D`OFMB^(Mroq{ z`Km1u6o0-lu;vukIBy>2)-#=C-Sw{?GFWY4&K$la-!{!`ABsx)gVnu_ZzcKjiaAfx zz+M&*$)dwpVz0`Mh?(iGyf9c_ECo>a9BRfWo%1cgcNskSUxaNc(9N6GSQF})eLNo~ zHHo+WCUtD7%U43EX6{NQkT8c`;Y(;1N4!ScwC4NMw4OJEAL#u)s>7~}soXptVH49z zY*FZud6OR3qDGtOK@L6y823fl+AN2vW(q_VZ0_`mZ4yF@QLp|_tyP~grthiK&00hz znV}718mI+RzyJUM9rm9~DAni)L>D|*3dy(S=fqIg7!^sbbt^zjpRwcYe)u5HOQ3qk zUWvcFvS0k6rJf%;2yyBwzSG9p5Ybs&r&*bxkZT#z(Rjk$<|Py02v;)nnv&&HS8`gQ zm!TuaNC4z)0D|Htdi9dl<;dT;&KF_8zNu)9 zI#iP+a}F+)2S}L8cxNl2*xGsmGiRP;IAd+Yu|p8lRAOhNH;ryN?KS{SV;~5k3KKIu z;s$1n>I$Y08I36I|!1Lm}B#de?2J;%n91nd~v*}C3;EE6B{D^Ic*kj_!1;z*#g zSctj?O)jgkyYlA3N4saWnFi%#Rrdv2U|JrZVLY;|Yzg_A)pB4UU1l9}>_HD#AEPq> zD*VIy(?eV>%nlp1r8YT3i1oI|=LGgRe1RURv%x*22edfi{RyAIX(%bo<)2x~b`;GW zX)yA6LegcR?qS1oyw2`Wv^AL1;9pGUySYl;?$<`qDEu25yEhGg!>(k)>@D$@j;e+( zb{~Fq)_7)b@8e^A{b*o|>4g) z1)0I!5Hao3#RN7HWt~MVK~Wr9F$<|^?=^**|D>&2aRp6UC%3vif#H5UBxEDTLD<-| zlZ~i}zr7*UInRm^e=TRb1TWXc`hD%f60D2N-C3Gd&yOg?#o`*qTyOkjV$X=kB>Gze zWHUi&Tka;t<6uUumF%NoXoH5LIdiiYgu2LYM!_GRITKzj(V!z6wAmp%4FsTi5 zXSs-heHpa*VjdHsrtdc847ebiPF1jH68XS_6Exw7jTo_naTU0zcSc%#3F)VLWX-Ox z266Dtn4zdjQ&B>mjVPLIW)4S$=WS9{w?d@$j_jR#BiOSF>elG~+Q( zR=g)oU_FRF&HF5_le~EX0?`_)rdf6RVv$@_F$E z8FLQKIIPJH*#shr*Tglvqg$kQFswY2{y%?U`2{q|FB;93%#~~+Qp35}5%H2DK0~Av zL$h$`N`RWO`szoI#($>OT3(HK^(SB$gw)!%hdd-B)x6#XOZGYLLw~5aN*$_p= zT|RK$2H3E$Yn5hLo^M7ZvT zg2L!3w9k^R1Rv++kHGs}z+6j}f*2QrDSh9x@4n?KXCk;H#VoY)FlW-mA0FQCe?Bvn z{#OoZZbtT;Ky}{4rR|o_c_lNQd-JH~aEHEm_^7t(=KUhX3s!#$=;mGwBmHdZMAx zILNiiqu`{$+?EVflq6ef;R0G8eni;$UX+oel=cMPUGm}J6oK%gPLM45yU!F$Sy=8V zaBKH-1i5Cgey61$qX*&4Bn#?ftAVYBpt5pdcDhQnmJHD$o(@n9?)F2Z4`)u-fg!pE zv}!MOr8==s4V?(Oj}@D@I+W)OnT!fQM_CB^Q?F&cF=X>rufu7lLYiGe8GEb*1Q6Wd zA*!yKV?fkecP57fcxHO_0v87w1)0)9CblZCXqCyr*q=w zOh=kzSD^Hp5xUx%%oz|Aw7f`oolr=aa>9-@S|cN^qT8`!))RI*IZ0M#i2>^Kv(Vf4 zOUcM_cZ+J-f!>kTXPQjMm2BN#ImcPkG_80ZL5e5OZ=g9@3j)Mj`QTQVrpR!y$#9rF zS{a1LsR43UWq_24%M-m*_44S)`etu|)pAZ1(|t z{tqRdiW;<~z0Eqr6z4|0`v9dWK}7M|>cNO(DFI5%L$@M~M;Sw125XrazWq(;?OfB$ zzaonV$oHv);bb4Nj25)iE}V{g?zDFHow8$N)!c>WcjAV50h=atwR#OGKU#Wkt0pZs zIfue#Q$Sm_-T;%Rqj=GbdOCQ<96rknz@z|tgc=|1?$2sZK9TM4CT;sfa^c??pI9$3l^(dz$)W)1sOz2334zl zCd!aJcCSXDUgUQmK6N?zm`porX)#Nq119am{`~?d>DPScON)29X=6ndI5`k{ zunl6Kug_)eYEn$|2zF^>l={x-2zjm~jgRr#OZrBaRc^Q;UjQHoei?&Bz>Q?25Cnt` zdiA4JQT6jQ-0OD3mGUI|57R9x&ybML^>Auh(E^;73HwWNnV)F115%_dOi;ND?<>UFhcs?dM*-<9g@_MY16|US%{~#9|}W zsV(Rn|G{bhtJNqc^WD}HPCF&Q@Nt?LSy9~y7VxoI8p{o^sL5Gqb>Q+@6aZ8=XxFOm znRUIX)nuIC&M;Bs1z;Uo?hedWhxZ9{Rp^Ukg{CR7Y>HV$wfG3;kfsFv|>bZdD2kWiXT*LUV5*LP`DeF;u43c@_ zVavZ$iv%;3GMu=r6C-5NEx<|e5c6e#Q)t~^`^V~xVC7A$7y%h^iF(~wG-c=Hsu5Mv zr-F%AGJZT8*5)4IMNMM+0{6s(Vu{$&7vnHg6E%y|RpW>j51^q;R_%!Gzm0H6*B`=E zp3sK#mw|iy{R|dKQ09r)qKQXQ(}vlwmt{Rz-MuYiKNrCbBt%qemNn*e+YN@P_x-vA z0OOR2>dAPHKYpSeqsC4X-^2U?Z?tF@pGwm|{YXNfXenYFw?< zWC4P#2U}(zOH*bub7;ezAQ`WnHuro6)rcOBXh%9s&D}6G4y^(tG{D=zi-V~yCDpCp zoTGnyZyW{k2)AE3iJ0#f=6^~%OC z&@(KdbFO7LTBm3JB*d!ZDWFQih*56rqrUEEGm#F5opV3yFkG+D*{dE%--nxV3y&y} z2!50>1oUep6I7XIk?Y)uh#Gy)$x2I~MKFPJHHyV4S1e{Wc=10Anb0FJ0tlo8MDvaz z9WJ&p;(P1_zSp>4W9;o_*w)so9<%KF8sU^8Ws{l~`9duH95w3TSdrEJpZ+5(WT`9W zJd6^AYzV$TYU_~ASGe_sLf!hRJOwy^kqfUc4fH{tYw0<#5Bb-4cI0fFqk2*}jpZUE zM~8}_^DWLr*kizl7x`b&9HV3Ev_DhyFVx%9=PL4kRc&UxPV6o4N=vc(LSH$_84SWP z>TeEq2Fzj*dM9YK-rOLs2Jtt(?y`nz9XTh_Lvhp+gRg^yfSS;hDT|#z@N9vr+!5UL z@@-!0{ioS3p@CvO=@tI+Lx17VXn)%O%3Xdn)VLZ9!>q*aaD^1 z|83M9W$R<$y}c~eAz{H;p{GS?BM_K+L~b!#3vjh%&NF8~>{+`{=($ymhn!o9Q*t66n7Q#oP@TkzByVBE{?ajZRg z$sjo@zwE5apw&jOz7tYQl-R(_E0H_V7n?zHtB7pavKYn}JLR>SSbrWu0EVEKjgV@# z#Bg*a&hH#kAlCsFJk#iGfucZ7kFS^)H2(meWmZfC!&`k9ql$MC_P^;BN<^xXwibkibu8~b zp;hHPY&{_MX0C6a`-jaENtyckH*gP-!4*nzHL4)ld(l_3Vl)y2rQ!T#8y9v@&Un@S z*7HUZzwIh*vrH@p!kCihjH`*GdP&RH4LvOe1Unih4*!HTWi_X6Fa#tED1o8lwlE{0 z{BXz)6NOZ3WA}Qn;~LD2F+$ zL6r;LaAVWI1VkYKK1PcJn?Z1Z~|kUVC=Vq;xhjN?iefAD_#R2iOCT$sY>jw0-{Sm>j&p-Q?c0l|%w8_rOUMGJV zs^=*CWZ}~~)Z5oguf|~N)J?v-nyv(o>&f_BedanJ9>bE54)mu%Nof7_)EBdb!A@c` z^99i4E3Y=p7+(n=;jaVI#J4Na7t!9CRh4kmdM|CQO1^CUr99YVbj*>yyia?XT zk3luC&d+$Woo#slXUx`RoMatEKd|sC3bc+Z3D~aSNnRwEIW|S zD81dvSU?I|s$Eb=P zAMB?bo2s6gx=!NLqy<)0CBTTy=m+OfBv7rLS-6Hs(3+k)U*go&8WKSN#h)=@q`Z} zJ6FOUiD-L2BV_`&to)q|ft@D2t=k(s0zpp~Wqf|8k(0SB65gz=jeUWo7)7R}1)-W$L zeXHk7kTsU4j^w8s(fujHYgsbd=f)sUy^kpY=I9kFxLzi3IkScCdO4t3juS< zOv8EEh=&11D;KEC6~?;^AFE;2RudTO5w+!1**y^-@*@A6(X2eSYL@~pIbXhv*8-0M zAhj*76WVpR_Q-ov*?0{&jffP72`taB{iO6;*AW(&)tF)@QuT9IGB!!rjU>D6@23Kj z&~J>HW17S1Y&%V1)lj+sYks)iQ~HRWMuC&Q8waWgBl0@U* z1K|f*E~yr>5>uuT^B>Cj&AVY@jj0|W?hD2?%S=coP^A&B40QWup>5H|_ETlXJ0r9k z6IxC@-MulD-#IFWKZxDFK~i}U&owQ4z`7w+0P-hj-#vqYLiN&A!*ib1sf#RYmTRsB z+BsyWIhHCTZ?F(?HzUE1Sgi5=Df~PcS+)7?V(*D(-w;EjGRDhj{k!l!%P>$+_}GXe ziV?FkPZbdNVyo5tULiPto`IZ$n;$aQ!z^hB-Qt-vRGT}Yk#_f#mYE6FFn?Kt9H# zW$X!E`3}|`6ad!s$NvuhK{owIr#i36W)}u3K_lLG5Fi*yld9g&%9yHlWK;Q>ni5vc zC?WZv9=Fy2_DgwP>sI23zVD6Z^8ayr%9$5UgjyC#e+~8EX8|PH)I^C4H7-b7mgCKH zrB1IgzIs(}(3QpxN^aJ!e^d71hiyYj;{lYZ@-`5mC2dJp4Knte8^i8RPwgW0G%k1N zo?`WO`!zrGmK*ExL)8fF zfiKBotW%v6JCIAEi;Iys7i03_$q^y1jd!vWq=>r0gP!Ml3VrE28#b1?tZ}~XL;4Fw zj;_%lU*RT_uexassu%Xd&{1Eh|AxQFdZV?0bAjPr)Q2MttzaLe7tZ!=>)-4WJx~4w z5>ul7eFTUxNSZP?7W3Q53rh=XV7E5xcS5q_d>HOS0|Kp7N%K~G97iv@CPo>11=Rj3 zciK5tNDGHJqXE4p+LFR!Z&eU>zxor&O<#h8qm;8jQ@dEmAXfCl@y{KQ#aivZ+@@)m z*HLLCM#L-lX6Z^Lin{DTYRA~=7?H!-FO@dA^%3_v#S2LM4L|sDwNmeJkFXYpYk6K! zfE0s273A!?T1@siCG=z#}XWwTyZzqhhxlv)zRgcw{fPbHp7HPVdoG7`X@hi%`AjDjaCvk5Wlc755 zlDKw)I((W|C_=widPYL<_}#MLfw>@i)O)nH%a_IH$g@IJ_=8iJXTd6M@e4&;zjGJr zlsODWt9>plqb*DWCt{NSc_j_>JsLN3N)9- z9BytIUF*KXa2#kA3_4k}g8js|1Hg{E22SXQK9c~fS!|*_-4z&Lq^vvI>6G!U!vT9S zQBVSO=>ejdyB*nr51Q62%MrvjHP2bfiSRvL&yinN;VcZ6fg>Ly_IlEXZ3bD}41?g< z$uRyHdq|-y-nEwzC|zftV=_g#fYWo4TSML)+=?A3t53r3?|_h-uX=#Toiw<3PpYs{ za-COx!UWXUkNp^igmIS1`ejXW!M@XN(3|Ws@RC-vJ%?ma=x*|DT{3n54Qf{UJl`qv zCapF_!Kl=gQ-)w!f6PEjzjRKiUDs_Ol%Yw>K$!JDhx9tbD0fnvAAzXDH0pFi^S_$8 z3*bx-4jfS4=rLdd{TGfO00PCNGV(8P`zwk|>ga*$yc#bmVyzVBrj09N5CAaBpZA@* zM1@ru;*jXu`gf4AqjZj?Y|!MJ?+97O(USr~KE*;rwRxBk%_5w`Uk+uRGAVHsbaPJ( zFDlAk4J_qhz+TcEC&Zu|q?{SBemH0iz~%=JOU{k`!-dE6&$VoR2uit+)c<7Jl|gEs zd{p1TKW76T;3dnLdf6)xAs)&El**q~N%M)F=D)}JOO=H=DjU1Y9Uw=BdHa{uG_WU1 z!l=nSMd5F!OQ=p@ovv$Dj6OQ0T4#(ct%zbzPfBU@{Be_2kNRGB?ky8z9v(bC!E+6|`69jF z|H$whM^75>f7)0rF1GrI!9_Xr1b0>JT~g%gOdMl8^;BuysGig<1r>HwXo~2&BHD1J zn=s6D&(jAO?>e(WOuJN63x{d3P9W`It;BPLuKW(~Tw+f__p5w&g8ksQrN)F{lrYFa z-8hFWttL|rrOdf;Hc2#Jh_ptX($91IjM4mwfzkz4w;SWmo0glSfX?)uua+Z@@p)_4 zijy(aI}1p{5t~h=?d)!NLaRLq76!k+o4W@W($L0QboP(N~zm}K<8?fEn?B9QDJSep> zI4wb%6%u94Y0Z_c^{&FMB5KV1TlN1LIY?-=Zy4>a!d<(SpG`u=$+q&*%yf|xa=fcD zVS=Ia@=!`9?J=$|O&$MmqLMY?P?AR#F`ZcEkt1*2*BD_dCT3%NI6oA+8}{kKKT1{| zrvOM{QE>4;e55}rT0INPT(8KV;lTz4jx#TD8YX&U^dD6BtToJ>Eb{#~GyB5`VU{o- zYKewLPLqmme?Mo*SH^q4W|rqf1NtYn7bP*PS3m~2xL;+2bS7RM^V=*l_{+^BahL07 zvf4)WU(!Mviw~J3fg>>*Bk*+msOd=hDW*E@5`LiF?m=@&hq$9nhYHkv1hC+CNNB~K z(}{OWY|H%9L=;YKiOz``)!CjSGro}W1{N~p8`Rd3R_cz9h7?S{FH%9!VaEHJ5{k5G zX6cDlFTwe4xJ#X~U$k&oaWlS-u6*(&;Li8S_GhvZ_)&=X6%1wO=)F zqq_K0<4IC~d{f=!SY2=PFtj;yIV9ZrZrU_<4Ll+4oiye?t&TB4@NUX{8Iu1)Atm{r zJ{S`HVp-~Nr{Euz&O-jJ&O-#>IM&=-5S8j#Z_pU}g|6Wo{y{5IOzxIGZ}$Cv=Yu|+ zhp-3CvD_Ub4Tt7YK>FYK3=ENN^>7QF=H~IYKQ~aQ+WyH`+vK0wpfbRUX#^jXkFU{* zr6XAenIs8oe~i0r0hE8CE4p7jwZ!cN-a4m1JIn-#d#Hxm;K^C#Sa}RKY~+S0fISE) zri~Y2m)`!SE5bhVD;dENNE7V8Q8(a$Z*I4flI`vr`C_G{`jb8b^hnEtE@_sF7d9m; zD1sfbzi^*vghG_ONSGhSL_k8<_`=f)I9 zxhS+YKRhOBTXN~v6sbW`dutSdI^1|2P0{Vcc4LNA-{r|MW4^nq7}}Bo(VJ9>&3Ca; zXZ=wf<^n1IAz&rDH7j7a%ETMti(XNI6hB!>U@a}>QuYFU@Xv|)8Ay87GQ$7EhQ;S^ zZ)Be*33+@Fkz-n$%wZ|u_o%!^q})W&)}Lvb5_sy^FuE_`*elw8o4afTv~p1ID@J~= zmi{NM&j|idL!x>U=9yhToYkCy96+X04j{#@PDQu$RK!jO@B!X5SitoN8gsJr&G#?nj2GKgget0aLbu1P5iy}f#*ev5 zH)M=UALTUwHjQa~Um;EtunUX(%mYYNtfplD^7$X z333gJMqr9}4`HnM4oI7eXzF(s8&?6xOmV+Y^mGvr|vh!p)|8eT->m&~>|-kaE+)@HHpfULn)XzpZgeND)T8kyF<6 zTy0R()k@-F6I_7+ZgpqV)6xBnRw&)^ogKBL9if%vwisiRbmyKh8Br1Q-^d2jdoc3a z6Q91O7c-NqHTm#kFtwiInuZ52#Q$d-I9?@^1o8nDbun4)738=$0Ex2asn9c%pT>6a z&hb(Au!B#3t-88Lkc~1bab!aEv^TLp-|Nb_7W-wsudcR#iq$Gn76^PqY`!yQX*!rc{o^9AeBZNLFHdv-oX|0F!Dv72)>f<{ zrPE36L`wU(vLPstNUq6q!omI8d+B=O>T?p9dRx^T3CE4nF>pRZv_@4H1cp=vH^)*a zAa4t5r;+*20B_?Z3~n?!dEVOE%ePR4xD_5y$Ltt#ayr-8F32brpZw;gZqH&_Q zqQPpJez4)hK!xzhy+G)NZ*gB&bqY!!KkFtO{12aAUL@<=PPmy@DeB@Q@bXY^XCpf< z(^VH)-BMKF@`X6SjlG9?N@3MdRN`m#NpC&4earE>-Zl+^HI>VkK&g^|4M1X<+1{!B zT2mWZe4x5=G03$zYdVr`82(7w#vOc#Tt}#CP3J;3^~WYOsb9UwN?^b~+mC=2{rm5I zeGxEkX!4Z5ro8jlAbyZDubakyq)(_@(E-Z%76-@92#%T$DVPGCbDcgmieLZP+deJi zYnmHuSiNLNc4por=O%jqMohvL=b9?=bq_e{YypV{%|(JV1!sb?m!y6GRmZZs59(F+ zgGsvM|G-orBVcwGZ14<{H7r&tb_!%L8#^V&Z~B=kHd19kv{60t-%jM;jrCn6CczH0 z2UWeBQK-MIMrmMy>1P>=l)wSf*`g0a8O_u#Q<#E|ml+)U;VMymmJaPe7=~$6ugMHE zdOC^ry?xHI(Crm)giQ>O^nHY7~;{_A;`e%vBaT+_EdI4R9bH!@;z``vaOeRmQ^8> z!^DxXKr+tJ8%}ng)64Q8w~dDl*HmMP`ZZXZIoZq5KJ05_U`%XwHUd8@9P(WpyzD6L*(v*RL=BoE=hrQ(AtzOOe%C_TL20+@U^ z;D1xszo!?nMykl%+BH;CE+s2_{yfB7opIOtvr?M`XvrV?@+u?vuJew$9NcuPK}C|f zF<5Aq#J}OY&i?L^gA4K~gY=?krpXZk_$-=Wgn92}{f;}Wy%Z8ciQCycqxiPBb1=Nb zv~BZy#X>JBd8%<~%Uc96saPTLyv#GzflPAPDqu67{WLN+xlE@YIRZur`R!LUBkd58 z1vAS4O84PJZ3%hewTLHwyUck@3hNfBS)m&_=UdcHjQrXz=0j}v-@ML@X-xaX8DcpX z9~HE9e{#X6g+nX(gHRg@!7W@TCl(JVp}LU`(DF4^u@+KX`QY||0{7*DLmmoJ&Is$h zU84I^bD}>02k50c2P+cjy#xB<9rye!lhIzF0$cWf)c<+0GipaiAzZ_%$=kp zFa{deCGso0b(&Fu&eF737fEE=UYd>H(NLI4|Kd)s|1%$y{-h+A1#tOCfb-+t{v4Y}FTEqB=kIwSY^~RB`1Qw$0 z_ha1mPG6#5lFf3Y{|2_Ns@6Ygz1)gS@n0_pLN|L?JmFOCwG%mv+dIm`U8Fxxia$

?Ock?Eu}#AYQ{=?J+i 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�Wo)P_b0>RZF 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 Ve=ISw84c&KaT@3u`{6gR0044x2B`o5 diff --git a/src/pumpfunsdk/pumpdotfun-sdk/images/999.jpg b/src/pumpfunsdk/pumpdotfun-sdk/images/999.jpg deleted file mode 100644 index b7f4ea6ee6a7fbc7448c34206032c98ad5b12086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220374 zcmV(LDxHLD1O&;0@Lv*8P%t0C9)3FGx@M{FnGDp#KE?Tbk?t@cv_e zjs39scjLa%J+1fO^I!5m#(wL4wSOc32l~Itk2C$h{onqN^>KU)9ne~JH1`%(0p{?G1Tzt8d? z_PtDhY5!~ceg8AzTmGl*$NaC0AJ@O%fA;@z{_p?)(6{w3^xyhFKmYT6Y=7V2>M zd;H)1fAb&gzi7U|znTA6|8M>a{OA5}^FROp@%``rPxlMVv-6+wKl%T__yYc;{uln& z`M>qQwckxY;(zJ?TmHlL@Bjb8PpQB2f2RLu|J(hi|Ns0yp+C+)v;W2a3;vJ)Kl$JP z|NOrDKmLEs_{d!|9|&p>{UqRZX^Edum>g-qCEZ|ruIrnbo68?=3$D? z9eU!Ru)ymiMNypyX-=IFp^f7kARN+i1OCk?Ti{$hDQW8`%85*GPqf`gouzTMH+5jP zll8a)pdi{VLT?DZxhKaZ>d$Sc&(fyTfhJ*YSas5RuL#3)FUWFf4!uBTi)B0*E3@>p zLA4XppT5K=k2@OR!At$$zze9E$|(04)pSVWqoiuU<=?STDZr@)y_5GHGh?{^IhWoH z=jOnxbP#T81BeTYOJ8yhdoY-~rTr8ntY7XaC&`W)d%CtJ=FT&w^Ua=sQBx*;J`E*& zMY8j%gDMGM`Op56y@cyU&1b+oJ~XyB*`UmI&t>?}1zN7ybt@PvP5qKF@6HTtl8ZN< zB#dO-4rVs^JeNR{os_=kvu6U7NnHT5BwW>mFiI)T*xionlnJ$(wh_gNO>DQ>46cs^ zFgkIRAgGOQ40dv_igQSrBEHuLl4#53G6@qOxwP!br#}@_*H2Ep_}|&_NE`l3P0m52 z@bC&!kWol@nLvpaRQk(2a@H5AMhwnzg&>VO0MEQw;Vb+0uGE(Y=FwknEyshn-Jql( z+dKKtD`8brRx9Wn@ScA;tj$_UM%_pHKeN zup(onyS}*Ic9J!mbM9O*XJsxl5N?5C!YZoaysPNCV?CJsZuCCpBVindYt;+(sKp-u z`X!QX5j9vq76mhvtaqW!_Ls}Z78u=BGtx7Ftbga<4$C@oeo;=p99DC)L+bgd+IS@X zRB8N*6r-Friks$@=n3xf{suvH;^(qTq~4+t%t#KBvhgd_*L}$LJ-2fWKDBxE=oK?= zI#}DI|93x#EJ;I&;y(V>eBeD2l-gZ;y`(3~UVJh$Qv8jN8?)#gI|H5o)kCD~SZW)@ zuLf{;t@AyV-GX5)L*aCI5I4)!ReeE#ig18qV@jhB}a?VN|-glh{~IEq`Q)b z8h^H@FZM)!VMPCGf33!*ioMaudEU#r$Rb})Uf1tr{MVqjpo`>7G|su5IpX~twp!En zH@)JL5fSVi^+<-5BjSGFx|fGaE`ylWr^0$3NCx{Qa!Bbb2@j2HV5eW=CRg$AYK~NT&Sy#OgkP*g*I>dCM&b+6* zkRoN5f{NX8j`@U~!BDP4@+{`hqrLthpk7!gJ(Au%>UyeHX6q^cb<`;WD9l;^^~N>3 z)v7Dk-q3md5(zuPU|o@Vw^zdIu${C3+IVSymF6teZF5)fm|vXw>4W=}9Yx6Etge@f zDh@&u^}aHTr{c9sZM~2v^IkjhBs2g$gKN<^xpn{GU)I=jSZ_u}_uyXthy$(LgGNH~ zz^L9W{Xd9FZ;_c1y#P$xy+;YMINPVb_LHdch*jIJ;*`2NYI^Tgm;I1a@9FD$YmmD& z8C?bo*@^+FMXmMkbu%!T(4*Yfor7z$39E&fpySA20Xjk^S<(ey`Tw5oQAA~@yBq6} zRGfSL>4-Ost}-_&Egta2f6j(>>Zrifo&dl!5$s*fkdYij$0h3$eNy*oT<5y9RxTeF zykEpCU%R$Y$&%btPuB%W(+($#ep9I{;?XZylSVLTvUI}EWQP^cN)}?O>d}R3;W@=0 zckM<)e_+X6q|3at9^=?e6rG+pitjR%-I&p8iu~cVfX*f|6Wwd>)>2goz;eW7=;ft= zt3DinqdIxpR)RJjQc%Pw;+*Q_KvqiDzvUL#{k(*CsyX^s?y6Qj?gQxX?e=mvYV$UD!u}`)em`k4o_fjuaW16}QVKNHRmAI4j?`fp>Qx>ysp02Py#0n*z06V&xIg1_k0%G|mr?fH+L z^3iu!u+p8v5o5&}5-adDL_9DJQY64lPZ=6O4yw|Z32R-1SS>36R9$P@Qy(!!UxBzP zzG!u#(x-xSNu$jeYLaV}!Z}QuFPf2Oi%RMfNzr?qWh%jG`kuBJEF}UBai$j7Tq?Bv z2F>p4Pn&TjNBmM!@I$yNJ|DeU8fPpB`}L1ONgZb2y^ZxV`*uUQt=)Q`{EZ_ol-A;$ zs_{|wNW|i|KIR7g8;FYx={Qa6x;s?Gzu548peT)v{`Tz*zt|p>8OVNM+onHv62`0Z zdiC1tryFFTG7)8bdTZerzbATzSoGwQpNPdbN5&fWEcZ}#` zL&oKsVmJm)@8%ZDzH>b5P2@99t-7(4bV`@**YfLx1p$o6U)f!s$V z{e(Ub{+cu)YzkEg0p%)3QWd%7eiJB9JUoSUV@gp4++36w97G>CT*Kgk{;8{hDlS8SRsq$ZMgz@)j`UZR6j}F-jdr-cZFjIr4~*QI@{AwZV|FJ-4zU9kE|-JPwK<8W5+C zIv}?Al_(ot7GFSPqKgGkc(Z5_${pVC*f0`ksxmS>{3ABKEARLp>uR|W`=t(&;`1Mx zv4Nm=)#$(eoQddTOK2!%T<6lqvhBf^dL8d4l<7f@>+A6Wb(|nSICBlADKLp2j`SHX)}o zRWV`qY+b9;X$yb%(P`>K-0ZlEj1^WRo^c2`k-SPFE+TaWD)w#FA#(2X0=pVu`Yfd~ z$zHSinNgAyFW}5}K9?loW8z;?3H#_RL;6m-6owK=sbCR5_MO}Hxx;&|6!u_9u$cdq znxNjAEqT)g+v`SOU>r^?(DH9QYS38Z&#PC@(WQzNzwc;IK}rk0_YsfD`5)^B_c3zw z8TAj?Yol|*48Ob7+YyxHEbS3 zRV$`hdE=EaFt(ak1c%mhj(SP&J!C1|ta3E(ue93G3fnSts@~SUD0ZY2nl#(yRu=+8 zxbel1TkP4kVWJC1N85a- z*e%8b4<4H4=dk}?nudy3BmxK~&`!}S@N;QC&%t`r$OaC{mkP$EjOJ$3S~vpGT`O70%q$1tZL>8T6HfKymrVu*%6-T%S2*6-$S07~A9* z)x{B0>`wcrx~^6_$jo8rt{rDKoo#X`878r5-}9uM`WlS;fGItJWiYTIEmv`$eicTv(>F(18uA1R&`}Wy*V58!{-wYSC zVub)@p0ao6*Hg_M?`%+g1*@vEs5l~LOmViD&J%QagObN;#V!rfd&_{JmC5X>IMqt4 z{M?ll;oq4Kf7V2moo-SMw9B*}QFC-lQDK;PWt43$iAXKAO{0{`C390kh)sriBpSzM zuK$&?Y^~>bB-EPm`43P?aLyZnXyUKU5*sZ20;Pd$WUNmrEo@fL-u&tL&Vm)?Gv1Y? zO`WXcisS-|htIK>r^c@7wXe&IiQ}_QG3eVa438I9fZoYnnWhZG-HDDWyl48nxaZ>> zb6&Q6UHdvFHb29AXJ+^%)7p_s)0AS}gM(|LEtaf}QS6*bX4HAd;YP1DKCXeNC zejsv+!@^-I5K(~QX~!{mw_`{W$4Bi)gB6^lV7u$RF`EP%+Tp0wL*nMZ+v3m@!Q%?v zA&Zzq=R4_;mD_I5E{P8$hqg!0Se8bm=Sml{$Yx)(PlX3~cjd>6%M!{ANbq6EpluJ6 zv>PP2mnbO$Xkc1=7&*XyQG}^imqR=1`g(DW>J~F!>F1qp>)wRS{-vP< z+wzDgXBJ<^dgZmc1NJ2lJI(s<<2DJqN{v>Ur+C3&;OKo;n zH4y`!SNPbbi#^N9r!Y0>0JZ>@j6E}Qh_Q9{Te~nbrh!^`Kvc0-wX><+{%QA~(Gs&! zsx9c3eX6k{kh`IAu&2)3Vd#0y>-y}F1e#wj4u>wtc6Jw|8u$Gx5_>2XJVW^;lpgv!0{~u5%^3=M|x2j7+8`~)`6Wo?9xqxK3*=eAf zJwP3y4OqCHfc39BJlFv_lO-M`vdZIv4JmdFhz8O!%r_nQM(nakGZNC0g-6^?#nwmC zJjvb6s!<8qCfra6Wy=wdV{R@5FWM(hjS?7*U0g}sU6Sy^*PnCfMK3`zzz?@pkhK zE>5pSO5M@{P}s?|{U!H+zs^&**rxVChh61hY!0GoTIk-{;@XzFx&!YD*YaBq=iG0p z-RZcIvs+xz_jm6Y$OrYGvMa|oaQz_p*d0IgQVZ_g#oS%~!yqB@-P%R_3poLe@tAxQ zUcWPfLX#y_#F(Q+`3c`L=ECGlf#|h;=29vcozOja)B~@tZV|!+`PD3jbbcHz3EB&Q?{japd`^vdxFC2X9WEE z&c(Mm`1xyMzBGGJI)B1X3lHWP0#t{8P(R>YlG*&5;cQx^gX@s0ouIBr5djO&Q<1>g zQP&5_J2%`13-r_ySRdj)9cJOpnBSscrDE{z=pL4o>oe%2E0EZu?+RPo`pVBwh2L|F z=%7(jGRv*4DYo3!V#_F(jwMd;*C?m02Mvp$;kaM;ND8}H8~BFqHHl1y!r@R(dnc^s zJy~b2y7Du6f&6~5_Zike+Tnm0l4oNE-@%kiOaA;F6?t#SETnw*Q3GHwFIH{4KJP@F z5>Z6!D|;Pi^oW$D|8vhI%g1|K)JOf_gPvVdtY8LWPi-?w0uz|o;E@m0Tv+B|vf!%6c1gpd zMmw3$qx`A+g2t>h!g(^8wd4r zfum5Z>LwLyma%Y6ZT0m@cbMgK_!#TNci41Jz1I4qG(Yb#V`;b|clCN1Jf(&uIHxW# zNqZMZ&$P5PogNt<^S}l@ag)y18u8t+9Lffpp_F=O&q+J7IlVgims&`sgk@Ly`{nFy z2q00bPTF2wc5NP0cqp4`mtDZm-s(}wtUslrr;!F^t<9m0mefCtv6xuoE4(#{3m4Kv z4&*_)^L=nf`bZLZHnx&byMmZ4L$t7@mH~?{~bOXB{cEX;H`kgyXajLk^ zt&Yqs)U3t(~ib? zs8m>r@Z)!AE3Csd(q_|T+i<=-xx8stBCsclzJGzQ9aUN4f%@2SD3nBH_6iAnzE3j@3$}rXUny@VCec z5YRpE7J@RX*kV*^>_$!CB4+^}-}iCaXuAQX=yzl6*C8pvGvIi+V@~UN%UWPckuzF%ngL(RoIu2|O`tJ~e1vPp^O}?DhlhV;1dG|vydL4|psd5S zb}bB<;^iwQcwqBPGx-6mOb9nZ0oAsmP7Sv}=RxAC)*?45ZvZ47qd}-XGmdbW68P$+ zK!!JP_@tUUV0JD#$>f28E^zo$$HqVBeCrA6;P@Z^GaO=WkYQs_StsK`%jL?uk?UZH459YrFd{cRdug(Yx?fN5ef zfkRsAsH^HqeaUWeu^TYwbO&$=4_T2=T=rmbH`O}FYojv$w*h8rm6bN8Mo6g$L(GzP zmS2Og)}dgTQP~3Bq*=rXptIeAYZ2z)>~HM?TYr-z(=KcyMaK%FkLC?k7dnS$ z>Ve;QaIN2*J`X1OKlzbZSb-C={MMGOD1TkEola8c(MJc8evQ$uHyXsKliTOa@TrKq z?nV`o82&#;fqHoUf2%Y>#w~)=u8UX&d%#*}60TJawMZ}|IbUMAc|ciBl&(Z#=R?{x zwER*-4xVs|VSmlwk6+e+Ksu^SX&EgR8u+(Q;TS%P!MNY9BHta{!g&^r%y1X5_8-MWm$}V! zI>dYdeuxtg1jN;)dij&IiCjT{?8Wrqhv+!4!ds>pGKlUHej#2YzL#*dF_2H|49@nj8>74ZXI$3O!J)NiS0TE@kB&NVD8IuFdpT;IT zlk0H1rK>QH3`poyfnsVh}12k~!()%6eJZ z9GG3{BANNHo^$`LB*yEC;;w!qiZVP{+piZqUdA7#1tO8@Atl9cnP`eSEp8*QKSUy= zptA~?0i0jlFXeXyz;GNg1P1ZcZGt4FO~KY8DYlQxbX!Rnh*ggTb0h0%=D-oLp@T8| zO^iCIjuhF`>pjS*`74^Te^!gJJaIw5<>yC}IT9S3C+*c-$r&UK24a8=E}0b>yYq@e zGnS`DyW#%N_8sl0x^~57lZ`1HSfQ!UNUhv)9 z*>SAjv-?Rmq>A#FUzrzGYQuBoW@~n?0Mu#Gcwa-7jt5ejnm|;TZXg= zNr46i*#gZHmSEfNwjQBqpIsbKHy9lqxxm95*$N}(Sv-Q>e_q+dKFq{8vO3KTrnUuj zy|Q!(p0n}?@+gJbjB=;QT{_x@LO{DeXdFtn<%GulT7k4&S(sXbT=**YkAI~4&96QU zcnMvU0CXCot5H|l+o#`^g_(Wony7xjs!zK8{xpHUQu6mn)p^^YO_x*CB~dk~o~vmN z@a(}SN{0V4^t-lp@=or#n&O5Z9rBA;jrUU;E;*~v8JK7MHhmR;u>V{BzV#j@Zi|Oz zgFEpT5r%;?#OXSi71k=E=v=ZH56f}z!pRd~@CFOg&St6?ih_&R>XeRdYFCUr0|kmw$SZIoc9bq6Ckr>+hqHnF8>e1(C>73X}ukiaQh3~ zNt%x4Du0YmXF7^OeL=UgEQ@Ni&o380)OIn9B2`pNrE{&T*OX_hCFY@XC4&(d0@`n? znX+oeAb-hMv-Ta`DVd&TcKR>u9A=<5I@ErFvC~+7{n9LLG)Z__l6vT@Op|&v2CnOs z6Bbj^gqM%Jukz;D(7KF!#=Yxv|Kqna3L=XLJWW=?ZSHsZ3<}m~Zz)mfl~UcISzv)o z60DjDbO$(R-WM$`!{$hg5i=g=u%wk5 zQ0K>!nwwu5;0^};$*@pX#r?n!9W`5E#cCE3*}bz}=Wj(h6+BGT4C!Y`>4Ocb=z)r^;ha6^KMd^SQ9)|0hQaNv|npvVV_FDp4691ULQ-wc5ev*rq*dQ zkU@1Vn#H!3_X1w5z{=bH0YMDz&(5!wfG4|rPZWEcQ?s$Fy&Gr5c|09X{#B`<>-d;XNXk5kE2vJ&bKYL{4A?u9V1ntRoxk5m&c{~YIWMa`$F_Nm!u!p**88KQhe`v)N5ozKhBO^gBL6$Pma;CF{)6kYX3-?&-Rf-PwT@wKp9SV-oU!FHgq(4mBm0>Y!5ngXot3;Awwt)Ira0?E!cnZ z@ag~F)4s}Z4Si{f77i!`D{u-p`&8V_Fm4W#Ty%N;nx?>WjT3vCTr+|WirReCkOSsK!^_jUkNycPvQZA zcMIKWZs|)@QvV0uCb{(M1hD@T;7I~%uFRm0ar8-U4t-r~RvzGaXy+SyeSho%gD!$< zVpx3(Q!$K5Xp<5qvqjEyk}r!=BiZmxhsA^X(VsXBn*umFDVDSJq{5z%mEjgj*V6z| z_-=WXpZDc0BKW(!H6Ji4X*-6l*Pd4FRUA+Da6Woy**?_1$wMP|h!eC&CY|vMLwA@= z8p=ebrkJOw`HeZ{tGr^LGo?=JJc1YWgdgN7a1P{d0rL`lnEn4pei{eWr@KuJx=`a;++$^K|tTPR$+qA{(Xi?-3cL?U|LllD!thAt6))7e@ z2#ef4Y7U!dj?<(4PAiex4N~)6yB$D)MIVRU{ellQ8efvNevyB{#(U_G0}>TUb0$o_ zo9}0lhh|CT7r=b>iJpI`7`9(Qo$ZJHMRcA?-+xftF+~UUgS}*lkJfl0&dX<75@iOz zee{M<{+v#q{J6Bx%#>gLEIOi3KTO|e7>ijb83H%rm#i2Wl)qa<_x*|^)4Se zc~DQHf`<1*mtM>SQ^v%3{ROozZ-m^Kde@h9dMW-$!u}?JkzZvsSEf5JT$@;WTu|(l-u3 z6TBFlYvpx-dpa{ZB1Db9H>~JW9;z?|D2rax;XjRWkaEieA6A;Ipp`1=>v}HA$-f4Z z18b^z(~nbIo*S#7JK3jA+nb;7x&Y$JiU#b21AL@iax9i-SszB|(Aj2rdxt3Nl9Fc6wc z5lbP-zP0)Y@LY@Wa$qw-74~`~&<`X9*ptc{S|9j*WK>UTmDRgD!h%Dw+W zk#D{$D-#5pURsu?D8E}QZPMyMZ~Y);q4marDWwOQOT5pf>9>Glw?qwoDK-7mDG{g5 zZ=FI_;a2JEZY@Z*bdI)eA!&g@a#3xB%&S3CPPx+H-?(zr$~5%r$~DY62y2*C%kIsN zFXUe(0&-KwHKHqvqyGY_9xLpuJkE`$C&*mQ9P+f*Q)Q5>*-jLeu676hS{i7@ZQ72+ z^E9}5{uM(K)I>e!dV|NM^+<)A6h+Er=^6c7pD%!%6qVCZlrK(Ug8s@QJgP2ZPt%b_ zG^u0Ym>3!3*Nyl#HJ6v_>-=lR^cZG5CulglCDYqBO z$^AFsi{FHAwu7gaO_990g7m(LU|&E_G&&Np0nmqiqjP{jJkCt8wIRJa?>z z8tTBQ8*f_4e1cOVdVA1|O;?-@SzWEK@si;b#E|a)gNIR?qenUL0-JZCuqXVIU3If{ z_vzp7i)0R;FCpA$#-2YT10B!Pb&BR?3&c-$5|WhPW$wcK4~x^qTp%NVKjc6|T3hcP zLM2X33-n0g0R7SYkXTl&*nK-gagU>5`vrHhg(S6McG_Ws!;cu#{rVArv*gw9gmY** z;Shxv?Fl3uB2cF*jZ>wsKlXLJ=S_zQ-}K1toFZs`6EN+aX{z207F z7y)^3+DPVTJ)p4=8VV8z4KANKdA^vX-hFa6&eso#*8=f@}n4 zzuJ$CYlbbA_JGc7${+0M=($(pnlcbB)UO?pJ+}T;TC(;%1TpA%U1v}XULf!OhS!nW zXyqpsv1-0$F(*0mKl>4WUq5H>M%e&!fPC=rpFc#A$@DtVYxY>-(j!N&5h6lcdcK>9 z4vIka0YIP)jK;`cjkn-3&)+ETyGz&=YI^>?Y8mUwa zg-gz`sBx(BBTXD@)Z`;3-p8~=gpA|TILEadV{TOI+|dGHif!9IjUb|` z(?T7GSWK!R7%ysf&tVKn6OcUah3ehXOG?&-IoAD{c8u)Qlp;ZD@adNnG&I-kVqIm5 zT3K^r@Fgi>O2u2$7gmaI?=@OXU7*GKFQRE=))^^uAo>qJ-+r>3o6&4ExPni1{=tpl zJ1rYm+6m_?M847U#@b9IOWAkYHZkbZFE-p?p-&Ar>uZjhgqc;UuVIfOr-D$gP$Z2N zd@0-$F{m=SHJ|Feoj;caei60G1EY zm>_EPa;UtNde`gC0!PR48{TlSE)%!P;Cp2AX`qWx zyqD(Vf2mFB>0ueDymyf=?#0;c%6QVSvs`j+)J4&yrg_%O!wMW_N+qrCQa&nR-)%aUT>)O1B1AWy_lf|tUjnZo(G3ji)a-SzTC-(5!C9I>5 z#&6I83Dcx}l*5Y$H@!ywvcKIoyggyUsGz`6&{DqH)h&cE9z*e<_RMD8svfEjJe{<< zA+JCo1useO?2j+#7a9LJz15uPYQp@0zK7iD66p)k;P#` z$;WeE_mw_-Lov=TgXSkRR!mM2ZCTn#YFjD;Y&lg-D+WnneZnv4(9M{g#_C@+1B66c z?%9z}<*($E3~?1(LuZy2fs-7-JNB+2>y?}ppF3MbF}-+kso7rBR)_wcBEbuv@R|zy zziJCqSQ~X4;TMvBvxaP-@}8Jybm*d*Y3VgU4e8(*kEm&RRH`9~uIh3uo3`bFmowc> z{sdzAjk(Z0EX^G@`jNQ5^StWgfvFmw7u&&jRvUO-_r3;~X;VA>6ulbz)1xn1vFktW zq8h#Vgu9D0^6DuK4B|;3QD6MiCL--+KWOLHvH9SQh8!I#nPKGNCf>?(2^ij0PT`HG z?yViN#iJyF1#t0E1fxd@mlFiq&?|Q%w2G+yK5%G4cRHzMhF#1)NZ&}?g;cQ&fxMy` z+MNAv{k~#9ic^5k&RCh5#j&_NcOTNDHFWhPE3j}N`ObXl>O0HyRc9*d$t4l9?<%57 z=7o2qyCG_y`J>`&`o>IrE#d1810tYvcAfTof}5~o<9pn7h}Zg+f)DujtF;wYNQ8}3 zzF7@fj(duUxEX{l3$7yPGq2ay^zRxpur9r>he|??ukRM9;IDAjF7@T^7H^~RO~1nJ zo*7Zy0n8_suiGHBh&(_aObsWe9RDC6g+AAszH|LXkFh4fPOFic;w|{M9d*D98(ZEg ziB-p&(fKcf7+`L3Gz+VZh0qF?HlUkj z_NMiNOZY~8QQ!i+uMz8=16Y_Jc6O=)hBwLc3deXVuD+@dNvZo~8|%riFQibwESVWz zSJ`quR+~Z?F37Pmug%SNc)$K*Et2DXN0o9(5wV{W7gn>(e%ia97ja*?3m=-s!wC7f zUoR&PUYih5ri7c!8wLqf9OxNueT?U4hSX7kl#b2g#z_DE;wM0?PKy9lt*PrHrbuD2 zdJVVv0m#!|0EJ=CvITtcoxqo!5$S`q!W-}3GeQyJ(*M31EE#L|Ic!+z)fWg?_CSMx zf?Tqch|s_vs)j(}OYtY=tv%#8+j)IKH$9#s+tp4Qd$w?HOm5f`di3WTU2 z7s0!gsDxBuFC5xbN4{)5okozE_UZ#`yp1gy*+P%fJer*^>>O z*vF33MKj)uC!EhY<4SQXMSTP&X`?USIj?=)n8(X|>np+ip!OO{see+76fTgXFdMrh z*O1jauJ_*}?Zk{4Msd-5asKgsT6QtAx$*SFb@M@`Pu5*R845q_jI5%JlVI1Gy8$^aNE$4Fq6# zv2ZBT{nB0p53dG8$b?dnK$(8w(w%K9GhdC(Grl-Ax)CAz!CgtA85)FpRlkD|N+7yS zKDb{v?ves;@qE_pfb)7ASFOOyJQx~w76ZCp+>VR0Zx`qsL+9`o0dt>wu)h<1+)E#Y zv)lWTk0+SQ24kY!)))l7H|&O9z94erY7wIez~^7`u6gbjM|+G^JYNf@p1?xK%9dm! z^G51(Uv*OQ+s44du=OTo{b(9KBh7ekGHOmhl_hqk z1%U>!k+t2{ysKpsKer4u=(2ftzS?Od^kiC!+!ScfMg7cL!Fil2CD#_v$>4_$R|y1l zQQl~AYJwf4jho5Yk_0e{F=eJ%hh*0T})WW7;?IqK3m$-x!(zd5#lz>DX zcb%l=k$PX)7#C0YOMJ(&9asR4+^_v2P_ITZdsCwzNIL*tJPeDFlI%H_zjfMcpYR5` zXtCd71yLP<$2_oC$HvuU{J;6Zs)bw|_Y;-Ssk<&h@Qw#>TY}=o%`=DxvqIb84fgIW z*h>Hwq6FV#xE-7ByT0o7iKNdP z`{kk@JJy6e1a|N;7tg6(8ittGWlyp;MipRSx0=Q>6A^BaQ3Hz+IiI7Y;#86 zkpnwE5{T8K9cWc;OBx`GU56_j`kQLe8B8=lDRGO)nNQ%{CvI@`rv_sRzoJ!L3lC-p zn`We3ozEq;ALk5P2ycyFhSy+Ra@y^txIDG2r0+L2D*k*7@Yh*gP<)a*mX5aX-9E-ZFWb}WbygfAv4#tsHl;yC zT61-@So1{Gg)|z(vE$-)7}^5H80!FT4P+J<9{a~7ND&PpyOtUi+Zsd?B)L!49oc81B?r60)=lhx0q18 zvm6;>;q)b;FX0i>NBVkt(!GQ-w6X;IFWxxAq}&1^r|vFrKTu%-bIe-7_Bp}A<_2vc zx{rcC<)#1h<9Cs<42k#Wh z8z61+{C(-kW?K6;B1^yXguh~(Q(5-CoNao6x*gG`5{J@%`T`9Vkdg}P&kDh^c@+7@5Dur$AeqjrUyzp%IfO$ zJ&V5VmUuwx>>xQ_zg`Gh8={1xW@%~J_x3B$|6MwRjQZDEAFpT!>-C0C(NvO0ZJ0j% zzyaeI(+9TDn7tRAO)}o_r_ba-xy5J5` zIG#@dmR-F6dx-y9CS_hyi};@p>d)HI8U%%D^^K38}Q2rXh0xwUY}K1F#3F3CmkR z1b}0=|Jt%NJ65SUX|PQEvte<|h7XO*&LmRa4^ZX5`KMFr)q`B(u1AR~?3*KeFFmJg zsORm06|D4-f|o^rGw(kziC2Oxs4$Kr7#VU6F`JC^Hwse*f7zb0g|wWel7*L_A`UKB z7zKUwWO5k;E$I{ik=(xZq z-T4StUMH=J5fduY#IEBzuojlQeuH<+Nxc)Ns8|2U`I*-BR;*73n3tDNq4L?6iXbgi zdCM0XzDYr)=r%@Mcm-l2>qG>oz$AxqlvBU>XwSUQ6z|@gL`P&j=Tn}9;Pw@Tu3Xc) z*(FG@1tRzTd1ZbZPX&UIek*-yaHanJ`rNES+*ILs{*PwIyy-_KYJy>-5LzV%9-WTO z7bp*o?s_DxY?89F1p+(O369YCxKkjhq zup>}aK5?ujEg?LZyfe&@ke%z=&T{A3Tj}dvquUCr8dI%Tb{l_3y0J`|AF2{+@_vkX z6tMW!TjIkMAo*UMvlWcSf~CSj_(7F3+Y7<}gs~b^Fq{ZPk@4_1x|XED7>$d4_e|+> zecD~1Z|u5J)pAxXTCYuHodx8^T28-CY9G*iKarTjn>fKP9T2Y^jA#m&9kjZ>cQzw_ zw$ldu@8z2JD2ADi+V7qCi4{!K7lPKKN8hO^568OJKXLDJ8$N8P<&)F@V{)Wcwa~Z< zQwQq<4ORiDdK9{C?q%}Pg8(2$=` zZ2Q`)b4x9+48FpL;T}iyO1R8}@d)RX?hwg2QFrJI7y5g$hxAJzc;#@Oq?(xF9q7AP zP>)6crgYGFB*}s=QE`4PAT0kDg6&$L1gKY1^NSQKWUkq(q^JzPmIk*Crd<) z^C)3c6hqK$urb$Q28+h(CF9q{c?VU`?Y`&!UJtj3l2A2@cFlK57?MTZk*Dm#7|+Lw zJlxO5LDn+|-hcTW`fmZ=g)sx@oZ0_fGJE7XqJni^nk^V7{|1SgahS zh3L9b*G=Cjp9S}=84p`$e7LXD+bCVaFFa?%@Z7w$#qSumnhT}%m|atL4Qcv%f969L zys^^9d zWrp1$0%Bkg@JRSd2AF1z$01$EE!SHA(6B4|O8d7WQh9H)tlzd2WZSJrfF%80DQ;j_ zNVK>|KskCI@;H?9?JyC*#HLIKu3 z{d6#O7Uv?7o(6D5Sps;WixXfsKm&)D@36Aypw)zHys zR5Ch5b>xt*imgW)1_ zd!ebr^GjlPx9SM_`NQw|Q+$S-HX8S=Mh$d!4p#hN;cDDihyUrlF~{pl18EHkm=Snt zEAvK}0{Xf=B9b;}|8o+)N55$wB$WPR&`Z z#*J+a>MVMl-O#*WME-Vf%EgYNB8#%^r~6LFfHECOXeGZQwdOzR6HV8N3el{RzcmA0Sajv! ze54{VPOBz34vNsUVovZLEl~*yzMy_5P@F@8yRV>fWFDj5hL$scJ2ZrxQ6LCg1B%zrLD4F};+XXExbo zne2n0ff#>KKJTGp_dM6{qp$NOj)nnWK#f8s1=WTfD6Z@_$(+0|v(B*~iI6xoWp-*Q1E36!~1)t8fe4kKeoRMC_&Uz0Stf)W`hQ6GMa-yD;h3TOPCSbp9wrFo( znERzB>o%QHjZ&M}w47|EL_LO{fIabXpsv(f+BMNsf`DhA^!(cM`R8HC`4St5Twg<6KrlVL7iiO@$$|end3M*Gu zH=xLkKfA>wRP6CzqnjS`07oFDDc{_LA1}xUp|P>>a?AA__6E5be-b>>--p5oc9L{h&CCyb=_?lLDPZsuf2Jf{~dl3x8I zJ_$ZxQ4>!S)U(Uzf~t9sLaoq=^EI{q%2y(X0-|p9gGSmn&Jcc+_&TQdTbL^U)t4+M#gn`IJq*AjNWc(xbzQ~bTrO~`5&Q1z(``18C4CeNE;6yh5cK8SDM;7R)P>YyUdX-yr3r^St z61^*$b?`NGIPyTO8CZ2&&~gA86|$Xh19oy3t})bV^GEgwu_C$jcd7k1p}Gf!jqG^Q zQSXOUgg&FqUR0fN)k_^g4-6mETm`P576$5~GbCfEo-Z5A*KiOlbTk{5wW*ho5H*AT zb-wjEUD3k#k9dhX%|dMGv2?NhodRS%IXosE*S$?{pE979A-OB}qB^E9O3`xM| zVx8Av1LTA}h0V~w#MAQa&Av8tRnU$#((t76gxt7>tq=UsmG8a#C1i6ZlFd66ZO+dzNwz(lEY;5OJ$7yJGpWi!-)U%S3q1=b0n+>jg?9s$KR*P19JOIGSKhKHS@2W_3u zT&OvHu#qc4+H1VLNFA90_Efy~;&ONNDRk(}CLSOF{*lPfXJv5tLoNs%#6Xg{jMUF9 z&G6CDh`Qz@G`6IR|M-Ld`1XJJzCXvZO?);YESjw+`;NOn^$2Um9bid5*Q5(zQSgNP zZz8VvD0ZP6wnpX~annZ(GMu*jqG4N26bXS;L)qnSr>< zyYmP1%rOl@sbwl~>9Fol*t;3&83JB~bEOX|D2JTI2>)&ql3Rpu<4@`#9zUUPPoq`g ze7;ty!AupP;zs2Ks^L9~-kI#9>+b5gJExB^Ljv@b4Ybw&f>&5RDWCWUxww{0%Jn)i zA;`=2H*XHQSnMIXuG)LQ3vA@7j=-^7bqGhaSGMxTMHj3qy9na{RRjSu_(c#}Yg~g8 z&=z%%SnJseE1eO=`gkCL3CAqqO#wqg={PN}-ZssY)T=J~Y$v+~brv;DAP9QmfV+Uwf++Q!VJs)9`CP5k@$?)tc_+_Iu}l|cD|Fi*wU4> zsW^Ya=q?>Zi*;%aCdubsumx~T1Gl`+k8N`({XPZV8)+dydga01FDS&R$n*PZ(A~JALf6UL}xXOYXGcl%fbv-;d zsJw41R-SGW3tV%B#_qEhA_I$B9$)XMfeC}7GZ-A{One&xfxXY2oP1tC?Z#_kSgVPn zWe}>53JcnnC7gDlq&XMVz?*aOv=7fT05d~jgxhC<5Mev;j4T*9o?TQPQ+l;&t$RlG z96?o?9A@7MKE2wlZ}F&`?y-_R~WPuAptj!m?b{V;d1>HG};M z{Dk5AzNy~C+$U^}&51L+#CJ&cI&WeVq<-|$Kl2EnDzXFp%h~bRrqk{PrFw+G&%8}g zaqX=H?8ZtYyL&qvz(KN#;I18LHESdJNteztI#7R-1ThDT0f3aZgeD(g7V+!a$}qI) z_LALFOE!!;{uLY@PV`Hh0x^YrQzK&;sheP^v9F1ehponq-&)y{Gpu+;#zC2zE!GZC zyw0nNpm0|cVLMLTVd(|6k~_bI5KO0?Skd_#{>K*F@2b_RnuBoNE+-$ejJCTp!TZum414hJWrYOE@@Yi z9%f`sNMdz*T`@hbs8;eU%m(P%%oR;8zv3Q=FUfX>hgXFlTh61iLwH%B(jI8)7f)ly zUuA2G8Gx)i)b>y-q6^E>8p2u)E^R&F#+^}I@SJ%$8I7S~e*gSlH zC&}l^YCLQ)QvcxUIo`X5Sswp(1Q#L9V+vs&=*Zk*zMBWgSK%g4TJ>Atk6RiFPEO!n z5|arakTQV#02ZS`35x<(_vVl+h!%6aCfkj6Y;{f@)nZm1nU(zO*EeJYi`Et zz|`-n1?13!c=WSgfd`PT61|!7*6#$&f%%tP^jd(HyN)Iv)O-H5j#`ux0dBwZQ^7}R z3k3}INuEos_2wwNYz}I4i5;l6ahs$-fjo1UT@lAMfp{HTJiwCN2Xtrbscwu z?3kk~8N)o+u0%*J{c*$!rp1-KRT!O}g+)7sdGFq>*~8s31wkQm3!epY`8(J=8a=3I zVBEaRSm)Z*Ft$w*v6a+lRG;_2^zeqz`31ChOi(F^xWP*q!l54p#6{cik458;ln^(u z21UZ&ErwdpBEU!Yi`5%M^Bti}rx@OkOR9QLq(XqyEb$WA_P~SJosNxtrsGAOpr7;B z(P~Q$0zyE)b4YWBu9eiZnVme7yQY|*5=8UQ9^^Vhpu=|Xl!_L8Pe`o54q~ub$IEZc z7q;e%k0_oqZc0ek8iuq;D{f#dsHEoFI>mFqHM;y~k z;Q-In5+1K_3s!k(w$OS9%`?|D& zPm%>%{|dr>?*8ZAtg5rmz}S5NP^r*HJl~Z938+-n@9j5iHE7f=MYkXkB4!CBbfIcA zmQd890Uq_V5U7^vTDo2n@;>i9mLILSAF|Edy6qD<uiI zun=3a5k9P?A*&pcv|kO~LE12_YOwsFD8_DDAAp`8G;I<8kK2dA1;K!Q2W$(1IzJ(Z4)dn1r*d|p#FE>(kJ4Fo~7x`w_S#aeIKwbL5~lHM;B zXZa&THkdA@+F{y#dXAmiDa~sEp)^iz($N)du8l{k3 zO@jUR(%)$fs|#tNP?8b6|0bBl1$P!p>!w+AP8IR>ZabOL{xq)Am&&M5>75?+fz#}s zH_8l=!cD&Ti=bl|!1eG;k!iEcG?r#=Qn*f7I=)MfT390jV1;M{-Wgb+h(bLgP@xRZ z7vhiG7{E$>dGmZdNL|XzJqeq5%hYCgn?5iM3W%}!HCms6#fbD+M40E5Dp(s?bEX6XzISc9fj}F#t#CyOnE)ZNN zgmrAkOO%oR(I}O_D>nVG@LEBzbOW%kGko#%a{SK-cgUVQ*i}K7gXt6RDl~WOs@+8Y z=NVX@skBY}H42ayH(UDvC!u1eEiy48|Bqs}A||Z&R%gGr7|~Px`Izn2bawl$gu9;> z9Y~+vdtcjSJY!SKSh4{gXy#$+{`4ZSFXF0eMQW6!BeN);IpT(=TC6oqRusE>Ge`h zDPkL^8bGoEWm=ox%M+05$tfW^|XYjLrNJ>C5XA5C=*LezetmQ?iS&qah^8S0o0 z6ly3I-XyveQ9e`M@Rn`BBzbXoOAG&RK)=GrPdyzs@&e0p||M1DO8mJkYlX-51@sr*&(6s=ooaI?@Wf zRnZp14|y3wB5e?x3#zz15t~5xe_jt)lpi(wZA4jJxv1c4?D|{r1_t5l^9a(|)bAoU z_%(HAq}C%WCSE|c>*zRH(iXgBq@j#J*SNXGeK^u>wqquU&B@gmv-31t_wWfwDgvbV z|E~JII~CeqOr&ELLD~{*-HAY%ui&_w_CXZbU`ve2&wC};f1aGu4e=tM;Mq8XtKM}R93E&Z~6(y>%@~6@g_hA;r zX0lUuJndi5yK>mXX7Nb)q@1xXzobGbwX*)-A2iN1ps_R7b^l;Toy9E$iHAjaSg+rF-?XZo^h)duEUQ6671rw0*i9E)B*2gKY@V5l-Df= zGhLka{U=?zlrSf)VGR)CFzQee8y{xC)6_5MK;cq@Tq76lYG4IB9SVgUcHvHG24!L@ z%hn_RykkUg`TWLcHC8ts|fEA>l=Qa+Q_bS+dM0AF zs{P9Wh&&#Og|q;^=g~9Iy#x!b?L&?egqW2paG9U!f;(9?vh62J354jU524<)&@0 zx1PAU!ZNb_AQ~R&VBLx@3tbV_8-SHr{q5`b32+b9^%_iA7++l^Ye><2eyXtd3ihks zIz!24P4BV}Iy9MV!~) z@{5qpEC)p?t8jH7Pyt87s7q7~t)OAw^+%}TaYOKk4v!*`AbhA6Y@Ggf!BO zx{*XRN4Z^$x^^OdIs}y(E}flq3_?u_*?W?Ruz*j z6QRr$K4f&spZtt6kYU(T-RF|I1*np58Zar1TFvT#kL!bH9 zP8iDPP-#*ZX0MbZ_w*I&t!YB5a4#~|m**n!UeRIu_qF1@*-F2-I)wFCp&|KZ7|o77 za4K3kxMB08$W!wu_}OK`-Q!}yPS-j^L1A{f6CfLt8>1GGjb5NMKDgtdL+}YOfZIfu zdmY8GSE_yys&oThe{{|;;A31m^j7)$$sNEl$mMy4MlHus*POwI3(h*>w_w^azt$WJn=Ms^v6q@AxEaZ$t zDJ!7c#`XKCSpzPbD&sL!(|wVmC^uCsQ>|celZUxy;P;f>5;pq4w|5~dCr%|zbk1izWu_eyz4vwiZ_NXKgw7gy2g&BPNa~$WB0R2 zu5fp31K;$*8xp;$>w2FX*eI+%I;sM&q4SpeqBAI zF2quwNsGI=m4b2yH09z)b;fkBp+wE3p&93d;eY$iH4Eoln<-_&<>!Us8kEEP2M+x? zaF%zthQnA>=#=xY1cAg~nwv!tlvFr>Q1t_4cUI=LSr!d%l+4DT5)rYNc#gf!-3W@X z6&%?*;_=Bp_qRk9I2RK=8Gst?$dYW>V<9`MxCK7Tw5hAgL3Ox%ARCXQI(rDozMhT8 z9{U8@73+%A{w07PGnawc1p3s`t@jzdf$qRpD=JuW%1-ut3o1wUC0qbNh)Oad9(z|Se4qZ*1cQj6%Z3|}#h1ELL z@#3{(%(`ANGv6`wTfsmyG3DX-z&_-I6ya5M$UO9ak$D;l1Cpf5G&Bur1U>yYtfGrg zw7J`i-%H#D58{}+{T?o#vkEmDigA4~l-s@%D7|kn&1DJ6Kd?}lK18>k=f`$?lNnqg9n?eL6D9XBJF+s(x5~3}r0ic?0 zuq`U+AY@YbEuVF0I;98{AIYTtNv1R=l56?`^V=EY=ORtHQI0AQ+nWm*%M5O%0;9hcEVm zM5qsl6;V^W{KQq}Ss2?%3({WSJ@Vf53)H1eT6}*>%Q0YDlHPEN9{E076iNN2+N7-w zAXANF7!D}M9Lh5vO>+JcG+OoU$zPMo3yC8_bGe=Uz(+H>|6XoUDh`oH0=ua|_SV7^ zKX%?mct8|8or=1{PgPmJBOq-M14~<|t_Zu?+b;qzG*esF%nm7}q$_Jj`&=|~HD?E0 zIr2;C3hFi;M}f54x_Q+7&>hneG68$CTH*NZ=ct6fxA*wa|0NF#Ku#GgJz%Yu0~X!0jdpk zMkOa1hX(I|`M+%3sMx=~!vtFEq6{1&^o50vRE}exTD__q5JeUwk6yMP zT(OSXQ7}FU%8qnk^mD3dPU6GRM_dqTi@NoLC6R8!Z%VLVCk319wicujCIkmAR{0jT zJY9$F*Jqh2V4U&acg}23RQI2$z?GIuHuD9S;Hk+f-MkEE?$?;fz1QH;!k^HRcHAsh zKlj@FczhJV#-3=FADbnEfmi|V{5y}1C}i`9cAFWqh(4`XIQtVP`k!M%wO_%h$~(9!gF0otgU1!b5PDNz^wLuN;tJPQq!AatcIAYI*vEi90&K@D41NEp zvX^=thyfBXc3B3y!d5CJoE{Ax?!6F0ah|qj@KzDso);G4ORPzs7>49=s)@?M5*Tgj z9H@=ZfmO#I#y7Yk!B_1%2$D~nXP+)*u`&;`L z_)|`qHRxX*9umJ!f5Jx<5+@tVkwRzQkZY?b=lT-R1f`Z$Y+)TbuY}encE);1&$V+q zrv9;#IS|#bg>{JBY<|9S`CxA!jvD$`*5pV}T#xhY@bLk)T5p>IR7tQFTGRu<0fwkC z>AeaCF4x@&fl8l%p-fQ+6-4Ia0$&~)ft^m$CDHE`YQ;z%E9#)rvC+(kOA%>50S_wH z0CJi9!4?R1IOFJESiSJe6sk)7HES(foh3r{YMj^gd9e~6&I(#NWVEfWKlQ_IVuKef zsk{dZOM_rx;PsKi8U`F0ZF}M;qG$dPzSxV5U9uMX1vXhvn0AWbzvrWDlDBFR!DAPvh=U9HpSqMEZfHx*-aAVG2Z%c= z4p5=sQ@KwA;@2e*y%3%uzHKm=9eEut+g7{>`<#JHf|)TOFRf{McHQSsX(n^RXxD9j zCV@u{WSY942XMlM_J6%(UwF5El)fc?Ms!fgR{5LJb7_Zx?JTb@dWb1`xdya z$#C}n$Qo>18k9yFHOki%M5q;^{y??3qH>mP6;J*5foRo*F|2tIZELxa$_fi!CE2 z7b<5t_MH4d>_T7kljb|`ThivhhR>rYfk72`#(4&b44sFRTWp5SUe74v?-sLK7`pQO zE8@%R=1+Pn=G*T~P>4*hdz(OeXL9{uE5xvu4x*QXc7Z?YTiefvz1CLB?tY2ZqM+>)_}Jst$wwwPo-q^nN{s&q>z!i z!ul4<2DVj4nr=q$?y&Gh_igOVfP}EUuM@V4$EZ~mHmCg|fgAO?Csc|`nsEq&Z<^x= zI}O%UhRALd2g^Mk$0MacOjVb>uVZx4nto;Pl2iNZ0&-T-E^OB;u3u)*YiM1Rs0uS+ z5n@g{Y!31bPT$;G^kU|v6~#u89x zziWyDY7ypX5jfhz>Q6D|j|wn&MvBK}Ge(gA)qFJ{F+VV8%+@MCTgGDhmVopghxN|2 zGvLO!gPX=r0R{~5f9$=GzMp4t*5F6&XWo}N5Fd_gn_LT{bOYg3BXz2;zf2*45ti6C zPfvPb-}G?#VU^K~E10(77(*xHFgyvfRgdXo142TA95o@H;~xCtddb6wpUi(?+j+{$6)L%ux3$FGMBqq znh3%uY92LRsZfF|rLv|Dh<=+9T%Lw?MkprB^q881G$|OE%yZ18eH2B!{(>Ru zQH_w*<}_=~o(N??bGDu;EENTs&IPiR_|b+)zWezC4ryAD#+<^5k;-Q~K~CK4l6yb9 ztwr7jTo;PLB=9Pv)1e%D5C|~XI*r0_gXc0hR8tR8x8QqQKQZia_Ce3iUc2ULE<h&C&yx~_>N4h0B$$Z8 zoTBi^l?1|fQ*t;-zoR`U(c&@MLc(yBtH?dx3Gis2AhT&kkOW|=n{|pCK*NSUSElD{ z0NX|}OhBO4!iwQ1{Z5b&i2Vd>baEG4$c2MmGR8FVf)(5d7+&RJ@FnAsl>B?ucbUJ+ zd$@hM%2rZfIb{)Whyh+La-_wwo~L@&xxk4Ct>rA}ydwt!h`T`cLTPA+i%vV~P}J=s z4&uo^-O8G!iliC4mFnIASB{*6&vs)52B*1%gRPK>ljY<{J#k!R9Ytpg31%x!1C!wd z=_cCG1uhxM9PqKGh65}qw&cv7!*MGzrbhaU$F5_0J`ezCG4>HOzY8LOfukdGkXune zEu(Af>=(>iM4jklXPJs>q)`awcQ~_QNpzB)4O5XitLY9PlIa|UcebX7XwTSnZ8r>R zi?E%;l*aUev?5S`f&(FKo}s{f;7CSam)B5kbm$79YKaP6;h+RuprL$XM9+z|mAHSU zQNb+kiqp2Iig+8$HAsrt*lD$z+ncQIeNqY-nruU1f=x1Dfma5(t?LjRJ5*l>a&%=| zE@bN^txg{i)0=9;Kr=|Y*$AZk7U}3xHP<$xcIi=ZNf!YOo=nM?Vb|7aq9n@5bnZRh z%xICwl3eDbK^*-UrL5pB59HwO8rScazxzox5HxdO*ItT`S4Nw1AAym^U7I>exC6w|`^IF?gKHozv=`=o>142r!ws<3Jh8+^*Gx(&rIXaVt zk+k2X$7dbW{%`P@*T}Xv>=qwh#q)eyBQ-z{c<5(gU@xezmmkj%5%b#r0-RxXe-8CK zfH>qLe6|vcm*uv^-rG0E6fGNVx#@RgqmhVfRYxW>&gW%6486#(dDow<`}zrvJ@dbS$#thZ z4giVz0YQAu!VD}Ay)ZcTO>^#=IDDTIzR4VU(4*}^&fOEX%L1l4FTgz zeWCh<#B;N-XU%wmf@u{43>-rz4XAWMEdqSXJ8Dy;-Iu9wKeKF?Zv$dh;}thIst_A* zwDB=N;V+ac^k5({VUBJ>wV9n?M;7#sj7dJ5r+6jzhaP)A!6{iL9A%1aesb_j)&a#TQ?id}r>^+4xh>>!+9jEXq&JPBKUzJ-+sXm42Ed zq9L4A7ZKyuhxrUNW&3lWZcSN8#N6>47?zs(z2?d6qVcP%mHq&r8@V&>h_?f)`^A{_ zBB5TAW#io2`vGz$4mSzYqOB=R)-}}FUgm@GA?VCGmo!-^uzxldgqyHY2>>qyOZUQ>%W;q zz(0ZPN<1&v6lwdL;Ap(v?HiNwE^JgwZDTBA#r}-UQ>h*@`l?R6y8{IB znkony@tb6_wuHR_t5_qAg!2kXdNE3;22|ZX!#1i+;$E4d5yU<`*u(p+U67NpgSm7Y zR#q?k4!m!pX|%AXr*Hl-S+hU^Y(pW2AF!0}f};eKJ$2=Zu?!&cJ;OBn01^%Hyt18S48H>;{AM~G4G zd7q{~RZ#St(KImLZDKi_wSUIZb6jaJVw;{Aw01OPoP{?p)Byt1KHUMh#dq`pYQeh@Z-z< z*qSKe<{%8XjP6>+nQP-cSuEL6j|t6-V=O`_#v#p)W(oz+$~@nISGnivx>Lfoj=HM_ zbC8>wQ;}vEDaVLfTSFUN+k*<%JjR74Z*XcdG9r$OsrY^ph4Ye91l~(SfuwGNM60M# zkH9Y!z>?D?XFO#PGFl)%5a(2KK{7cPtU;)5sA8_bk1*yRM_v$=2tE8mrF|Ua2$PZZ zk!-fWJ$wt5sn#ewd*SnX9cUam@ZoKMI+TVANh|_zSM!D{Z&>B>^I^G!Qx0RLulZdV zfP+g_gzOnDT+`G$0W7y;jug&Bw6{!2EhFD37MH-mf(nOHyU+ftsm>;*$RLxagh6d- z)N(R+-3NM`(@h{5m_KQL9cw!-U|k!6BHTMfO%2Oz2MdGQPp1wCfJOh$6Z<>c;`BNW z#ccpZy*uSYBNlF&?5PqfX#b@3L@fY6c<8YAEjG69M?ECoW?D%d^CfW5z)+mtU7@bo6?4bLWyt}A}lgC@3_dNm!|70OUR$75B>1=y`(26 zEIg;p_Sv_YVJXJPPUpKpWVkk?NdcT%k#F&F9{7^#$9I6HFiD-#?pCu@(pVI?WbEA| zHfb~@%$uaC3x{D^AN^vSN+Vhy^+75_&6}`95aGBTqO?H=&Vk5q)(l(O=2)duDqvip z-e0k}D&=Fa<<#UWhcyc>kw2oIDZUa&-NqoYaaVu?T8TPqT(<|3K=x6@E z5HR<7GDW=P4$Efyf}>j+>y+WhL~`TD>Me{Sly6;A|(KT5Z7!D|h*Hj}5{jswa$pZaM18U)DLSuyN zoa1yeTgZ`U-6m4`_S@t|5xSiJPKWQv$_31l)^}jl6A&9WYwiKEsf@BRe<{XC2gv=-G%^R>oA3@d68;F{NQtTm@I1Gs$!!S>D_x5~TJ=H-tWV#iL zb4>!V-o>8Qo7q-v$j50g&rKYt(Zyn^;ki{$N`hchSSEs{GOe-!%tYc_gnev)!%}Ie zj8|4ISh%j?czzRv3@9#XnzIX#mupN56M#f7Yg1RkL#sg0w55hl;xj^mHGXXLbK`P!kXKH>lCA}fD`Q~ z4ZUfByW4%4!$j(T7RAj#&u{wX#UM|dK#7@!`=%;-bjwB)6Bj6>!qpx5o+eF@3HmoM zBmpGIS;w$g#}pCtZ(QLZ$)JW1Xgsp(1~mjYb4(0#^nJh7{#`(qWh(9@&@4=On60Fz zwMHJt{cm;614PuM<{=AW27f8ktY3z?np7K`Cop_Vi@G{Fu)w4(>H9HCoh-@!-J?3F zzQBlnpLbl6T!C8Du9TcoDhCi#Pxh0>A&t!O#73(pHUZ6PRcxkd{Y~s1`S^ww{!=uT zXY`8#({r!&&+2Df8b70~1fnz^Lim7wfxhj#FG4}Xfb9+mEkhinr8UYMyqvJq+YtF2 znH7?z>$4hh=J$6#2%0_ej57g-EgHLe4O;*x^z4sz`$EZ&GEOMgiTCKWFF=dl=WOkY z?7l`=ET7?5?Hlf6Kw0*Fol#M&Hbg|GK%5te7I?|Y3hj}5#nybr`_qJH8QZ#mxE=(}#3 z4|A&G$?Bd4tfvx%I$5mWb(eGs}z;$jF!i#JI;PWSPgR*Ez7zmbxJ0 znQ4+&)A$Q&mr_Y)2v9prQJi_%1YR_*PI z*vPeADMi9M(W{Qp8ETlyhAx9+jtFt8UjX^(D!5k|di}dxL}LCbP(0j`+HzafqeDWO zvy#9&^jKawaTJYY0HZYGhX0OAaSX@=7IpQo+^Shc4o8-%{C zQzR1}1A{MpjPAhHD>PBBCh&&d7agN|IbgKR6u^T()14NlpBnRmU0t+3*^c8tWWY59 zGUmgQIX%yxLyVAS637^4&$^a<&)uNkbMX*V=Ro_iSM>`2oDylgHz9%b^vWgbD3TS_ zOOAeW_@{|;=aFN|!y@8X$`$!EJ@M5D$D{~+gd{s;Ahr_<0sS{?1>eo2=U~srIKX}4 zz0}Ow5)(lpV(kPaIXg!%O_ljCq;az{WxBVr0&fY8Yz$r9K?Gz(&oHGflxVDf`W;)` zk66!wVCxi;PfchIKa!cCXlv=(!nk)Pu)%+2BC#lgg>mD*SSCV=$0bP80Ro{c)L#>q z{_j50YP)ZMI;%CrhLh@I3Pg1Y%W4HNH(-V0u-(N0C3#5bO_IQAs-@lD?q((z5DN*zKNDqc&YC!oMV9Is@?h~ZXAr6*iUahaT8yt-bHXtXmWI1tefrhQ*|1ueK0-)A#^!BZsQnJ!zIg3JB8=Mz!~(;R zxT)~vw=ztAL|#0~D|jm8BR@YPY__#mv#=A?HD%XqW|{eR`%DM{@_9@;t&DA+sEtE=mL9`RGnEQ;20 zm2%G5{l1kmO*3Nw99P^t7@4-UhRA{gAd}aok~v86an$J{=lcvx?#WI+*>(6< zc5;k}T>{3!6ggK;IGj0a8?w3SyGhPkt=K0`UqZI`>dOGG(Gk&{IeG>cJL;~YLR{t~3c(mM2;~!}JQF-Z@N2pxgn`^=9 z5vBT&qre3{x9*9nzp~RwQdBLITT}?}r(I)=ub_Tnm-6zkNm{g%>g}KfZ>;fC0t?84 zK@GNA;}-hwQMI{|M3_uTBu-iQLgbcfG!Rg{wrt>~20;@pJ4h7L&HPZ5rJ=j^T(&kG zG-<4Vu_H&UeuL%vei^cx_&Ew#?ty}Uwuat;vK!-zp>e6-Ey zhl~C85^69n8lD2OrH*gA|I}>SxC#;!^jEJ$Vzs__iE$q|Zf0enV7D3hh5Cr*!fwfk z;atxj;|Vng-cbrakTS*^$Upl*Hy@*x$|_X*z5jAxK<=|0zei0W9K!c^X6?ckn3=&> z?Sxx}>K1@t(vosZ%tsB0hVUn2j_>M~y8^w&MI*VFe@ZDzDI*$iNMAkQEOsHvDZ!<^l$NtO?Fi zt`ud|44ww&sfw#?cyAYf_FZN!w zh!WyFbc959sp0xW=^8z6tnOJzlFg}(ghN6C^(@h#+L(Q)(XeGQgKm!DBvB1l%&3wc zRLMg}O|bIqg@io?`s~eGn%CE5c#CN_Bq&1oO?ch07;0kW2yO!_qdT8X4H=}@rsn~N zTOBzJzZT!y7O`cGVKAyYA0)0E_&W!F*vW`cyc}zstFtz#V_R&HHw}*5`Z53^OlC6$ zRyj=ciH|J*QATgKh&XGqFO=CesWm{`r}O-!59bg!hUDAmq0y<20q^(GwcNX*M5O(a zjuXx!Gc?bCKj?C*NBDUnFiKsS?%QL;TAKtr{8yEpTv5J?$eUW3qXuDurGqT4n5x@C zqV<#?cpLAN(Sen5nGuwxfN8}+iDX=LgSLNDw8X(!k) z6cvS)@BIfug)CT&wQ|4N6nscD&CrY(7_mShb8FJ@3%vo`7^-N!pD#KZnln{~{jBPN zF+{X>L8rjz=C4I8V%+U==)YZRJHbgD z4@d*#-QR&d0N6OLvMwT8O7H`JkCLn{+b>mD3#LL4Eo9aJ1tr1?2oFBHqS`u@ss^Qq zU@g&Y+Pqd}Ao~SEw{qGX(z$LhvR@|^=0`(^tv(KxFjYq}Wr-rqR(1mgxZBq|_4b)z zHh*X16sX|Nw`@yxqoI|wf!@@xfKEnR$AsswO}tVe(gT+I#ohzUjpU+_XFb1=y)XzG zHB(BDjeGTykr>iPcfA!;6KhIFhF+PG4FHYsFp>p7Ow-H)qW(ka5)q6eifNjWLh0M)d94jG*L76Ulf3we7A_-Twtq6z`(l8MN; ze>#XZ?NpQR9%YhRH}I|oBT*l!sxy0ODwut-0|+HU3G?hpOwk$|u;~k7o$@L-A-5=y zUIaOKxoujmHgufU{X01?n2rAiUs-~}wE8{fa$6Dxfq!I>VeK!gS6c!HHEUo&rnIQ! zM8k;WqGKaw4ucIOYkX*YcI|W=fHZIwz0%}R$F=`8k(=jq2IHbhtgM@z}1Qo5iE9B|n0zQVTnC}735Mi4J4C|^g4 z*5W`s2tigcWGqzcFw!9OWXO@G?dU}#9mQw@l_x?uAB72?_rI*5%g9nXY!~fX_ru>w zV(#1B^G}) zE+s`+5uQJdgGCyQCFLSD#V#ozcta3+Qp=BE3Q_hPMh!A!E)!p2)q^wL!x9%wa+Y}l z&CkFaWA2Re*iUTCVEW^Uk2o7!1*RA$5eC zLi~wn9#|;?aTp{mpK`BHsMN*d*@*@ZdRl>bQ>qNZ8o!2-CqWyR^}fy-@Zf0bYICj` zZmc&^!fA|gm(ETZJx2hDr2r2l=BFtmuX?@I(ukbF-@6l`!2`$q{*$xX81Fr}9{f@C zhkx^eH+nzMmLg`F;3@*8aZQ`2d1Q`$#=bqf8V6T4Km12PRW&tu7a90v7cAUKO{${$ z+!2J7YlP+^uKj%l{<2J~>k>P9CSuh3>ldzG={wv49y&k!fpS1A5y3a@P{Y;|F*2(O z7OWv{69h*=FcIrhNNBcf(FH5HF=na3}q{&!10t-ZbYVogWGqg$D2UrRRCGXe4 zl#i5zZ0Ns8P{QN~KoAe>HXHo#NX}qzp2cGJWCydsARkbj&{z&-;kzp{5EugeD$ec9 zAQn}ve-=N{4pIa_Q5aA()^}J(6{0+!HP`CUf|E~=?OTeOBW#!)<=4u4ha-iocU(Kz zbFhSyPe3HA=9<9RRJ%!p_EDQ=&H8R>Hev*b!xawiONOB>3Tni^w41&cg_gPS?JL1PRKhLLg@EzQu}KdWo}Yp2@_czZYM z_9ht~3Rt`*Q|!7>#p&xEy&-jv5QX|9ewEZ0NdkdbZ(?wGduY4BZplUgPlXW14nLZ` zF1#aQ)s%RO16v9y6A*CgnV$2%+Q_Y`y6Uj;whXh-Ca_9A_3E0yhJCV{LHck|Mv&HU z5+YG5F)VPp);v+7YtP*#Fe#3u7OpJ@Uy}^HSI+nq!-&nQ!c+jvod<8WD^L=enuUXMvbGnF!*z}io@g>)?&VKXH6pwWrEDjE8= zBB+&?dP2tP_=#st@@nL=5RCTN zyPftVt2N62@z0nd^K_m^6`JXzU%9G3u-d-pvL1K$Z-p$*x`Va;K>IQ}Y+HwBAwhfHuJuLwlIuV?<&VSb@|+ z#Ffl=R(|&GWu(Hq9QR z&MP4-f!P{K;lUfN+ePwP$D^i>7V}0WmRpB{k?5XOjPKdDFz~IZUk9EDf%yYwuAB^& zi4iezquWlROo$>BFyHrW%-u`{4)34Txd={=|6tgP@Wi3q&}(2PerV;HQCrH8ec6J^ z0N2y8x`iqXiHZB$+&tB@^ZF^8)XWI=Vu4J}=PJ)5X;XcP1NMWb8uIMwJ6!y#xM9w2 zqKXk@xvA3y^|q<1hTK*LBmhH~(-^V;2xdiZDyVJmntLft?bVn!;;y#w1*eFqLIt#t z=c3wYA=J(4_^(w^3I%vdUdymL;;N{0|9= z!8O%2){gJ9{P?`u@R*9L=QXuOMaL=$4ak?hlC|iNru#% zt@ryV_5E^x)u43V{r_x-RL0bpwGNft)Is`{jZ_?}iEzv4%ZIWVETmPv-MR0Dg?C*g z-FzLCj_!h+w>663Jfh}}!#IwdptdaeP^|gToL6N(kN(bnt=&LGqB<2P<{({jGBR)H#Sn^1a(bkw6I`q6xpPZ2 zbTeJR)mTEZ`-~54yPw)-_duYdf`z3O7uvfl<(xT2D-eH5V0;a$c+V-v?X5Z`T;a$Y z)8+E+6IUog!;=3n+qX`84BF9EE8(s^GqV33v1E8Ji2f%|dt26`V9`QA%V|=38XHAx z-+)k%gq$tf9NXrMYD$cEE^uX$X>WtIN=I5aB!_CC+yw9m(7j?Hp9k&{)q$)7H9TJ9 zb~|O#bu&f+lN(agpn(#Pl4nO9v7zdnN^#n50qRtWsrbo1@qY|=+`{acf1)IiW;G=O zj)U!_Xm*}4Q2kX1M|+3yiFsvOMQWmW4c$E@;y*`=940Ftw`&3QwAsYR1trRT!{|F> zC3ZFM$0}#PkPH?yn}nnv+Lm52cy-yC08jq{Zk8Jah2GNy9a2xn3GT!FMPA?Ow@xB7 zj8nvD?YMhQIDqWBU&k!$lrV_2rT7-nBVfXNVyaM-$y05AYyAf9$qz}4`-MygRPl{* zx$z91oT~D*q`1JAJu|dqZv&Bt!;cpC@WHn+4UVu}4*x0*vu!cP#issRlpY^sGbG2( zXvO$tjJQm&zV%wHQANW@Y>&JH@PfEAFeB>OtnN^Z0aV(V;&+cnGjPlnL+QB(mEjF} z{(IK7ViH9RcJY`W{=O3Mp=RHiJXml>n&Hf^bda|xWuwdc>{YnN-<3U$+r25q%b9-b z?WJ?hHL3Y<^i1+xQNTp7&1Jw{7I^S%haDUM#P#@8f% zqjof@lw~Q)<@#TFI26`mV2eBytDMUHyDr5E4vfSduyhWpaTLrG_znUej19kcO$q#fSz1iR}^G=m?O5s>v)k<7x+Q81}6yl$3P&Y&_aYQz++JewuvNvzK+ zchbpxxK7iVOp4W%4MTq)Vb!-~rvE8q5{bkjZ7I>PR>)C^(5GmQS&{d6pmFuU)TJLl zfU^GBD*BoZ1zdT>u+lW)3T&9X$C6q)TnQ*1g>JbzmD zJf?BY>Msw09v4iwX*|yvjPAU+wG|4`+K)y#FuJn0Q#e{COo?H;nC&ct!IZy35b5?} zCSwh}mI5}V?^gJ2@-M68GVy2wyYCV%ki2oCh7yrQt1?NSD4Azk;sna-V8tkoB+)#o zV?!d74*jZ=h9Z~uT$6YbrCI-+Yp`tk3MSYq^w9~B5IvNSyCwWCK+`nnc<*acBR7IF zg~Yu@-%l1+bge=?i9t)N)46OE1}E-$+LTn}gIw*Ju&RsP16q#xkrNQ}0_!gypurxM z792LTk;>_kYL0&=5$sJWFYRM>kQtl|N-t4yjM=;V5=kOQ4xs~r3Vmm0;2~H(xC)~YjpDXXr#a}$ zB=Vo|d%nWbcsm-;ZFN+chyQsf#K7M|Opee+uwZv|;^H-`6%BpqY=~!k%6t-qQRili z!zpj$3nFEXBGrq==>SW3C)35M3=+QYrOo`#b=aNcB(_4t+}c_7pbDD#10ZP83dA(*+S<-WV#;-PW58DYxOo zz!BRvx6_CFQ_Fs28zG}XSx@5Gv$7VWbo$E{NC`7Owk$2p1h%VLs`d31iAb^J;Om1Y zwyDE)L41tv1|^S0kPCm9ZUZ95BH}(G#jJUFiWtAzwVF4-NeffX5*n5LAU$vJayo&D z?uEZX2wY`YhD>vjMHGJ}0&|r5X?IW^$2I^|=!R>vS7UsZj-~ zn2{^pKhD+^fq+Nx7>GXgBwnW1U)XROIXP`TlWs#pMw-b6bg8^PRg3i<`r-QXI%U>B zwKlsC%6xR0YBki$uYL0HZZqkA)ayF36=9nU2=pB&AQ|0;SGbRMAq3B(aU~1?(BD*_ zgW_Dw);T%%IGOxu>5=0jkgkec6J>AjF)uZP#DH*MP4YuT-QzcVi4Xe55ZQQpM$H$1FMA-SW}p9j)XvS(|X>>7YFRv8LCZHPN}Xe4f?M8QXxM>{@@lG6=& z>GUWm*nS|<`c@sMdI7}YG_?CYm|3VkEfW(flmdD1ve-)6DkEgU&4yk*xlRzh#u>d9 z#o$6+4Am7L+=(k2B{+;93gO^UaPzbB+*DR;zqxUVMRP+fhkLPdj3jdYD`Ovsr(v)Z z7?l{J3(xyVxmUT4S_yQ&z(y$VXHUXEe5tN$yKlDd(l~Gi;pU?PqyM=x0{AL{G69Yn zOTC_HB*A%u0f?$#0JBlsa@qQ$oJ{}SmXna5PeJgtq}gihbd*}dVj z0|>10SiC||txgTWZTL-(S>J>EbWUY9iQ7MDIxUrrz6V_LesR6=8AyKp0OQSv-s2BWu&C)*P(5bSRSk%~ zxj5zPUY~A3@Dps?2FE&o6og-}8DzB7Qxfd8MY4|!NIewo)w@}1I@SfygU$4`OB$l1 z^9|mme+l`RF3~2D9E;nBZGGjz3ND{E$sKE3d*d`0EIRdmw_MWoY?q_*d#Pf6UeXDk z!H6(*PwoZfta$+4jbNflK8ojfkwL9<`8z1Xktd_AG*tETY@?U#;AvEkA*ARYU@kE^ zp3zWBegvdx2ble@g!RLAj}2Xo!#qyVFboDP(je zOF*W^hk|#blzsJKGx%7jk!wpkoV>9z>Vr4J(D1IndP7Y|_$aVyKGQpWB5F?4^g?H1 zbibrB&TcxM69$oJ;TDru+V=DxDb%{S&y*Br1RUMQ6fVvR#6|oajQLF(V-MGF@J_%- z%oplu3~c`QxS$BxK3W85W^3jk%a}p|QaO}?5u$|!w%cPL>54F2-qbtn;D3jR{edgV z6Tn|cNDj0Sr&8MW!PgP!XHe@2U?MUmgD76B)h9%2UjDi$stE5+>xXoAnkX6P4|3-kmsn8w0xLb`*`{qZ$TekcQjoBTS{JOxqKB zyu_tF(@D4m!FR2DyDeSUTM(-B|FF*emMziK1cIza=b%wta$3O`$QS(1R|4fO&u~slcgYbF6Wx)cJ^=fW)~Y2j}?7@=L^t@lEH)38K}!i=eYz!JWhyTO|@(zF_1WN^4$%%x(v}5cAFp?-x zsSc7_0C!l4M6_+#=}g>s5|v0WtT1+k+-d~`W?m`WX+m1%AU(Z!kc;Ss-UG7-sBN(U zaK~R)Kb7?Sw7w!qqXOn%f+A&3n!e)Ha4eiz&}yu=@<5RLdEu{Qh4itMJgGivW?Hw! z40{U`J-sVW_zo|VVq7wFp*@i}cubZ4V_~UFI0kQFn?T|3qP_6ocSUGUyC6Ju_sd3#H*qh^4sdOc= zc>6Ra#ggP*7sjPJemW+n3R%AJdnQ^VG)pz z0c6O=g5O45UBtR5@K=vs2b^?!>W*Q5Wt%nPYUQgyULgb-#9`*MBT3dU%^Zb``RKSa z!JA><~?w#*3&`=Sh?ZiAX3z;g<`NpWArF zky<_vi62psPib=$q}S^)N*C+Mu@YeK{5XS+{x982orGrHLe4rCWa3M3H{|@_Or9p! zro?(-D-`J-F#e6P1&9LJ!3j?Z7Nl*cB$wLFiP|Ts`3BBCI#moqYJj=qQTzO=sq|xzd_5aBr{>WF*LxL znE_3mEG|tZ3$V52*P-F}&`%Gtq!mrQn%<_WaxnBSRMx`8vHt}KRg_kJfHIjl^q%Qq z&KrMK6RTOy-!vsUH-+g;CLg-m95HnF!6ics_i^Ki6STi_Z*GFcF1Y^L}ra* zF>0v0DF~V zQ&<-h+Kv9cXSZ8;O;{8O!je|`Hzhi z)8`27e%Pi|zmT4cJP<(AZ)azjs~ue_P=_XX_oe#=q$L-h$7lY!iP)MzdzdgXn++&z z#iO)1>F>frL!CGbIAVa64wi4jxvnCkLr0*K)N3z~3j2Yrjm&G!bhFyQ5zQV^s;*%P zf4h2DkS5JJSs0W}BL|g5D5J4a8xDIIV143zb<^P``FF{uZ=3lAbm#VGIag?xY@N=p z8ASIGC3+ROfIxi2?j6- zS^E0eezYX@P^UBl!mI`jkvJ}rsE_J$E&icmTxM!D+Y-x1Z2ZNa9MSX0Qa1aj9Z}R3 z{lF0oGv^=z{?J1A=mUO_AuUiQR=rXHDI0E1 zV?qNGY-gH%HfOkvMk5KjeFP9>uG!#cpL4-qD3kU+_Q0Bt9JZ-*6v!fFE>ySUAmf?y zN9Ccp@_aV7PPc-?am#W{e^m)7GYCRLkm(>>*E45PB=k&M^ z{SXgq^Fil=^2aQ{Y&;|XbKAugApnRqzTOF-V-Whcg6ANZ|$e)A^hxSSxd*dhi`6!T&_R2fXPR80mt_o)6jHjOJ@ z`~2VdVhQO`EJc?Dp!|@w)rlHQG9Et*I5yepu?bRwVw#?-p79s;LO{=LX38)jRCgjS z|JGe0Lh&qc8I^P;kntypQ*BDwEoE+z3`=#!?zsy*_Iw1?l{^RpA2c3KhCA4zahbHs zsvCqi@C6Tuo8z@@t*9U>uYgeMf0Sg*srQHd#*A9xali5vW*fwy!Kldi@zN6-GDB+b zjCZf|5q%dwTr^Ar=YN)=LtR>2-|ZEs_Te5$WiD*e8*&csDZw+3Lvd3nhl4=7Q1c=G z`P0@N7Q1W{Ocpyv^@u`fWooe+iS;i~>VE4jNzIn|w$KrK)P%IP%&_sMa485_iv%YJ z$O(l#Z5u6Md99rdgUE>sOtXvRt*M-qG-##k@wPQcIYp>HbNANf~ndPlDFxY9~Dc$eP^$O_YV%84=bzFq4)Qk~rzAmu3a)KTD z{Q$|&vw!ct_ublQY^tzE1je~Ppwy3;Q!LRK|4ZnQQJJ7K_Kt4*k#X_flF(2B3kYH{ zF#&&L)`uI@HmT)C;3Pz%bmck#<T!})g7S`3ysLbpG+U-lCwBNGsH z09W}?x{Lv6e~P&VpE}a0Eo~Y@c*UgwgVi-j&3qb*e7Uw84yb$`yz|W@XNNQgSB9J5 z!jdf55bR_}2-88G;cUMpBlW?vm6@j?zm@O^A%E~wMVGA`v{&Bw;4q7qu82=1z+nOX z+Zslplte~Mjf!?nK`%Peo|E`;{xL7gQ#EkBzj(j3Vhrs+VEb*eO(4mVXr+fSg!DU= z6$>TdYX5U~%H61qfXJN8!oB7_&!ALqVLCzKG!@99sEPGZ7}OeO<~v8H`h=xIB8Gy` z0eP814ah$4#9Z$kIDH+%9yP!G8c6?zhkdWSDUU4&( z?^`n_vFTA~yM!9=U+-ew{0Hhnd>u$wc$@`Yr(a@sRKq-EXDiVTzM2SjIIYYS zsvCSV!5)`1Gc&{5QiMmVY)-h!rgqSIT}U^ga*4uwI*MlyAtNr23f(YfMwkC20<@s7_-asL#8!|}Z$WvhJsA2K&?j14$QYA?EL zPm%QGaf>R{(dR`BI-^sWE@bJIoR8WEcK=$+x&VdeKbJ~W0XroX4`{oQEcI-2@J zVdonl+`r377R;kgR78AbugTa2zdL{bKta0g4!xAAP7UxzhUL*r{-uIP>VqwO_~tr^dAXm_@$5 z-@tE0cO_MD^sm|o@kG3QyJ1k|bsxmj$C!#biEKr@A$AW}E^09Ze}b29RALZ2mrwb} z2|5ABd*%8vle%5m+|dr@FK|f5)PJwQ@aL&ti%VrPwIQZdYUu*98KxDwInZY(#gR7k=WO1pohnlqPnJTm-W17}Gobjsj>U z^r}t;K%?FeBnCZCqcYBVLdYyBsLacvbjPyC zoMirSzrsNg7iB>vUT+;q%`VIrw1LQVEUJZG{e=zvUr1AhL-^G_5+RIUon_aMGx%m| zI%bgBid^ArXqR?c_7-@axB8>p>UNKD1e-VR{(} zygVhOI%-yjK?FaA6e7vwUooH~L>ThNM%?u!HMd^mO7>kwN`0NvaD)Be6Qs8$ZYWG` zFnKZ<4x8adN8zHL5sM=}8;0J7FZ%@clSWrR#kYGq^AiXWP6~A3jEj}zwvFnJ=a9yr z01WV-e}dx>LQpsJ$06{5?+IbGk;kYlV{6ax<{X&zv)z^-lnB>MyXQ(9w3g2~`diUr8tJ0Mc|K^2D>IO%2#~Km$>_Cqq z#C}W`-qXDqa~t?MnDibRzH52(Ho(lSrD@Z+f~&Jo@h!DIXh+l`rGz`A104$T3XQCd z3YL`~yv(=EH5uELDg?Pz?@~f|EN4giiqD;D&ZKMUd7UnO83b76q_GxXsA*1oOECzL z+Y#b~r(KFlRiH!3kG^Q%$~}3zPjz<&@QBaH)u_^obVu6^1AHqZVtMeqXU!14-;GTh zZCz#bi^qh0GQJ`xQ1_2M`f~DIjUQYN-COF0tQH3vUUZRH{8zv<0Z-mw^iwQA)SS!* zLWcK-CGM7`t=X6q7QU=;QiNBI$~YPEoeON9fMX$v=mxYFl&A@9fklM$@0GI|SX*z& z!f&XbUi4FdIaw}g@|&?8Y15WilGR6TQoSEhuA;6$VX;TlhK1@4!8N-?np8~4J}()I z`iDP|7QW29eRjTm8DVu%n038#CBiCI?#icyeA<=>i=p)xYlhx&)9)>XxXv!afe(FOT5@7Q9n z@(g$5{-e6WBs(*MZ9IHGPj|tpXuu6aW8KbS)(PV+JJ{;Vw1~bkAR4f^x*R73W=B(A zIZ%h3)`6>=b{{XGFk~e@8-`nuE26OGc9ysSoV2VimNVFY7!^vCZOj=xVMenNAK!8$ zpQSLx-2Fw%kCAE}ax1Qm9UqTUF&@v|lO!`F^Ja~y;y@0Hm@MgVQK(5;0n8;w0U;;1 zF_KTVP>7Eo>ae2()O_>de5-p199d1B`q#A1^$c`Jq25*({(?bRL!Vwle)jPnl7n+l zGb5(CNWg?*l9f>2@j6|;$ds5w0dQ&%^#9q@qo88mS%%m6h{O|H^#VQwj(B^1OpMxI z{S;{W@Y&W&iknoIg&Igs^M5@%WPt{oCYd8h4aYr9JNI{8@`Z@VCsGs;v^}jQKp9Gc z4VTZ1Bw^T1;EfWkqsI;TKP-QBZ#1LEXbq- z@TPz9=oab`1&w4$pTru7hD-|TmAnO1Wj~03zNCyV@XRqQxLV_#gu5!K=m+x*Ba3S7 zg86~^UHE%Jh;i4a9{fzE(05wd*82)F>mqI>aZ7U0-b%#OMn6e4)ea-4DXhCfVODMJ z6RHVY7~R~5QpWv3)WD}CYpVvagViv+haLzx-zK#k=J7|nGvD7VX&ag=!lr<6VI)WY zApT0{p!d1AF#JL9V{z<~@NLH4eh|o36UHGq82)km6WgHJ6#Y@g0ObE(mdh%d}@O4M3SR5Vf^Hlmu;a@}Vtf!8Le;&Y? zdc8A%k}fHlWTuY?ob$dr+V0}{-+FVo`1JUIleuHY6QDupJ3(b*J#&ExWoS>B4a>Gd z5F}OBF^<1)y5)r8Pes6E2Pi)^DnIo0@4A1GMOq~f_^5U!p`D2ug!R@cKFl3!Oo#ZC z-*R~ICNSG1gNV@WtT<_Ka%p_9-rq>*!Gqt zpzS(Zh2XQVw2(U{YdU~F1@e8d#ywF6e;jZ6Le#>oYK>Hlk_wt!^R|6hjgUagrXLJJ z$Pkn%t(*ow4e=^P%L-BXmFvd7*w*HKdXU(}y5}wl7>aU|R`px4@$BQcdS%|ml4j>G zGf?Klu*cFGXL`@^dh4+c3XNYX_942VF+UA8S4b?6@0EFXhT!3efcE$FZoF*0&+%cr z2gR%FrA_mmCs01Sy;yJqz3^@HjnL7bET}g@2%ZGog?QI$DpJB0ZZ{=3vAH6cnMkM- z6+)vQ3P2iw#d;f-2704h@dX=?&O(FqWj!Q(hz0Aa`DLx*jvsK&g1wH-F^Z>Rn#dCr zTe@8PcgV3_v@}Zh_Z1!sHmmU;BiM0(dM#>t{wUocGhPv|*c8nRu^FFj$@X$LspiB3 zYo6Twks5}h)L|1{qj)imuzcia zv7FiAl%w*wfLH2>=++~G9diFJdo_Vjl@d#uh7);0j&{d+^v1%P|Mb%y@2%FirS(4j*kY#g~kgblH~4rzZPAuTE5&bx2UB` zZXxFMXEbcl)mea}iSKj7r`wU4DJ;-UEmOcqhZ&PZ|1&KoQT~p8wyaaua=#>t=KKSq zdKt?!{`%J-+l)zXp4A^Pb`CHayfi<$p`qhU0VF+=pTudH3v^o*eSE{9gBjs26(ah^`6By*EIs(nzOi z9T;O4=rTJ%%R||dd_F_gS^N$e2Q2T&wou~V9lR!d;oJQAygW>^cLi3+IQ7Lyq#0AJ zn^8KD*-bw-iKY2NQwIJ`7fy>x)=ERSu%a>bTmD^!SfX<`9Zw4pl}v!QSrnporKtZO z>bI~Nyv$vOY@Wz$sXsv}SfG!I>#?lHPB;odVk=$z`EDv1G-AAX@ zj#BWLs8HFircMwgWENzM%0-|r#rA`*TLMF5{D@v_f$9){5x8bcxaB2U2+_RlaiwO~ z%Vr8$%rFJe_Vd>}JnG%+%+M<~d3xWwqYPTWO;nYSQ;1QCWacc4jsh=ZE2Jnb3+ts( z?ES^V?KdP8E?xESwvq1&6n2Q~BTD7N{jsgD?sCiw2s;}d|{hCi6-7p6TE-Jx~ zR=#;2^&f_o?NCxB9e{)!+tyj>SyB52uDvm(A74h$0cV$A)4-$ zd{PwAxz9iri$Zy%YUh6Jw|$^EWqEi)*LB+Uh*NaVOAz-<((|cbJG54l9ty@>XpgY29j0_bzMF^j34|K@j>;Nh&DC88R;v`RkCZbN= z`JoQrn?J?X{+f4*0?I#dC5a~J8ZU`jBg~*yAaV6$B0+>DJ28B0$$UFA7(5!iY#<7J zwuGy~@yAzvO(XyDc-5A&p#P>Eu3)*Nys#Vo>Q8Bw3|Puq-;548$#js)7{F_J*IQqH zVOW=(>{NSh*ADb?sI^09OhVpbXE^+X?Hkmt3sWdwbj%#ATbvN_M}?Mq%A{W^a+<5%5P}ObSfAr+Cs=cNhR~j)9{H5~oCnlkD)ME!ptb=v^#L z_xNGOqVdW47-6SwShv*<1s*3y%|gZf$1?Dthig;6OzubMkKbS%ZXF4W$5-W-(~yS3 zh!8@J=4r*?*Fk5B^E-;txsJ0tNKm?q7gS|tP6NOQnb^66JXP(lL}zeyXrGJgz0o>p zBU)ZbP)SaY8Q~7=<8oG1cuy@4cfjEe62}-F22awkb_Zfcu!gy{ge}^8R|RwPFlOcH zlB}eAnXn_}l<5eaQy;U+kr-Y|!nbfngITGs=SuAVy3B=eM76(GNNUTL2T0lL2b&P5b zuB+a*}%N?c+UGX?gZ?9 z$L9#n(u%ROAw>-`Y=WU`u-Z3Km9zJcog`2kYnno9Bc*(;JTXv9dTN)A`G|e)R8}~N z?i2v4JF@)&rMVD7<`E<%*Q{~?0Aoq=!?LC*q(O1}jXkGw6BuoLmpB0X_rer}aunXa zzAGEJ)S3bnks_9>%+8+eR0Ng4)(nSNeh4RIXf<(y!4^AK=FJZRM! zq6BD%PPvps`Z+C$OlOAOvy%F(G|J89Ms{o}d8OkIZXCDLg7@xs5AmyTJDu5b!DcCq zi}BPc8;$IQ6n4?nN1_wJ64u9$(lUu#zbpVAoN@pkh*i(7wW`Nf;rEP@%v|DY>S)=f z^VOV;b%ef{?1e4vx}P>g|Ynv-ga7R(1#wT~8qZSqr(u8{Xch!;z1XR#W@zt~k$qpZjED0BC# z?CX0XcA`tp{A94zMX4dxSWhrmR{Y=_|Bp&sV*uD&?oymx_$b^%ELzxo2;6Eu z+kfl4=9^V&E2~mkTW%LbAW6dwFkqi?R0}!#!+=FNU_N=e%sRB_&u(~ z`ngIR{a#4?4-2&?J~{zyYU?X(25Z6UWG-a>zmSn&l(Lc1K&sB0=o_LX10`6tH*HV3 zGYc9YwajJFGU=0m-Cb2-bCLJ|Ciq6%{=N8~GPwh8i8B>wC}~g)VAJHp$xN9~Trw$5 zDdhFzb^Pn#r+JcIMqhuTOkMz!QijkD`eVZ(;uT5W2+!ZY$bs1YNp%?eIDe`rjW#e$ zPS%DY=a&el?qqozDK1q&nBAe4MlgsQ$&12z9nE_2&NsfqMA{R|z zIcTo>wYQ6e{P|`7(%7}6+7!prV&r?u91@iagrMkzFh+QO`zEDtgh#w1qtJ|P_0RgV z#}NN^1OTXuh{wbU_rY4ebjIXC6!;YBabf}V-0)^yW8W2?qY{hm!>ARU8nb5$6EmER z!Gs^2c~7i6qPO_#uw=BC#d*I15t3EN&`D|e%&Uio(1s~9d~bwU!w#?kb@CYpxr*|v zi{YK+ly}3mS@rUz$`1@X)86I!1icX&;hMnwk~luK3mZ)Y58)(OYsf@KaZw&wyB=5i z+)q);-Tv!N9sH!ysWgPL4^e~T!!;>U(m3yje6Te1JUsPLUq35{)Su!ysn2BBph1-rYG0m? zDaT{UhUM4E-Yx^B2TgN~^4R&b2&OZ~u8y=gJWIdZ2qKAYExy3|w@bsLlr}mhYS^(| z+6woKr3CKrIt5e-eWLGHne2ZtQ3`cuINu>s`$So4baH}OXC<%=UBLH>_eXKIyi}!zEiyvi9C+@Q_8`sFcQ3(Uq(0lAnt%z0Z+d^s0oUCx_=jspDyEZ zH{tf`EMW~i?jY7J-{I$eT3fkfmySa>;7`7G{7n_ApAyR)f~u`x6|8oX6Z40zv913U z*S6GsJ#k?msr}De-BY@+?;}j0jwsldWNHZzE^#H{|)Sfb3u*hl)x8UeEmaCjHod*Xq45*=zL)-`xIDAhn$1$!QY7+-?Mv*2fbv9w z)FTAc9?8kGFHMXM*)Iqwq#cvC2|tx*e#vNkbNs-nYr~rFeu`oMI$JRT2Y)oV=` zt{A{H0E2rRl7EEr^&vnA=9ULt2*{- z$`be8L;@I{2wgRxEEznx17HOQ)e=J5lHN99gv5Su7e`=!n0z~-!^15OgsCVVVBl*DG!9sUP01aTelp4crgMstsCGE0VOk3aXaB5^Y|d+{2j7FmA6HzJUA zOjn65(rGT(FXId#obip>R*9Mfd2W5P6i#qIL-%NE8jG>Xzc;X<){_W{X&-)yJ8oW$DoH_@Y;=wZsEY?%Wk4&f!MUo{ z7TdhZv5l*#I3OBPS~?3W|I(r%G{OK}cL=Sxsdus`S>7!2SBz5yb|j^lz;y!+K5aCzPj? z4(3oZ{*J(%vK~#t0rKY(VMd8bioXnrhm7MHztqQo@5bEv zIaHBGBZOb-`Fv*UeQd{i*6jMnByJ05;hLUJuFK{A|NnRo3@gW?j0vfHNz z6y0`V^uSqeOnof!@t4HMS)k}5E~C}ye5XUtB=zupy)Pi@M3R^W0eW(KoFC1&H*pF! zy@YPy>jURDzR-6$BC7~-jEf0d`s<07D{n&jY0GbTwSpK~xw3_FCig6K*90lh!J#qI z@YakkJmJ1DzbDt8lgh*olnpga3eJZBUrPlDZUYkj?nuyH?s9D00J@74x)i$e|oRH6-Bq8uMjJ79{?)<2Q2 znJM}0lmN`jqhVZRgM|$J=~AQuyk*fN;jj{uceo7HbSGqq(r{i)K9gbq9tljwb;raheU*E1NV4D|#;qHUor!*=NLCfjpy_wiF!eJvSpEL_Qc4E%mgv*1 zee&H7Zo3_v!m$Wyfe5zsD6{Jq0tttu=(-uf|B=z5aQR_aAJfKWH4>MnkOpz>P1)M< zZ{o9z!5{t^4ZSrg-CiOOnQZ7zan1~qQ}(mro0ZlbbnO-!JXX@ztNz2@J2M{0ttBT3%fFb$pk1Wkw5y=0irVSO@pbLtH3kmGz%EJu7rbQCZs zrO!WGYk)`HPi1Snl&-G&Ik0s@S`@u1{^|5n)7v!?j;2lSUG0={dIL*qp+SL{y6};r z8|=3;Md&4gz+NMeFPA`)8oIM?K0R^uf58<;$@n&vq!fa;_0%G}?qI|Ckkbs(-B}CY z8cgAK@iRAQb_A=XRAwaRJY;c{8jO?6{~BBlN#BBDto1fjD?c`o^1Ba}cx`F1BZ{vu zjc9`#Tz9#QB>?tX^zj^)&L1#1i|G=t<*D13MSEITi~st1(c*3yLxMw&JA51{JV8JC z!%CkgBbZ;B?RleH!RX((!iJYMLHL^*Bl{yy)GmZ2uoh8001zkn zE|kk>f*UBJ+$NWZzUdB5*iu&q^xp+QqMruA0)t?`Lu*PG2?qc+u!`WS?O)Ln`SXsH ztil|l<8JG_e=M%c=aGL3!~d{8DREn&F+O6Ix@dRfBD)i!*+}6?ucm8;L}q>`I^jf= znrK#`C40Q4f2A2SRj?(lM3+p2CrXMc>7ekKM2|rVdZ51O;;2`8gB8;}M=q#O*_kI9i|B z3`L{M=2Q!M38W#(X2Q6f%+3n>Nr6r_2I@r;TiE;wg81B5=OXv3@(QE_`}}E^zjRqh?nzs+(@-M^wfeMzx?l1?WOX6;Ud zA!z&q@2)#>GGedz2ESHFf=RZ|VozuCKyJ;9Jf3C)PJ$cgF!$W-0+NA%Xp-(g3*xd} z0SwB3GT*ZWcd_JQ1JhZgo2^i`J-ern-U2lOrcxNt4`foS3AsMxs8xXyzsbh7zvz!v zwRJ&vk(L+?-+LZf1~mkn==_+uYW7c?d-`)e$dHc)82=lw)Z)^SyG1H~ft@;^8>;2^ z>#4%B#TKi&C?@v;sTvf*zMtqB$Gws4biPF!d#_J<#*kcr87Zclg2n|~W$lLQ*eZJX1B>Okr9DZ%)#t~ki1+6m|k(muv#XK7gP>TFJDt0-u* zw)%4H@;Y%qKvR!LRJmZ9APVlX)LnO#EyT4bEPbB$jSiRfWO67bT`kNeb|SY+gnGrc z>X>YPsSBjp9{sB6&t1f{#fNWy+QlTTgQPj^nB|SGmEd0GdCa%|FZ56`(!xCtbjWwVckh6?{oGJQ^tu6v^ZtLRN2LNkXByarK&Sn>Kv ziI9z7MJ$XSn-A{=Z6j|~uHPNbF(L!kYKF(5$dDRUb5TihBOB3umdHIoh}DD$I`m5l zks+hjF8P2KYE*!{BrssY-${7LETxM8tsJVKnd|Rf)5qX4BQn~&ewf}dUE;Z7Z1U>Y zJUm_amPQ@v|0U-8Oz%CtedJmXu6HX&Y0$Xv?6u;8qC#V|T&=pOWE*t=1j5Z3WDbee zx&7=vLAHwOKIixNlk)jEH3=gr;S^L>SUgt`9eQXRnLt{4T#QU^*4wE`YmO+;Z}%L5 z=n7wfumNa}67-a`);BHDyJX1YHpgN9p=Tt_Hk$)ScZVPAbMWVG4hX_&hHy@og$bJ= z`+XgVKw6{|z{hfC6T}T=kB@gkc-%to%@5P`&9@xk5@jDpD}xjTG`L3;_wDzGRl7g_y+r zUM-h`-Rx$}gtm{Ro2eb_F{@J$XZr?t0QZ9tqX?`5tc**Jt5N6y@n?(E*?|0hpMZp_ z-jdjACpHvEO)b|;a-28HTYKWn!TAc8eIjkl1!-0p&R^mje3KSL*NfD8cbiLub(p{1 zz3M5bWV=;ZxPlxqnPy{f)X5t&YG}g+YcS(otgeKyaGUM9{^4|pkeOKl9BLt-Gg7L7 zxx%K|H>iAvij`$WKg$S0I)2dKTsF(daOs`<)YgM6c8l37uJ4n0HElDrmHJb?k*^FE zJo3=g^ThN|?>_KBi{!O0GS)Y=!|dsDc&tuVr5+0jv1hvjp?0v?`I=!~aIGw`E&~<^ zSM?rSWfjDxMW;QayflZK^|-1D_Y0UUSzfx74uc8f^ihTXFlV{#qw%~fN% zYOoj(35~(j)~E?MX%S_e27SMHJDX!x)lB{WC#RmG0sYmni6?u#l7vDcf_h8fbEbGhgRJ(p3-HC-<*5RB8ujy)+ z^2dz5Wz7pFS(hh}H1x9nIs%-;N$9v6P+^d~6DjNx4U8k)j5CLw3g_^Y=5zuKA$Ol} zKP5Acrh!`tb(NWn9@IOpBI$R6n8Ar5sZN~!j1UR>gTKd60--+ycC0e|jDjhAUArhD zJStmAUw5TY<3N0(?+vo}F~-qfX#~GEL|e*z0USw>#GgnlSe&@iaH(r*53bpx9W8pX z1=IJJDqn^PC9;nWf3xl`n_`DhIDaS7$=c_7tPZHfFDKhaabXsc{^AR^Jc5Dq)K3pnxL0Z z2GplqhAnofS)RY_(LvD3`^&OC(P}fk!LbJE@Xerm-lo30CuZp;K$Bb_#M+Y{2#Na4 z3v{GOl6Rx)5@5zl{0=9_K-HJliJ~6Lly7j&3KaenwTtTzG34zYfhvlT+Y0s9e}xG| z=4w&;nX#vw^p(K}uY!%*t$-Fn6pDeg)d$Msz$?4+{V)daQ;NRYNSpYS($QK|aG z9nmQ&%)nxekU28Yv9YLr*P3dd@_-8i+>ACG#B6C_6gq1#D$plc)pRs3zP_-as+_AWOD&Q|@RU;#g+vn?BM4_4}mNP`J^uIuQ zX%pcJ{Zf;yw`R^#bCaF?@k<@M;}TJ}IeZ*dh^x2wXe18B_CYdQGuk1;3uXF+&S|)$ z)O)`V;^aw{815lDK8~p&+hL6*ta715fs)w~AW$?Nz?g2?} zp`z_0#^QF%f^39iwZHMKBM0>)WG~%I8~gM7*MeL47Lq^!J={)GWqH7NooLPpY2_wb zLgX@Ok_Y@u3sG@+7@DQJ?-5qMjAqD#jNa28CY>=nO5JACc>Aizj=X4lL{B-J+zkgzE=t!{*pIVXq3c?%)Y3xeE;lqvD^tqNYpZXC6r0-yYkE z!JadB{-W5;wWdc*fri+TQY9!d%JUo)mPBpY>4y)d&a5Fu9nCMdr6=j)#+T6zJMEY> zi^Sdf2XaG}72k9gIKh9(r(a0u(=_TmROTdxb_b+o`Q`y;5?M=9T6!EkB#%SdJj0{z zbHz=7{`r2`?^&BH?dHRMH3V4$HkinH@eacaE#70Ks5FS$IQi`#TcYWm3$=Pa^` zeT+9x;HqKY)m-Gx$a?4LvKcVBH5UfuGDc$J!8b@FEIt6}Se-pQd*tdE`zMBeTG4A` z@w(yx!}$i?0Mbx$Qdr@c*mo$(AA-sN9*OS9Ej*_9t)b*}QXf}k1O+sB47o$VgUAsu z8)xO4YEGIYk(eAFGs#1eykV&6xI{@IWW+*p>$K{STRS@K(7iAMK@#l*1#}M9UyvB> zjhXz*+qRHuNg#T!1{r4yhlEQ01=`MWP85WQ{aLD=0ugV^Yi1k#4y-3(?g1uLgGb%s zQe*^vK8Yc>j1F0!W*q*#CHGk@eGoqzOg4+wVi;l5^`Le@M#4OUc|9(TaUSF~l9T6U z_$`eqwd4yBHYKZgxUO_28gi zMcj8x>sXy@X7=>Pc%?s>8(C_dV}$xdfJzT=CVvyB;oHiqm1nt64#@UI0qL!#Z^Id# zl!b$yUO}?kb3S(iAD6Y48$U3}aHz$;r!%(Ug95Ad{-(l83z6v~k}HhNg{B4yN_`Y) zrXHCYGI4zC%+l^3v&iDQZ2W3CFh`<}j5-cF83gtD1zGrx45aZlDQyT!3Q-+T*TECj^m;8{~AIcgJ&ZAWOWj=8Hi zbW;MFGER7nA~z%46?HeJEcv_lV(EXMJ2Q8H_tmfy@D1t0hRkv-nEh~kBOX5H%**6z zyu2T6mw^FRD$@W!>IG8Kw7~91vO4AXJX8Dpq$%tt?l2frd}~*FbSXikU2^?=LP~v8 zg@l!Kd(+V%Nc&51c+y%i~IBe`9@=9uT z^5xSjAb$KLgojK`8I~))`Fh?>z`d+Yh|Q*;(e*o@=tu6{=LRAc0M!IN2nBok6Eq@q zPkPrz8K;=ABUYo9gy7Rw+^=y^dILL&8nyfoW-zg4XB}Gv63DAv+rjT_*sQzu0Nlyz zyo2gc9QqGr=fdLaB!Gqd2pciQ2I@tUiQMqUkgeg3%gnowKN2Y5gqelOBk>dr9f^c5qT6^Jo!L-!^)e-hm{(Y~+!namZs)Z^IIpP)1HCP)x=r>_lh9 z?0woT@eqQ3AKU3F@&3=qAdhK<*g^e6Y^_cI=D6G;oG1PHk(*Evhsf4H0Cn7zh*$uN zvE29m+1_6&{LbX&|3_72g4S5WywXpprfWMMQoyf5UP+atXy6DodiWrD$n+Jf{Q>A> zGJa2!Fao__78bfJTU9AxpkpskGOy5{G}jO}D9+Qve(z;-+sOcOMJ)`mktZiFQ)W70 zoDPYJFaVov1o%RLwm3yPZyi8OPyvq6^}+!7An8i8wk93biI=av-_3;AQ?yCe{8wZd zNNm#Q$=fTIr9PA089BoCOh=T}mt7y&wSnBo{y$q|>v+a&b`NR6QVhL-3uSn#k??O8 zTmW*&)Vc7IyA_d$j=?(irGh;Gq<^LN5~{C!X`&lzPW#E4WiS*Rv_;{}J%3}Lqt{2Z zMNT#?%BPX_wU{B~Cs!GyDDj_j6i^uK)gvwnCoFj4XtVP-QryfyOIqtkzGz4--)1;O|RRy{8>sbcCyXikWjuyJz0z zv55W*%NgDphdPP~p7p?%e3kGV*tjI=e0qWpBw3`AsyDnzAe2-wWSX975OqYEXE;?3 zDhMqNW0xLntFQW@t`HAFO=HT%m*p-PrdeuoM~Dp?+X&9!SrlJ`Tm}3z3^urM+2`w1 z4s7UnJS*tXt!M|~?2&ohKSI{16*rbf%uD~k=*5yaBs}d!qBY@A|1G1h)GQ)UUa;d> z*~g7n9sZ#tDPP>ZO^~j>^KBaIS)s-Ton@pjY(B0wk=0*~SKzFPw#_5W9=*8k#B#yZ z(M|^iZNNfcVloZC4ah)32OOKnw&P=`<A?(_E$VqB{j9W!Ve%kgF=?*aMA0Z-gof>t0difoG8pAj-zJ%F$LZUP=W8tt?; zF219jg4~++EObh5e<+Pe&A;PIoy!6$Kf)XIt6l+}NBDC#nD3saW<%gLII>5HAOsrx zYSn>(GreFRXPt(H>@pajsk7F&$#r5c8YJkRcAJP2>k_bVW`3##s@T|ZC@c2FF3D*= z?=ZYeO+a#)MYtdBFK2%}U(api*%$hE{iHfn*Z=@%yuIGrVMs1+lhij^T3Oyu^&}R+ z7%5I~0Ao#rA*K4Ef7=XW5ku&E#3C}DrijiNp&s9FSGxGnOtz*;vFRk zFJLFa^NfR74yw~S7qFqAFvU4HxTc3c!wct^0@C?r9BS%Ht1g=lFcmDb+lmSlj%hO( z4V}h-tZUXK3L@6>@#t$1F=Yapp|K}md9?Noaw;*^u^-j1FzMPVSr`%!aSOk6U$CWZ z1zH7ltwVu1NSv9npDXwh0wx~Fn=6}4e7pBZu0{k)n&QQgNkx*cy6RA?##qrH2)?1(z+r$1Hne+m~f+5UX7B+BW{;9yQAPSpP%J`AIR9lv6Ax8e#z1INhc3yD6{ zms$DOkJ{b|R0QzhgI{bIr|$b4M2E&=RrhKcN$5#Lt~aoCIrwCl^WpL10;OtQ&|+rK zFDI)w{(M&}8e=e-anoZk!NU@bi3|a4XYDh9-O`ZsVb$n3gsO~g7}9J>w;2b7H&;R& z(+xv^H)oq?ymuA~vtukV@rsn-emQQGdG5raR|^&fcOq63 z@`*FbMApPgs~Dw+_F2w*z4Lu$&3T>Iv;1VdriJ&AIB$7e_Q|p<9AKxmjm|J8bt#nu z^0|rT2oe)!S>IwUYjXxj&zfshx+xjwXN1a;6d`T<$P)CH{9zmYvU6xjR;H$%G$YT& zYfvhBd^v3@P?hnzWa9geRJu%@@tUbU$&gfOMc40L8E&olnrRH&Q?P{## zXVCyD{lcbo>z$vw*Aqc9Zb*yQ_z~yI(h#R<^@&%xQ$K-gs+?>DxW%p|4 zR-#SG`&Op@20T&LDke1^CQjI_DwVstpWKOXLN&)GBuz5ig5i^p@jl(k$acQq4Xq3^ZJ(c3M?;J?rL-rtHQ0Rwt0qRKwOZ-0tth`=8h znyhWU{HkoXB*-QAX2AF$fqX5v9gDyj{epk6m=bjeR&gHv=l8}S3>|zx1X0X>dGRj> zazDONWv46gz0mD9kB;YxNg0acff+=8dz|}YHl`1CY|%eQ{f%0K%Vb)6);{G-<^MV& z2XTmz5P=C%)T?LLa0}L(LKSl7+P|VD?LV;=>qxnJkfd^T?z+d-{A8w$oZkiArLhYk zQWml55*os6@$mLz&H8CLCKR)|w{n=;*PWf)Hgg4rbyd#|?X{wkSv`-RU+STq0e_#c z#WImMsh)2ruLr;mps`DS1p5BUZgyejKFPK~Y)RzyFA|#Vkh5_?mp8XIk4fDOWIF3d2ZaJQykTt)G=gLLw$o3EOdS79m4j+({YVl2gmTRV^67+1 z%W+Rz?erUZB?2}S(@{&DAHj#Y_C>Y~CIXWlQ7S9UO>dIZxnO6%`{c>TKk-k!l@XGK zn{XsB8AU*8vSFc(?i6vW@2VYOU;Ck^l1$BH9~{Kyb15e3TstLi0vmj$Ec{XQ=1XqK z>lRC_$iW_(qg9Te%tmz?&-ezsWuxdAfc~{=0th-wv;Ve4*bm+g<9`nI|fuXrpE9#LUm^Bl|w9qg0exKj!(+cr&I z4u`9&#aTiI@Sc$Bzh!9ceHMp=x|@*YBJRl#xo$O+rJm>ZUw&O9UChRJ3I7soi1I=S zPo(61EsvbL;L9RYG{#NDIDy9`cnCq-Ot3<-nj&WO=YygC(~wPp-JibOnrONx`!7BM zL8u*?2|)oyyak?6thj03cMYR|lr8%>bGuqH;$tlo(^}6~?z{zlv<~5M1+R#PrQ`oW z;W0r~Y8ok&i9#A2Re_SuWz-_bCOcL=wY>o5#CgH+GM7 z-oJi|I4KT6eMA=b=#?H?a|={HG+{5D4sv7Q%3)xbFI{+K3=w3Dw3~CCD?fk$Q_o5u z(sPGUZeMxE{Y%kBARTDwV*p+g>918etT+6BZG)unT{!?FO7+`7R-Co zns=JxW{X}5?(QybDkw+2UUy+*ybsJQ$4TYmhXIC{JdXSjUQjZ=_Vq_AcXwPNfiSC8a>O4`_%o!cwSe?>gF$9I~}m z5&IH-p#o@NKm~xM=yA5(E7{rM4YGHRvS&NjIqiS3Et2J=X=4qe!}R%!o~-yxAPTUC z%|%O?xYf-2T!4By@eUXzfQAQtH?_DCi5V9+bcCYbXHl1xT4mT?#dsBxMvpy9V92)! zPh7_OQ8y3Q(B)@8BE{X9-KI7S+l&}&|5c5JT_f774uE+#JAzPt7gNq|%16g;*kV1; z0pC?lobqr@M>h^01Tshntdkd`ors5O=NpuiQVDd5( zdDC{p5g7u@J;nA*h1y3eJ8V#j&`K>Q1=wDJ)I4IucyVi=KK-Mv^+MyKFiHT{|R}O=|RMX(SGuNYat*3j=;h}(Nc2VTM|w7HBv<KA<-tdL0p@LFPR=@+yCXfu&p&p9$?V8^i)CQksx z8>Nxc=W*&MV}q^+c!J))39}yp#6ccBP@>aeL6=;0H>7$+na~zphH;i+_7_y;2xhrDZJBQ4e2E`5M0>; z1q$KUK%Evqz-k#ATzZeK^(Ri#M6|8JJ`dk(o0 zR;d5-lS=6I`<8)m3xT*|#dQ;ij|yD|XHs>>VmjgrOd1ua1He%U>GND#V_8knu-o~= z>PSSZtn6}?N`+#<_)r9i!VJN;BrsrqJ&(&~L`v$)`R3gbln0ZNJfJxqOWdT#?d9v{ z5=;8u=%k=}UG=NaRD&elX=g@n2UlUi5CLg5t$C4z1 zE1KXvN_aS{7RK97dyEI!cSjvc6_Lv_ym9VJw+QzX^6SQDi5;`5I?|E^!K(8A6HMd8 z%`nYe%U01%qir8_{?m>YJR~!0cfr?bH7M#y>+6X#9oEgUKEBMX7Zl4(EM+39eKR0J zTCX`EYeimBk*^N5n(1fc(TqJt(>~)+zI}8imOpWYz5Cd@=6CFQyt`g(&zdg?knom9 zB04N^mvbEjumM}jflB+1^+AJ0C{!7%Xwnq{YVu$S7)3h+U zN?*?t$x@Zq*wnO@v4!fH6_TejMB?-7gmP}$ivT=(P8Vol$i`c((Kj&oTuRva;W@oo zOmI(>Ql*I>#Ox10I~N#euBFTxulWghAKsXIY^YW@s(pA)Y8y z@MndjmnVlVFyeAv%0OL$LU;}4y&oqlq?I1<3U)oE>xHTx^wn

ykF&mn3on?xbporbF{I|YNq&Eq3i(IY{Q1@tdhoAWqW6IHrp`#43``E1e2Yx>_ zoTcT%JNX@)_us9Hfm`~DK>eO)Jm{l{9M5_Rn-^JfANeCyx?!j_Ggk6nb9n->A%l^< z?GwZKsD{48irAF!)|)Nn=Yi-!BcJHu;tY6&Wl>jfbA=3(=O7Nfw>8?LuY@B}y0X?} zs|Ctof*it0xC|})CZJ9H2t3FCdS$JiA1PWD1`WL{yfoLe;H!ElXK*{5z?WP)Qa*@N znO`w0n^?9w@~+Jg!R9Liuj8)IvRQd#iqcX=3@(;6U+(1k=48H6f6;f5kbo=Nbkkpn z2O?|201+l8t7iuJaPq~VzD{ieu)NtJ61^~_`tv0wMUpY()lK#=$d5xf!QkLHtYXpJ zWV{cU_)Y}7?ssIHJC)geU;;?kCVyfg!EmP-!=PIZv+h#E1>tYO@>$0?_&4tg`&3hEY$HbUB`~k>5e(4%2 z{~A>HN{c?$0^1Uu>S)&?K89i34dUvA%_TwGDBR;c?y!5f8U}pz1JZACT*EGLbtlv4 zwD-&Hen?=y(dp%b8mmNI5GwUg8oURyAZ}ICYp_Ovz~{pKTj}=YM{P|`G-(=HF(RKL zBjpvJANi!BQY7Lit}2n@4W;j;zwk{p96M$Xz$>;l$sGQX{$WNYHU>xUz8wUc>4HkJ7mSTlV1%P2+&prL_Fx#z*mgpt zgVd7W%NP8zXNp5tK5*w8^VF?mZXwBg>Ud85e){^ZSOm#I5>Yd-j=;v1n8oM#*{(wQJ#+>ywcudi3tVr}#Z10AGsgV9+X4q7 zsPkhM*=|3ksOTr!;QG5BDeXPElN8o zo9X<)G03z{u*A)UR#=*`-vryJky_#VPcpIRIZYfj&?4vjco<8AGzzKJQR@D93hlR? zna06)n|fgjo&(2|^U9Y1OQa`CQfG0Xa!_b~WTiB3xSFIgVi-jzI&^Jr@E*J}}2Jr>o#&Lvx{fqx}SP8 zb{fcBsJVQmMk@)_3cC(q&4+53D5N*@4JdYIbTTreA~WG7KvPrnfi!e2e=^J1#@*mC z$Ka0`9&Nzjj;RAdGdBax8)u`6AkYzU3hoFkriucjdA>*3Cw?kohkW_q7AhGmzDrQQ zXGdSrK#ke$Sb1{lsEh_taHD|2ZyK$+_B@>U9M8&%6+@OF^%a1PaMYg3+Imo(z@;hN*R2D8m)dI_9MpJY#=NQsjHC5dT{=B(-M1ZXe^p9ppJv ziy53e3nlnsvg0>q8$jJG1jOsnhE!y&?tY8-UxE(6w7jQ`@{7LR2nt9|WBIG}eQ*pX z_WC<*e3#}4ttLo}@@o5%I)5H?$%s$YPWKzcMMo+Ul~U|nxi;>YTM`5?V*}DB6G8@e zKhCLA%>ue;5xvS0hN>+NF^S0>!qM-{fqLe@-Qxv~za)KYg##z%0Y)Y^+U^6{6L5xw z2$!#-Ef2%k>NKgY!RZMC2Ur*3Rkig3Vl1HL7FU3N?ms`dwhOZ*dI0gj4JR$nWF4}Y z4K_oHTxB&r%@NPmu1h+#V^A#Za2m_aOwfRR&#EN2AjpfGd;aITF|c?HZs(m7auIa< zV7oAAGEG24zdv+R(seULWCukwgC-vEh*(=4lWGUlYosbvKr#c&#$}AVuOp(dh!ylf zyuTze8p^m3At=fl=mkg}+MqO}Mceoe zS@na+L_*yK^yJwyyr7buDfpETS~L%`XXOFSFdOaJn;WeOI3O9M80h8_=wVpf^2F1O zAYncF=7JTC!AsaJ2dY5*+h33liD=&Xg6IW|MJFZjaq-Y`!Aq%nKCqW7372JHk4d@~ z-C}u!;>=_Wg;mE^tchsgn(Z4=#fY;RvLw9IX{Ya>$}@WjpS-RQ>;7*h^3Ayc9>4ln z5^{^CxNn0QmpMRfezp`-jPPo}KnAN?QA1eRoGl4-7P@~r`9jaGGQ?ETsl7VRNHuoo zKREZKckeqN*hKw4ZOl{e5>Pg8`rPTXbyp!@`=NWw>X;Tbro0!3c1@M(6sT(y0IH1L zlO&m%P8y3PVcUy+rj&boesWM)kMa zFEH_j;b7ten!uZd#bwWsx{2@CxZMsdmdk@2>cs9z^N&%gF9cvx;Z;#pZsrOcwjTX0 z&#)O_fZbSKbMhS9s;$J1og{?JA{Xc>QnW8i?QS~;Ie(1t66!6G7zg>h1;8asrwMOL zd;rB7J-bHB9MqB3y`ujX;6Aykf2G8@b$G7kP_?VbYL<=i*s*j|*L42II*5hcILlX# z-x}q>w>)421Z{PSB`*~(zUM7IizRl!44>Cf_@}hW92p#B*b?N;hCamTg2NYHF)*%N zGaSgz_K=^dyQIOaZ&V$`Mk$UmtO|*x6$+GD(r=ApWi_Z7(J^)L9W0JMSB8d7oX)BC#zVt;ZCWpYLHP01gtO9v1m52r(nDKw8y&W zluNn!=L-lOksKPn`|(Bf1|!^5Q=MFQ*;n4Q50;4ev)EgS$p_T$!g5YUlv%LIqfs0j z&9)y$^eRvZ{w7zCi3)O?Z5E$a))>K(H6$p>t&Q)L!iloF!9*UEuW6GS8zJegVp+&z zF%SXB4QOJGuEF{pi&&*H$DC=Fhll?OeC$-9u5t4;I%3O~GT1fdGUUPNlp}Q5_pUma z|5;F(otck*d=Ig{=Tabg-9$UvYg;f(Q-68InzkjetySy`Gtp6C;MBgcf^3bHYXzc0 zVrm+Ax0e16x0^(Uuxbw-4%&zK0irdNqd*+zF^RP#gtskQgl=3MEr%|oz zJ^mG`Rb*jH<_e<(*HJW#>F#spbC|});mw`3T@;Pde6uhAj`3M-(K~^KVoFd zWSDdDk7tXQuc*l=EKIC!>#N3qgz~4xQ~bid$9r7WwVvk&XPrxurYfA=ky(5MB)oKo z!i6HUI z%E)03@^puSdQv3o%2!UBx}dLtbDY@o$ehS1;SUAy!}r_8FwdhzV2F^LmD{=8-Wiu= zUY{x7>ZWDmmktzI+V(SyxmQc-KX+bUZ>ak9soCiSOgjj%WlFg9RdPUmUm(bK+YlYzq_jOmK$ zOD=i+rTP@lHa4|$2Y+AHXc=@{?+D9wU<8`{65cLW<-;^J3sDD{SANkK(Vt(?CbpEY z2jY|+f&6;;zWbg@B6a+0=dUx5Bjr5gFVTJ8$7pd}M9fzr!C0#`Nl4=$yPMl}Bp5;6 zBE5^fj723&fh6U5?-9+J30iB6krX0ZOU!=15n{+EO3sXFu3V}<@m!0J<#92(EC|MG#63|8L3$(cDao3Nh#x7bC=vu19I!y&5p4bT)|CL z#N9=LIS99_BO+^#qk2M&S}7rnW}BMUnUid=x_Nh+WDOQE`KNB=@jOE)pDHJw0uJHN zLZcBWMLOSUoQR1-Os#1lby&wROW z_>+r}yV$D0#a9`o7bm@aOU;7~T~Gq7zS&*s0hvO#o3iMPQtbit0p1mKy`ZzUFnkFh zqZ(LG$b`Fw=6XN8qND}mm|ttwj}OEJE{l8CJ&I8^%xJ~!j}4Ik326}N9g#qk&W;+= zZI!!-ja&+29Q?-!1m(|J0Wvz)hVx;dw(s_rr(>H-qz|n~-Q_PAhT=*AypN3*!BDR{ zPRvMb90PR}d3b)Q`)-<1`%pkh_iZ9QLqu4qVEsw!9V_$32~~zxJBumYX0X* zm0 zXdDWQQ9Et`ei0yNEr6&45)WN{yf{SPZK*~2z#GUTx_zu~p9tR0163GGYs3|vPA6bQ z!N~pa(t5A|Y-qF;iue^b9k^kq;lMrS;|5vTU?!$ip!iTd8BfmOk-IQmXjZO+wxn)> zry!Hu>0D>q5yHULZujbW2^Eb|I`u9OPLbbkN^rM)al`aBka3{|XjB2R66IeE9axRr zjh28I+-i>K534PN<`ry1t{DokX@~zw<6p!8y58lo8>EK&`apD1sqHn?g^+>429eEt zUdQCXSmTAK-kg0?LF`GYNeEL)gA)98^*4e)gq>zYf*2-G?{P|?A)psW zF%nY!@3-((6&4CmGJNeh!^-+5)D830oq%YHgI?EVd<6X;`(%Hv6hBn&An^ZcA( z^CUDY3_a9S37qQ?nqofv37diWSLphwZNx7XfUOF9*wvtR zMV#yt=3$wa^2oy`;XPZl&Di&sB88fiy*IZN<~mpnqfceBD~%kCCg(a`T|KR=-){3L zy-rh_xP~@~(83M6B&V#V%dY&91H>$i^qQWkG7>TVkiP4=G{&Q$dL8T-r&?c(N-zj7 zt0Pj5fG0?Rg1zCZUY(u4`NIW!35xhOIs8`!_dqL$eCz6C@Hds(!D3Tw>81bRz+e|= zC6JyvP*viW9XA5a6(AqAwE|^4NM-ca;^z`5j2xLH&gkqGrKW*l_aGOC|{>Geggl z0yu;%w6MeL@DC?E24US}20nz+pd%b{UzXUU`nKEA2@)pZHgZzvWA=*y8tPzjP>CkAAs}UP+&cD zKBwHn0dLV3D$E1qHhXbgjRp!4&uR$Kkc+{e%96KX#oP@G0vDd)tp0vu0^ z16uZD>AYalybjZYAb~*tfPER>fa~4t%IR#2m`7Hi|E!%?2ZCrjUt-!+i^`$m{t2uO z3*{}D7>-%xc*2!-83>g3W-Cfe+Yv>oHc%&cLTS#;VZj4pHA)WYPYXnjy3Qb$Bz|h_ z!G~F}{#jg6VRckkFe48MC6LBEjrg0;M~gbsvV5sp_hUE!xdy0#Zv?mp=PMm6qt4Ks7V5Y=B0=4O154Y+9+=KM8)NIL-e zCT=Ko=IeFtXb-37u1Eb4F3Ly#s-G0sD=x^Hi zB;A0IVYp;phBakl{Lr1P6b}t~ZXZ)Ee1L6}MdsP!8l1(u)!D)xpb0~!zl5>=_b6w% zi-^u*qH8PYCO6{r_XFnGT&A)Pux;sDe-+YI#P}EkoSg4|E$OmDAbUzy zavrm+54L0!>y`MnuZ@RWx3LRkd7a6qQ6aT&a}|H~7t|wum-z)!?kJCr6B4g61Nw`X z#wnz_cjGfJbRqM=r8S_ym&RI8bkC&x*9GB^SjQ4P$b&8`ogBVQ3sh zg|b%~|9IN8`~eEG8ro1CzFTT#Bn0Qi#;^!%@>5zPRxQkfnzlTnajw}K12@>z`qeQxF+XFvN50>=&1%1R#`s5~_ zOpu$C+iGg6>uO!O_7bt|`c8A0=bI^dBf0@fNrq^>WU{6&S$W{j(~*r>REdZ(qcTSX zqsQ;5Y0Gn$GTZ;`X?7>!)<_vU12t(>+gHi6h&zmHr!Rt9VD}wLD~j&wdXZ3rgTl-o z;`!X)AanpfK)}B}O;H^gXEaq%{du{78lqE5U$B%-X}yAp;88f_x@<+4N?qxp(@5cakbEQ_@gg#oOWOLs8AUaJmuJv^AqNji>6s%(z7VT<$#$pNTS08+GV z^?JYr_D$^VahAn~b4mf{0@#3=1eVL;h~N!q5SG@=lXsGLN)fCV*p;QxaH$Ko34n*_ zyIF=cI#a))^|LzN3I|;qzJ5Ue-n5lSh1nd4j?xU) zG4`h2mxJ}c^!TV7H;LD|!&2%++i#|OBBjo86g`7Bhl*I7td-_4bM$i^3)lHPf@dCG z13J@0Dd|oKiQ;2mD-N+x9R# zdcjSzypaD@c_ivFfKE?&t;*+3%IRx%1uBE*CKeffuOXijKo`iZGzpnm?LW|=$*T`w zSS}y724>~t*&Qg)bL_-j=oL>9!zcSup6J;WrLIwCDw)uH%0%GLVvk1ppFIzSeV=6J z<)l&7&~AMG)&vKJ4p^jUJ6Dp!nT^VcEOU|3EWQ2Im?PGiU0rN#d-8slJu8SLQ^VC2 zOY2+}_DuI@^P1X6sGE`CM9z;qxO!(e_Wcyxb#&gmLgBCi8$RgQy{qHlKE$<1+T|og zMS4qBLE(uMh{XKOnuYCyfxqs?n@-sMomXJ$9ND6xWnpZM9&RYFdC^nVNfGL=z%oqscdYdat z1M2knPGA(#XK^Gm=~MlYpb)gUYhcB=#mYkPa0{7C(3YaMjKYJ`%)Fx*hinUxqPD%~ z&+QD}=z7fYH}I(}(k5+36$8n#$7?;#z+d07+VY3Zh8x zHFwx}tDUpHW47hQP1qk4ZQ$njl;y=PYdEI^+e)S`zeNLte18V$N8au)A0Dw2_^9WLy`M4_} z4SfKN*Y0VMB?4frkMkw5iaVKN;E_zF`MJ0~Tri?lXAdfyIAHf3sf?;@1)pQhA7Jct zjs=U?c*X65Xp@ z`u*hdC0XfJF%xN#3ZN`CbiEpaYP%9g&PGH=QU>TIsp*zZ)4{VLQuEy$fNi}jTiG~z zNvM`K5y-!9K*Y4T|-ZY3_>y z*6+eWqWMIv2o{&YQtZ`wf@DT0MjTpI;%ErUM1fgNBR9DXP5o4u2;fDFZ}@5xQ5TQn zuXukhm;-UFA=LJU&O;U9$O|Vtwm2MVh>OTICul{y>SH_OCK4VSIVF>PezW2v7Aga6 zLW%QpUxp4G$zewM{ANvEv0G*b-nK8jHvy}lu~>A@x}^ouD?@>P>E;uYo&p<$?1J~s%`+E_vJOGrdsV$*fkFAKmHu0xA1-7! zVP)I!`(UUd$lvx%=fqqdtq3vep#6MeV+i=0K4FlO;s^1ESvmGRNlMk3F7?SYFw(BURwlNa~rZ1$WW2YpBJ1M(^xT znwAo6QUlqR$^c{nfy+HVIUnT`z8O{z01obDju{Ab5zT=U;L@xgK)g8fvrjM@cN{@< z&${oK|8qk?>6v}o6&|^RPt1#%{d5@@IF z#$IMQjjTcB1O!IYJRN;?O`VYM6HYvqr#6zxk~6>9;V@m=iIai=8#FqEKxbb9-k&)% zZ-5afElciAyat6-iK=fhzUx}u)vT5XQAD|Y9~f0n;pB{y+G-({vz(Ie{{U$;sR%^J z#!729JZXFZM=aN43{=&;kJAn|%!Je6$D)XVw^$7&>pkV%N~&Jsrb%5h!?Uaw#rKyd zXz`Y|cSqgCl|2&U)~i}J^s>7SdcgDpc5@BBT_yL8ROGh=shlHn!E$Str0G*Bbo^Qk zedzzyHO*jzlrKE+Fb68y1Wr}2@(?vkYEm;d@GykL$P1v_dt;tC81PzPKL+3lFX{|} zt02-?I4JnhZd8&fBwKIylz)xwdj*n&6RHACR!%sCq@}iA49OFCoig6d_>!H(z7UG*kXasp>#+`*9UX(^DP@s za3oS@Ioh&SML_NRK+|h1+N?l>ALHp;wCp4``J*p{5limcJW<{TQd0^(X%S0RBw>&M5YBf7y5r$P}=@J zmD$`g&W;Wj|5>Gg0LBW&)C&wo+X8DH{Of5X;Yw!*w>nISq)BDvbfp?uC}iwG48MmL zP__D}xS?HjW2x$kc}|yf9w8v5L3a2y9ucdZp}V73<_D}(x4Bwmw%t@tjaZrH*O-6T z&`tdTo}=9JI^0@D!DvgZTYsB8>La2L{8Nsv0RT$64Bj;Vi}_dnp+-(aZRq3 zvFek;4|HtP6XK<^QD16QaxF;$3a(0F%0s@P&ebEw0lU*`$W|@Wz<-?L)3UZe1{HE@ zcovLrQKN4ckAH<~WN>=u4%pB(;x-MO|Jt)vLK7iD2<&d5jx!IkE+#|e| zrn+uKtlv=v&KP<2gw`rgnZhSHM2rTV=b#UejyQ5j5E{mT5Q)vVaXWT_lkSxJfdru* z=ZEtx69Q_^?_Af{%Ply7^OcW{y}8t5K2W^?2}cGo5cO;ED1#c-$vRiA2wYNUBw?-b z4(ey~;tcMZe+fJV$z+ZF-!=)k?Fe_B@raPzJfq;Pz}~<1JVBm04vI^{{Op^=#JeQHe2ck6JC`d1GhZ ztYN`h%TYD5$vkp%npOGs(VuwC?{(u??MU0`M^We6+HI1=(}_i&G?JU_Z9f>N}=#=;Ss@=fjso zBU)90rUgMe3YdIaSL=;K&@ISg{2-LV2DdZT(&=PD*R*!p9tnYlxuhMuEIB zIdfK>vdU$xHT#&VJAPMktGL+Tv&%jkQ|TlTs>xIEv888a00KJ7%8*YnIQe>;oh*RH z1funZuA}L$JTm|`Gu#nq2s$LU<`B!1kl(P5_7Bn9u543Ix)8J&{^jtg-&*&>56nOa z(tWBrqQLrR{k`-!0)NKSO1wDU$7)WgDwhWE{%%T~kvm|k`!#)%i8Rby7vWB5&xUL~ zss^n0bnt7MPrR{>vLP;ncIyY)^cR%xGUx5;2^~AkBseDmV!zi_vN(kMZDNroceqXdf{b?+qUWnS`3RhTgoE9|iZ0bz`cp*0)nV zQ?ni|pFLxP=Lyv6;Q8IQoi{(gszMgvO0`tTszH;-y#-&5eWH~!lHK5pP$i=*f^7#) zt#Et$6W_MC=Tv;d=ic+NARA?dk$qtZ-l!tBHObq;fLL~&M`k|l$e z-?Mf+I#B=Hh!^7w{IbU`wAG@U&{8(7v_h8+p5SLeE;G~Rz0`u2G}&JPMVqv!Vcx0< z5CTv+7en79xzP4O`;Mz(->BqwtUUj(3H!Mnd&4YIdP%2b@adV3LVN!q;UD2~Sb3Dd zD^Kf_dVg?GRhyjaNPDJaW^7cc|tHbH%m_ zRWg;LnC35&b8_Vq^$1pgKqC4h|5WElAgB_bw|RO|3o%euAE{;)s-g#}6!_`t2Cw5S zP-X7CH+o6f;<9ppo*!eKK>kD_2acRRZ~ujN-yG33jOY37%UXBemsoGxuN{*m@s6X3 z@r(54Iu+4ymka9Q|LH@fscSk1%XjtHZRCwmMkGIu1xE3l_(1=b8)p6u1^EqB#}Q1r z5FuEsLB3i-BK3Sga4J?8Twu39-I1;RIzs5=LO06{KTE&U4Do8pExn^4MYz*IRk%)q zWYJ*DE`xhfpdiYbtga1x$KWpGb$V!{si*P17jG`T{WTuVB6pW*gb{`9(p`a3nm2v| zd3#^eI=}o7t6Y3fGrsg~9L!?145viR{-=Y3@T_M>-;Pw%3jCzsh=*A$=%B zYPG!KXaI$+S{kQ+Uq2WK!lP{~iw=@Prsumk(pN z;kbPTr#CAF0EOQM^fg0{1pftqtpGorp#Knc#yKmjJc(vfqZ@QIGSpK|B=U$ghM;;8 znVN=V`PA$Z5RQmp`#?fcy1XW%tLOyANnXF{jt;6*_83h}&|1VBh2_QsWcxlO8F~ni zy{@IG0W`Nb4#~&-8Q|njG5YO9%rt}2vuUTLdapOmaf_LtT)FIXA7cUq>u70{Q#4QN=?@tT8mBA8JkV16_j2Or^&tp3|0*wifiN*;Zv%?Ogakb@b+5#}Wk(e0c;{+e_3*{`zherB zqVY3BYx7mB4zB_}=Vi#8;Cj+nx>pc~avMOc)9aK4#ghd4mIGa|2?^PZd|kox4P64` z52`*J!QkyE>uML|Ecn(gZ9a`EnAl6@)@}n4Hyvyhx^dScdIWFR%K?sh5>zUBG1h}} zf1hc+Y?M*)(Mgs+QwBcWX`ccDR}$U`Gm6ErC6}nginq%f@=U*tfXFo$KNe zZiNk9JniGqC@NBGa2{~VgW2v~QY?d+LxBjWO|bG z4b!(V>$wBJCv}rM03W^9nP7!PsE1MG1t_vT$NB%#mC5)Z*yo%BneWCG8aRr}WIjB^ zsfjY`3Vzg|LXv#le36nOqfzgMhH~1A{Xsd<6OJ7XRfP@#1Hu;`!-fgV?&wHG4)s0a+ zBIr$(lc&r9e3Z*X-kC(s-AzkXr7KB|OFGtz&<~!73L$C$l#A>4F@&1=vUwKOFRNyx zdCYwbc+G?TP_PuRRBcoe`l+i}S3e#GhCJo|ZdJzCG52w-v)@uIs%OqWkcQ4|k2_Fo z+BpAaX}~Waj@Sc*O#;5^_0D<$RMS;B@{te>kHYZ-fz-THY$Sl?G~CoDC|;Z&g1D5u zqi?L*>E3)~Bnq5IlF6La7y!}HvVH<#+j2cJ{fy1k_vo{;fe{YBM}F?4-5>EhXwjskFY1kO5}P$ofrs<3N)8X?VCBW)zz}3r3xpRhj7ikCYXH)^ z*}@4Pm8#UcVb0fqAS3_d5~u>pT{7mHNd!moO6gu6sIJSyBGTAqj7$sJ?(3&}B}htA zl;GeVi!?7^gPy|nNMW89Cz5tqCF5m@8x%fiD5*W0=fG=GcPcAUQ&q%^&_o{+SXC_F<2ok0VV+|fpQVlPY-p#p*;X(6@Ils z)=1NbU* zMvf!t9f*(J5?zESn{N7K@?lq(ey@Vxn+Naw9`8l;2UZoFO$Wm8QBC2eVO;;h=-#dI zZf;ZbKb95)2qg`ewgHCncnuF9nULL>%F-}ih9^jRMZr*j|I6zyXm48*?FzX4bf;G1 z@u&^;v<974*HUDcsA-8kD3Ba;t7SdY=zkf$4bR+$K;52V z{l*@jU4ANu^w05Zsv@wK53?ZX=rwe|`hI4``v0$7KfPup>Wi=F&&n)lLy;5?WjnWnHJgS{FNZ@O+na9 zNv*VS88m0WQfHQeje4?=zfuyl!cCaa1*U1clYFFvw1R=;lZ+CU((cA``0Vs#Z*bJ) z=BYfOu>EN8!j306UC!5CVxk18S@G>hBRLjJ&pOA=VOksLjN|L}wtYI>$eHqJ1$o{I zd8CHY{X5(du?*!Y?5Sw?n9X#8+PPR^h6g7mQ5D1#S&wDFvYXm)>1~}2?y$$!(f$E0 z07-I^Y*~Ml*vTVq;9cO2FSb3Q0xMtnVD!qtF>*k#oiDRn6XLvDq&6#6FVt67+zzP~ z0_p*Qj`aS;CL=LP5P)vJYOdNn(#wkjtt`LQi8c?pd;LG)tWe-RxLzJ>X?kg!T(_LP zU9SMmOy}DlF26f%6*23HLb;$=gDX5cJ6%_a zT^l=ufb3eKPSppXYL~@BH4kr!F9ZYMT}9CfrQtp{6orz{WX3f)jSos5LT14^#WDK!BL(tJCXB5;ViIXS7Mj_4#)-q>Qs2o^#%BAfV^?< zY%?syv3+~wz~5iq8!_$u+-XqbQiB8@yZGeI;s~U$_yUV*GC*~uW$IZ!?1yOaVoX7& zT@W$PUAM~-m%)p5Qeihm(o8d<5b4*EB?{u*uETs3&bE=AIpj%=VVn*zV;=B3m&(xF z;fzsc!Nvd@Zaw0SEV7<^-=RYV5Hug zD`hi}Go^&E3k)TMQ0FvZos|yCnKshzF&eD9imgAD;Mwp6pVIw8PJn9cH^Ey_Nk-5{tFz)|wN!D}XPpH5X6DsGr{(F$t5VX;O1<^)P zKeN9iHrrA{nI37osT)%YY{D_CbV8bu*}{0E{BudGkGrH?9$YElgDB#zIUO%?l?9)< ze?8ksrX9Cs*1EZXYi;`=_5CX-u=0?b0I-mK zBE7i6t&emzZ>YzTPz-Y@W}uDq;GrhRwFxvkld-qBK@{JjLHhXH94`NWJZbXMnz?dqg;hP51D%c1XiGNwDAu!-g z?`XP~rs6NOYktNxSRWP}>jeQlPn|gM7-wq@2qe)3U)*ou(YZC;s!YW>^tlE2Jj~X3 z_KkzcAH*Hvo`pWaiz!NhxsdX9jqRlwdRNyf;8erDaXXgK_#4HOY7tS`@~gggU*4O= zRs6hOjHpvYlLo0tweSnNF#DjPb%q4B*BU||iIEVzvu>!Zqrq`w8U1xW0oU5|NlD+h zlkhFXtKE!(Xs2cNTWV3bMV=plX*K)vqaB&P7k6mRN@eC&AzehpMy{#>WyM}Wj4|2! zV?O1jWh$x0MA47RA0C&qrzjJwjWA@7lh%ue;knn7D{M_dw~E^_oWb3aZ@h431YO2l zftRAKL<9G?nE}wJF3xDS0>Q|uL^F8U+M-L$xn>c$?figv{JGT1aR~u6c*+jxG#3%r zJ~-6?P)wRUU$VhxhF*6$*Tm6V&95sILtHqT!s@GAoGzV{gUt9y1RsEQi(u^sf1?Bj zUb#StB`)wmFkM`pm~x3F>8$Gz>BC~oB+xAc3jv=@(+3DI)p`}; zv(=vqY9;pA;mIsZfjP2WFXzKs`6TCNLJnTUVqlvqnU-`}_eR^1w6#-UF96gG6ST*4 za#$h#3<;V_w_D{|c8rssgs>rO`fZ=^#>mG0S#~j$QAkG^l#oR_jJknDlyPk**i7XB zlTHTQ*b^2Z@wQiuQ64XoXyQzT%pnzONwSpHZsU`$6iLmMADItXQx`WX2g-S;40 zu|+-68Yp}%+ChflG!cNsn+Y-2!zID<*7I{32YopKxzaf*x+k;noGw6F0n8K)GRRAP z*Q!)f_>;!xr&i;>MX?x_=&}p`AA)gtzgX}ti?$<(+ih9*a%;pOD1ZXRV(4^9&?m4i zW*dJcTh8l8y-(zX(fkK_z}3y<5S>fKe!u|k-*KZ=!nR38(nqvU!7yJ;7jSv)HvrXI z9s^}eU6Ft|xi3~!eHDw-A&Hd68A()iyXFtV>?|)6_h@zMCSEF&@saq!No&qx zR%J_9YN%{1f&3V2B+X| z0VEKcP0tvPQCAzA<-a)b8TAwZQrGuA;2~3yOf5h^xg3SQX~#HcM6$xgP7Y5x^SJXs zG24d|+V*i&5VTpT|A*=Or)rlg1je97u1adgsIo8E!zA}kD2vUhJUUB$mro+B+Fc}R z{nLH2EIAUBz z*j4wEras(~=sNDyOxk%$)i)qQN^TS5{Wf>cd$iX3APZlEc27%+eOzHhYR`9^1lPK8 z;FEBY5aIRR_0pB*gUg!BP?}^=!d=cM!b5J?-&fF!=?omjbQBVHI{;QLQ22o(ArqF$ zP7M28Fu)Hj`|_5Z6AF)L_6Gxbfk4B^tnQhMJj7p8e3109NMbl|)w(jo7jbRFjPJ#|at>iqDg zymhe1n-M*}Mo)DJN`el-?KWj9DpLKYYle#*xIzpHHAAoY^UUv^7)wYSH`);qbj7ihWd}{ojgp(B-==TLNS=^^ z*~qKOfMH5iVv=KA42a3&y|!3F2KNl3J^l-3?&VY<5Z_`Zz8(MX=~goTSfKuwZ|{mB z96$~?tMA1Qwrsa1SyhnAnTY*9z~`F_@3cN4SzG;~?W`iF0KZ@y<42mEx62NGB-6Z?x0x`j=zBPv;raT+H}15pYTA;RiUEb@X+QKB3s$@q zW=IX-rBv&2{basvYjYgE0Mc9qJkV+F<1uT>EL_AJ2^_TNr!MRAVP^TzklowVpak_R z{|t?Acg~t@o-I$#w-PmUlSRABVn(I;MQkXw7O)C^bmCccj*LK!lstm2Aqg#Quz6qB zg+DMCftk_TC)qzT85Ml1QxJqEqbrs*D5hwJ#VQ#1XU;cVkDOt}rES_9mdf_Rg{a7| zy)~xEc`;3rhai7YR!w-ZUwhRYvmjGi@kK%c@m#p9!BAUAyt~!kf^;Y&N8Hz$UFk6h zBmHRdRSZK-Sx5MZM51l|e}Ej(pF+TE8(psH=sRr)L47#)l;GdlZqmT5E3G5%&0Tge z8T3|G;0eFa@%y{-RpF*v9)jrVQ}=;75dgfMo_*QXn40#p14N;Cd|WIodn&$(ntt*F z<8RJUQnL!(t*#zOGutg6$MPC(mB$g7Sj2nALz)DR(K#9yNqJn0EdMI;s9VAl?H%uDl8? z30RJ}*+>-s+z#iPpiCfVG#gNk-uyIw8$4r7jAb!&cBlXAwf&w#a?WZ0e6{BV(JJQF zl8H+Dn_mr}e_8bSp0tCtXkEWHi73qmQg@yp!V4cpQ?Ovq7adT53t$K9W~^(XGVHki zGf6ENKBPCx+TNGrFr8B+x87Q~@nG<6Hx1esPOJeOD9p*J$_~JFATSyLwp_)A1PI7Q zV0T~vBzoiicrvELO&}6B9W3EDh0a?jdka8IJF>y#;w~*Se1GLCXqI*%kod#QOrcCj z$IcXKxU)GJ!+q)?+7y|LlK83@Ae9d~yj5jesECjY^IAD_>N<2ixE%G`=le!mwJl%cy_syCbSg#698W&d@UMlUd~Kpp0%!+8q!? zOk6llRPoR&K0^&H>`=sj0dwd7#Jsh_K4G6EqA>}x`kIfxDYowSwral3^UE3{qi9Nroco#=QI5v z(7r&rQX3UzCtreZyPF{pHT|*Fk3hL{Z=;VC0kQ=pIDZumtRe|C=B#esj^Cr#LMxR7tV54 zQ_jO2&}6$35g-KRt1^N_W1T8&<2M*3L)9m@v8JfjDt4qiJhr7pe7VGJP(C6*wn zZOG$XYT!frfTdXkdi`X>lczHar)!0(+NHn_Veg`@HFL}p8C>*>I29&Cl@ad?Y2%+r zp83OwXhX9XWX{UM6kV>V$pM|&X8fkK_J);N>jA%4 z(9(3V_xAh9E9`X;hlN9aFd9+W965|(%|`~hQQM6|kCs`0bftQ5NuWs|w^Q6T1Y@JV znd)0NrEM{7!vt-E6Vi4T!T*<=x$MURo_a!AOoYKsGCKzit*vVjw`sNb3Poa&BBjR$ z?_e1v7(0#L`Wtjrl$8jJNR}VAVUR)?M%Gq}?-mv~b3(=g++|a?!P%u; z_?IRKUyBO!|3dNbCj5OygB;4)>QHE;&aK-1tLyv~THC^>LgkDf_)l==@FNyGov!%g~=NBr!Z*d1Y9OOcF218q%LCL;ErD9D9d7_;bIoq6S?7XR7Y%|V?6LfonEn8b?ajx>++olbr$g6 zZp_;9q1ADGgTExPo%f-9+yViq*o$_>xEy^14!!i8kwaGGnX?{faO|)E{f#$@Vtp#Musp>c8U40v*q0SOeI_!;>F?=a}%)^nYHqO z+s{rXquax8H{Jokm=-cWO?|Tj`T$>5eeaj+Ys=SdntZKgu7Oc6+`OulT`qwsN4&v* zJqK1zi3i&d$DMat0Op7M>#g4W99LkOq zwR`m|qB+5Wy|v^YH$w|iQ2~PS6H)QI?HN(zW!7qq8OLVrV~gzg`)9c_xvlO>dg`Lb z{U$_A*KI?=ehG&fmMfCp_0{p_w#Uud<5b4YPte#S-I$xz4g#Q5Bm$3PY~0bhL#N~v z^E!wWd0_M&Gfc4eoq}GU<+Bj0)~uqdl};9W{UKjA?tPM4`UlwP+$ZEte<%Za)$N?3 zjsPRFxl3y0jL~0MAKL)}g`!$+V0z&%u!fhmKT!PH!5Gfl-%6swLsd}F;Jk~|FMJ*X z!DyP};Go`fjN-E_)Ke_Yowr|dTJ1tLpZA&aFuZ-voFWk5-8kK36&5;9~ z>)}EymR|*p(oH3fJ8>G6QY_n(k>a5+3+ER=VZs)ujpKlm81H8Pj!` zQJm4NQ+I>H+Km2Lsf34Ke^QlX&`84;^5#`MOmK(L>l3Y*Why#9)(E;07FY4E*zFoF zeRNlM*19YMK?oUrc@*I>5dcaE1<&Ae-|4R4ZEi`L@puhxx{}Y1_;J{jZeP+|Z%qB# z-Zw#R2@(}KA&yTBb1Sl;6cqpRLzT-e7nU;ex)m>z0ZF0?{NXrq4DgYA2pWbgGrxd( ze@TY!#{Ub?rG>z=2bf;VV&6U>r1OmL;lh^3C0uTs76!$jPqrgiZ6LZqPS*zykuS#@ zJgs)J6boVDTpCSnls9t6-9Oyyn(^dkW*;8+WlIMdX@XIaz;Q-`bYSy=*9q`O00BJR z_zy1x79(W99m+Gzw=!x7GhAuus)HhD#pR?<>&zLZKFyGz0a;oVUy-q;@@!P& zE*vPyAB4S%cJz%|E?cYqy7reo#eQ%phIfO0pJ?g8SVWyUAB;CtkJbnJj=$gArdw(m z&f4T?DXAP#fJglXrp_toCAuuP!f-nJs#AJtM1yX@plD$dPj9Z2?$U_MwITxm6ukMG z&NoX&0w|7CZ6yl(F0E@7R)H_UH}cGQ^D7D-rE+Laucat0dBJ3C7tBJw{9DbkbXJtBdR z2@Q$5+PjQL5ue3nRR?AW;c8t0(<+PUy&7sTg6BoCy0YslP3H?o;biqU9egv${BM8ryxb{@l2uOTsWzJC;Hs#Jf z%5D@MsuGm&Ve?AgJiJNl7U@ex{BN9aD>gnZ2BM z(CsGDv+!dn4F<&KMl=A~q<53<12}h;e<UU2Z`8ySL=?fW2GI`PzVB;wYb}HC$zX!3UJDOe;&< zUn3j!?{+V%i-a89N&^5aw3{bW0EN9i-(+bdHV~h%IcJDe)v)DE1OEJ5U)z)F`GKap zX1mv%o+0APB|(H2t2hxJ$bVK@NQwSUw_iTP*Ou<@g?t)y1viNUX-rqG;HKV1;Dy-6 z_15#ZiaQFjMSRgrd5fDH*$mngr7a-$Bnd8(W2&!W>R7Fgk{N)cO&s&DsSojY8}MMV zI3|FYoO42x^>t%YgEz_v`%GePhg6>4e^-}r?Vo=GaJmmy^N2sxBJBcdA`O6Pc63}9 zqUVd9zW=>T)MeU+O;j z`jz2vPR4^3t7pj>@kC&ih#<^i1EFI9@dM~mJo9ZmIpieYB(NGM9h7NW8XV&ESpe_6 z$2n;aB_NI@KI34U0V9a;tBOSnSKi8BV%!GO1kEb*2O=!n6iPPZR!BQxy&&H&Qa?0Si`vUz5+SB}?a6M6iK$MX6IsxIlS>2%WU0ca z<{IX^9Okk!pP0UAGB+NcVcq}$LXi5}4TerZA|Bl@Ui!~o26OY3{X$DqMDK=zRn1KB z_17_b%S%kQFksPo+n@&RVP?#4%!??>V5NBx3lhPV+#|Imege%tYh zBdz5lvCSR@9!IU3Jl(j$yfVlv3kk7TFR!#{hik5sNO(vhiD-UD zYD-K-;SWBMbL=0m6IgN~Wa6#k@kg@Izgv&2yTyzFpSz56Ze&7n;A;)|a=k2p!CVrw zIYY>>8!6V@>Q^Yf^K`pMHc1)RYjjpmub{lfUgM|;b4>1=MI#16GB1|pf$5Bwcd_eXsmng|#& zs)Wfiog3{ySRCamuA}p`ZhzxoK)2un1N0A&G4E*K&2wny12{}wA8rFoJvOquQAv&EP#^}+Ktx%mltPOJ;pZxz@8IW@YWGG+FQ`Al z6j@(!i^HWgA6Wa@;UDt1mQlU%`{eq3mQfm5{Pm3VY60nZQrY=xuibLrWbGi>NXZ)wn6^Jz-l<^J02^V2m2?FLI?^m1cv814PojOW%ep}QmO z-~(x*D|VQMb)F?E_wzNL+2$hG!MbklzB>SF##+8&T+BW#$M6b80y@NY7LBRV`Hcw% z8vD4B94oF`2f$+w?zu0c>M}^oE?1Vn(AXt>i;X*AOUuunV`&8Tt{|8}wW(^M4;!OYw`=kfC2}xQxdUiv4 zkLWf&+{urxR4ffdC_|DGV+J9PZH8mbBS{RKT9XBnE;sWLurbXq^kXt*T)@3_QOQgB zYy2_OS#dgfPDAQaUEnvMTgIm+Fwyqp3-8qZmbZhr8=KS7TdcM~jFRW`{J{}f7*Es#u5z{;+ zWPuuV`PfCZ#C2=YI}n{@a9|Ij-a)-2*_4CK4!LrjN`GrSdkwJ=N5DicKB@HTe_cW8 zsk0@BxzjA~kT^u;6OE7Nz$DnW;C6wb#WmnTFXEe{T$ykY-^UW zLh4rqEugr<^bh0lX{;pm3Jm(SM?O8i(!LL zOcfA1BVmmwyCHCPT_QO0%OQ|D}RGTTCzwrJ?5v2TmhzY;N^ z$sA8HkJoy7)QhaxOGLN6W#v(8V;B&tL!C^daG}X59;CrZZ_QHVBYe0AsSoU2&6Pes z++O)t0kUK>0QNCRS>`D8fu}jsv90N=p z2+@+5cXtM<)a)t4ghS0l815QU*jrUlP_Jks)0n(33KlH82)DvEXE}KIJ}8#rpA4%q zw^Yso3?0K!Lup?z)nkX=9ivOe-@ zYDUXHLNF`e=#<;9r2WGrr8l5&Fh9`@)aYZr#1{WFV7mbVbCFrTy!A_7XUF4;N5|Qz z28E!@(B_h|AH=UQudEZC)-wf&i673iyE?4$(@7fo{EjrkD$z%b?|_710HA7@^Xe^KP#Ob#J0ObWj{PW~0b*JIPNh{Ox$ej7|o$2x2=E;*8nifK_i z$Xn+4$Toj7KMKB&qUUTlr~52F!uW>=*`YA(c5L9~rEHaN>B-;@-fo{>uB?JWBj7-x z(U4HF)E2Lj1DovcD2LGwZ_Ii%~^mf=+Y5 zrMMPigItE2(x52=x)boYs=BH|g&R?^t!9)a3wX7_00L7dfLs7uM=;RPtG8tr0E$~% z$lguNlgbnHwIA<+`TV=mcib#f!ht>vYbiaLs?{j$kpit_-RS}FXH^>qr-kWJyhCGZET zDne?f{&M__9&NQCV2w$ON(Jhn{!Sc8sM*c5#AwWv@W> zZ-1s+9YCLM;nxn172!`OV$d`nObdaI2}}g^&4Yf>q`uA*y4#rd`t1zU=d(Afk=zIkh68?@5=ACVeq4)9J{o7M9FH?&-(F=AAxYwABCNOO#2w@2au9_B?!yBnk?u ztV}2mmk~3!NCSf&YbGv*pXKKcKm3d1r$D=45V;qUvJ|Ay2y69vw*NH*n=bOxmid3& zn2m#=nuPiAOZ&5BLJUylKckO9)a%;rofpkZ%_wmRi8;sOVqD#w;{OZ?y@Q(cD`$K{c}C*(EZAZUW2wwk z-O<>C8k6{MS^@-^d|2jSsjk#EfzMgv_h` zN(zqoQtmvW8ZgGaLq9o0IX?nKyCIL1QE(;?h%0-BMtPoy71yFj3>Jht*wKI{ z&3IOKKE?MyTuh)VA~IV*XB|I9M`|qAaZA-BVu`+wbjUxbaQTDr#gWFNbOJpu-xz}3 z*Z{1NNWe&RxpSbq7ukI@8s9YVuurwu&LD%`nb5eLyxT~G&&|H!qU5Vz|@ z@W5va!I~_j4MXawwuv6L>|sFw00VP{fN+h~dPlw4qwuSbVH!`;H~#EdG5qXKaCD73 zZ#2W7kK0h`C^8RH+J6*}YvGIin=40-epYk-*C>P4NGWYp{WfH(JmXhSKN~2?p40?W zfzj{VdY@Q&YasV$oHcZY?cTEaOKcf$fQ&ME)}7;6G->CpxNEBjJ(WF>%Os65GBNxy>rjK810n{TM3j5ruFkV*a8_!DHA^|zB?0%HrI$~A z3@sa{4NEneNd^>=s`;IoUk$6KiQ#bcxn;Hv`(-a(~AD9uHePBGLZJSo`!HE%>+OXbFAqAl7S~pnEc)&6KYh-hH zA62!UbGr%WZ({^S{i+bY#E}snPj9i2(%BF`HENbR>z3R<8F;L`w!Kk@vKtH?4Ba^%s zavTwz^b1j7!MN~fC1t1yTT+3goNB1H?E}tAlZeJ7ud4{Ov@X~qaz|&QkQ6+`p#5-w zl(HFkHh)nMXVWx&1POHdv<~D{BOX2U;a_AUM`*7?k`1DGv*CcWgjk(WcB29)%8Ci0 zGCF~rIW+U>=n<$-ctNTE5~A$r>+)p*p3)%!@CIU6cf9EU!|q!FICRU0gSsE39K#PH z88@PU&{1X5+fx+4%sSN9Ul7?(Y6j^pkj6w$-_JkE{VlQDq1ezX(4jLSs5R!%`>+A6 z05jXOoK+#o2zVx5X?!EC)#&(sTt>`D>s3auZgWklo7|HLWfM|be1b-!%4M0PXj;R6r; zrJ)Z*ILF-If#x^h6dlqy&AX&KX@4UTNN_v*$~-c8{eTjTv~@>#f?(k{Lw_aU@gIW6 z*@ms7Afrto1wh2l16z8z8qtqR&Oj$9aR+rh#jXnf4iJ4Ol@6VcNFU)qEICGK_@^v! zce{n>{E0Wzdp*bGC}`*fcD9qTUS#UMoeL zU~3WM`=yCd0Z(oJh@wTHmTIs7Ej89d`-RWazw1lrQ>n6d#HrFwmTE`^2h%d;Q|H(@ z7dF;-!f~C3N-N0~ox>yF7l61bKe{Mw=-LVdw>XD#W7P&D*d?4LwYK-zxy75?>Cy68 zcRQ5WM(Lk4Lr4#V@cvZ4sH}Fj98uNybyKx*!w4-p!b>(PUqz!!c0PdiL@KFh9~?OX zLl=3q;|RIXaONQ3^$r|;UZ&0dR#v07#lSPgWBQ?8_d7M&3aJ;?=otY;?ag7clEfv6 z>VEF^j~%(qB?fnX8Z$%jy2}OlGUTO%{@}IFQB6m9qlKsxf6zo0G}odrB2k$BS-p`3 z_BdTAhELmYXRkA@(7*{7bOyyi4%t;uQ-Idz^&{9;?UY`b*<+rjWjLa-%346?OtBs` zGaxqhc*jMzbjqh4vc#DDFChmwW^r|Y{n_b^U?(=~d-n;PpGuBho{WV)zR!E#u*$gn zcg<^5YM6RP#x02g`Ygc)uJVJkavaAe7aU^eBfcL8AUi5a4ya@WU6B$w|Ew)TQWblp zc!k+qVn@W^+KN!3-)KQ$1SBa~y`w}KWvu=zxj0tu%aU8hLyC||T?_CIANe(Fj~z!bXC2(y z^0z#NC@CIzXW{OL7C>`xqR>jNprY>pIW8wH)9@7857|37; zO|s)zS;26#(EWs*1kfXzp5D zq$Pj@Z!(F&-Bt5RDww+p(p;XMA8Owt!Idtl!Qtz#cblq1wK++7nf^lO4$y#15?X0G zFy|UOr(W`3cyQKO6DY7V(ig(AESSg3#O;rPD1EBEg!6y(WYV2bY66}~rUKJX&IbpDXh*_VZ$%K6g8^uzVA*k3#4DNyay@3(1bvFbpGS@E)u&WO&>N@M zb}9H?ESgLwgWI7>!|5!(SMrvt#cgyVJwStb!m1Fx1~9fyk?0FO0RKcSKi}H^3&P5f zqjU!`z+$E|p^n_bi>IQ&BEic-TyTQl_XRx1Y`CphDl#I9Eyx6Iu#XO#`lt1cf)gN9 zfA5e1J@M+~2j>d@s)L2;k2WEXKm21bRIu1wOW0fAloo#dtbxe}9W=ULf7IRj0xPhD z5bR->lXI>){1BOyxXY!-`mRqBSZ9L+9y{hb7E{$WA@^N!6Hbu=g$2?pckrN`MEazAzOJBkfVRfgw z6b^y59xHxCvjgnJie$2h*3=^4yj1jVBeffJOJ{@2Z=g(cu#ga&2Ol?dFar&&gQ0cb zpepIaNKT7rf&Sg?{rq5g;_KGQl_6NC@i4n+JwJ%G-5#Q3>cqXr47Fd41cx(HDSF?T z_VGX8yks6PVSlY=RiMnb;1sylhfagDt&S=i{z$FzL z>A#-OtIE&PRc^*lk4zg)61MQwoN#-`g7;#}^8aa>3C3ZM3IYw`vvz#7%plnAzmrBf zgby;rv3pBZ)J?aVZKTWnA)YX;UGax`EyE%aI1%|$x0MDB$b^7{6JG=ticVd315Qo) z*_SykilSNJ)yu34DzSDTR__ob1QfaqjE2Msvxv>yR5#A*RY{7G&qUJOWL?8~=8JYt>Y(-*4R# z5jpWJDap~L%j)%x48Q3Iykg{2dR+xbL2oKvQz>tDXO$zZ3)L5c@_sx5D@3iw zi^2b=W__P|ALisdPaO^c;0`lde>M<{0=t|)X)twZjaEt3RbsqwF5ttFp6d}tcPbMY zM}2aS;S^{TTGB3i9C_>)82eBWs;T-|xR9yv-LC0z=!oo^$h|$8CO(B;`jspElUkpT zu(#PST4;JQC+x5iMscTKiVT5 zjYlBX19zu1b5zLqUv5Ct1?E$nR$IIKJ-SXAX%lFkmBDD=7CMV3hlc|n5BOE?--pJX zEuxKr^@Od|E*k;1vZ4}YJ~TbAR~hHH5_FzX^o;BCbusKz10t~c<)<4I%Xujkpym6Z zzqkmoYKlF6Zt`m3SXqeT>A?rp0O?r!Nxz~Zm${t6s_W!xFY_TI+O&yfKA)yzvn5PK zB1)wtacuuyC~mmDE{@wb-qsl0z)AtLWE$AR-5ThnLQX^DQtV}?gxD<4OyjTbKI9LX zbDa$GgXZW=Vc#)nLmHDg_}hWu5hG)|{{Br*HB-l_U$cuRnc-2-)1 z$ZyAyrx5-Gr(LBPRI?KW*2uIxM>)?2MhG4tjSk} z{e+a4m-n?~#zG7e1A#pqJWjfKtvSOQ0nHT}z^CxBGV(onpp$$Arl?c?$|<7i2fRv< zZe9uQ5571%``-ozLvQ2QT!ZR!`3ZIL4d?{A_Sz^RYSQJdA;hMWdPKPl8&7p8`IA9} zaae+a2)z$xR2P-fnk2PWf-X&lnzJPbK)zz|i8pHyi!Ivnb?RAT1LhgOMPxmF(Xo_M zeN=qWhrzDdZTX;C3NhGxw{u-7WsGBG6H3!>)75A$B`Ob8EzK~m;f;656yB$%CH(9> zzdN3bS(3gS8e&kY7XseyNNEnAiCi4HC#ddSv8=Ywz;1ApZpDjU_gpGDWxGK<4YJp4 zmHbhdr)%+!2Q5eWJhKc7oe7*FgMInGa+&^I6PibF>mXk}OM@ZU_Qe$H23ZwZhdm4X zLrjy?TZ&FI!;_0D@NjbhwEg;Tt|V>|fGD<*1j{mdCT$jWk|T*SY7bcum>USQ&Eq#3 zz@brQ7+_QMtTC)3j21ZUV;QEmbi659G6y($9K6*iG|fEK*+QctpP{i1JeBy+F`Kj< zl2eN9S#uEe^79QCz_*eI-8rmeF5iC&Pcu(moj`h_ zK;NaxYLl{?fORj8n9MGv;s0DSo{g0%IcfHBI6F+?=aJDFnWya`Lu$;TyD zZw(GWgYY=mG@iqR9<2D(5|UPVI-p;Qu^oLVYhqG^LtoGVE$Q8i)L&^#;8B&?Tz^-&4&;Z|NPQj^GnDvBpWh_iY@ELtvTW&w7e51Ckm zs+R-(2EYKEP1WoPlm{?2&%d%ECC&x`f_rsH?!$`%uR|=TxEDGi9V8?G4=@hG^w6*2 zy|H{@w9~k_vepEE_UhmqZ;YKdJ~fQ>2#c=Uac*Ra2oU3x3hOFcm=sxkpP^9v8}}si zAG9I8ONBPFDQ)Zc^|p@|s#anY%hplJZvX%S0;Gw%DfRiKH9Ua2E?R*p+>r-u_vG53 zv_#r`zYErIvRVi*=;$3YJI3fffln&Ke*%g3bz(GTwK>k1--e-<;C|;a<{Qrq;sv0a0{1YiR+GioI;& zCyU)8XB*|s_bC*!p?-H^>p3qu%V~BS}bTQ zbRmxPldwq3Nt6sTbvEEzb~P+JFLB=r{_zDwl$gW+2GrH;x;|zoiot9ud7Czt zW>ppRRnZ>J0R4VJMw($fpCX_DDxq1HF>d$9H;z?CL?$Xqb-V;UHHYo@W5m*7AFJ>f zIOD&rqGS7_z4k-%gP0r2O? z@&okip_B0WJOky*1b&lmTez?u8{M#>g!%)~sBL{}X+L`}(0|1QMbty`hraBuRJkc& zhORKQcU97Yx!C4)n=#>9vzT7D;0esV{g*$h_k} zXiR-ktuGUC{iI==uXtIIK!Ew2D?+ZU1V8@jUF|)6Y)wLaP(&*(H!Si4P`WA(}=tV($ocqdktz2}xpCUo- zzmQi3O|bYwC{)MO+OhAJd!9wfVCb7I%)y%65Yej3b9u6IW_uLsD{|9#Jf22Mkk}C!SYpi56q2!F0!!?qPGs1O0){kMhW~B=0004{=KR>)UbS2(-D*lCbLA$aB0;)Jvo(*W z`PQMx_K*1m&{h1N{V)935a#`w-Ezia3jTT@vBN8XdEdn*ey-sQpb=Z@gmaT5GN;Ns{5u0BmRew$Fu@^)lot)Zq+% z`2Qb-mX*Aq)3`Wgg*D=GVn1ATdMlx({e`lpcA{zRHCGp$`Tv<)929T=4Ssbo*hyth z;_URq$RkHmUmnR|e6GX4FEX9cCt0OwYI$|?b{lt&KEZ_*R=i5x_CFF>Kw3NmKyYpT=g;JqUd~|HLe^EarPYZ|s$+>s4Y${HH}(YI z-3KFn=FxhQ?5aLxh=zLlRMP!_b{Jy~tvF85R?MRF^gb!+0OwHgT0)n@L0BnDmYT1DwD=gUj4!EaD{T&5ilW5b{Xg> znl{S=ZFqgxO{5WoAK!HmZjG2Pl3i&0E}sZ>)*C5AD)_M6d3{q;FHse0OH47dgBTMf zTNru=PfxYt)rWQD4 z-$Y2XseU?WLhuT-#-{a@cHY!qmQC^}enNj!gP4cS#WZnu@UAEt8KQqz&w1pc+TpxB z0sQu-d&8R;Nu>d@=RJF$!$uT3?)V50fJb@<7ZIYjUbbP7WP0W4GLWj05l#Wda%sOn zS)FL+t$oYd4b2=||J?2U_ls3n$#vD?f=pKzJP&|_uKg@I&O}Cb8dhLhHn*C^u=A-S z8pZ}PnlzKny?ds0*hJo^8VCl@v3oVN@ml(;^r8;4mAyN`kedNTzj8i1`BOyQiNVxp zI}(+SUP^pXm7>+|^wp*LkC@o=p2)lywlIsA2CEb#-5XfzIl#@tXSwUD%ht&1zAe$^ z#^U<}2sl6zQ^=VDlyUfIChAt|v|@Qm``f9Xb++B}5DiWQvx4%ad_oMmRUH%I#rq34 z4(iQCtk1+8>X)q}Oy3rnV&VBVS?02!uJxVjieTz$SV5?EGorf=zk+Afz{TcKcsK`m%W85RAYvy^%hOi^2gM6OUc{{YixlOBTM_!F?` zi`rF#0mr|~-O==T((^_Xf)NsQf6Gyj?(hRE=r9^yfUp!7JirU@MB(9t_!=in0rAdv zPiOapA{3MGcQ&EZ=d z9aazA5+xhiCx^L4i(FL!vR!(Wn~&MJ%R`4)TaxnR?>TQArPpgujj3rlzvMh^%iyd` zIs5B9Q^TR+h>95`ih?s2^VV<)akwgLj5j#2IY9wII8O@lTfKfa=m98ThS;p%lSidW z2S`5~)>2v2i;9rtb%r{C+XdhT@H<}&j0_e%28|lO9uBor{Qr@*x9E=7!ngl{D)H{% zJ-HiXxlT`1*m+H7ThfPOLJ$hL39I*`eY`I8_7^AuPgRWpwYy+I&r7rNtDCW{*BOqsq{f>G~voHi!zT#lln&H zL$>$>qHx#O+S|i&j%Gg7O>9WEX8ru2Bi%odJPu9PfJE5+;Wnc@io$XO?N(cszkbzM zn{u?h?~w{MVquKDlN-heU1H|c_L38+E5&lo>_wQ>O31BPYNeME)5%9S?0ukD7%1gv zrw7)_;OdF)U2=VWF zC}LtOP^Z#vN=O}krNStpQBjRu)!3Fxvk+^~B%tw-RZ7@0s}T4O+JK-Ki`cRJSWYE{ z)g_+07l;vdUqItl!ZBU$2>%CG8~%C5i|nlPzvVl{&t9;4)LAKpY2CHN;QXN3Cih^e z)m{A#m@9xr^yL5c63-&m`cLwYonedcHspIfmt9B&pH+wWx_A`;U^NjH}|+B zAz`OqRk=f3j}DI*h;m&1ked&tWeFETZidaInUka{QwF@zLR1c4YjnZ4*kd3e@>eQ7_Q&-MoavR@zl+U z>jFJT&~E(z+?!ogPxw$t_Vh(FPq_v3v%PGmr|)$f-2Kt0!RFJS4uvXFmzZe3Ufue` z*%NDBrZ?=zmQ9YVvrO zz$Gp4ksrR4xG`S6qb#bFv`S{;^0AI&3b?B<87)ul2>|_WQJ#xRuQWkpuYt8&D0?x3 zbt|vG_$FVe&QfMpS|Wuxgl7eSly&{F<6q`<)dl6Ik`m<&*wb=Jo4#vSVZD1Ide11K?*`Tr>0Z7Hf#HVJfpw1_LE!OD}y39=n^cW+!F zdlv$jQC=@xdSLa>k;;#x$q~~Rqe=8#4HZ)-x4H@UZeeGehk^TAYnX^lmF_9i*FLad z&64=?000;800C7vZX2g$+lqW%lHNqZVaYmITEx0&MvY1Ja%#6O1zGfm8`Zu5o`fT} zKpt)Y2x-p6W1|+0d$1H+%;Qg|Fz2i}9K!OcL59R`?Z7e!4ZKx62d;)TP`+BVpzq^X zPLq!?HggFAjCJX@t7IfGIH!b=12e8)01FmYf@j3kbF8sP_BkWEJ(EVcxl+u{ncRH= z@pZSb4wqZGvDAuP*TLpEI5TZ-KF4giNy0Q=ZN!*#EXDa z`aQQ#!Z*5_t%!P7K2}%T$$WCTB|{fb%O7vxX1|?Xv!vzT2lJh zLTHtSHZ?O*s018`0_9+a!?y@ev76Sfc@y$XJ4~}nzwir1Pwj^-q-nvdQ^%)T;9>`>jZvwQtN*Q= z0*9pRA2EFe4`-SHi^Z2GqBm+y*GQCJfg)cJ*dLvTo^y@f#nS>riY@+;cx*3|9KOkU zk@%0A7N}0>MqegPH$qwVd^2Xpt_6I7JL3{?H)qHl@Y(5JUroUQF`_F&WW}4n^Is~h zvO6Tpr`94Vm4+P}CiFv>OClI1J|~wfT_&o?;iR&R>%<90z7`q}KOcdyZ>5`_t97~j z@B)?uJbym>Xlb#U!&kHQnveV*TYjqUysCB34f&lv7BQ;WWO7g&AYUL~5M|UA6q>A6 z{AVw0ZXa*1kdl?@LvOqp!=s%WD-l}!6I56{`&WqRM|>t&kcu-{DG=jaih?I0Fq=JfS>3D1mdKvv z`?vhbjALMX)Zb>@bYIoiR=dn)1FmwnMOfnrm|Sc*-xuh8n6> zH3)4Y9#gI8S(t=*b>^;!%eIGA@L{KfgW#Mo_~oII)R7>}Iydf>DT5%TK#BazWKa`7BNV76XTKnoFs!?>2eA040 z_(D^_t8tl8;=Gar8$Z6HQrD8iaYw%SC7Od~M?EDDG!I_my5fj-sL~gOGyk8Kl-z}b z_-z6bLA!!u*;kr1)DXNX#8}!#)0C<>aendf&y9-i=SWuX0~fxhUYnlTlC#W_EbXzgbX(XT-OMGBE=H$Hdz>;Azb>dO3? zDKrK_aNVf$rpV$F!gGjg4Z;XZRA%3)WViOtvTMIqxO{lj%iBk*v!DMFOpLy2C$PR; z4r!k<59T3Zn;rKYKG94ld!bFOO^^G6a_qyG&X#MyxclQ0HFx6~5H-RK4D!M@z0-U~ zsJc$?9KwKqC8D9@1jT}**MVxNY7uE8DoF*j8Hf2O(i#JaN8c_|!BC!@p{8zvrll(3l**)JzK|JH6 z1uxFx7)*Ka)=%UtTkt-og*Wmur6waSHZ(O-eh}=S52MKk9a+m9Th;GDCzs$X^pFfU zIGv&VBIK$lsRs>*zj&_AzKk+iDYnq`QJ42X`FHwc>n^VEN@a^NzFPUku9FrAYcXhL zt>^+C{>tbBqI{|s`EK1+75G4o^G<=W(hVE+g(!H^84w^3%m9;VxG`hg24j_>(6g`L59rz*Xc{2@%8HnwJCX&P-mL{d;H-AAm#E0=r*44AScjVLQ~ zTb7fL+uK64Wu^^Qg?ft`lmg%j(=TEx9P5@Qg4^PpsC4DO z#lF?a8x*ziJR#e)!R)eraz-G3;bl}{z+r!6p+>wP&0@X@q zX)|vvZp(piIP}JB_xf%$P#)LMGQ<}bb6fDQTmM&(mLfA&h{0Jj9b7bz1+W&)Nr70p ze|L(yrqs*i^F2eI!?~o_Sf7D=?rB#}QiWmJ(g`0D9Tu!} z!2Lj)6$RwlDot#c^8RCrYWtOuBCgw7!hqoq%AVKl)Q8!j!pr^}b{L?FpO^6t-GTua z4)uhcf*C3i&kKKE>K@?cR7u6iN{kJq`cN zMM}CN%9c+T&+v*HHqVZD;;*y7)m{|)J$lrv zpS@#o^c_QqvX1PnI>wyXTvs%AfXDTY9dFX{PGe~N3*DQv?59k2bYXXd%U}U7{Rpv-vl#fc+;LUpPtSSN17nHR)<3w>2a_qf)(A^#?ZVjx ztu3WM#*sCAOBsks8cT5UbrRxafCmhpJ3$$n65A@3MEx#(UJ{LEQlDe4%K8)7x~BIp zIOy--9B$^#hS!~Ua@EWw{w9JQ?PJ5(r>db;NW~L{?K7PP;WOz!$7T|Qt>|_d>l|71TSQVM; zMSd1Ie&a@zHe5>G+#Nbml;H1Nok;c^Dw&2i<^on*Z3DkdN6w3Y6b-Q~E^g@+s~dWr zJ*-iSn+U?@%kig#yeP1e73qa0eV{YW#(?0vu?G=2(B+{DJemqC>_1 z^CkX#Kg#gWR=GG~wBHsNun}xWAhbK#*$y+rJK|!<|Cr@G=^>xDxymIR=q@ute`-v< zDm13-Da7|}=2-a)@o^)`nMioH8VyBGB2Ie6zin0}4t)|t>p~<)NB`(JThFgOwZ*98 zmqtt^+{AzL&o}~G7Vi1XT&VJMy6O^%!Z&}|G;tsFBh2O2TbD;KgAKSk>hy-qkm+0^ zvrAIo7A*M6((EbQ#OcR<+rs%*!HATe*yqu%n48aRUHUf;_G|`lF03Zw!vHW2~un!8x{hi)Jxe2GFBE3YQZI5^Cytj3@E1@C}(_# z8io9FX79RlJWg-V8R5~Oxe3~@y6$^)-{}>)%Vq_^Wy5YsDHcak+|CwV4^S{&5v!CUx6ciCZp0z z!90m3mQ%Wf2Lm%;K8X?k)(WC!N5*95XHK~rmCsr1oC5h~1W|t}v~psPNNguyo_4o& z&)kEdmvw!IFxKI98QkmRLRoZ{mx+>ohfI*F@vA|8_8?;WP=16{eG%g$M@~JU&tkfm zyDK0jfk*${JgWk-9VUHYO>l;F-Gw?W@V*tiP!vtTrlhwGt3{U(7V|7nJ<` z-E7x55I zhE}e6bH&tmj%RBz8%&@*%{AWNNs~~xh@g&?0#6(7%nOgvB0aNU+8V0)rGjSF42<0X z0097_fB*mh9W1fAt&e5v-+BL-VV}#Dn$*G=HSJq=6Pkxm5>UemhaWrHafKYhkT+bi z=SVu}Ocgjti(qzXyd$y%T^pD|5oW{1qlCzAb!6!yF=hL#cuWGt>@@SX*0w846Ap5x z7&0^D;U!xTvxNQWj$H}_GsY1XNqd#Zm3x%u_$pg2P}oFmlQC_XvBV;VZ;h{1EhFki zsdFf%dC@W85DK1jSYqAD9bp9?7-8ahtN_>fGAgG4|Jo2vannW~^$hnb1%d19Dy5`% zT&x!o1;Ak)Y`+*b*h&OZv3N$?)X zBaU*O%q%UoHX8F)rYBg#jv*KaJTT2+HUM)G5T4a+T`px0Y)&aXEIizkg=L!yM>B6BMXN=Q_zB~n2+Ei-EF7Ow@-~S>rwxi7%*vXzBi9WSS z^1FE2d|I+F*!YML;^suU;lzwCd0RU;iyE;i(luCpUpPN4ompJu9NT5(tg&Pd17&&` zoYbyEcusm@;4PIEv|OaVfjVw`tJVz=UOZ!e{xFKUV zm7$3dO12wEQUFpr|H$cxfb24S7l<)ur+6-mjC7#3EGN~9U@-uQE?444t`hy1Q7I`F z9Vccgx#h|ZCYoohEXS2;1-tfl_2kut?@EambouzA-p{M~t1=3@a$`*L-Uz4!J*_*c!?E*K`2h zh&jDlP|9P&OspEgM_=L`+8LzFP1SBKE?L^Bw?1EBi7qI5?stazF)4&vg$+jREcpS& z_hS2DZ?@vV7A#ua&gAbjt+04B)K*6NunwGrJN2`b(1A0Kqh;Oc(@uSLyXDhDluUs~ zHB9ko_oCUwkclyjbF{Ux2P<1D$k!6@{fX0^bbPT4mG{L80$1PiIHgSR=gqINU@fbN4=PJ`A_-UPtG%eQ?zM|u(l**jLbMLrvY zKfBf=;w*AvAF231E2Pm z)N=xN-t=gdS8hE4eRxxYL_x;EB}AlhF)87FPY7Wx{mG5Z^7i@8ftZO0I!38XC8nHVL}ZIL;t?z5lL}ay&IJn?;^n3GDZU7o6sW8^ z~`rPDv61oA`CiSvvS7pwXqRc zt5;SVE54vb!|Zn!>GPaX(8Jf|~7HAw!{U@~>M2XrsYntbM)UCy2Vst?$$q5gtw_&r!?8>_<;HR~9l z#b1=s6#1;e*;s%HeEpu{#G=^a))Ib(4Lf7(7-57)L;8Ab33_u*qH29K!-)TIV2G0- zKm}OJC(MNtvx*BtQ(=Vj-uWkyB|31Ixj_5OdePca&qN306uekG{ZTm5xJ&Cv-GYdr1B7)Ml_q?j>n8{K!56+;>0PWX&cOJKCo5nOI#Nu+CD>kB*foT(t?yBP`jcO4I9LDITx>iz^XwFt;`idRxQ zXB}wMU@xP`r(=#`&O-Q@9Cbz853{IYN+DHXghoIbXS%5-Wn-Jp~v`<3V?Z zwOZvo!gB|#%s&o>(#6CyB6MuQE#Q%BxN1@p4Ha&f&U^|rQVJJ7-!Q5d(ab6fK|^{O zs7G7*COU8tGRBPi09qw}S#(PRb*&xh^{K(O=2skK1BKeZ}76@8Tn?AA+Vw@O9=UMj~ zrSYx%P&UF6wduEq2?)4Lu`l`B6byeFe(H+MAU`6glL59#R}+9lQ7Fvjpg2rVc(6L~fibYmqH>4sIv(E?|}0>y$Xnsk=Z%2r(&@5{}9A*?Z; zl#crk3N78vK}JhI#OJfu3=^W-H>dI2IZj$~OLdhY~17tM|>bpZrNHVD;sN`s=Z;}n1ytWo@MsV888G$wD;?7`#NbMOid+Zl?b_YdY*;%S2kUbSf6MwMfkbSVgEqP zDNypdlYr?Uu&LHY5Vtg`W#=fB6-jVdKj{nLOu69f8zr@V|3l-EtRZC*`)RVx+k#P1 zEM5Gyd9odEFZHI^#9GzHjEo8df$xJqrGi`BYTJ zL6iE+SE%R(4T6Xlex`!`{YFvdqky_nQEuA|xS``dmj8KxVbQfb2D04^0RQAwc9VcA z#!SO5tsJw{ty_Liq@tcyZv7OTlf)9|Zh-KCpiRFTYBgg9lYO~5>E>B$cF)uU zl}Exv!-RHGAaxz7Ii?{^N>Kb5N{>C%3CeA523(QQPFO!94LcaD=&bf+U{wiT)zK|yco_p~buXFwxR%aU*BzH4+(W)b< zq=(1g*A(BGC(w_M7o9BUos)b|a;dz7b1A!u(Qf~&i%%TI<#0_rWt zjyp<{lW5jnDxd#Xq&LD&^*eoRbSMzO2#IFAs#&$wcB{GwwW=QOM<6$8%tj$RR#h-& z%v=}GTC0kcF5~{T$HYU0A>B}XnG(%N=l!Mg!T1A*9z5S7y^y&eD)G%tg2Do1CPs@;~`atStK+rNC)AViQHrVoout=)TD zL?SfZ;trD3Xe=x4BHrI+4@tk#E*va0$?zd)v9k_v`=o+<6~I6|x!JN^jS)>V*B3MV zId*p2C~ZSxHj+_aN|gddqKTG4!~O9ggB!pH346atvDsj7R@7(}ca%VOQXU~Y0L@w8 zy^PfUsG3;}=ia!@y9POp1(ZF%!<92<&#pAV0jYQ0%OGC-jG?rlR_JU$Rdc2Bhb5ab z31R3BR7v}&mkw%qrNa9Ay}ZE+MQUWbDnJ-2%piOjPoKTNlbrE+?-+G0ji;zB01tvg?+5Bryik*3i>fU>Ch zh%b4By>x}7GFP;R*a$wSU1VhA_M(x##@fvyk;|%Z^vRXzvrK>sK;}k5BK?M(6Xnn8#Do|b522dzcW`~`p z^C?Fu`HK?6H{Ep7&Kh`0H`qBo`=mVYq=e}Slt^-p z(m{$R$I3^1R#h*C=gm2iCW0z?veam|AnGvm{A7=0a+oIa2u@y0 zybe25L_fQsaWT_7W>@8z=3Ef$XBy{gM+WE3y1A#M0=gG{2<%_fDJz3$AmKfI5_{PQ zmb#L?7=xSO$lXyN02#fV^SU>}S+xNM;m6)N8*=Bg2V0EUZpmA-t>3W1_~8d9kKgQ@wPj%lZ#P%1dMZn zC^pxiMLM|eVC17CE@yxWr)iamDtwkzGAas?m?Lw-d(tpM(9lg17BgE#Y zpg_7miLA7BV+DgH%Rh}^H$K9F821a(x00`nnDN0Y2?s-?-q_i228q2gcUI2YiVUZy zcHWs$JudbMmTuS&E@HPc5^p2fGS*=!iQ?g2vN;8u;sk#@trz`AJ^zE4wZAj#!k9e9 z&j<*pC=E$fM?f80tZ27s$HufJQ zW-N6BIkg*{`@=tJ?ucZQhrm7iaMj(8RXm9{@lse*>0{<+4h`X?9Z|+gYl-6{Duo_Zml?+Tvc7-G*vajD^H)?S~z zR=&|z@MIoRY;yd*S&AO=34S+l!LWX^@yc2P7uj9y@)L{&tGd637BWm*7lKo9x-M^(qcfMSK?on;?bT37PLn)vN-^ZH37dNLH$it~ko7Lv`!EK>Em^GA$qp zrLm_}qwYQ;kiL$~c5|1*j0(}Xg$*mBFPZaltZmgaVS3&YgqnB`12D`OFMB^(Mroq{ z`Km1u6o0-lu;vukIBy>2)-#=C-Sw{?GFWY4&K$la-!{!`ABsx)gVnu_ZzcKjiaAfx zz+M&*$)dwpVz0`Mh?(iGyf9c_ECo>a9BRfWo%1cgcNskSUxaNc(9N6GSQF})eLNo~ zHHo+WCUtD7%U43EX6{NQkT8c`;Y(;1N4!ScwC4NMw4OJEAL#u)s>7~}soXptVH49z zY*FZud6OR3qDGtOK@L6y823fl+AN2vW(q_VZ0_`mZ4yF@QLp|_tyP~grthiK&00hz znV}718mI+RzyJUM9rm9~DAni)L>D|*3dy(S=fqIg7!^sbbt^zjpRwcYe)u5HOQ3qk zUWvcFvS0k6rJf%;2yyBwzSG9p5Ybs&r&*bxkZT#z(Rjk$<|Py02v;)nnv&&HS8`gQ zm!TuaNC4z)0D|Htdi9dl<;dT;&KF_8zNu)9 zI#iP+a}F+)2S}L8cxNl2*xGsmGiRP;IAd+Yu|p8lRAOhNH;ryN?KS{SV;~5k3KKIu z;s$1n>I$Y08I36I|!1Lm}B#de?2J;%n91nd~v*}C3;EE6B{D^Ic*kj_!1;z*#g zSctj?O)jgkyYlA3N4saWnFi%#Rrdv2U|JrZVLY;|Yzg_A)pB4UU1l9}>_HD#AEPq> zD*VIy(?eV>%nlp1r8YT3i1oI|=LGgRe1RURv%x*22edfi{RyAIX(%bo<)2x~b`;GW zX)yA6LegcR?qS1oyw2`Wv^AL1;9pGUySYl;?$<`qDEu25yEhGg!>(k)>@D$@j;e+( zb{~Fq)_7)b@8e^A{b*o|>4g) z1)0I!5Hao3#RN7HWt~MVK~Wr9F$<|^?=^**|D>&2aRp6UC%3vif#H5UBxEDTLD<-| zlZ~i}zr7*UInRm^e=TRb1TWXc`hD%f60D2N-C3Gd&yOg?#o`*qTyOkjV$X=kB>Gze zWHUi&Tka;t<6uUumF%NoXoH5LIdiiYgu2LYM!_GRITKzj(V!z6wAmp%4FsTi5 zXSs-heHpa*VjdHsrtdc847ebiPF1jH68XS_6Exw7jTo_naTU0zcSc%#3F)VLWX-Ox z266Dtn4zdjQ&B>mjVPLIW)4S$=WS9{w?d@$j_jR#BiOSF>elG~+Q( zR=g)oU_FRF&HF5_le~EX0?`_)rdf6RVv$@_F$E z8FLQKIIPJH*#shr*Tglvqg$kQFswY2{y%?U`2{q|FB;93%#~~+Qp35}5%H2DK0~Av zL$h$`N`RWO`szoI#($>OT3(HK^(SB$gw)!%hdd-B)x6#XOZGYLLw~5aN*$_p= zT|RK$2H3E$Yn5hLo^M7ZvT zg2L!3w9k^R1Rv++kHGs}z+6j}f*2QrDSh9x@4n?KXCk;H#VoY)FlW-mA0FQCe?Bvn z{#OoZZbtT;Ky}{4rR|o_c_lNQd-JH~aEHEm_^7t(=KUhX3s!#$=;mGwBmHdZMAx zILNiiqu`{$+?EVflq6ef;R0G8eni;$UX+oel=cMPUGm}J6oK%gPLM45yU!F$Sy=8V zaBKH-1i5Cgey61$qX*&4Bn#?ftAVYBpt5pdcDhQnmJHD$o(@n9?)F2Z4`)u-fg!pE zv}!MOr8==s4V?(Oj}@D@I+W)OnT!fQM_CB^Q?F&cF=X>rufu7lLYiGe8GEb*1Q6Wd zA*!yKV?fkecP57fcxHO_0v87w1)0)9CblZCXqCyr*q=w zOh=kzSD^Hp5xUx%%oz|Aw7f`oolr=aa>9-@S|cN^qT8`!))RI*IZ0M#i2>^Kv(Vf4 zOUcM_cZ+J-f!>kTXPQjMm2BN#ImcPkG_80ZL5e5OZ=g9@3j)Mj`QTQVrpR!y$#9rF zS{a1LsR43UWq_24%M-m*_44S)`etu|)pAZ1(|t z{tqRdiW;<~z0Eqr6z4|0`v9dWK}7M|>cNO(DFI5%L$@M~M;Sw125XrazWq(;?OfB$ zzaonV$oHv);bb4Nj25)iE}V{g?zDFHow8$N)!c>WcjAV50h=atwR#OGKU#Wkt0pZs zIfue#Q$Sm_-T;%Rqj=GbdOCQ<96rknz@z|tgc=|1?$2sZK9TM4CT;sfa^c??pI9$3l^(dz$)W)1sOz2334zl zCd!aJcCSXDUgUQmK6N?zm`porX)#Nq119am{`~?d>DPScON)29X=6ndI5`k{ zunl6Kug_)eYEn$|2zF^>l={x-2zjm~jgRr#OZrBaRc^Q;UjQHoei?&Bz>Q?25Cnt` zdiA4JQT6jQ-0OD3mGUI|57R9x&ybML^>Auh(E^;73HwWNnV)F115%_dOi;ND?<>UFhcs?dM*-<9g@_MY16|US%{~#9|}W zsV(Rn|G{bhtJNqc^WD}HPCF&Q@Nt?LSy9~y7VxoI8p{o^sL5Gqb>Q+@6aZ8=XxFOm znRUIX)nuIC&M;Bs1z;Uo?hedWhxZ9{Rp^Ukg{CR7Y>HV$wfG3;kfsFv|>bZdD2kWiXT*LUV5*LP`DeF;u43c@_ zVavZ$iv%;3GMu=r6C-5NEx<|e5c6e#Q)t~^`^V~xVC7A$7y%h^iF(~wG-c=Hsu5Mv zr-F%AGJZT8*5)4IMNMM+0{6s(Vu{$&7vnHg6E%y|RpW>j51^q;R_%!Gzm0H6*B`=E zp3sK#mw|iy{R|dKQ09r)qKQXQ(}vlwmt{Rz-MuYiKNrCbBt%qemNn*e+YN@P_x-vA z0OOR2>dAPHKYpSeqsC4X-^2U?Z?tF@pGwm|{YXNfXenYFw?< zWC4P#2U}(zOH*bub7;ezAQ`WnHuro6)rcOBXh%9s&D}6G4y^(tG{D=zi-V~yCDpCp zoTGnyZyW{k2)AE3iJ0#f=6^~%OC z&@(KdbFO7LTBm3JB*d!ZDWFQih*56rqrUEEGm#F5opV3yFkG+D*{dE%--nxV3y&y} z2!50>1oUep6I7XIk?Y)uh#Gy)$x2I~MKFPJHHyV4S1e{Wc=10Anb0FJ0tlo8MDvaz z9WJ&p;(P1_zSp>4W9;o_*w)so9<%KF8sU^8Ws{l~`9duH95w3TSdrEJpZ+5(WT`9W zJd6^AYzV$TYU_~ASGe_sLf!hRJOwy^kqfUc4fH{tYw0<#5Bb-4cI0fFqk2*}jpZUE zM~8}_^DWLr*kizl7x`b&9HV3Ev_DhyFVx%9=PL4kRc&UxPV6o4N=vc(LSH$_84SWP z>TeEq2Fzj*dM9YK-rOLs2Jtt(?y`nz9XTh_Lvhp+gRg^yfSS;hDT|#z@N9vr+!5UL z@@-!0{ioS3p@CvO=@tI+Lx17VXn)%O%3Xdn)VLZ9!>q*aaD^1 z|83M9W$R<$y}c~eAz{H;p{GS?BM_K+L~b!#3vjh%&NF8~>{+`{=($ymhn!o9Q*t66n7Q#oP@TkzByVBE{?ajZRg z$sjo@zwE5apw&jOz7tYQl-R(_E0H_V7n?zHtB7pavKYn}JLR>SSbrWu0EVEKjgV@# z#Bg*a&hH#kAlCsFJk#iGfucZ7kFS^)H2(meWmZfC!&`k9ql$MC_P^;BN<^xXwibkibu8~b zp;hHPY&{_MX0C6a`-jaENtyckH*gP-!4*nzHL4)ld(l_3Vl)y2rQ!T#8y9v@&Un@S z*7HUZzwIh*vrH@p!kCihjH`*GdP&RH4LvOe1Unih4*!HTWi_X6Fa#tED1o8lwlE{0 z{BXz)6NOZ3WA}Qn;~LD2F+$ zL6r;LaAVWI1VkYKK1PcJn?Z1Z~|kUVC=Vq;xhjN?iefAD_#R2iOCT$sY>jw0-{Sm>j&p-Q?c0l|%w8_rOUMGJV zs^=*CWZ}~~)Z5oguf|~N)J?v-nyv(o>&f_BedanJ9>bE54)mu%Nof7_)EBdb!A@c` z^99i4E3Y=p7+(n=;jaVI#J4Na7t!9CRh4kmdM|CQO1^CUr99YVbj*>yyia?XT zk3luC&d+$Woo#slXUx`RoMatEKd|sC3bc+Z3D~aSNnRwEIW|S zD81dvSU?I|s$Eb=P zAMB?bo2s6gx=!NLqy<)0CBTTy=m+OfBv7rLS-6Hs(3+k)U*go&8WKSN#h)=@q`Z} zJ6FOUiD-L2BV_`&to)q|ft@D2t=k(s0zpp~Wqf|8k(0SB65gz=jeUWo7)7R}1)-W$L zeXHk7kTsU4j^w8s(fujHYgsbd=f)sUy^kpY=I9kFxLzi3IkScCdO4t3juS< zOv8EEh=&11D;KEC6~?;^AFE;2RudTO5w+!1**y^-@*@A6(X2eSYL@~pIbXhv*8-0M zAhj*76WVpR_Q-ov*?0{&jffP72`taB{iO6;*AW(&)tF)@QuT9IGB!!rjU>D6@23Kj z&~J>HW17S1Y&%V1)lj+sYks)iQ~HRWMuC&Q8waWgBl0@U* z1K|f*E~yr>5>uuT^B>Cj&AVY@jj0|W?hD2?%S=coP^A&B40QWup>5H|_ETlXJ0r9k z6IxC@-MulD-#IFWKZxDFK~i}U&owQ4z`7w+0P-hj-#vqYLiN&A!*ib1sf#RYmTRsB z+BsyWIhHCTZ?F(?HzUE1Sgi5=Df~PcS+)7?V(*D(-w;EjGRDhj{k!l!%P>$+_}GXe ziV?FkPZbdNVyo5tULiPto`IZ$n;$aQ!z^hB-Qt-vRGT}Yk#_f#mYE6FFn?Kt9H# zW$X!E`3}|`6ad!s$NvuhK{owIr#i36W)}u3K_lLG5Fi*yld9g&%9yHlWK;Q>ni5vc zC?WZv9=Fy2_DgwP>sI23zVD6Z^8ayr%9$5UgjyC#e+~8EX8|PH)I^C4H7-b7mgCKH zrB1IgzIs(}(3QpxN^aJ!e^d71hiyYj;{lYZ@-`5mC2dJp4Knte8^i8RPwgW0G%k1N zo?`WO`!zrGmK*ExL)8fF zfiKBotW%v6JCIAEi;Iys7i03_$q^y1jd!vWq=>r0gP!Ml3VrE28#b1?tZ}~XL;4Fw zj;_%lU*RT_uexassu%Xd&{1Eh|AxQFdZV?0bAjPr)Q2MttzaLe7tZ!=>)-4WJx~4w z5>ul7eFTUxNSZP?7W3Q53rh=XV7E5xcS5q_d>HOS0|Kp7N%K~G97iv@CPo>11=Rj3 zciK5tNDGHJqXE4p+LFR!Z&eU>zxor&O<#h8qm;8jQ@dEmAXfCl@y{KQ#aivZ+@@)m z*HLLCM#L-lX6Z^Lin{DTYRA~=7?H!-FO@dA^%3_v#S2LM4L|sDwNmeJkFXYpYk6K! zfE0s273A!?T1@siCG=z#}XWwTyZzqhhxlv)zRgcw{fPbHp7HPVdoG7`X@hi%`AjDjaCvk5Wlc755 zlDKw)I((W|C_=widPYL<_}#MLfw>@i)O)nH%a_IH$g@IJ_=8iJXTd6M@e4&;zjGJr zlsODWt9>plqb*DWCt{NSc_j_>JsLN3N)9- z9BytIUF*KXa2#kA3_4k}g8js|1Hg{E22SXQK9c~fS!|*_-4z&Lq^vvI>6G!U!vT9S zQBVSO=>ejdyB*nr51Q62%MrvjHP2bfiSRvL&yinN;VcZ6fg>Ly_IlEXZ3bD}41?g< z$uRyHdq|-y-nEwzC|zftV=_g#fYWo4TSML)+=?A3t53r3?|_h-uX=#Toiw<3PpYs{ za-COx!UWXUkNp^igmIS1`ejXW!M@XN(3|Ws@RC-vJ%?ma=x*|DT{3n54Qf{UJl`qv zCapF_!Kl=gQ-)w!f6PEjzjRKiUDs_Ol%Yw>K$!JDhx9tbD0fnvAAzXDH0pFi^S_$8 z3*bx-4jfS4=rLdd{TGfO00PCNGV(8P`zwk|>ga*$yc#bmVyzVBrj09N5CAaBpZA@* zM1@ru;*jXu`gf4AqjZj?Y|!MJ?+97O(USr~KE*;rwRxBk%_5w`Uk+uRGAVHsbaPJ( zFDlAk4J_qhz+TcEC&Zu|q?{SBemH0iz~%=JOU{k`!-dE6&$VoR2uit+)c<7Jl|gEs zd{p1TKW76T;3dnLdf6)xAs)&El**q~N%M)F=D)}JOO=H=DjU1Y9Uw=BdHa{uG_WU1 z!l=nSMd5F!OQ=p@ovv$Dj6OQ0T4#(ct%zbzPfBU@{Be_2kNRGB?ky8z9v(bC!E+6|`69jF z|H$whM^75>f7)0rF1GrI!9_Xr1b0>JT~g%gOdMl8^;BuysGig<1r>HwXo~2&BHD1J zn=s6D&(jAO?>e(WOuJN63x{d3P9W`It;BPLuKW(~Tw+f__p5w&g8ksQrN)F{lrYFa z-8hFWttL|rrOdf;Hc2#Jh_ptX($91IjM4mwfzkz4w;SWmo0glSfX?)uua+Z@@p)_4 zijy(aI}1p{5t~h=?d)!NLaRLq76!k+o4W@W($L0QboP(N~zm}K<8?fEn?B9QDJSep> zI4wb%6%u94Y0Z_c^{&FMB5KV1TlN1LIY?-=Zy4>a!d<(SpG`u=$+q&*%yf|xa=fcD zVS=Ia@=!`9?J=$|O&$MmqLMY?P?AR#F`ZcEkt1*2*BD_dCT3%NI6oA+8}{kKKT1{| zrvOM{QE>4;e55}rT0INPT(8KV;lTz4jx#TD8YX&U^dD6BtToJ>Eb{#~GyB5`VU{o- zYKewLPLqmme?Mo*SH^q4W|rqf1NtYn7bP*PS3m~2xL;+2bS7RM^V=*l_{+^BahL07 zvf4)WU(!Mviw~J3fg>>*Bk*+msOd=hDW*E@5`LiF?m=@&hq$9nhYHkv1hC+CNNB~K z(}{OWY|H%9L=;YKiOz``)!CjSGro}W1{N~p8`Rd3R_cz9h7?S{FH%9!VaEHJ5{k5G zX6cDlFTwe4xJ#X~U$k&oaWlS-u6*(&;Li8S_GhvZ_)&=X6%1wO=)F zqq_K0<4IC~d{f=!SY2=PFtj;yIV9ZrZrU_<4Ll+4oiye?t&TB4@NUX{8Iu1)Atm{r zJ{S`HVp-~Nr{Euz&O-jJ&O-#>IM&=-5S8j#Z_pU}g|6Wo{y{5IOzxIGZ}$Cv=Yu|+ zhp-3CvD_Ub4Tt7YK>FYK3=ENN^>7QF=H~IYKQ~aQ+WyH`+vK0wpfbRUX#^jXkFU{* zr6XAenIs8oe~i0r0hE8CE4p7jwZ!cN-a4m1JIn-#d#Hxm;K^C#Sa}RKY~+S0fISE) zri~Y2m)`!SE5bhVD;dENNE7V8Q8(a$Z*I4flI`vr`C_G{`jb8b^hnEtE@_sF7d9m; zD1sfbzi^*vghG_ONSGhSL_k8<_`=f)I9 zxhS+YKRhOBTXN~v6sbW`dutSdI^1|2P0{Vcc4LNA-{r|MW4^nq7}}Bo(VJ9>&3Ca; zXZ=wf<^n1IAz&rDH7j7a%ETMti(XNI6hB!>U@a}>QuYFU@Xv|)8Ay87GQ$7EhQ;S^ zZ)Be*33+@Fkz-n$%wZ|u_o%!^q})W&)}Lvb5_sy^FuE_`*elw8o4afTv~p1ID@J~= zmi{NM&j|idL!x>U=9yhToYkCy96+X04j{#@PDQu$RK!jO@B!X5SitoN8gsJr&G#?nj2GKgget0aLbu1P5iy}f#*ev5 zH)M=UALTUwHjQa~Um;EtunUX(%mYYNtfplD^7$X z333gJMqr9}4`HnM4oI7eXzF(s8&?6xOmV+Y^mGvr|vh!p)|8eT->m&~>|-kaE+)@HHpfULn)XzpZgeND)T8kyF<6 zTy0R()k@-F6I_7+ZgpqV)6xBnRw&)^ogKBL9if%vwisiRbmyKh8Br1Q-^d2jdoc3a z6Q91O7c-NqHTm#kFtwiInuZ52#Q$d-I9?@^1o8nDbun4)738=$0Ex2asn9c%pT>6a z&hb(Au!B#3t-88Lkc~1bab!aEv^TLp-|Nb_7W-wsudcR#iq$Gn76^PqY`!yQX*!rc{o^9AeBZNLFHdv-oX|0F!Dv72)>f<{ zrPE36L`wU(vLPstNUq6q!omI8d+B=O>T?p9dRx^T3CE4nF>pRZv_@4H1cp=vH^)*a zAa4t5r;+*20B_?Z3~n?!dEVOE%ePR4xD_5y$Ltt#ayr-8F32brpZw;gZqH&_Q zqQPpJez4)hK!xzhy+G)NZ*gB&bqY!!KkFtO{12aAUL@<=PPmy@DeB@Q@bXY^XCpf< z(^VH)-BMKF@`X6SjlG9?N@3MdRN`m#NpC&4earE>-Zl+^HI>VkK&g^|4M1X<+1{!B zT2mWZe4x5=G03$zYdVr`82(7w#vOc#Tt}#CP3J;3^~WYOsb9UwN?^b~+mC=2{rm5I zeGxEkX!4Z5ro8jlAbyZDubakyq)(_@(E-Z%76-@92#%T$DVPGCbDcgmieLZP+deJi zYnmHuSiNLNc4por=O%jqMohvL=b9?=bq_e{YypV{%|(JV1!sb?m!y6GRmZZs59(F+ zgGsvM|G-orBVcwGZ14<{H7r&tb_!%L8#^V&Z~B=kHd19kv{60t-%jM;jrCn6CczH0 z2UWeBQK-MIMrmMy>1P>=l)wSf*`g0a8O_u#Q<#E|ml+)U;VMymmJaPe7=~$6ugMHE zdOC^ry?xHI(Crm)giQ>O^nHY7~;{_A;`e%vBaT+_EdI4R9bH!@;z``vaOeRmQ^8> z!^DxXKr+tJ8%}ng)64Q8w~dDl*HmMP`ZZXZIoZq5KJ05_U`%XwHUd8@9P(WpyzD6L*(v*RL=BoE=hrQ(AtzOOe%C_TL20+@U^ z;D1xszo!?nMykl%+BH;CE+s2_{yfB7opIOtvr?M`XvrV?@+u?vuJew$9NcuPK}C|f zF<5Aq#J}OY&i?L^gA4K~gY=?krpXZk_$-=Wgn92}{f;}Wy%Z8ciQCycqxiPBb1=Nb zv~BZy#X>JBd8%<~%Uc96saPTLyv#GzflPAPDqu67{WLN+xlE@YIRZur`R!LUBkd58 z1vAS4O84PJZ3%hewTLHwyUck@3hNfBS)m&_=UdcHjQrXz=0j}v-@ML@X-xaX8DcpX z9~HE9e{#X6g+nX(gHRg@!7W@TCl(JVp}LU`(DF4^u@+KX`QY||0{7*DLmmoJ&Is$h zU84I^bD}>02k50c2P+cjy#xB<9rye!lhIzF0$cWf)c<+0GipaiAzZ_%$=kp zFa{deCGso0b(&Fu&eF737fEE=UYd>H(NLI4|Kd)s|1%$y{-h+A1#tOCfb-+t{v4Y}FTEqB=kIwSY^~RB`1Qw$0 z_ha1mPG6#5lFf3Y{|2_Ns@6Ygz1)gS@n0_pLN|L?JmFOCwG%mv+dIm`U8Fxxia$

?Ock?Eu}#AYQ{=?J+i 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�Wo)P_b0>RZF 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 Ve=ISw84c&KaT@3u`{6gR0044x2B`o5 diff --git a/src/pumpfunsdk/pumpdotfun-sdk/images/download.jpeg b/src/pumpfunsdk/pumpdotfun-sdk/images/download.jpeg deleted file mode 100644 index 516fbafe80385caf8ac6cc4aa95c85344a53edeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10981 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 From 71f9540b5e7aa470ebb7753a4a2fb860a43706df Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 14:55:28 +0800 Subject: [PATCH 057/140] testing --- .../bundled_launcher/index.ts | 0 .../market-making_dev/boost_volume.ts | 0 test.ts | 9 +++++++++ 3 files changed, 9 insertions(+) rename src/{Memecoin_dev => memecoin_dev_old}/bundled_launcher/index.ts (100%) rename src/{Memecoin_dev => memecoin_dev_old}/market-making_dev/boost_volume.ts (100%) create mode 100644 test.ts diff --git a/src/Memecoin_dev/bundled_launcher/index.ts b/src/memecoin_dev_old/bundled_launcher/index.ts similarity index 100% rename from src/Memecoin_dev/bundled_launcher/index.ts rename to src/memecoin_dev_old/bundled_launcher/index.ts diff --git a/src/Memecoin_dev/market-making_dev/boost_volume.ts b/src/memecoin_dev_old/market-making_dev/boost_volume.ts similarity index 100% rename from src/Memecoin_dev/market-making_dev/boost_volume.ts rename to src/memecoin_dev_old/market-making_dev/boost_volume.ts diff --git a/test.ts b/test.ts new file mode 100644 index 0000000..552cc66 --- /dev/null +++ b/test.ts @@ -0,0 +1,9 @@ + + +/** + * please run this before using the cli + */ + +function test(){ + +} \ No newline at end of file From ff55fe01e8efac8b3f361722c64c91b57679fb8e Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 14:56:08 +0800 Subject: [PATCH 058/140] testing --- src/{memecoin_dev_old => memecoin_dev}/bundled_launcher/index.ts | 0 .../market-making_dev/boost_volume.ts | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/{memecoin_dev_old => memecoin_dev}/bundled_launcher/index.ts (100%) rename src/{memecoin_dev_old => memecoin_dev}/market-making_dev/boost_volume.ts (100%) diff --git a/src/memecoin_dev_old/bundled_launcher/index.ts b/src/memecoin_dev/bundled_launcher/index.ts similarity index 100% rename from src/memecoin_dev_old/bundled_launcher/index.ts rename to src/memecoin_dev/bundled_launcher/index.ts diff --git a/src/memecoin_dev_old/market-making_dev/boost_volume.ts b/src/memecoin_dev/market-making_dev/boost_volume.ts similarity index 100% rename from src/memecoin_dev_old/market-making_dev/boost_volume.ts rename to src/memecoin_dev/market-making_dev/boost_volume.ts From 6f8f474a61f4043ff8bd6bdeb521e9d1775254aa Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 14:56:50 +0800 Subject: [PATCH 059/140] testing --- src/jupiter/swap/swap-helper.ts | 2 +- .../market-making_dev/boost_volume.ts | 4 +- .../market-making_dev/boost_volume.ts | 87 +++++++++++++++++++ src/meteora/Pool/swap.ts | 2 +- src/orca/Pool/swap.ts | 2 +- src/pumpfunsdk/pumpdotfun-sdk/src/util.ts | 2 +- src/raydium/Pool/swap.ts | 6 +- src/{Token => token_old}/README.md | 0 src/{Token => token_old}/burn.ts | 0 src/{Token => token_old}/create.ts | 0 src/{Token => token_old}/index.ts | 0 src/{Token => token_old}/revoke_authority.ts | 0 .../compressed-token/createAndMint.ts | 0 .../zk-compression/connect-testnet.ts | 0 .../ProfitAndLoss/constants.ts | 0 .../ProfitAndLoss/stop-loss.ts | 0 .../ProfitAndLoss/take-profit.ts | 0 .../ProfitAndLoss/utils.ts | 0 .../copy-bot/bought-tokens.json | 0 .../copy-bot/copy-buy.ts | 0 .../copy-bot/copy-sell.ts | 0 .../copy-bot/copy-trade.ts | 0 .../README.md | 0 .../bloXroute_tips_tx_executor.ts | 0 .../index.ts | 0 .../jito_tips_tx_executor.ts | 0 .../simple_tx_executor.ts | 0 27 files changed, 96 insertions(+), 9 deletions(-) create mode 100644 src/memecoin_dev_old/market-making_dev/boost_volume.ts rename src/{Token => token_old}/README.md (100%) rename src/{Token => token_old}/burn.ts (100%) rename src/{Token => token_old}/create.ts (100%) rename src/{Token => token_old}/index.ts (100%) rename src/{Token => token_old}/revoke_authority.ts (100%) rename src/{Token => token_old}/zk-compression/compressed-token/createAndMint.ts (100%) rename src/{Token => token_old}/zk-compression/connect-testnet.ts (100%) rename src/{Trading_dev => trading_dev_old}/ProfitAndLoss/constants.ts (100%) rename src/{Trading_dev => trading_dev_old}/ProfitAndLoss/stop-loss.ts (100%) rename src/{Trading_dev => trading_dev_old}/ProfitAndLoss/take-profit.ts (100%) rename src/{Trading_dev => trading_dev_old}/ProfitAndLoss/utils.ts (100%) rename src/{Trading_dev => trading_dev_old}/copy-bot/bought-tokens.json (100%) rename src/{Trading_dev => trading_dev_old}/copy-bot/copy-buy.ts (100%) rename src/{Trading_dev => trading_dev_old}/copy-bot/copy-sell.ts (100%) rename src/{Trading_dev => trading_dev_old}/copy-bot/copy-trade.ts (100%) rename src/{Transactions => transactions_old}/README.md (100%) rename src/{Transactions => transactions_old}/bloXroute_tips_tx_executor.ts (100%) rename src/{Transactions => transactions_old}/index.ts (100%) rename src/{Transactions => transactions_old}/jito_tips_tx_executor.ts (100%) rename src/{Transactions => transactions_old}/simple_tx_executor.ts (100%) diff --git a/src/jupiter/swap/swap-helper.ts b/src/jupiter/swap/swap-helper.ts index 85a7a8a..6f75bd7 100644 --- a/src/jupiter/swap/swap-helper.ts +++ b/src/jupiter/swap/swap-helper.ts @@ -1,7 +1,7 @@ import { VersionedTransaction, PublicKey } from "@solana/web3.js"; import fetch from "cross-fetch"; import { connection, wallet, jito_fee } from "../../helpers/config"; -import { jito_executeAndConfirm } from "../../transactions/jito_tips_tx_executor"; +import { jito_executeAndConfirm } from "../../transactions_old/jito_tips_tx_executor"; import { getDecimals } from "../../helpers/util"; /** * Retrieves a quote for swapping tokens. diff --git a/src/memecoin_dev/market-making_dev/boost_volume.ts b/src/memecoin_dev/market-making_dev/boost_volume.ts index 263d03e..cbdf76e 100644 --- a/src/memecoin_dev/market-making_dev/boost_volume.ts +++ b/src/memecoin_dev/market-making_dev/boost_volume.ts @@ -1,6 +1,6 @@ import { connection, wallet } from "../../helpers/config"; -import { simple_executeAndConfirm } from "../../transactions/simple_tx_executor"; -import { jito_executeAndConfirm } from "../../transactions/jito_tips_tx_executor"; +import { simple_executeAndConfirm } from "../../transactions_old/simple_tx_executor"; +import { jito_executeAndConfirm } from "../../transactions_old/jito_tips_tx_executor"; import { program } from "commander"; import { loadOrCreateKeypair_wallet, checkTx } from "../../helpers/util"; import { diff --git a/src/memecoin_dev_old/market-making_dev/boost_volume.ts b/src/memecoin_dev_old/market-making_dev/boost_volume.ts new file mode 100644 index 0000000..cbdf76e --- /dev/null +++ b/src/memecoin_dev_old/market-making_dev/boost_volume.ts @@ -0,0 +1,87 @@ +import { connection, wallet } from "../../helpers/config"; +import { simple_executeAndConfirm } from "../../transactions_old/simple_tx_executor"; +import { jito_executeAndConfirm } from "../../transactions_old/jito_tips_tx_executor"; +import { program } from "commander"; +import { loadOrCreateKeypair_wallet, checkTx } from "../../helpers/util"; +import { + ComputeBudgetProgram, + TransactionMessage, + VersionedTransaction, +} from "@solana/web3.js"; +import { swapForVolume } from "../../raydium/Pool/swap"; +let slippage = null, + tokenAddress: any = null, + payer: any = null, + cluster = null, + solPerOrder: any = null; + +program + .option("--token_address ", "Specify the token address") + .option("--payer ", "Specify the path to the secret key") + .option("--cluster ", "Specify the cluster") + .option( + "--sol_per_order ", + "Specify the number of SOL per order" + ) + .option("-h, --help", "display help for command") + .action((options: any) => { + if (options.help) { + console.log( + "node boost_volume --token_address --payer --cluster --sol_per_order " + ); + process.exit(0); + } + if (!options.token_address || !options.cluster || !options.sol_per_order) { + console.error("❌ Missing required options"); + process.exit(1); + } + tokenAddress = options.token_address; + if (payer) payer = options.payer; + cluster = options.cluster; + solPerOrder = options.sol_per_order; + }); +program.parse(); + +/** + * Boosts the volume by buying and selling a token in one transaction. + * @async + * @function boost_volume + * @returns {Promise} + */ +async function boost_volume() { + while (true) { + console.log( + `Boosting volume..., buying and selling ${tokenAddress} in one transaction...` + ); + try { + const res: any = await swapForVolume(tokenAddress, solPerOrder); + await error_handling(res.signature, res.confirmed); + } catch (e) { + console.log(e); + console.log("trying to send the transaction again..."); + await new Promise((resolve) => setTimeout(resolve, 2000)); + continue; + } + } +} + +/** + * Handles error for a transaction. + * @param {string} signature - The transaction signature. + * @param {boolean} confirmed - Indicates if the transaction is confirmed. + * @returns {Promise} - A promise that resolves when the error handling is complete. + */ +async function error_handling(signature: any, confirmed: any) { + if (confirmed) { + console.log(`https://solscan.io/tx/${signature}?cluster=mainnet`); + return; + } + const response = await checkTx(signature); + if (response) { + console.log(`https://solscan.io/tx/${signature}?cluster=mainnet`); + } else { + console.log("Transaction failed"); + console.log("trying to send the transaction again"); + } +} +boost_volume(); diff --git a/src/meteora/Pool/swap.ts b/src/meteora/Pool/swap.ts index f1e784f..0ff5f30 100644 --- a/src/meteora/Pool/swap.ts +++ b/src/meteora/Pool/swap.ts @@ -17,7 +17,7 @@ import { ComputeBudgetProgram, VersionedTransaction, } from "@solana/web3.js"; -import { jito_executeAndConfirm } from "../../transactions/jito_tips_tx_executor"; +import { jito_executeAndConfirm } from "../../transactions_old/jito_tips_tx_executor"; import { jito_fee } from "../../helpers/config"; import { C } from "@raydium-io/raydium-sdk-v2/lib/raydium-276d396e"; const BN = require("bn.js"); diff --git a/src/orca/Pool/swap.ts b/src/orca/Pool/swap.ts index 0f929ef..b801f70 100644 --- a/src/orca/Pool/swap.ts +++ b/src/orca/Pool/swap.ts @@ -12,7 +12,7 @@ import { import Decimal from "decimal.js"; import { connection, wallet, jito_fee } from "../../helpers/config"; import { getSPLTokenBalance } from "../../helpers/check_balance"; -import { jito_executeAndConfirm } from "../../transactions"; +import { jito_executeAndConfirm } from "../../transactions_old"; import { TransactionMessage, Transaction, diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/util.ts b/src/pumpfunsdk/pumpdotfun-sdk/src/util.ts index f3e924e..ff406ea 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/util.ts +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/util.ts @@ -17,7 +17,7 @@ import { import { AnchorProvider } from "@coral-xyz/anchor"; import { PumpFunSDK, DEFAULT_DECIMALS } from "./pumpfun"; import { PriorityFee, TransactionResult } from "./types"; -import { jito_executeAndConfirm } from "../../../transactions/jito_tips_tx_executor"; +import { jito_executeAndConfirm } from "../../../transactions_old/jito_tips_tx_executor"; import fs from "fs"; import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; export const DEFAULT_COMMITMENT = "finalized"; diff --git a/src/raydium/Pool/swap.ts b/src/raydium/Pool/swap.ts index adc8d64..0c3429e 100644 --- a/src/raydium/Pool/swap.ts +++ b/src/raydium/Pool/swap.ts @@ -36,9 +36,9 @@ import { createCloseAccountInstruction, } from "@solana/spl-token"; import { formatAmmKeysById_swap } from "./formatAmmKeysById"; -import { simple_executeAndConfirm } from "../../transactions/simple_tx_executor"; -import { jito_executeAndConfirm } from "../../transactions/jito_tips_tx_executor"; -import { bloXroute_executeAndConfirm } from "../../transactions/bloXroute_tips_tx_executor"; +import { simple_executeAndConfirm } from "../../transactions_old/simple_tx_executor"; +import { jito_executeAndConfirm } from "../../transactions_old/jito_tips_tx_executor"; +import { bloXroute_executeAndConfirm } from "../../transactions_old/bloXroute_tips_tx_executor"; import { Keypair } from "@solana/web3.js"; let tokenToPoolIdMap: any = {}; diff --git a/src/Token/README.md b/src/token_old/README.md similarity index 100% rename from src/Token/README.md rename to src/token_old/README.md diff --git a/src/Token/burn.ts b/src/token_old/burn.ts similarity index 100% rename from src/Token/burn.ts rename to src/token_old/burn.ts diff --git a/src/Token/create.ts b/src/token_old/create.ts similarity index 100% rename from src/Token/create.ts rename to src/token_old/create.ts diff --git a/src/Token/index.ts b/src/token_old/index.ts similarity index 100% rename from src/Token/index.ts rename to src/token_old/index.ts diff --git a/src/Token/revoke_authority.ts b/src/token_old/revoke_authority.ts similarity index 100% rename from src/Token/revoke_authority.ts rename to src/token_old/revoke_authority.ts diff --git a/src/Token/zk-compression/compressed-token/createAndMint.ts b/src/token_old/zk-compression/compressed-token/createAndMint.ts similarity index 100% rename from src/Token/zk-compression/compressed-token/createAndMint.ts rename to src/token_old/zk-compression/compressed-token/createAndMint.ts diff --git a/src/Token/zk-compression/connect-testnet.ts b/src/token_old/zk-compression/connect-testnet.ts similarity index 100% rename from src/Token/zk-compression/connect-testnet.ts rename to src/token_old/zk-compression/connect-testnet.ts diff --git a/src/Trading_dev/ProfitAndLoss/constants.ts b/src/trading_dev_old/ProfitAndLoss/constants.ts similarity index 100% rename from src/Trading_dev/ProfitAndLoss/constants.ts rename to src/trading_dev_old/ProfitAndLoss/constants.ts diff --git a/src/Trading_dev/ProfitAndLoss/stop-loss.ts b/src/trading_dev_old/ProfitAndLoss/stop-loss.ts similarity index 100% rename from src/Trading_dev/ProfitAndLoss/stop-loss.ts rename to src/trading_dev_old/ProfitAndLoss/stop-loss.ts diff --git a/src/Trading_dev/ProfitAndLoss/take-profit.ts b/src/trading_dev_old/ProfitAndLoss/take-profit.ts similarity index 100% rename from src/Trading_dev/ProfitAndLoss/take-profit.ts rename to src/trading_dev_old/ProfitAndLoss/take-profit.ts diff --git a/src/Trading_dev/ProfitAndLoss/utils.ts b/src/trading_dev_old/ProfitAndLoss/utils.ts similarity index 100% rename from src/Trading_dev/ProfitAndLoss/utils.ts rename to src/trading_dev_old/ProfitAndLoss/utils.ts diff --git a/src/Trading_dev/copy-bot/bought-tokens.json b/src/trading_dev_old/copy-bot/bought-tokens.json similarity index 100% rename from src/Trading_dev/copy-bot/bought-tokens.json rename to src/trading_dev_old/copy-bot/bought-tokens.json diff --git a/src/Trading_dev/copy-bot/copy-buy.ts b/src/trading_dev_old/copy-bot/copy-buy.ts similarity index 100% rename from src/Trading_dev/copy-bot/copy-buy.ts rename to src/trading_dev_old/copy-bot/copy-buy.ts diff --git a/src/Trading_dev/copy-bot/copy-sell.ts b/src/trading_dev_old/copy-bot/copy-sell.ts similarity index 100% rename from src/Trading_dev/copy-bot/copy-sell.ts rename to src/trading_dev_old/copy-bot/copy-sell.ts diff --git a/src/Trading_dev/copy-bot/copy-trade.ts b/src/trading_dev_old/copy-bot/copy-trade.ts similarity index 100% rename from src/Trading_dev/copy-bot/copy-trade.ts rename to src/trading_dev_old/copy-bot/copy-trade.ts diff --git a/src/Transactions/README.md b/src/transactions_old/README.md similarity index 100% rename from src/Transactions/README.md rename to src/transactions_old/README.md diff --git a/src/Transactions/bloXroute_tips_tx_executor.ts b/src/transactions_old/bloXroute_tips_tx_executor.ts similarity index 100% rename from src/Transactions/bloXroute_tips_tx_executor.ts rename to src/transactions_old/bloXroute_tips_tx_executor.ts diff --git a/src/Transactions/index.ts b/src/transactions_old/index.ts similarity index 100% rename from src/Transactions/index.ts rename to src/transactions_old/index.ts diff --git a/src/Transactions/jito_tips_tx_executor.ts b/src/transactions_old/jito_tips_tx_executor.ts similarity index 100% rename from src/Transactions/jito_tips_tx_executor.ts rename to src/transactions_old/jito_tips_tx_executor.ts diff --git a/src/Transactions/simple_tx_executor.ts b/src/transactions_old/simple_tx_executor.ts similarity index 100% rename from src/Transactions/simple_tx_executor.ts rename to src/transactions_old/simple_tx_executor.ts From e5cd3cc1a1570c6cd751bd6757658dce2894360a Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 14:57:43 +0800 Subject: [PATCH 060/140] change dir name --- src/jupiter/swap/swap-helper.ts | 2 +- .../market-making_dev/boost_volume.ts | 4 +- .../market-making_dev/boost_volume.ts | 87 ------------------- src/meteora/Pool/swap.ts | 2 +- src/orca/Pool/swap.ts | 2 +- src/pumpfunsdk/pumpdotfun-sdk/src/util.ts | 2 +- src/raydium/Pool/swap.ts | 6 +- src/{token_old => token}/README.md | 0 src/{token_old => token}/burn.ts | 0 src/{token_old => token}/create.ts | 0 src/{token_old => token}/index.ts | 0 src/{token_old => token}/revoke_authority.ts | 0 .../compressed-token/createAndMint.ts | 0 .../zk-compression/connect-testnet.ts | 0 .../ProfitAndLoss/constants.ts | 0 .../ProfitAndLoss/stop-loss.ts | 0 .../ProfitAndLoss/take-profit.ts | 0 .../ProfitAndLoss/utils.ts | 0 .../copy-bot/bought-tokens.json | 0 .../copy-bot/copy-buy.ts | 0 .../copy-bot/copy-sell.ts | 0 .../copy-bot/copy-trade.ts | 0 .../README.md | 0 .../bloXroute_tips_tx_executor.ts | 0 .../index.ts | 0 .../jito_tips_tx_executor.ts | 0 .../simple_tx_executor.ts | 0 27 files changed, 9 insertions(+), 96 deletions(-) delete mode 100644 src/memecoin_dev_old/market-making_dev/boost_volume.ts rename src/{token_old => token}/README.md (100%) rename src/{token_old => token}/burn.ts (100%) rename src/{token_old => token}/create.ts (100%) rename src/{token_old => token}/index.ts (100%) rename src/{token_old => token}/revoke_authority.ts (100%) rename src/{token_old => token}/zk-compression/compressed-token/createAndMint.ts (100%) rename src/{token_old => token}/zk-compression/connect-testnet.ts (100%) rename src/{trading_dev_old => trading_dev}/ProfitAndLoss/constants.ts (100%) rename src/{trading_dev_old => trading_dev}/ProfitAndLoss/stop-loss.ts (100%) rename src/{trading_dev_old => trading_dev}/ProfitAndLoss/take-profit.ts (100%) rename src/{trading_dev_old => trading_dev}/ProfitAndLoss/utils.ts (100%) rename src/{trading_dev_old => trading_dev}/copy-bot/bought-tokens.json (100%) rename src/{trading_dev_old => trading_dev}/copy-bot/copy-buy.ts (100%) rename src/{trading_dev_old => trading_dev}/copy-bot/copy-sell.ts (100%) rename src/{trading_dev_old => trading_dev}/copy-bot/copy-trade.ts (100%) rename src/{transactions_old => transactions}/README.md (100%) rename src/{transactions_old => transactions}/bloXroute_tips_tx_executor.ts (100%) rename src/{transactions_old => transactions}/index.ts (100%) rename src/{transactions_old => transactions}/jito_tips_tx_executor.ts (100%) rename src/{transactions_old => transactions}/simple_tx_executor.ts (100%) diff --git a/src/jupiter/swap/swap-helper.ts b/src/jupiter/swap/swap-helper.ts index 6f75bd7..85a7a8a 100644 --- a/src/jupiter/swap/swap-helper.ts +++ b/src/jupiter/swap/swap-helper.ts @@ -1,7 +1,7 @@ import { VersionedTransaction, PublicKey } from "@solana/web3.js"; import fetch from "cross-fetch"; import { connection, wallet, jito_fee } from "../../helpers/config"; -import { jito_executeAndConfirm } from "../../transactions_old/jito_tips_tx_executor"; +import { jito_executeAndConfirm } from "../../transactions/jito_tips_tx_executor"; import { getDecimals } from "../../helpers/util"; /** * Retrieves a quote for swapping tokens. diff --git a/src/memecoin_dev/market-making_dev/boost_volume.ts b/src/memecoin_dev/market-making_dev/boost_volume.ts index cbdf76e..263d03e 100644 --- a/src/memecoin_dev/market-making_dev/boost_volume.ts +++ b/src/memecoin_dev/market-making_dev/boost_volume.ts @@ -1,6 +1,6 @@ import { connection, wallet } from "../../helpers/config"; -import { simple_executeAndConfirm } from "../../transactions_old/simple_tx_executor"; -import { jito_executeAndConfirm } from "../../transactions_old/jito_tips_tx_executor"; +import { simple_executeAndConfirm } from "../../transactions/simple_tx_executor"; +import { jito_executeAndConfirm } from "../../transactions/jito_tips_tx_executor"; import { program } from "commander"; import { loadOrCreateKeypair_wallet, checkTx } from "../../helpers/util"; import { diff --git a/src/memecoin_dev_old/market-making_dev/boost_volume.ts b/src/memecoin_dev_old/market-making_dev/boost_volume.ts deleted file mode 100644 index cbdf76e..0000000 --- a/src/memecoin_dev_old/market-making_dev/boost_volume.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { connection, wallet } from "../../helpers/config"; -import { simple_executeAndConfirm } from "../../transactions_old/simple_tx_executor"; -import { jito_executeAndConfirm } from "../../transactions_old/jito_tips_tx_executor"; -import { program } from "commander"; -import { loadOrCreateKeypair_wallet, checkTx } from "../../helpers/util"; -import { - ComputeBudgetProgram, - TransactionMessage, - VersionedTransaction, -} from "@solana/web3.js"; -import { swapForVolume } from "../../raydium/Pool/swap"; -let slippage = null, - tokenAddress: any = null, - payer: any = null, - cluster = null, - solPerOrder: any = null; - -program - .option("--token_address ", "Specify the token address") - .option("--payer ", "Specify the path to the secret key") - .option("--cluster ", "Specify the cluster") - .option( - "--sol_per_order ", - "Specify the number of SOL per order" - ) - .option("-h, --help", "display help for command") - .action((options: any) => { - if (options.help) { - console.log( - "node boost_volume --token_address --payer --cluster --sol_per_order " - ); - process.exit(0); - } - if (!options.token_address || !options.cluster || !options.sol_per_order) { - console.error("❌ Missing required options"); - process.exit(1); - } - tokenAddress = options.token_address; - if (payer) payer = options.payer; - cluster = options.cluster; - solPerOrder = options.sol_per_order; - }); -program.parse(); - -/** - * Boosts the volume by buying and selling a token in one transaction. - * @async - * @function boost_volume - * @returns {Promise} - */ -async function boost_volume() { - while (true) { - console.log( - `Boosting volume..., buying and selling ${tokenAddress} in one transaction...` - ); - try { - const res: any = await swapForVolume(tokenAddress, solPerOrder); - await error_handling(res.signature, res.confirmed); - } catch (e) { - console.log(e); - console.log("trying to send the transaction again..."); - await new Promise((resolve) => setTimeout(resolve, 2000)); - continue; - } - } -} - -/** - * Handles error for a transaction. - * @param {string} signature - The transaction signature. - * @param {boolean} confirmed - Indicates if the transaction is confirmed. - * @returns {Promise} - A promise that resolves when the error handling is complete. - */ -async function error_handling(signature: any, confirmed: any) { - if (confirmed) { - console.log(`https://solscan.io/tx/${signature}?cluster=mainnet`); - return; - } - const response = await checkTx(signature); - if (response) { - console.log(`https://solscan.io/tx/${signature}?cluster=mainnet`); - } else { - console.log("Transaction failed"); - console.log("trying to send the transaction again"); - } -} -boost_volume(); diff --git a/src/meteora/Pool/swap.ts b/src/meteora/Pool/swap.ts index 0ff5f30..f1e784f 100644 --- a/src/meteora/Pool/swap.ts +++ b/src/meteora/Pool/swap.ts @@ -17,7 +17,7 @@ import { ComputeBudgetProgram, VersionedTransaction, } from "@solana/web3.js"; -import { jito_executeAndConfirm } from "../../transactions_old/jito_tips_tx_executor"; +import { jito_executeAndConfirm } from "../../transactions/jito_tips_tx_executor"; import { jito_fee } from "../../helpers/config"; import { C } from "@raydium-io/raydium-sdk-v2/lib/raydium-276d396e"; const BN = require("bn.js"); diff --git a/src/orca/Pool/swap.ts b/src/orca/Pool/swap.ts index b801f70..0f929ef 100644 --- a/src/orca/Pool/swap.ts +++ b/src/orca/Pool/swap.ts @@ -12,7 +12,7 @@ import { import Decimal from "decimal.js"; import { connection, wallet, jito_fee } from "../../helpers/config"; import { getSPLTokenBalance } from "../../helpers/check_balance"; -import { jito_executeAndConfirm } from "../../transactions_old"; +import { jito_executeAndConfirm } from "../../transactions"; import { TransactionMessage, Transaction, diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/util.ts b/src/pumpfunsdk/pumpdotfun-sdk/src/util.ts index ff406ea..f3e924e 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/util.ts +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/util.ts @@ -17,7 +17,7 @@ import { import { AnchorProvider } from "@coral-xyz/anchor"; import { PumpFunSDK, DEFAULT_DECIMALS } from "./pumpfun"; import { PriorityFee, TransactionResult } from "./types"; -import { jito_executeAndConfirm } from "../../../transactions_old/jito_tips_tx_executor"; +import { jito_executeAndConfirm } from "../../../transactions/jito_tips_tx_executor"; import fs from "fs"; import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; export const DEFAULT_COMMITMENT = "finalized"; diff --git a/src/raydium/Pool/swap.ts b/src/raydium/Pool/swap.ts index 0c3429e..adc8d64 100644 --- a/src/raydium/Pool/swap.ts +++ b/src/raydium/Pool/swap.ts @@ -36,9 +36,9 @@ import { createCloseAccountInstruction, } from "@solana/spl-token"; import { formatAmmKeysById_swap } from "./formatAmmKeysById"; -import { simple_executeAndConfirm } from "../../transactions_old/simple_tx_executor"; -import { jito_executeAndConfirm } from "../../transactions_old/jito_tips_tx_executor"; -import { bloXroute_executeAndConfirm } from "../../transactions_old/bloXroute_tips_tx_executor"; +import { simple_executeAndConfirm } from "../../transactions/simple_tx_executor"; +import { jito_executeAndConfirm } from "../../transactions/jito_tips_tx_executor"; +import { bloXroute_executeAndConfirm } from "../../transactions/bloXroute_tips_tx_executor"; import { Keypair } from "@solana/web3.js"; let tokenToPoolIdMap: any = {}; diff --git a/src/token_old/README.md b/src/token/README.md similarity index 100% rename from src/token_old/README.md rename to src/token/README.md diff --git a/src/token_old/burn.ts b/src/token/burn.ts similarity index 100% rename from src/token_old/burn.ts rename to src/token/burn.ts diff --git a/src/token_old/create.ts b/src/token/create.ts similarity index 100% rename from src/token_old/create.ts rename to src/token/create.ts diff --git a/src/token_old/index.ts b/src/token/index.ts similarity index 100% rename from src/token_old/index.ts rename to src/token/index.ts diff --git a/src/token_old/revoke_authority.ts b/src/token/revoke_authority.ts similarity index 100% rename from src/token_old/revoke_authority.ts rename to src/token/revoke_authority.ts diff --git a/src/token_old/zk-compression/compressed-token/createAndMint.ts b/src/token/zk-compression/compressed-token/createAndMint.ts similarity index 100% rename from src/token_old/zk-compression/compressed-token/createAndMint.ts rename to src/token/zk-compression/compressed-token/createAndMint.ts diff --git a/src/token_old/zk-compression/connect-testnet.ts b/src/token/zk-compression/connect-testnet.ts similarity index 100% rename from src/token_old/zk-compression/connect-testnet.ts rename to src/token/zk-compression/connect-testnet.ts diff --git a/src/trading_dev_old/ProfitAndLoss/constants.ts b/src/trading_dev/ProfitAndLoss/constants.ts similarity index 100% rename from src/trading_dev_old/ProfitAndLoss/constants.ts rename to src/trading_dev/ProfitAndLoss/constants.ts diff --git a/src/trading_dev_old/ProfitAndLoss/stop-loss.ts b/src/trading_dev/ProfitAndLoss/stop-loss.ts similarity index 100% rename from src/trading_dev_old/ProfitAndLoss/stop-loss.ts rename to src/trading_dev/ProfitAndLoss/stop-loss.ts diff --git a/src/trading_dev_old/ProfitAndLoss/take-profit.ts b/src/trading_dev/ProfitAndLoss/take-profit.ts similarity index 100% rename from src/trading_dev_old/ProfitAndLoss/take-profit.ts rename to src/trading_dev/ProfitAndLoss/take-profit.ts diff --git a/src/trading_dev_old/ProfitAndLoss/utils.ts b/src/trading_dev/ProfitAndLoss/utils.ts similarity index 100% rename from src/trading_dev_old/ProfitAndLoss/utils.ts rename to src/trading_dev/ProfitAndLoss/utils.ts diff --git a/src/trading_dev_old/copy-bot/bought-tokens.json b/src/trading_dev/copy-bot/bought-tokens.json similarity index 100% rename from src/trading_dev_old/copy-bot/bought-tokens.json rename to src/trading_dev/copy-bot/bought-tokens.json diff --git a/src/trading_dev_old/copy-bot/copy-buy.ts b/src/trading_dev/copy-bot/copy-buy.ts similarity index 100% rename from src/trading_dev_old/copy-bot/copy-buy.ts rename to src/trading_dev/copy-bot/copy-buy.ts diff --git a/src/trading_dev_old/copy-bot/copy-sell.ts b/src/trading_dev/copy-bot/copy-sell.ts similarity index 100% rename from src/trading_dev_old/copy-bot/copy-sell.ts rename to src/trading_dev/copy-bot/copy-sell.ts diff --git a/src/trading_dev_old/copy-bot/copy-trade.ts b/src/trading_dev/copy-bot/copy-trade.ts similarity index 100% rename from src/trading_dev_old/copy-bot/copy-trade.ts rename to src/trading_dev/copy-bot/copy-trade.ts diff --git a/src/transactions_old/README.md b/src/transactions/README.md similarity index 100% rename from src/transactions_old/README.md rename to src/transactions/README.md diff --git a/src/transactions_old/bloXroute_tips_tx_executor.ts b/src/transactions/bloXroute_tips_tx_executor.ts similarity index 100% rename from src/transactions_old/bloXroute_tips_tx_executor.ts rename to src/transactions/bloXroute_tips_tx_executor.ts diff --git a/src/transactions_old/index.ts b/src/transactions/index.ts similarity index 100% rename from src/transactions_old/index.ts rename to src/transactions/index.ts diff --git a/src/transactions_old/jito_tips_tx_executor.ts b/src/transactions/jito_tips_tx_executor.ts similarity index 100% rename from src/transactions_old/jito_tips_tx_executor.ts rename to src/transactions/jito_tips_tx_executor.ts diff --git a/src/transactions_old/simple_tx_executor.ts b/src/transactions/simple_tx_executor.ts similarity index 100% rename from src/transactions_old/simple_tx_executor.ts rename to src/transactions/simple_tx_executor.ts From 2e3706a458b42da395fbdf5d98b75efe643119a9 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 15:34:48 +0800 Subject: [PATCH 061/140] add test.ts to test all the cli script --- src/helpers/unwrap_sol.ts | 5 +- src/helpers/wrap_sol.ts | 5 +- .../market-making_dev/boost_volume.ts | 5 +- src/meteora/buy.ts | 3 +- src/meteora/sell.ts | 3 +- src/orca/buy.ts | 3 +- src/orca/sell.ts | 3 +- src/pumpfunsdk/pumpdotfun-sdk/src/buy.ts | 5 +- .../pumpdotfun-sdk/src/createAndBuy.ts | 5 +- src/pumpfunsdk/pumpdotfun-sdk/src/sell.ts | 5 +- src/pumpfunsdk/pumpdotfun-sdk/src/tools.ts | 2 +- src/raydium/buy.ts | 5 +- src/raydium/sell.ts | 5 +- src/token/burn.ts | 5 +- src/token/create.ts | 5 +- test.ts | 72 +++++++++++++++++-- 16 files changed, 106 insertions(+), 30 deletions(-) diff --git a/src/helpers/unwrap_sol.ts b/src/helpers/unwrap_sol.ts index 1fe496c..4c3f214 100644 --- a/src/helpers/unwrap_sol.ts +++ b/src/helpers/unwrap_sol.ts @@ -2,12 +2,13 @@ import { NATIVE_MINT, getOrCreateAssociatedTokenAccount, createCloseAccountInstr import { wallet, connection } from "./config"; import { Transaction, LAMPORTS_PER_SOL, sendAndConfirmTransaction } from "@solana/web3.js"; import { program } from "commander"; +import { logger } from "./logger"; program .option("-h, --help", "display help for command") .action((options) => { if (options.help) { - console.log( - "node unwrap_sol.js" + logger.info( + "ts-node unwrap_sol.js" ); process.exit(0); } diff --git a/src/helpers/wrap_sol.ts b/src/helpers/wrap_sol.ts index 001509c..7ec8778 100644 --- a/src/helpers/wrap_sol.ts +++ b/src/helpers/wrap_sol.ts @@ -3,14 +3,15 @@ import { wallet, connection } from "./config"; import { Transaction, SystemProgram, LAMPORTS_PER_SOL, sendAndConfirmTransaction } from "@solana/web3.js"; import {getSPLTokenBalance} from "./check_balance"; import { program } from "commander"; +import { logger } from "./logger"; let wrap_size = 0; program .option("-s, --size ", "size of sol to wrap") .option("-h, --help", "display help for command") .action((options:any) => { if (options.help) { - console.log( - "node wrap_sol.js --size " + logger.info( + "ts-node wrap_sol.js --size " ); process.exit(0); } diff --git a/src/memecoin_dev/market-making_dev/boost_volume.ts b/src/memecoin_dev/market-making_dev/boost_volume.ts index 263d03e..b709bd0 100644 --- a/src/memecoin_dev/market-making_dev/boost_volume.ts +++ b/src/memecoin_dev/market-making_dev/boost_volume.ts @@ -9,6 +9,7 @@ import { VersionedTransaction, } from "@solana/web3.js"; import { swapForVolume } from "../../raydium/Pool/swap"; +import { logger } from "../../helpers"; let slippage = null, tokenAddress: any = null, payer: any = null, @@ -26,8 +27,8 @@ program .option("-h, --help", "display help for command") .action((options: any) => { if (options.help) { - console.log( - "node boost_volume --token_address --payer --cluster --sol_per_order " + logger.info( + "ts-node boost_volume --token_address --payer --cluster --sol_per_order " ); process.exit(0); } diff --git a/src/meteora/buy.ts b/src/meteora/buy.ts index df514fe..e6663f4 100644 --- a/src/meteora/buy.ts +++ b/src/meteora/buy.ts @@ -1,3 +1,4 @@ +import { logger } from "../helpers/logger"; import {swap} from "./Pool" import { program } from "commander"; @@ -9,7 +10,7 @@ program .option("-h, --help", "display help for command") .action((options) => { if (options.help) { - console.log( + logger.info( "ts-node buy --token --sol " ); process.exit(0); diff --git a/src/meteora/sell.ts b/src/meteora/sell.ts index eb8601f..94de408 100644 --- a/src/meteora/sell.ts +++ b/src/meteora/sell.ts @@ -1,3 +1,4 @@ +import { logger } from "../helpers/logger"; import {swap} from "./Pool" import { program } from "commander"; @@ -9,7 +10,7 @@ program .option("-h, --help", "display help for command") .action((options) => { if (options.help) { - console.log( + logger.info( "ts-node sell --token --percentage " ); process.exit(0); diff --git a/src/orca/buy.ts b/src/orca/buy.ts index df514fe..e6663f4 100644 --- a/src/orca/buy.ts +++ b/src/orca/buy.ts @@ -1,3 +1,4 @@ +import { logger } from "../helpers/logger"; import {swap} from "./Pool" import { program } from "commander"; @@ -9,7 +10,7 @@ program .option("-h, --help", "display help for command") .action((options) => { if (options.help) { - console.log( + logger.info( "ts-node buy --token --sol " ); process.exit(0); diff --git a/src/orca/sell.ts b/src/orca/sell.ts index eb8601f..94de408 100644 --- a/src/orca/sell.ts +++ b/src/orca/sell.ts @@ -1,3 +1,4 @@ +import { logger } from "../helpers/logger"; import {swap} from "./Pool" import { program } from "commander"; @@ -9,7 +10,7 @@ program .option("-h, --help", "display help for command") .action((options) => { if (options.help) { - console.log( + logger.info( "ts-node sell --token --percentage " ); process.exit(0); diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/buy.ts b/src/pumpfunsdk/pumpdotfun-sdk/src/buy.ts index 476c9cc..b21c9d2 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/buy.ts +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/buy.ts @@ -1,6 +1,7 @@ import { PublicKey } from "@solana/web3.js"; import {buy} from "./tools"; import { program } from "commander"; +import { logger } from "../../../helpers/logger"; let token_address:any = null, sol = null; program .option("--token_address ", "Specify the token address") @@ -8,8 +9,8 @@ program .option("-h, --help", "display help for command") .action((options) => { if (options.help) { - console.log( - "node buy --token_address --sol " + logger.info( + "ts-node buy --token_address --sol " ); process.exit(0); } diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/createAndBuy.ts b/src/pumpfunsdk/pumpdotfun-sdk/src/createAndBuy.ts index c8ea09a..ac7e797 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/createAndBuy.ts +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/createAndBuy.ts @@ -2,6 +2,7 @@ import {createAndBuy} from "./tools"; // command line tool import {program} from "commander"; import fs from "fs"; +import { logger } from "../../../helpers/logger"; let sol:any = null, mintKeypair:any = null, name:any = null, symbol:any = null, description:any = null, telegram:any = null, twitter:any = null, website:any = null, file:any = null; @@ -17,8 +18,8 @@ program.option("--pathToMintKeypair ", "Specify the path t .option("-h, --help", "display help for command") .action((options) => { if (options.help) { - console.log( - "node createAndBuy --pathToMintKeypair --sol --name --symbol --description --telegram --twitter --website --file " + logger.info( + "ts-node createAndBuy --pathToMintKeypair --sol --name --symbol --description --telegram --twitter --website --file " ); process.exit(0); } diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/sell.ts b/src/pumpfunsdk/pumpdotfun-sdk/src/sell.ts index c91019a..8c0e468 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/sell.ts +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/sell.ts @@ -1,6 +1,7 @@ import {sell} from './tools'; import { PublicKey } from "@solana/web3.js"; import { program } from "commander"; +import { logger } from '../../../helpers/logger'; let token_address:any = null, sellPercentage:any = null; program .option("--token_address ", "Specify the token address") @@ -8,8 +9,8 @@ program .option("-h, --help", "display help for command") .action((options:any) => { if (options.help) { - console.log( - "node sell --token_address --percentage " + logger.info( + "ts-node sell --token_address --percentage " ); process.exit(0); } diff --git a/src/pumpfunsdk/pumpdotfun-sdk/src/tools.ts b/src/pumpfunsdk/pumpdotfun-sdk/src/tools.ts index 6a26929..168b0f5 100644 --- a/src/pumpfunsdk/pumpdotfun-sdk/src/tools.ts +++ b/src/pumpfunsdk/pumpdotfun-sdk/src/tools.ts @@ -1,5 +1,5 @@ import { AnchorProvider } from "@coral-xyz/anchor"; -import { PumpFunSDK, DEFAULT_DECIMALS } from "./pumpfun.js"; +import { PumpFunSDK, DEFAULT_DECIMALS } from "./pumpfun"; import { wallet, connection } from "../../../helpers/config"; import { getOrCreateKeypair, diff --git a/src/raydium/buy.ts b/src/raydium/buy.ts index 3b51382..67547f6 100644 --- a/src/raydium/buy.ts +++ b/src/raydium/buy.ts @@ -3,6 +3,7 @@ import { program } from "commander"; import { loadOrCreateKeypair_wallet } from "../helpers/util"; import { wallet } from "../helpers/config"; import { Keypair } from "@solana/web3.js"; +import { logger } from "../helpers/logger"; let payer_keypair:any = null, token_address:any = null, @@ -16,8 +17,8 @@ program .option("-h, --help", "display help for command") .action((options) => { if (options.help) { - console.log( - "node buy --payer --token_address --sol --cluster " + logger.info( + "ts-node buy --payer --token_address --sol --cluster " ); process.exit(0); } diff --git a/src/raydium/sell.ts b/src/raydium/sell.ts index eb59dae..63dcd84 100644 --- a/src/raydium/sell.ts +++ b/src/raydium/sell.ts @@ -3,6 +3,7 @@ import { program } from "commander"; import { loadOrCreateKeypair_wallet } from "../helpers/util"; import { wallet } from "../helpers/config"; import { Keypair } from "@solana/web3.js"; +import { logger } from "../helpers/logger"; let payer_keypair:any = null, token_address:any = null, @@ -16,8 +17,8 @@ program .option("-h, --help", "display help for command") .action((options:any) => { if (options.help) { - console.log( - "node sell --payer --token_address --percentage --cluster " + logger.info( + "ts-node sell --payer --token_address --percentage --cluster " ); process.exit(0); } diff --git a/src/token/burn.ts b/src/token/burn.ts index 0bcc08d..72ae39a 100644 --- a/src/token/burn.ts +++ b/src/token/burn.ts @@ -15,6 +15,7 @@ import { } from "@solana/spl-token"; import { connection, dev_connection } from "../helpers/config"; import { wallet } from "../helpers/config"; +import { logger } from "../helpers/logger"; let payer_keypair_path = null, token_address:any = null, @@ -31,8 +32,8 @@ program .option("-h, --help", "display help for command") .action((options) => { if (options.help) { - console.log( - "node burn --payer --token_address --percentage --cluster " + logger.info( + "ts-node burn --payer --token_address --percentage --cluster " ); process.exit(0); } diff --git a/src/token/create.ts b/src/token/create.ts index 8d0255d..0ebcaf1 100644 --- a/src/token/create.ts +++ b/src/token/create.ts @@ -30,6 +30,7 @@ import { connection, wallet, } from "../helpers/config"; +import { logger } from "../helpers/logger"; // info let payer_keypair_path: any = null, @@ -68,8 +69,8 @@ program .option("-h, --help", "display help for command") .action((options) => { if (options.help) { - console.log( - "node create --payer --symbol --token_name --mint --supply --decimals --metadata --image --cluster --priority-fee --file_type " + logger.info( + "ts-node create --payer --symbol --token_name --mint --supply --decimals --metadata --image --cluster --priority-fee --file_type " ); process.exit(0); } diff --git a/test.ts b/test.ts index 552cc66..d4a5e32 100644 --- a/test.ts +++ b/test.ts @@ -1,9 +1,71 @@ - - +import { spawn } from 'child_process'; +import path from "path"; +import { logger } from './src/utils'; +const config_path = path.join(__dirname, 'src/helpers/config.ts'); +const wrap_sol_path = path.join(__dirname, 'src/helpers/wrap_sol.ts'); +const unwrap_sol_path = path.join(__dirname, 'src/helpers/unwrap_sol.ts'); +const meteora_buy_path = path.join(__dirname, 'src/meteora/buy.ts'); +const meteora_sell_path = path.join(__dirname, 'src/meteora/sell.ts'); +const orca_buy_path = path.join(__dirname, 'src/orca/buy.ts'); +const orca_sell_path = path.join(__dirname, 'src/orca/sell.ts'); +const raydium_buy_path = path.join(__dirname, 'src/raydium/buy.ts'); +const raydium_sell_path = path.join(__dirname, 'src/raydium/sell.ts'); +const pumpfun_buy_path = path.join(__dirname, 'src/pumpfunsdk/pumpdotfun-sdk/src/buy.ts'); +const pumpfun_sell_path = path.join(__dirname, 'src/pumpfunsdk/pumpdotfun-sdk/src/sell.ts'); +const pumpfun_createAndBuy_path = path.join(__dirname, 'src/pumpfunsdk/pumpdotfun-sdk/src/createAndBuy.ts'); +const boost_volume_path = path.join(__dirname, 'src/memecoin_dev/market-making_dev/boost_volume.ts'); +const create_token_path = path.join(__dirname, 'src/token/create.ts'); +const burn_token_path = path.join(__dirname, 'src/token/burn.ts'); +const copy_trade_path = path.join(__dirname, 'src/grpc_streaming_dev/grpc-copy-bot/src/streaming/copy-trade.ts'); +const pumpfun_sniper_path = path.join(__dirname, 'src/grpc_streaming_dev/grpc-pf-sniper/src/streaming/snipe-create.ts'); +async function runSHScript(scriptPath: string) { + return new Promise((resolve, reject) => { + const child = spawn('ts-node', [scriptPath, " -h"], { + stdio: 'inherit', + shell: true, + }); + + child.on('close', (code) => { + //console.log(`Child process for ${scriptPath} exited with code ${code}`); + resolve(code); // Resolve the promise when the process exits + }); + + child.on('error', (err) => { + //console.error(`Error running ${scriptPath}:`, err); + reject(err); // Reject the promise on error + }); + }); + } /** * please run this before using the cli */ -function test(){ - -} \ No newline at end of file +async function test(){ + logger.info("Testing helper scripts..."); + await runSHScript(config_path); + await runSHScript(wrap_sol_path); + await runSHScript(unwrap_sol_path); + logger.info("Testing Meteora scripts..."); + await runSHScript(meteora_buy_path); + await runSHScript(meteora_sell_path); + logger.info("Testing Orca scripts..."); + await runSHScript(orca_buy_path); + await runSHScript(orca_sell_path); + logger.info("Testing Raydium scripts..."); + await runSHScript(raydium_buy_path); + await runSHScript(raydium_sell_path); + logger.info("Testing Pumpfun scripts..."); + await runSHScript(pumpfun_buy_path); + await runSHScript(pumpfun_sell_path); + await runSHScript(pumpfun_createAndBuy_path); + logger.info("Testing Memecoin scripts..."); + await runSHScript(boost_volume_path); + await runSHScript(create_token_path); + await runSHScript(burn_token_path); + logger.info("Testing grpc Streaming scripts..."); + await runSHScript(copy_trade_path); + await runSHScript(pumpfun_sniper_path); + + logger.info("All tests passed!"); +} +test(); \ No newline at end of file From 2a471ebc7649866b1e3e1e35819e3d3ccfce449e Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 15:35:24 +0800 Subject: [PATCH 062/140] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5273694..fa37c81 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ 3. `nvm install` 4. `nvm use` 5. `npm install` -6. also see the command examples in examples/ +6. `ts-node test.ts` ### Prerequisites 🚨 From 28db07070bdafb339b036273addb7ed158984f7c Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 17:11:53 +0800 Subject: [PATCH 063/140] add grpc-rug-detection&grpc-raydium-sniper dir in src/grpc_streaming_dev/ --- .../grpc-rug-detection/README.md | 13 ++++ .../grpc-rug-detection/command.sh | 1 + .../src/constants/constants.ts | 10 +++ .../grpc-rug-detection/src/constants/index.ts | 1 + .../src/streaming/grpc-requests-type.ts | 42 +++++++++++ .../src/streaming/rug-detection.ts | 35 +++++++++ .../src/streaming/stream-token.ts | 71 +++++++++++++++++++ .../grpc-rug-detection/src/streaming/utils.ts | 65 +++++++++++++++++ .../grpc-rug-detection/src/utils/index.ts | 2 + .../grpc-rug-detection/src/utils/logger.ts | 17 +++++ .../grpc-rug-detection/src/utils/utils.ts | 70 ++++++++++++++++++ 11 files changed, 327 insertions(+) create mode 100644 src/grpc_streaming_dev/grpc-rug-detection/README.md create mode 100644 src/grpc_streaming_dev/grpc-rug-detection/command.sh create mode 100644 src/grpc_streaming_dev/grpc-rug-detection/src/constants/constants.ts create mode 100644 src/grpc_streaming_dev/grpc-rug-detection/src/constants/index.ts create mode 100644 src/grpc_streaming_dev/grpc-rug-detection/src/streaming/grpc-requests-type.ts create mode 100644 src/grpc_streaming_dev/grpc-rug-detection/src/streaming/rug-detection.ts create mode 100644 src/grpc_streaming_dev/grpc-rug-detection/src/streaming/stream-token.ts create mode 100644 src/grpc_streaming_dev/grpc-rug-detection/src/streaming/utils.ts create mode 100644 src/grpc_streaming_dev/grpc-rug-detection/src/utils/index.ts create mode 100644 src/grpc_streaming_dev/grpc-rug-detection/src/utils/logger.ts create mode 100644 src/grpc_streaming_dev/grpc-rug-detection/src/utils/utils.ts diff --git a/src/grpc_streaming_dev/grpc-rug-detection/README.md b/src/grpc_streaming_dev/grpc-rug-detection/README.md new file mode 100644 index 0000000..7144f4e --- /dev/null +++ b/src/grpc_streaming_dev/grpc-rug-detection/README.md @@ -0,0 +1,13 @@ +# *Geyser grpc rug detection Bot (Beta)* + +## Don't use, still in development... + +## How it works + + +## Prerequisites + + +## Code usage + + diff --git a/src/grpc_streaming_dev/grpc-rug-detection/command.sh b/src/grpc_streaming_dev/grpc-rug-detection/command.sh new file mode 100644 index 0000000..a317466 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-rug-detection/command.sh @@ -0,0 +1 @@ +ts-node src/streaming/rug-detection.ts --token \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-rug-detection/src/constants/constants.ts b/src/grpc_streaming_dev/grpc-rug-detection/src/constants/constants.ts new file mode 100644 index 0000000..f0d8db8 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-rug-detection/src/constants/constants.ts @@ -0,0 +1,10 @@ +import { logger, retrieveEnvVariable } from "../../../../utils"; +import { + Commitment + } from "@solana/web3.js"; +export const NETWORK = 'mainnet-beta'; +export const COMMITMENT_LEVEL: Commitment = retrieveEnvVariable('COMMITMENT_LEVEL', logger) as Commitment; +export const RPC_ENDPOINT = retrieveEnvVariable('MAINNET_ENDPOINT', logger); +export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable('WS_MAINNET_ENDPOINT', logger); +export const GRPC_XTOKEN = retrieveEnvVariable('GRPC_XTOKEN', logger); +export const LOG_LEVEL = retrieveEnvVariable('LOG_LEVEL', logger); \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-rug-detection/src/constants/index.ts b/src/grpc_streaming_dev/grpc-rug-detection/src/constants/index.ts new file mode 100644 index 0000000..c7582ff --- /dev/null +++ b/src/grpc_streaming_dev/grpc-rug-detection/src/constants/index.ts @@ -0,0 +1 @@ +export * from "./constants" \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/grpc-requests-type.ts b/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/grpc-requests-type.ts new file mode 100644 index 0000000..e9f6679 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/grpc-requests-type.ts @@ -0,0 +1,42 @@ +import { + CommitmentLevel, + SubscribeRequest, + } from "@triton-one/yellowstone-grpc"; +import { req } from "pino-std-serializers"; +export async function createSubscribeTokenRequest(mintAddress: string) { + let request: any = null; + request = { + slots: {}, + accounts: {}, + transactions: { + pumpdotfun: { + vote: false, + failed: false, + signature: undefined, + accountInclude: [mintAddress], + accountExclude: [], + accountRequired: [mintAddress], + }, + }, + transactionsStatus: {}, + blocks: {}, + blocksMeta: {}, + accountsDataSlice: [], + commitment: CommitmentLevel.PROCESSED, // Subscribe to processed blocks for the fastest updates + entry: {}, + }; + return request; +} +export async function createClearAllSubscriptionsRequest() { + const request = { + "slots": {}, + "accounts": {}, + "transactions": {}, + "blocks": {}, + "blocksMeta": {}, + "accountsDataSlice": [] + }; + return request; +} + + diff --git a/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/rug-detection.ts b/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/rug-detection.ts new file mode 100644 index 0000000..923be1d --- /dev/null +++ b/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/rug-detection.ts @@ -0,0 +1,35 @@ +import { logger } from "../utils/logger"; +const {program} = require("commander") +let targetTokenToMonitor:string = ""; + +program.option("--token ", "Specify the token you want to monitor") + .option("-h, --help", "display help for command") + .action((options:any) => { + if (options.help) { + logger.info( + "ts-node rug-detection.ts --token " + ); + process.exit(0); + } + if(options.token){ + targetTokenToMonitor = options.token + } + }); +program.parse(); + +async function snipe(){ + + // show the options + logger.info(`Will monitor the token: ${targetTokenToMonitor}`); + + + try{ + + }catch(e){ + logger.error(`error when streaming ${e}`); + } + + +} + +snipe(); \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/stream-token.ts b/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/stream-token.ts new file mode 100644 index 0000000..ab5321c --- /dev/null +++ b/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/stream-token.ts @@ -0,0 +1,71 @@ +import pino from "pino"; +import Client from "@triton-one/yellowstone-grpc"; +import { PublicKey } from "@solana/web3.js"; +import bs58 from "bs58"; +import { + createClearAllSubscriptionsRequest, + createSubscribeTokenRequest, +} from "./grpc-requests-type"; +import { handleSubscribe } from "./utils"; +import { getSPLBalance, retriveWalletState } from "../../../../utils"; +import { GRPC_XTOKEN } from "../constants/constants"; +import { token } from "@metaplex-foundation/js"; +let trader_balance_wallet:any = {}; +export const raydium_authority = "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1"; // ***it represent the person who extract/put the sol/token to the pool for every raydium swap txn*** +const client = new Client( + "https://grpc.fra.shyft.to", + GRPC_XTOKEN, + { + "grpc.max_receive_message_length": 64 * 1024 * 1024, // 64MiB + } +); //grpc endpoint +const transport = pino.transport({ + target: "pino-pretty", +}); + +export const logger = pino( + { + level: "info", + serializers: { + error: pino.stdSerializers.err, + }, + base: undefined, + }, + transport +); +// Array to store Jito leaders for current epoch + + +(async () => { + const version = await client.getVersion(); // gets the version information + logger.info(version); +})(); + +export async function checkIfRug(data: any, token_address: string) { + + + +} + +export async function streamTargetTrader(token_address: string) { + try { + logger.info("Target token to monitor if it's going to rug: ", token); + + + const stream = await client.subscribe(); + // throw new Error("test"); // test if it restarts when error occurs + // process.exit(1); // test if it restart when process exit + // Create `error` / `end` handler + const r1 = await createSubscribeTokenRequest(token_address); + handleSubscribe(stream, r1); + stream.on("data", (data) => { + // receive an update when trader makes a transaction + if (data.transaction !== undefined) { + logger.info(`Current slot: ${data.transaction.slot}`); + } + }); + } catch (e) { + logger.error(e); + throw e; + } +} diff --git a/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/utils.ts b/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/utils.ts new file mode 100644 index 0000000..3233728 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/utils.ts @@ -0,0 +1,65 @@ +import { + CommitmentLevel, + SubscribeRequest, + } from "@triton-one/yellowstone-grpc"; +import Client from "@triton-one/yellowstone-grpc"; +const PING_INTERVAL_MS = 30_000; + +export async function handleSubscribe(client_stream: any, args: SubscribeRequest){ + // Create `error` / `end` handler + const streamClosed = new Promise((resolve, reject) => { + client_stream.on("error", (error:any) => { + console.log("ERROR", error); + reject(error); + client_stream.end(); + }); + client_stream.on("end", () => { + resolve(); + }); + client_stream.on("close", () => { + resolve(); + }); + }); + + // Send subscribe request + await new Promise((resolve, reject) => { + client_stream.write(args, (err: any) => { + if (err === null || err === undefined) { + resolve(); + } else { + reject(err); + } + }); + }).catch((reason) => { + console.error(reason); + throw reason; + }); + // Send pings every 5s to keep the connection open + const pingRequest: SubscribeRequest = { + ping: { id: 1 }, + // Required, but unused arguments + accounts: {}, + accountsDataSlice: [], + transactions: {}, + blocks: {}, + blocksMeta: {}, + entry: {}, + slots: {}, + }; + setInterval(async () => { + await new Promise((resolve, reject) => { + client_stream.write(pingRequest, (err:any) => { + if (err === null || err === undefined) { + resolve(); + } else { + reject(err); + } + }); + }).catch((reason) => { + console.error(reason); + throw reason; + }); + }, PING_INTERVAL_MS); + + await streamClosed; +} \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-rug-detection/src/utils/index.ts b/src/grpc_streaming_dev/grpc-rug-detection/src/utils/index.ts new file mode 100644 index 0000000..d90cdf8 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-rug-detection/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './utils'; +export * from './logger'; \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-rug-detection/src/utils/logger.ts b/src/grpc_streaming_dev/grpc-rug-detection/src/utils/logger.ts new file mode 100644 index 0000000..393068e --- /dev/null +++ b/src/grpc_streaming_dev/grpc-rug-detection/src/utils/logger.ts @@ -0,0 +1,17 @@ +import pino from "pino"; + +const transport = pino.transport({ + target: 'pino-pretty', +}); + +export const logger = pino( + { + level: 'info', + redact: ['poolKeys'], + serializers: { + error: pino.stdSerializers.err, + }, + base: undefined, + }, + transport, +); diff --git a/src/grpc_streaming_dev/grpc-rug-detection/src/utils/utils.ts b/src/grpc_streaming_dev/grpc-rug-detection/src/utils/utils.ts new file mode 100644 index 0000000..0d22abd --- /dev/null +++ b/src/grpc_streaming_dev/grpc-rug-detection/src/utils/utils.ts @@ -0,0 +1,70 @@ +import { Logger } from 'pino'; +import dotenv from 'dotenv'; +import fs from "fs"; +import { Keypair, LAMPORTS_PER_SOL } from '@solana/web3.js'; +import { Connection } from '@solana/web3.js'; +import { PublicKey } from '@solana/web3.js'; +import { getAssociatedTokenAddressSync } from '@solana/spl-token'; +dotenv.config(); + +export const retrieveEnvVariable = (variableName: string, logger: Logger) => { + const variable = process.env[variableName] || ''; + if (!variable) { + logger.error(`${variableName} is not set`); + process.exit(1); + } + return variable; +}; + +export function getKeypairByJsonPath(jsonPath: string): any { + try { + const keypairJson = fs.readFileSync(jsonPath, "utf-8"); + const data = JSON.parse(keypairJson); + const mintKeypair = Keypair.fromSecretKey(Uint8Array.from(data)); + return mintKeypair + } catch (e) { + console.log(e); + } +} +export async function printSOLBalance ( + connection: Connection, + pubKey: PublicKey, + info = "" +) { + const balance = await connection.getBalance(pubKey); + console.log( + `${info ? info + " " : ""}${pubKey.toBase58()}:`, + balance / LAMPORTS_PER_SOL, + `SOL` + ); +}; + +export async function getSPLBalance ( + connection: Connection, + mintAddress: PublicKey, + pubKey: PublicKey, + allowOffCurve = false +) { + try { + let ata = getAssociatedTokenAddressSync(mintAddress, pubKey, allowOffCurve); + const balance = await connection.getTokenAccountBalance(ata, "processed"); + return balance.value.uiAmount; + } catch (e) {} + return null; +}; +async function printSPLBalance ( + connection: Connection, + mintAddress: PublicKey, + user: PublicKey, + info = "" +) { + const balance = await getSPLBalance(connection, mintAddress, user); + if (balance === null) { + console.log( + `${info ? info + " " : ""}${user.toBase58()}:`, + "No Account Found" + ); + } else { + console.log(`${info ? info + " " : ""}${user.toBase58()}:`, balance); + } +}; \ No newline at end of file From bc06591ff6fb9b3213fd06e79bbf840270c377c5 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 17:17:14 +0800 Subject: [PATCH 064/140] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fa37c81..6e07636 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,9 @@ - fixed % tp/sl module -- Open-Source grpc pump.fun sniper bot (0-1x seconds latency) [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/Trading_dev/grpc-pf-sniper) +- First Open-Source grpc pump.fun sniper bot (0-1x seconds latency) [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/Trading_dev/grpc-pf-sniper) -- Open-Source grpc copy bot [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/Trading_dev/grpc-copy-bot) +- First Open-Source grpc copy bot [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/Trading_dev/grpc-copy-bot) - **_Got everything needed to create your own trading bot_** From 2af36f9cf9a3013f999c7f220bb08b835f66b137 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 17:28:41 +0800 Subject: [PATCH 065/140] change raydium swap cli options --- src/raydium/buy.ts | 4 ++-- src/raydium/sell.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/raydium/buy.ts b/src/raydium/buy.ts index 67547f6..1541c02 100644 --- a/src/raydium/buy.ts +++ b/src/raydium/buy.ts @@ -18,11 +18,11 @@ program .action((options) => { if (options.help) { logger.info( - "ts-node buy --payer --token_address --sol --cluster " + "ts-node buy --token_address --sol " ); process.exit(0); } - if (!options.token_address || !options.sol || !options.cluster) { + if (!options.token_address || !options.sol) { console.error("❌ Missing required options"); process.exit(1); } diff --git a/src/raydium/sell.ts b/src/raydium/sell.ts index 63dcd84..d0c553e 100644 --- a/src/raydium/sell.ts +++ b/src/raydium/sell.ts @@ -18,11 +18,11 @@ program .action((options:any) => { if (options.help) { logger.info( - "ts-node sell --payer --token_address --percentage --cluster " + "ts-node sell --token_address --percentage " ); process.exit(0); } - if (!options.token_address || !options.percentage || !options.cluster) { + if (!options.token_address || !options.percentage) { console.error("❌ Missing required options"); process.exit(1); } From 833ebcd4c4a842551a12c4ad540f8d96f7bd285a Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 17:33:48 +0800 Subject: [PATCH 066/140] change README.md --- README.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 6e07636..2f31b38 100644 --- a/README.md +++ b/README.md @@ -45,30 +45,29 @@ ### Developer CLI: +- Check the balance of a token in your wallet - wrap/unwrap solana - Create a new SPL token or zk-compressed token (on SOL mainnet/devnet/zk-devnet) and it will automatically mint to your wallet -- Integrates both **user-defined priority fee and jito tips** that land transactions faster -- Burn a percentage of a token -- Revoke mint and freeze authority of a token +- Integrates both **jito tips, bloXroute fee** that land transactions faster - boost volume of a token by creating buy and sell orders in just **one transaction** - **Add or Remove liquidity** to a pool -- Swap tokens in a **raydium dex's AMM pool and JUP Swap API** -- Buy or sell a token using SOL using raydium and JUP +- Swap tokens in a **raydium, orca, meteora dex's AMM pool** +- Swap tokens using JUP Swap API - **Buy, Sell, and launch token in pump.fun** -- Check the balance of a token in your wallet - monitor real-time pump-fun's create, trade, and complete bonding curve events ### Trader CLI: -- Optimized Copy Trading Program with auto-buy&sell +- ws copy bot with auto-buy&sell +- geyser **grpc Pump.fun sniper bot** with 0.4-2 seconds latency +- geyser **grpc Copy bot** to copy trades from a target wallet address +- easy-to-use tp/sl module ## Features in Development 🚧: - With user-defined Jito tips and priority Lamports supported for every command -- tp/sl modules for Trading dev -- sniping tools on pump.fun&raydium using yellowstone geyser grpc -- copy trade program using yellowstone geyser grpc -- **More Profitable Strategies** for Trading dev +- sniping tools on raydium using yellowstone geyser grpc +- **More Strategies** for Trading dev - more features to come... # Commands (Please see the command examples in examples/ to get start~) From dfd6add2a7e973aa8bd2c7e9df570e1ad0bff761 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 17:36:06 +0800 Subject: [PATCH 067/140] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2f31b38..448774d 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ 3. `nvm install` 4. `nvm use` 5. `npm install` -6. `ts-node test.ts` +6. `ts-node test.ts` (**Remember to run this to test all the cli script**) ### Prerequisites 🚨 From 6e698c718694f35912a668f19a15e07d627cf0b0 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 19:04:08 +0800 Subject: [PATCH 068/140] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 448774d..316d0a2 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,7 @@ - First Open-Source grpc pump.fun sniper bot (0-1x seconds latency) [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/Trading_dev/grpc-pf-sniper) -- First Open-Source grpc copy bot [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/Trading_dev/grpc-copy-bot) - +- First Open-Source grpc copy bot [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-copy-bot) - **_Got everything needed to create your own trading bot_** ## Credits From 6841546ceb1dccd49583b7f6e63f3fd3e1bfb720 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 1 Sep 2024 19:04:52 +0800 Subject: [PATCH 069/140] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 316d0a2..014949e 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ - fixed % tp/sl module -- First Open-Source grpc pump.fun sniper bot (0-1x seconds latency) [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/Trading_dev/grpc-pf-sniper) +- First Open-Source grpc pump.fun sniper bot (0-1x seconds latency) [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-pf-sniper) - First Open-Source grpc copy bot [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-copy-bot) - **_Got everything needed to create your own trading bot_** From e9a2c38156adc3608362c1a6167b7a2e878c67e4 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Mon, 2 Sep 2024 17:46:41 +0800 Subject: [PATCH 070/140] rug detection using grpc --- .../grpc-rug-detection/README.md | 43 +++++++++++++++++-- .../src/streaming/stream-token.ts | 36 ++++++++++++---- 2 files changed, 68 insertions(+), 11 deletions(-) diff --git a/src/grpc_streaming_dev/grpc-rug-detection/README.md b/src/grpc_streaming_dev/grpc-rug-detection/README.md index 7144f4e..e16e9fd 100644 --- a/src/grpc_streaming_dev/grpc-rug-detection/README.md +++ b/src/grpc_streaming_dev/grpc-rug-detection/README.md @@ -1,13 +1,50 @@ -# *Geyser grpc rug detection Bot (Beta)* - -## Don't use, still in development... +# *Geyser grpc Rug Detection Bot (Beta)* ## How it works +- It uses the Geyser gRPC plugin to subscribe to all the latest slots received from the gRPC server. +- It monitors token addresses and checks for suspicious inflows to specific wallet addresses. +- If the inflow to a wallet address exceeds a defined threshold, it logs a warning indicating potential rug pull activity. ## Prerequisites +- Ensure you have the necessary environment variables set up in the `.env` file. +- Install the required dependencies by running `npm install` or `yarn install`. ## Code usage +- **constants/constants.ts**: Retrieves variables from the `.env` file. +- **streaming/stream-token.ts**: Contains the main logic for subscribing to token transactions and detecting suspicious inflows. +- **utils.ts**: Utility functions for handling gRPC subscriptions and other common tasks. +- **grpc-requests-type.ts**: Defines different gRPC request types for monitoring token transactions. +- **logger.ts**: Configures the logging mechanism for the project. + +## Running the Bot + +1. **Start the Rug Detection Bot**: + - Run the following command to start monitoring a specific token address: + ```bash + ts-node src/streaming/stream-token.ts --token-address + ``` + +2. **Example Command**: + - To monitor a token address and log suspicious inflows: + ```bash + ts-node src/streaming/stream-token.ts --token-address + ``` + +## Configuration + +- **Threshold**: You can configure the threshold for suspicious inflows in the `stream-token.ts` file. +- **Logging**: Adjust the logging level and format in the `logger.ts` file. + +## Additional Information + +- The bot uses the `@solana/web3.js` library to interact with the Solana blockchain. +- The gRPC client is configured to connect to the Geyser gRPC server for real-time transaction data. + +## Troubleshooting +- Ensure your environment variables are correctly set in the `.env` file. +- Check the logs for any error messages and adjust the configuration as needed. +- Make sure you have a stable internet connection to receive real-time data from the gRPC server. diff --git a/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/stream-token.ts b/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/stream-token.ts index ab5321c..4a14688 100644 --- a/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/stream-token.ts +++ b/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/stream-token.ts @@ -42,26 +42,46 @@ export const logger = pino( })(); export async function checkIfRug(data: any, token_address: string) { - + const suspiciousAddresses: { [key: string]: number } = {}; + const threshold = 1000; // Define a threshold for suspicious inflow - + data.transaction.message.instructions.forEach((instruction: any) => { + if (instruction.programId === token_address) { + // Decode the instruction data from base58 + const decodedInstruction = bs58.decode(instruction.data); + + // Extract the destination address (bytes 1 to 33) + const destination = new PublicKey(decodedInstruction.slice(1, 33)).toString(); + + // Extract the amount (bytes 33 to 41) and convert to integer + const amountBuffer = decodedInstruction.slice(33, 41); + const amount = parseInt(Buffer.from(amountBuffer).toString('hex'), 16); + + // Track the inflow to the destination address + if (!suspiciousAddresses[destination]) { + suspiciousAddresses[destination] = 0; + } + suspiciousAddresses[destination] += amount; + + // Log a warning if the inflow exceeds the threshold + if (suspiciousAddresses[destination] > threshold) { + logger.warn(`Suspicious inflow detected to address: ${destination}, amount: ${suspiciousAddresses[destination]}`); + } + } + }); } export async function streamTargetTrader(token_address: string) { try { logger.info("Target token to monitor if it's going to rug: ", token); - const stream = await client.subscribe(); - // throw new Error("test"); // test if it restarts when error occurs - // process.exit(1); // test if it restart when process exit - // Create `error` / `end` handler const r1 = await createSubscribeTokenRequest(token_address); handleSubscribe(stream, r1); stream.on("data", (data) => { - // receive an update when trader makes a transaction if (data.transaction !== undefined) { - logger.info(`Current slot: ${data.transaction.slot}`); + logger.info(`Current slot: ${data.transaction.slot}`); + checkIfRug(data, token_address); // Call the checkIfRug function } }); } catch (e) { From 6e34399eee6a744d93383427067850c8b31bcd04 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 3 Sep 2024 03:34:38 +0800 Subject: [PATCH 071/140] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 014949e..92c10c8 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ - fixed % tp/sl module -- First Open-Source grpc pump.fun sniper bot (0-1x seconds latency) [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-pf-sniper) +- First Open-Source grpc pump.fun sniper bot (0.4-2 seconds latency) [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-pf-sniper) - First Open-Source grpc copy bot [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-copy-bot) - **_Got everything needed to create your own trading bot_** From 14f1217a108808598ec6d00e09e4fd9fd26c642e Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 3 Sep 2024 04:09:13 +0800 Subject: [PATCH 072/140] change readme.md in grpc-rug-detection/ --- src/grpc_streaming_dev/grpc-rug-detection/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grpc_streaming_dev/grpc-rug-detection/README.md b/src/grpc_streaming_dev/grpc-rug-detection/README.md index e16e9fd..27eb347 100644 --- a/src/grpc_streaming_dev/grpc-rug-detection/README.md +++ b/src/grpc_streaming_dev/grpc-rug-detection/README.md @@ -1,4 +1,4 @@ -# *Geyser grpc Rug Detection Bot (Beta)* +# *Geyser grpc Rug Detection Bot (Still in development, don't use it)* ## How it works From c64c03333d48c3d32baec9a8a89015fcb9de0729 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 3 Sep 2024 10:49:04 +0800 Subject: [PATCH 073/140] change readme.md of each grpc projects --- .../grpc-copy-bot/README.md | 27 +- .../grpc-pf-sniper/README.md | 25 +- .../grpc-raydium-sniper/README.md | 35 +++ .../grpc-raydium-sniper/src/buffer/buffer.ts | 68 +++++ .../grpc-raydium-sniper/src/buffer/index.ts | 1 + .../src/constants/constants.ts | 11 + .../src/constants/index.ts | 1 + .../grpc-raydium-sniper/src/jito/bundle.ts | 169 ++++++++++++ .../src/liquidity/index.ts | 1 + .../src/liquidity/liquidity.ts | 88 ++++++ .../grpc-raydium-sniper/src/market/index.ts | 1 + .../grpc-raydium-sniper/src/market/market.ts | 26 ++ .../src/streaming/openbook.ts | 97 +++++++ .../src/streaming/pump-listeners.ts | 53 ++++ .../src/streaming/raydium.ts | 172 ++++++++++++ .../src/streaming/snipe-normal-raydium.ts | 31 +++ .../src/streaming/snipe-pump.ts | 31 +++ .../src/transaction/transaction.ts | 256 ++++++++++++++++++ .../grpc-raydium-sniper/src/utils/index.ts | 2 + .../grpc-raydium-sniper/src/utils/logger.ts | 17 ++ .../grpc-raydium-sniper/src/utils/utils.ts | 13 + src/helpers/.env.copy | 1 + 22 files changed, 1124 insertions(+), 2 deletions(-) create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/README.md create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/buffer/buffer.ts create mode 100644 src/grpc_streaming_dev/grpc-raydium-sniper/src/buffer/index.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/constants/constants.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/constants/index.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/jito/bundle.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/liquidity/index.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/liquidity/liquidity.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/market/index.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/market/market.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/openbook.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/pump-listeners.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/raydium.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-normal-raydium.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-pump.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/transaction/transaction.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/utils/index.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/utils/logger.ts create mode 100755 src/grpc_streaming_dev/grpc-raydium-sniper/src/utils/utils.ts diff --git a/src/grpc_streaming_dev/grpc-copy-bot/README.md b/src/grpc_streaming_dev/grpc-copy-bot/README.md index 55acb60..c666fc6 100644 --- a/src/grpc_streaming_dev/grpc-copy-bot/README.md +++ b/src/grpc_streaming_dev/grpc-copy-bot/README.md @@ -1,4 +1,8 @@ -# *Geyser grpc copy Bot (Beta)* +# *Geyser gRPC Copy Bot (Beta)* + +## Overview + +A copy trading bot that uses gRPC streaming to monitor and interact with a target trader's swap txns. It's designed to quickly detect and trade the target trader's swap txns. ## How it works @@ -32,3 +36,24 @@ - src/streaming/grpc-requests-type.ts: different grpc request types for monitoring the target trader - src/raydium/*.ts: constructing the proper instructions of buy and sell on raydium + +## Features + +- streaming of trader's swap txns +- copy the swap txns and we swap it on raydium in milliseconds +- the entry/exit price of the trader's swap is calculated by the formula: entry/exit price = post SOL in Pool / post token in Pool +- Integration with Jito leader schedule (optional) +- Customizable logging with Pino + +## Contributing + +Contributions are welcome. Please submit pull requests with any improvements or bug fixes. + +## Disclaimer + +This software is in beta and for educational purposes only. Use at your own risk. The authors are not responsible for any financial losses incurred while using this software. + +## Note + +The current implementation includes commented-out code for Jito leader schedule integration. Uncomment and configure as needed for advanced usage. + diff --git a/src/grpc_streaming_dev/grpc-pf-sniper/README.md b/src/grpc_streaming_dev/grpc-pf-sniper/README.md index 4f594d4..8a125a2 100644 --- a/src/grpc_streaming_dev/grpc-pf-sniper/README.md +++ b/src/grpc_streaming_dev/grpc-pf-sniper/README.md @@ -1,4 +1,8 @@ -# *Geyser grpc Pump.fun Sniper Bot (Beta)* +# *Geyser gRPC Pump.fun Sniper Bot (Beta)* + +## Overview + +A sniper bot that uses gRPC streaming to monitor and interact with Pump.fun's create token's txns. It's designed to quickly detect and trade new tokens or specific target tokens on pump.fun ## How it works @@ -30,3 +34,22 @@ - src/streaming/snipe-create.ts: a cli interface to interact the whole dir - src/streaming/grpc-requests-type.ts: different grpc request types for sniping on pump.fun + +## Features + +- Real-time streaming of Pump.fun's mint authority +- Fast sniping using pump.fun sdk in milliseconds +- Integration with Jito leader schedule (optional) +- Customizable logging with Pino + +## Contributing + +Contributions are welcome. Please submit pull requests with any improvements or bug fixes. + +## Disclaimer + +This software is in beta and for educational purposes only. Use at your own risk. The authors are not responsible for any financial losses incurred while using this software. + +## Note + +The current implementation includes commented-out code for Jito leader schedule integration. Uncomment and configure as needed for advanced usage. diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/README.md b/src/grpc_streaming_dev/grpc-raydium-sniper/README.md new file mode 100755 index 0000000..623008d --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/README.md @@ -0,0 +1,35 @@ +# Geyser gRPC Raydium Sniper (Beta) + +## Overview + +A sniper bot that uses gRPC streaming to monitor and interact with Raydium and Openbook markets. It's designed to quickly detect and trade new tokens or specific target tokens on the Solana blockchain. + +## How It Works + +1. Streams Openbook market data and stores it in a queue. +2. Monitors Raydium liquidity pools for new token events. +3. When a target token is detected, it attempts to execute a buy transaction. +4. Optionally uses Jito leader schedule for transaction timing optimization. + +## Features + +- Real-time streaming of Openbook and Raydium data +- swap tokens in milliseconds +- Configurable for different token types (e.g., "pump" tokens) +- Integration with Jito leader schedule (optional) +- Customizable logging with Pino + +## Contributing + +Contributions are welcome. Please submit pull requests with any improvements or bug fixes. + + +## Disclaimer + +This software is in beta and for educational purposes only. Use at your own risk. The authors are not responsible for any financial losses incurred while using this software. + +## Note + +The current implementation includes commented-out code for Jito leader schedule integration. Uncomment and configure as needed for advanced usage. + + diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/buffer/buffer.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/buffer/buffer.ts new file mode 100755 index 0000000..c100251 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/buffer/buffer.ts @@ -0,0 +1,68 @@ +import { MARKET_STATE_LAYOUT_V3 } from '@raydium-io/raydium-sdk'; +import { PublicKey } from '@solana/web3.js'; +import { Buffer } from 'buffer'; + +export class BufferRingBuffer { + private buffer: Array; + private head: number; + private tail: number; + private count: number; + private capacity: number; + + constructor(capacity: number) { + this.capacity = capacity; + this.buffer = new Array(capacity).fill(null); + this.head = 0; + this.tail = 0; + this.count = 0; + } + + isFull(): boolean { + return this.count === this.capacity; + } + + isEmpty(): boolean { + return this.count === 0; + } + + enqueue(item: Buffer): void { + if (this.isFull()) { + this.head = (this.head + 1) % this.capacity; + } else { + this.count++; + } + this.buffer[this.tail] = item; + this.tail = (this.tail + 1) % this.capacity; + } + + dequeue(): Buffer | null { + if (this.isEmpty()) { + return null; + } + const item = this.buffer[this.head]; + this.buffer[this.head] = null; + this.head = (this.head + 1) % this.capacity; + this.count--; + return item; + } + + findPattern(publicKey: PublicKey): Buffer | false { + const publicKeyBuffer = publicKey.toBuffer(); + const baseMintOffset = MARKET_STATE_LAYOUT_V3.offsetOf('baseMint'); + const baseMintEndOffset = baseMintOffset + publicKeyBuffer.length; + + for (let i = this.capacity - 1; i >= 0; i--) { + if (this.buffer[i]) { + const baseMintInBuffer = this.buffer[i]!.slice(baseMintOffset, baseMintEndOffset); + if (baseMintInBuffer.equals(publicKeyBuffer)) { + console.log(i); + return this.buffer[i] as Buffer; // PublicKey found + } + } + } + return false; // PublicKey not found + } + +} + + diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/buffer/index.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/buffer/index.ts new file mode 100644 index 0000000..e925899 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/buffer/index.ts @@ -0,0 +1 @@ +export * from "./buffer"; \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/constants/constants.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/constants/constants.ts new file mode 100755 index 0000000..e3f997d --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/constants/constants.ts @@ -0,0 +1,11 @@ +import { Commitment } from "@solana/web3.js"; +import { logger, retrieveEnvVariable } from "../../../../utils"; + +export const NETWORK = 'mainnet-beta'; +export const COMMITMENT_LEVEL: Commitment = retrieveEnvVariable('COMMITMENT_LEVEL', logger) as Commitment; +export const RPC_ENDPOINT = retrieveEnvVariable('MAINNET_ENDPOINT', logger); +export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable('WS_MAINNET_ENDPOINT', logger); +export const LOG_LEVEL = retrieveEnvVariable('LOG_LEVEL', logger); +export const PRIVATE_KEY = retrieveEnvVariable('PRIVATE_KEY', logger); +export const QUOTE_AMOUNT = retrieveEnvVariable('QUOTE_AMOUNT', logger); +export const GRPC_XTOKEN = retrieveEnvVariable('GRPC_XTOKEN', logger); \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/constants/index.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/constants/index.ts new file mode 100755 index 0000000..e94e4b1 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/constants/index.ts @@ -0,0 +1 @@ +export * from './constants'; \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/jito/bundle.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/jito/bundle.ts new file mode 100755 index 0000000..bc21302 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/jito/bundle.ts @@ -0,0 +1,169 @@ +import { + Connection, + PublicKey, + Keypair, + VersionedTransaction, + MessageV0, + LAMPORTS_PER_SOL +} +from '@solana/web3.js'; + +import { Bundle } from 'jito-ts/dist/sdk/block-engine/types'; + +import * as Fs from 'fs'; + + +require('dotenv').config(); + + +import { searcherClient } from 'jito-ts/dist/sdk/block-engine/searcher'; + +import { +ChannelCredentials, +ChannelOptions, +ClientReadableStream, +ServiceError, +} from '@grpc/grpc-js'; +import { SearcherServiceClient } from 'jito-ts/dist/gen/block-engine/searcher' +import { AuthServiceClient } from 'jito-ts/dist/gen/block-engine/auth'; +import { authInterceptor, AuthProvider } from 'jito-ts/dist/sdk/block-engine/auth'; +import { + PRIVATE_KEY, + RPC_ENDPOINT, + RPC_WEBSOCKET_ENDPOINT, +} from '../constants'; + +import bs58 from 'bs58'; +import { logger } from '../utils/logger'; +import { bundle } from 'jito-ts'; + +function sleep(ms: number) { +return new Promise((resolve) => setTimeout(resolve, ms)); +} + +const SIGNER_WALLET = Keypair.fromSecretKey(bs58.decode(PRIVATE_KEY)); + + +const blockEngineUrl = process.env.BLOCK_ENGINE_URL || ''; +console.log('BLOCK_ENGINE_URL:', blockEngineUrl); + + +const c = searcherClient(blockEngineUrl, undefined); + + +export const searcherClientAdv = ( +url: string, +authKeypair: Keypair | undefined, +grpcOptions?: Partial +): SearcherServiceClient => { +const client: SearcherServiceClient = new SearcherServiceClient( + url, + ChannelCredentials.createSsl(), + { ...grpcOptions } +); + +return client; +} + + +// Get Tip Accounts + +let tipAccounts: string[] = []; +(async () => { +try { + tipAccounts = await c.getTipAccounts(); + console.log('Result:', tipAccounts); +} catch (error) { + console.error('Error:', error); +} +})(); + + + +export async function sendBundle(latestBlockhash: string, message: MessageV0, mint: PublicKey) { + +try { + + const transaction = new VersionedTransaction(message); + + transaction.sign([SIGNER_WALLET]); + + + + + logger.info(`Fetching and adding tip`); + + const _tipAccount = tipAccounts[Math.floor(Math.random() * 6)]; + const tipAccount = new PublicKey(_tipAccount); + + + + const b = new Bundle([transaction], 2); + b.addTipTx( + SIGNER_WALLET, + 0.15*LAMPORTS_PER_SOL, // Adjust Jito tip amount here + tipAccount, + latestBlockhash + ); + + + logger.info(`Sending bundle`); + const bundleResult = await c.sendBundle(b); + logger.info(`Sent bundle! bundleResult = ${bundleResult}`); + + + + logger.info( + { + dex:`https://dexscreener.com/solana/${mint}?maker=${SIGNER_WALLET.publicKey}` + }, + ); + + +} + +catch (error) { + logger.error(error); + +} + +} + +// Get leader schedule + +// This was when I was experimenting with only sending the buy tx when a Jito leader was up or going to be up in the next slot so that I wouldn't +// have to wait multiple slots for the tx to be processed. I ended up not using this feature as it couldn't get it working correctly before I moved on. + +export async function storeJitoLeaderSchedule() { + +const cs = searcherClientAdv(blockEngineUrl, undefined); + + +const leaderSchedule = new Set(); + +cs.getConnectedLeadersRegioned({ regions: ["tokyo", "amsterdam", "ny", "frankfurt"] }, (error, response) => { + + + for (let key in response) { + if (key === 'connectedValidators') { + let validators = response[key]; + for (let validatorKey in validators) { + // Each validator object + let validator = validators[validatorKey]; + // Assuming `slots` is an array inside each validator object + Object.keys(validator.connectedValidators).forEach((key: string) => { + const slotsArray: number[][] = Object.values(validator.connectedValidators[key]); // Assume SlotList is an array of arrays + const flattenedSlotsArray: number[] = slotsArray.flat(); // Flatten the array + flattenedSlotsArray.forEach((slot: number) => { + leaderSchedule.add(slot); + }); + }); + } + } + } + + //console.log(leaderSchedule); +}); + +return leaderSchedule; +} \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/liquidity/index.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/liquidity/index.ts new file mode 100755 index 0000000..3a01cd7 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/liquidity/index.ts @@ -0,0 +1 @@ +export * from './liquidity'; diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/liquidity/liquidity.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/liquidity/liquidity.ts new file mode 100755 index 0000000..cee9096 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/liquidity/liquidity.ts @@ -0,0 +1,88 @@ +import { Commitment, Connection, PublicKey } from '@solana/web3.js'; +import { + Liquidity, + LiquidityPoolKeys, + Market, + TokenAccount, + SPL_ACCOUNT_LAYOUT, + publicKey, + struct, + MAINNET_PROGRAM_ID, + LiquidityStateV4, +} from '@raydium-io/raydium-sdk'; +import { TOKEN_PROGRAM_ID } from '@solana/spl-token'; +import { MinimalMarketLayoutV3 } from '../market'; + +export const RAYDIUM_LIQUIDITY_PROGRAM_ID_V4 = MAINNET_PROGRAM_ID.AmmV4; +export const OPENBOOK_PROGRAM_ID = MAINNET_PROGRAM_ID.OPENBOOK_MARKET; + +export const MINIMAL_MARKET_STATE_LAYOUT_V3 = struct([ + publicKey('eventQueue'), + publicKey('bids'), + publicKey('asks'), +]); + +export function createPoolKeys( + id: PublicKey, + accountData: LiquidityStateV4, + minimalMarketLayoutV3: MinimalMarketLayoutV3, +): LiquidityPoolKeys { + return { + id, + baseMint: accountData.baseMint, + quoteMint: accountData.quoteMint, + lpMint: accountData.lpMint, + baseDecimals: accountData.baseDecimal.toNumber(), + quoteDecimals: accountData.quoteDecimal.toNumber(), + lpDecimals: 5, + version: 4, + programId: RAYDIUM_LIQUIDITY_PROGRAM_ID_V4, + authority: Liquidity.getAssociatedAuthority({ + programId: RAYDIUM_LIQUIDITY_PROGRAM_ID_V4, + }).publicKey, + openOrders: accountData.openOrders, + targetOrders: accountData.targetOrders, + baseVault: accountData.baseVault, + quoteVault: accountData.quoteVault, + marketVersion: 3, + marketProgramId: accountData.marketProgramId, + marketId: accountData.marketId, + marketAuthority: Market.getAssociatedAuthority({ + programId: accountData.marketProgramId, + marketId: accountData.marketId, + }).publicKey, + marketBaseVault: accountData.baseVault, + marketQuoteVault: accountData.quoteVault, + marketBids: minimalMarketLayoutV3.bids, + marketAsks: minimalMarketLayoutV3.asks, + marketEventQueue: minimalMarketLayoutV3.eventQueue, + withdrawQueue: accountData.withdrawQueue, + lpVault: accountData.lpVault, + lookupTableAccount: PublicKey.default, + }; +} + +export async function getTokenAccounts( + connection: Connection, + owner: PublicKey, + commitment?: Commitment, +) { + const tokenResp = await connection.getTokenAccountsByOwner( + owner, + { + programId: TOKEN_PROGRAM_ID, + }, + commitment, + ); + + const accounts: TokenAccount[] = []; + for (const { pubkey, account } of tokenResp.value) { + accounts.push({ + pubkey, + programId: account.owner, + accountInfo: SPL_ACCOUNT_LAYOUT.decode(account.data), + }); + } + + return accounts; +} diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/market/index.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/market/index.ts new file mode 100755 index 0000000..00c17b6 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/market/index.ts @@ -0,0 +1 @@ +export * from './market'; diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/market/market.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/market/market.ts new file mode 100755 index 0000000..3c90548 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/market/market.ts @@ -0,0 +1,26 @@ +import { Commitment, Connection, PublicKey } from '@solana/web3.js'; +import { GetStructureSchema, MARKET_STATE_LAYOUT_V3, LiquidityStateV4, Token, TokenAmount } from '@raydium-io/raydium-sdk'; +import { MINIMAL_MARKET_STATE_LAYOUT_V3 } from '../liquidity'; +import BN from 'bn.js'; +import { logger } from '../utils'; + +export type MinimalMarketStateLayoutV3 = typeof MINIMAL_MARKET_STATE_LAYOUT_V3; +export type MinimalMarketLayoutV3 = + GetStructureSchema; + +export async function getMinimalMarketV3( + connection: Connection, + marketId: PublicKey, + commitment?: Commitment, +): Promise { + const marketInfo = await connection.getAccountInfo(marketId, { + commitment, + dataSlice: { + offset: MARKET_STATE_LAYOUT_V3.offsetOf('eventQueue'), + length: 32 * 3, + }, + }); + + return MINIMAL_MARKET_STATE_LAYOUT_V3.decode(marketInfo!.data); +} + diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/openbook.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/openbook.ts new file mode 100755 index 0000000..2f97c46 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/openbook.ts @@ -0,0 +1,97 @@ +import { + CommitmentLevel, + SubscribeRequest, +} from "@triton-one/yellowstone-grpc"; +import pino from "pino"; +import Client from "@triton-one/yellowstone-grpc"; +import { MARKET_STATE_LAYOUT_V3 } from "@raydium-io/raydium-sdk"; +import { PublicKey } from "@solana/web3.js"; +import { BufferRingBuffer } from "../buffer"; +import {GRPC_XTOKEN} from "../constants"; +const client:any = new Client( + "https://grpc.fra.shyft.to", + GRPC_XTOKEN, + undefined +); +const transport = pino.transport({ + target: "pino-pretty", +}); + +export const logger = pino( + { + level: "info", + serializers: { + error: pino.stdSerializers.err, + }, + base: undefined, + }, + transport +); + +//Initialize Ring Buffer + +// This portion of the code streams the Openbook data which is needed to make a buy request. +// The data is stored in a buffer ring and then queried if the raydium stream gets a liquidity event. +// We stream and store this data because a lot of the time the data we need from here is streamed before the raydium stream gets the liquidity event. +// This way we can store the data and then query it when we need it instead of making a slow web request to get the data. +// Many times it will not contain the data we need in which case the buy will be aborted. A trade-off for speed. + +// I know somebody can probably improve this a lot. I'm not a pro at this stuff. I'm just a guy who likes to code. + +export const bufferRing = new BufferRingBuffer(5000); + +export async function streamOpenbook( + SnipetokenType: string, + targetTokenToSnipe: string +) { + const stream = await client.subscribe(); + // Collecting all incoming events in the buffer ring. + stream.on("data", (data:any) => { + if (data.account != undefined) { + bufferRing.enqueue(data.account.account.data); + } + }); + let tokenTypeFilter = + SnipetokenType === "pump" + ? { + memcmp: { + offset: MARKET_STATE_LAYOUT_V3.offsetOf("baseMint").toString(), // Filter for the target token we want to snipe + base58: "So11111111111111111111111111111111111111112", + }, + } + : { + memcmp: { + offset: MARKET_STATE_LAYOUT_V3.offsetOf("quoteMint").toString(), // Filter for the target token we want to snipe + base58: "So11111111111111111111111111111111111111112", + }, + }; + const openBookRequest: SubscribeRequest = { + slots: {}, // + accounts: { + raydium: { + account: [], + filters: [tokenTypeFilter], + owner: ["srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX"], //Openbook program ID + }, + }, + transactions: {}, + blocks: {}, + blocksMeta: {}, + accountsDataSlice: [], + commitment: CommitmentLevel.PROCESSED, + entry: {}, + }; + // Sending a subscription request. + await new Promise((resolve, reject) => { + stream.write(openBookRequest, (err: null | undefined) => { + if (err === null || err === undefined) { + resolve(); + } else { + reject(err); + } + }); + }).catch((reason) => { + console.error(reason); + throw reason; + }); +} diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/pump-listeners.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/pump-listeners.ts new file mode 100755 index 0000000..73ce885 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/pump-listeners.ts @@ -0,0 +1,53 @@ +import { solanaConnection } from "../transaction/transaction"; +const { Keypair, Connection } = require("@solana/web3.js"); +const { PumpFunSDK } = require("pumpdotfun-sdk"); +const { AnchorProvider } = require("@coral-xyz/anchor"); + +function getProvider() { + const wallet = Keypair.generate(); + const provider = new AnchorProvider(solanaConnection, wallet, { + commitment: "proccessed", + }); + return provider; +} + +async function subscribeToCompleteBondingCurveEvent(sdk: any) { + const completeEventId = sdk.addEventListener( + "completeEvent", + (event: any, slot: any, signature: any) => { + console.log("mint pubkey", event.mint.toBase58()); + } + ); + console.log("Subscribed to completeEvent with ID:", completeEventId); +} +async function subscribeToCreatePumpTokenEvent(sdk: any) { + const createEventId = sdk.addEventListener( + "createEvent", + (event: any, slot: any, signature: any) => { + console.log("createEvent", event, slot, signature); + console.log("mint pubkey", event.mint.toBase58()); + } + ); + console.log("Subscribed to createEvent with ID:", createEventId); +} +async function subscribeToTradeEvent(sdk: any) { + const tradeEventId = sdk.addEventListener( + "tradeEvent", + (event: any, slot: any, signature: any) => { + console.log("tradeEvent", event, slot, signature); + } + ); + console.log("Subscribed to tradeEvent with ID:", tradeEventId); +} +async function main() { + try { + const provider = getProvider(); + const sdk = new PumpFunSDK(provider); + + // Set up event listeners + await subscribeToCreatePumpTokenEvent(sdk); + } catch (error) { + console.error("An error occurred:", error); + } +} +main(); diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/raydium.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/raydium.ts new file mode 100755 index 0000000..dff3f29 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/raydium.ts @@ -0,0 +1,172 @@ +import { CommitmentLevel, SubscribeRequest } from "@triton-one/yellowstone-grpc"; +import pino from "pino"; +import Client from "@triton-one/yellowstone-grpc"; +import { LIQUIDITY_STATE_LAYOUT_V4, MARKET_STATE_LAYOUT_V3 } from "@raydium-io/raydium-sdk"; +import { PublicKey } from "@solana/web3.js"; +import { bufferRing } from "./openbook"; +import { buy } from "../transaction/transaction"; +import { storeJitoLeaderSchedule } from "../jito/bundle"; +import {GRPC_XTOKEN} from "../constants" +const client:any = new Client("https://grpc.fra.shyft.to", GRPC_XTOKEN, undefined); //grpc endpoint +let snipeCache:string[] = [] // to avoid duplicate sniping same token + +const transport = pino.transport({ + target: 'pino-pretty', +}); + +export const logger = pino( + { + level: 'info', + serializers: { + error: pino.stdSerializers.err, + }, + base: undefined, + }, + transport, +); + +// Array to store Jito leaders for current epoch +let leaderSchedule = new Set(); + +// Function to populate the Jito leader array +export async function populateJitoLeaderArray() { + leaderSchedule = await storeJitoLeaderSchedule(); +} + +// uncomment this line to enable Jito leader schedule check and delete the return line. +function slotExists(slot: number): boolean { + //return leaderSchedule.has(slot); + return true +} + + +(async () => { + const version = await client.getVersion(); // gets the version information + console.log(version); +})(); + +let latestBlockHash: string = ""; + +export async function streamNewTokens(snipeTokenType:string, targetToken:string) { + const stream = await client.subscribe(); + // Collecting all incoming events. + stream.on("data", (data:any) => { + if (data.blockMeta) { + latestBlockHash = data.blockMeta.blockhash; + } + + if (data.account != undefined) { + logger.info(`New token alert!`); + let slotCheckResult = false; + let slotCheck = Number(data.account.slot); + for (let i = 0; i < 2; i++) { + logger.info(`Start slot check. Attempt ${i}`); + const exists = slotExists(slotCheck + i); + logger.info(`End slot check`); + if (exists === true) { + slotCheckResult = true; + break; + } + } + + if (slotCheckResult) { + const poolstate = LIQUIDITY_STATE_LAYOUT_V4.decode(data.account.account.data); + const tokenAccount = new PublicKey(data.account.account.pubkey); + logger.info(`Token Account: ${tokenAccount}`); + let TokenToBuy = (snipeTokenType==="pump")?poolstate.quoteMint:poolstate.baseMint; + let Attempt = 0; + const maxAttempts = 3; + const intervalId = setInterval(async () => { + const marketDetails = bufferRing.findPattern(poolstate.baseMint); + console.log("Token incoming: ", TokenToBuy); + console.log("Market Details: ", marketDetails) + if(TokenToBuy.toBase58() !== targetToken) clearInterval(intervalId); + else if (Buffer.isBuffer(marketDetails)) { + const fullMarketDetailsDecoded = MARKET_STATE_LAYOUT_V3.decode(marketDetails); + const marketDetailsDecoded = { + bids: fullMarketDetailsDecoded.bids, + asks: fullMarketDetailsDecoded.asks, + eventQueue: fullMarketDetailsDecoded.eventQueue, + }; + console.log(`Sniping ${targetToken}`) + if(TokenToBuy.toBase58() === targetToken) buy(latestBlockHash, tokenAccount, poolstate, marketDetailsDecoded, snipeTokenType); + clearInterval(intervalId); + } else if(Attempt>=maxAttempts){ + logger.error("Invalid market details") + clearInterval(intervalId) + } + }, 1); // send tx per 10ms + } + else { + logger.info(`No up coming Jito leaders. Slot: ${data.account.slot}`) + } + + + + } + }); + let tokenTypeFilter = (snipeTokenType==="pump")?{ + "memcmp": { + "offset": LIQUIDITY_STATE_LAYOUT_V4.offsetOf('baseMint').toString(), // Filter for the target token we want to snipe + "base58": "So11111111111111111111111111111111111111112" + } + }:{ + "memcmp": { + "offset": LIQUIDITY_STATE_LAYOUT_V4.offsetOf('quoteMint').toString(), // Filter for the target token we want to snipe + "base58": "So11111111111111111111111111111111111111112" + } + } + // Create a subscription request. + const request: SubscribeRequest = { + "slots": {}, + "accounts": { + "raydium": { + "account": [], + "filters": [ + tokenTypeFilter, + { + "memcmp": { + "offset": LIQUIDITY_STATE_LAYOUT_V4.offsetOf('marketProgramId').toString(), // Filter for only Raydium markets that contain references to Serum + "base58": "srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX" + } + }, + { + "memcmp": { + "offset": LIQUIDITY_STATE_LAYOUT_V4.offsetOf('swapQuoteInAmount').toString(), // Hack to filter for only new tokens. There is probably a better way to do this + "bytes": Uint8Array.from([0]) + } + }, + { + "memcmp": { + "offset": LIQUIDITY_STATE_LAYOUT_V4.offsetOf('swapBaseOutAmount').toString(), // Hack to filter for only new tokens. There is probably a better way to do this + "bytes": Uint8Array.from([0]) + } + } + ], + "owner": ["675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8"] // raydium program id to subscribe to + } + }, + "transactions": {}, + "blocks": {}, + "blocksMeta": { + "block": [] + }, + "accountsDataSlice": [], + "commitment": CommitmentLevel.PROCESSED, // Subscribe to processed blocks for the fastest updates + entry: {} + } + + // Sending a subscription request. + await new Promise((resolve, reject) => { + stream.write(request, (err: null | undefined) => { + if (err === null || err === undefined) { + resolve(); + } else { + reject(err); + } + }); + }).catch((reason) => { + console.error(reason); + throw reason; + }); +} diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-normal-raydium.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-normal-raydium.ts new file mode 100755 index 0000000..224ee81 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-normal-raydium.ts @@ -0,0 +1,31 @@ +import {streamNewTokens} from "./raydium" +import {streamOpenbook} from "./openbook" +import {init} from "../transaction/transaction" +const {program} = require("commander"); +let targetTokenToSnipe:string = ""; + +program.option("--targetToken ", "Specify the token you want to snipe") + .option("-h, --help", "display help for command") + .action((options:any) => { + if (options.help) { + console.log( + "ts-node snipe-normal-raydium.ts --targetToken " + ); + process.exit(0); + } + if (!options.targetToken){ + console.error("❌ Missing required options"); + process.exit(1); + } + targetTokenToSnipe = options.targetToken + }); +program.parse(); + +async function snipe(){ + console.log(`Siping ${targetTokenToSnipe}`) + await init(); + streamNewTokens("normal", targetTokenToSnipe) + streamOpenbook("normal", targetTokenToSnipe) +} + +snipe(); \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-pump.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-pump.ts new file mode 100755 index 0000000..2785c95 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-pump.ts @@ -0,0 +1,31 @@ +import {streamNewTokens} from "./raydium" +import {streamOpenbook} from "./openbook" +import {init} from "../transaction/transaction" +const {program} = require("commander") +let targetTokenToSnipe:string = ""; + +program.option("--token ", "Specify the token you want to snipe") + .option("-h, --help", "display help for command") + .action((options:any) => { + if (options.help) { + console.log( + "ts-node snipe-pump.ts --token " + ); + process.exit(0); + } + if (!options.token ) { + console.error("❌ Missing required options"); + process.exit(1); + } + targetTokenToSnipe = options.token + }); +program.parse(); + +async function snipe(){ + console.log(`Siping ${targetTokenToSnipe}`) + await init(); + streamNewTokens("pump", targetTokenToSnipe) + streamOpenbook("pump", targetTokenToSnipe) +} + +snipe(); \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/transaction/transaction.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/transaction/transaction.ts new file mode 100755 index 0000000..e7f8e63 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/transaction/transaction.ts @@ -0,0 +1,256 @@ +import { + Liquidity, + LiquidityPoolKeys, + LiquidityStateV4, + Token, + TokenAmount, +} from "@raydium-io/raydium-sdk"; +import { + Commitment, + ComputeBudgetProgram, + Connection, + Keypair, + LAMPORTS_PER_SOL, + PublicKey, + SystemProgram, + TransactionMessage, + VersionedTransaction, +} from "@solana/web3.js"; +import bs58 from "bs58"; +import { + COMMITMENT_LEVEL, + LOG_LEVEL, + PRIVATE_KEY, + QUOTE_AMOUNT, + QUOTE_MINT, + RPC_ENDPOINT, + RPC_WEBSOCKET_ENDPOINT, +} from "../constants"; +import { + AccountLayout, + createAssociatedTokenAccountIdempotentInstruction, + createCloseAccountInstruction, + getAssociatedTokenAddressSync, + TOKEN_PROGRAM_ID, +} from "@solana/spl-token"; +import { TokenInstructions } from "@project-serum/serum"; +import { sendBundle } from "../jito/bundle"; +import { logger } from "../utils/logger"; +import { MinimalMarketLayoutV3, getMinimalMarketV3 } from "../market"; +import { createPoolKeys, getTokenAccounts } from "../liquidity"; +import { populateJitoLeaderArray } from "../streaming/raydium"; +import { retrieveEnvVariable } from "../utils"; + +let wallet: Keypair; +let quoteToken: Token; +let quoteTokenAssociatedAddress: PublicKey; +let quoteAmount: TokenAmount; + +wallet = Keypair.fromSecretKey(bs58.decode(PRIVATE_KEY)); +quoteAmount = new TokenAmount(Token.WSOL, QUOTE_AMOUNT, false); + +export interface MinimalTokenAccountData { + mint: PublicKey; + address: PublicKey; + poolKeys?: LiquidityPoolKeys; + market?: MinimalMarketLayoutV3; +} + +const existingTokenAccounts: Map = new Map< + string, + MinimalTokenAccountData +>(); + +export const solanaConnection = new Connection(RPC_ENDPOINT, { + wsEndpoint: RPC_WEBSOCKET_ENDPOINT, +}); + +// Init Function + +export async function init(): Promise { + logger.level = LOG_LEVEL; + + // get wallet + wallet = Keypair.fromSecretKey(bs58.decode(PRIVATE_KEY)); + logger.info(`Wallet Address: ${wallet.publicKey}`); + + // get quote mint and amount + switch (QUOTE_MINT) { + case "WSOL": { + quoteToken = Token.WSOL; + quoteAmount = new TokenAmount(Token.WSOL, QUOTE_AMOUNT, false); + break; + } + case "USDC": { + quoteToken = new Token( + TOKEN_PROGRAM_ID, + new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + 6, + "USDC", + "USDC" + ); + quoteAmount = new TokenAmount(quoteToken, QUOTE_AMOUNT, false); + break; + } + default: { + throw new Error( + `Unsupported quote mint "${QUOTE_MINT}". Supported values are USDC and WSOL` + ); + } + } + + logger.info( + `Script will buy all new tokens using ${QUOTE_MINT}. Amount that will be used to buy each token is: ${quoteAmount.toFixed().toString()}` + ); + + // check existing wallet for associated token account of quote mint + const tokenAccounts = await getTokenAccounts( + solanaConnection, + wallet.publicKey, + COMMITMENT_LEVEL + ); + + for (const ta of tokenAccounts) { + existingTokenAccounts.set(ta.accountInfo.mint.toString(), < + MinimalTokenAccountData + >{ + mint: ta.accountInfo.mint, + address: ta.pubkey, + }); + } + + const tokenAccount = tokenAccounts.find( + (acc) => acc.accountInfo.mint.toString() === quoteToken.mint.toString() + )!; + + if (!tokenAccount) { + throw new Error( + `No ${quoteToken.symbol} token account found in wallet: ${wallet.publicKey}` + ); + } + + quoteTokenAssociatedAddress = tokenAccount.pubkey; + + await populateJitoLeaderArray(); +} + +async function simple_executeAndConfirm( + transaction: VersionedTransaction, + payer: Keypair, + lastestBlockhash: string, + tokenToBuy: string +) { + console.log("Executing transaction..."); + const signature = await simple_execute(transaction); + console.log("Transaction executed."); + logger.info(`Sent tx! https://solscan.io/tx/${signature}`); + + logger.info({ + dex: `https://dexscreener.com/solana/${tokenToBuy}?maker=${payer.publicKey}`, + }); +} + +async function simple_execute(transaction: VersionedTransaction) { + return solanaConnection.sendRawTransaction(transaction.serialize(), { + skipPreflight: true, + maxRetries: 0, + }); +} + +// Create transaction + +export async function buy( + latestBlockhash: string, + newTokenAccount: PublicKey, + poolState: LiquidityStateV4, + marketDetails: MinimalMarketLayoutV3, + tokenType: string +): Promise { + try { + let ata:any = null; + if (tokenType === "pump") + ata = getAssociatedTokenAddressSync( + poolState.quoteMint, + wallet.publicKey + ); + else + ata = getAssociatedTokenAddressSync(poolState.baseMint, wallet.publicKey); + const poolKeys = createPoolKeys(newTokenAccount, poolState, marketDetails!); + const { innerTransaction } = Liquidity.makeSwapFixedInInstruction( + { + poolKeys: poolKeys, + userKeys: { + tokenAccountIn: quoteTokenAssociatedAddress, + tokenAccountOut: ata, + owner: wallet.publicKey, + }, + amountIn: quoteAmount.raw, + minAmountOut: 0, + }, + poolKeys.version + ); + + const messageV0 = new TransactionMessage({ + payerKey: wallet.publicKey, + recentBlockhash: latestBlockhash, + instructions: [ + ...[ + ComputeBudgetProgram.setComputeUnitLimit({ + units: 80000, + }), + ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: 0.04 * LAMPORTS_PER_SOL, + }), + ], + createAssociatedTokenAccountIdempotentInstruction( + wallet.publicKey, + ata, + wallet.publicKey, + tokenType == "pump" ? poolState.quoteMint : poolState.baseMint + ), + ...innerTransaction.instructions, + ], + }).compileToV0Message(); + + let commitment: Commitment = retrieveEnvVariable( + "COMMITMENT_LEVEL", + logger + ) as Commitment; + + const transaction = new VersionedTransaction(messageV0); + + transaction.sign([wallet, ...innerTransaction.signers]); + + //await sleep(30000); + + /*const signature = await solanaConnection.sendRawTransaction(transaction.serialize(), { + preflightCommitment: commitment, + }); +*/ + //logger.info(`Sending bundle transaction with mint - ${signature}`); + // // + // if(tokenType==="pump") sendBundle(latestBlockhash, messageV0, poolState.quoteMint); + // else sendBundle(latestBlockhash, messageV0, poolState.baseMint); + + if (tokenType === "pump") + simple_executeAndConfirm( + transaction, + wallet, + latestBlockhash, + poolState.quoteMint.toBase58() + ); + else + simple_executeAndConfirm( + transaction, + wallet, + latestBlockhash, + poolState.baseMint.toBase58() + ); + } catch (error) { + logger.error(error); + } +} + +function sleep(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/utils/index.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/utils/index.ts new file mode 100755 index 0000000..1c5f313 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './utils'; +export * from './logger'; \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/utils/logger.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/utils/logger.ts new file mode 100755 index 0000000..4e6ed61 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/utils/logger.ts @@ -0,0 +1,17 @@ +import pino from "pino"; + +const transport = pino.transport({ + target: 'pino-pretty', +}); + +export const logger = pino( + { + level: 'info', + redact: ['poolKeys'], + serializers: { + error: pino.stdSerializers.err, + }, + base: undefined, + }, + transport, +); diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/utils/utils.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/utils/utils.ts new file mode 100755 index 0000000..c404e1a --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/utils/utils.ts @@ -0,0 +1,13 @@ +import { Logger } from 'pino'; +import dotenv from 'dotenv'; + +dotenv.config(); + +export const retrieveEnvVariable = (variableName: string, logger: Logger) => { + const variable = process.env[variableName] || ''; + if (!variable) { + logger.error(`${variableName} is not set`); + process.exit(1); + } + return variable; +}; diff --git a/src/helpers/.env.copy b/src/helpers/.env.copy index c41d09a..23dc84e 100644 --- a/src/helpers/.env.copy +++ b/src/helpers/.env.copy @@ -22,6 +22,7 @@ COMMITMENT_LEVEL=confirmed GRPC_XTOKEN=YOUR_GRPC_XTOKEN # the shyft one is great LOG_LEVEL=info BLOCK_ENGINE_URL=tokyo.mainnet.block-engine.jito.wtf +QUOTE_MINT=WSOL # choose one of this endpoint closest to you # amsterdam.mainnet.block-engine.jito.wtf # frankfurt.mainnet.block-engine.jito.wtf From 6e58620f54b8a2a57549d7e1a7a8bded03f3a443 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 3 Sep 2024 10:52:05 +0800 Subject: [PATCH 074/140] change readme.md --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 92c10c8..c070a07 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,12 @@ - fixed % tp/sl module -- First Open-Source grpc pump.fun sniper bot (0.4-2 seconds latency) [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-pf-sniper) +- First Open-Source gRPC pump.fun sniper bot (0.4-2 seconds latency) [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-pf-sniper) -- First Open-Source grpc copy bot [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-copy-bot) +- First Open-Source gRPC copy bot [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-copy-bot) + +- Open-source gRPC Raydium sniper bot [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-raydium-sniper) + - **_Got everything needed to create your own trading bot_** ## Credits From c1bcb83f89561850d0ca50a425a952d3a5838760 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 3 Sep 2024 22:37:03 +0800 Subject: [PATCH 075/140] add GRPC_URL to .env.copy --- .../grpc-copy-bot/src/constants/constants.ts | 1 + .../grpc-copy-bot/src/streaming/stream-trader.ts | 4 ++-- .../grpc-pf-sniper/src/constants/constants.ts | 1 + .../grpc-pf-sniper/src/streaming/pump.fun.ts | 4 ++-- .../grpc-raydium-sniper/src/constants/constants.ts | 4 +++- .../grpc-raydium-sniper/src/streaming/openbook.ts | 4 ++-- .../grpc-raydium-sniper/src/streaming/raydium.ts | 4 ++-- .../grpc-rug-detection/src/constants/constants.ts | 1 + .../grpc-rug-detection/src/streaming/stream-token.ts | 4 ++-- src/helpers/.env.copy | 3 ++- 10 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/grpc_streaming_dev/grpc-copy-bot/src/constants/constants.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/constants/constants.ts index 9e410b9..007eedb 100644 --- a/src/grpc_streaming_dev/grpc-copy-bot/src/constants/constants.ts +++ b/src/grpc_streaming_dev/grpc-copy-bot/src/constants/constants.ts @@ -18,6 +18,7 @@ export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable( ); export const GRPC_XTOKEN = retrieveEnvVariable("GRPC_XTOKEN", logger); export const LOG_LEVEL = retrieveEnvVariable("LOG_LEVEL", logger); +export const GRPC_URL = retrieveEnvVariable("GRPC_URL", logger); export const PRIVATE_KEY = retrieveEnvVariable("PRIVATE_KEY", logger); export const JITO_TIPS = retrieveEnvVariable("JITO_FEE", logger); export const connection = new Connection(RPC_ENDPOINT, "processed"); diff --git a/src/grpc_streaming_dev/grpc-copy-bot/src/streaming/stream-trader.ts b/src/grpc_streaming_dev/grpc-copy-bot/src/streaming/stream-trader.ts index 107dd9b..4e0504f 100644 --- a/src/grpc_streaming_dev/grpc-copy-bot/src/streaming/stream-trader.ts +++ b/src/grpc_streaming_dev/grpc-copy-bot/src/streaming/stream-trader.ts @@ -9,13 +9,13 @@ import { } from "./grpc-requests-type"; import { handleSubscribe, wsol } from "./utils"; import { getSPLBalance, retriveWalletState } from "../../../../utils"; -import { connection, quoteToken, wallet, GRPC_XTOKEN } from "../constants/constants"; +import { connection, quoteToken, wallet, GRPC_XTOKEN, GRPC_URL } from "../constants/constants"; import { sell, buy } from "../raydium"; let trader_balance_wallet:any = {}; let targetTrader = ""; export const raydium_authority = "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1"; // ***it represent the person who extract/put the sol/token to the pool for every raydium swap txn*** const client = new Client( - "https://grpc.fra.shyft.to", + GRPC_URL, GRPC_XTOKEN, { "grpc.max_receive_message_length": 64 * 1024 * 1024, // 64MiB diff --git a/src/grpc_streaming_dev/grpc-pf-sniper/src/constants/constants.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/constants/constants.ts index acf7600..7cfa46b 100644 --- a/src/grpc_streaming_dev/grpc-pf-sniper/src/constants/constants.ts +++ b/src/grpc_streaming_dev/grpc-pf-sniper/src/constants/constants.ts @@ -7,6 +7,7 @@ export const COMMITMENT_LEVEL: Commitment = retrieveEnvVariable('COMMITMENT_LEVE export const RPC_ENDPOINT = retrieveEnvVariable('MAINNET_ENDPOINT', logger); export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable('WS_MAINNET_ENDPOINT', logger); export const GRPC_XTOKEN = retrieveEnvVariable('GRPC_XTOKEN', logger); +export const GRPC_URL = retrieveEnvVariable('GRPC_URL', logger); export const LOG_LEVEL = retrieveEnvVariable('LOG_LEVEL', logger); export const PRIVATE_KEY = retrieveEnvVariable('PRIVATE_KEY', logger); export const QUOTE_AMOUNT = retrieveEnvVariable('QUOTE_AMOUNT', logger); diff --git a/src/grpc_streaming_dev/grpc-pf-sniper/src/streaming/pump.fun.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/streaming/pump.fun.ts index 56c2c2c..5463e90 100644 --- a/src/grpc_streaming_dev/grpc-pf-sniper/src/streaming/pump.fun.ts +++ b/src/grpc_streaming_dev/grpc-pf-sniper/src/streaming/pump.fun.ts @@ -7,7 +7,7 @@ import Client from "@triton-one/yellowstone-grpc"; import { PublicKey } from "@solana/web3.js"; import { buy, solanaConnection, sell } from "../transaction/transaction"; import { storeJitoLeaderSchedule } from "../jito/bundle"; -import { AUTO_SELL, AUTO_SELL_TIMEOUT, GRPC_XTOKEN } from "../constants"; +import { AUTO_SELL, AUTO_SELL_TIMEOUT, GRPC_XTOKEN, GRPC_URL } from "../constants"; import * as borsh from "@coral-xyz/borsh"; import bs58 from "bs58"; import { Buffer } from "buffer"; @@ -15,7 +15,7 @@ import {createSubscribeNewTokenRequest, createClearAllSubscriptionsRequest, crea import {handleSubscribe} from "./utils" const client:any = new Client( - "https://grpc.fra.shyft.to", + GRPC_URL, GRPC_XTOKEN, { "grpc.max_receive_message_length": 64 * 1024 * 1024, // 64MiB diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/constants/constants.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/constants/constants.ts index e3f997d..435705c 100755 --- a/src/grpc_streaming_dev/grpc-raydium-sniper/src/constants/constants.ts +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/constants/constants.ts @@ -8,4 +8,6 @@ export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable('WS_MAINNET_ENDPOINT', export const LOG_LEVEL = retrieveEnvVariable('LOG_LEVEL', logger); export const PRIVATE_KEY = retrieveEnvVariable('PRIVATE_KEY', logger); export const QUOTE_AMOUNT = retrieveEnvVariable('QUOTE_AMOUNT', logger); -export const GRPC_XTOKEN = retrieveEnvVariable('GRPC_XTOKEN', logger); \ No newline at end of file +export const GRPC_XTOKEN = retrieveEnvVariable('GRPC_XTOKEN', logger); +export const GRPC_URL = retrieveEnvVariable('GRPC_URL', logger); +export const QUOTE_MINT = retrieveEnvVariable('QUOTE_MINT', logger); \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/openbook.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/openbook.ts index 2f97c46..6b7c4f0 100755 --- a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/openbook.ts +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/openbook.ts @@ -7,9 +7,9 @@ import Client from "@triton-one/yellowstone-grpc"; import { MARKET_STATE_LAYOUT_V3 } from "@raydium-io/raydium-sdk"; import { PublicKey } from "@solana/web3.js"; import { BufferRingBuffer } from "../buffer"; -import {GRPC_XTOKEN} from "../constants"; +import {GRPC_XTOKEN, GRPC_URL} from "../constants"; const client:any = new Client( - "https://grpc.fra.shyft.to", + GRPC_URL, GRPC_XTOKEN, undefined ); diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/raydium.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/raydium.ts index dff3f29..4bcd93a 100755 --- a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/raydium.ts +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/raydium.ts @@ -6,8 +6,8 @@ import { PublicKey } from "@solana/web3.js"; import { bufferRing } from "./openbook"; import { buy } from "../transaction/transaction"; import { storeJitoLeaderSchedule } from "../jito/bundle"; -import {GRPC_XTOKEN} from "../constants" -const client:any = new Client("https://grpc.fra.shyft.to", GRPC_XTOKEN, undefined); //grpc endpoint +import {GRPC_XTOKEN, GRPC_URL} from "../constants" +const client:any = new Client(GRPC_URL, GRPC_XTOKEN, undefined); //grpc endpoint let snipeCache:string[] = [] // to avoid duplicate sniping same token const transport = pino.transport({ diff --git a/src/grpc_streaming_dev/grpc-rug-detection/src/constants/constants.ts b/src/grpc_streaming_dev/grpc-rug-detection/src/constants/constants.ts index f0d8db8..4b1c18d 100644 --- a/src/grpc_streaming_dev/grpc-rug-detection/src/constants/constants.ts +++ b/src/grpc_streaming_dev/grpc-rug-detection/src/constants/constants.ts @@ -7,4 +7,5 @@ export const COMMITMENT_LEVEL: Commitment = retrieveEnvVariable('COMMITMENT_LEVE export const RPC_ENDPOINT = retrieveEnvVariable('MAINNET_ENDPOINT', logger); export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable('WS_MAINNET_ENDPOINT', logger); export const GRPC_XTOKEN = retrieveEnvVariable('GRPC_XTOKEN', logger); +export const GRPC_URL = retrieveEnvVariable('GRPC_URL', logger); export const LOG_LEVEL = retrieveEnvVariable('LOG_LEVEL', logger); \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/stream-token.ts b/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/stream-token.ts index 4a14688..4721f16 100644 --- a/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/stream-token.ts +++ b/src/grpc_streaming_dev/grpc-rug-detection/src/streaming/stream-token.ts @@ -8,12 +8,12 @@ import { } from "./grpc-requests-type"; import { handleSubscribe } from "./utils"; import { getSPLBalance, retriveWalletState } from "../../../../utils"; -import { GRPC_XTOKEN } from "../constants/constants"; +import { GRPC_XTOKEN, GRPC_URL } from "../constants/constants"; import { token } from "@metaplex-foundation/js"; let trader_balance_wallet:any = {}; export const raydium_authority = "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1"; // ***it represent the person who extract/put the sol/token to the pool for every raydium swap txn*** const client = new Client( - "https://grpc.fra.shyft.to", + GRPC_URL, GRPC_XTOKEN, { "grpc.max_receive_message_length": 64 * 1024 * 1024, // 64MiB diff --git a/src/helpers/.env.copy b/src/helpers/.env.copy index 23dc84e..f5004dd 100644 --- a/src/helpers/.env.copy +++ b/src/helpers/.env.copy @@ -19,7 +19,8 @@ BLOXROUTE_AUTH_HEADER = "BLOXROUTE_AUTH_HEADER" # to get, go to https://docs.blo # for grpc development COMMITMENT_LEVEL=confirmed -GRPC_XTOKEN=YOUR_GRPC_XTOKEN # the shyft one is great +GRPC_XTOKEN=09644c06-7573-4231-9d99-f9bf54341e7b # just a example,the shyft one is good enough +GRPC_URL="https://grpc.fra.shyft.to" # just a example, you can use another one or another grpc provider LOG_LEVEL=info BLOCK_ENGINE_URL=tokyo.mainnet.block-engine.jito.wtf QUOTE_MINT=WSOL From 1d9202a5878cd3301d571e5d94b8872d7ebbdaba Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Wed, 4 Sep 2024 11:17:26 +0800 Subject: [PATCH 076/140] Update README.md --- src/grpc_streaming_dev/grpc-raydium-sniper/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/README.md b/src/grpc_streaming_dev/grpc-raydium-sniper/README.md index 623008d..520bbb9 100755 --- a/src/grpc_streaming_dev/grpc-raydium-sniper/README.md +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/README.md @@ -1,4 +1,4 @@ -# Geyser gRPC Raydium Sniper (Beta) +# Geyser gRPC Raydium Sniper (Still testing, don't use it plz) ## Overview From a591d5c97ff90c92a7087466fce146741546e258 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Wed, 4 Sep 2024 11:55:06 +0800 Subject: [PATCH 077/140] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c070a07..dec2449 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ - land transactions faster using Jito/bloXroute -- Fetch the real-time lp-burn percentage, pool reserve and market cap of any liquidity pool +- Fetch the real-time price, lp-burn percentage, pool reserve and market cap of any liquidity pool - fixed % tp/sl module From 9ed0ca5a5edb58e0afc1722ac623fda467e222bf Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 6 Sep 2024 18:54:34 +0800 Subject: [PATCH 078/140] add orca document in src/orca/README.md --- .DS_Store | Bin 6148 -> 6148 bytes src/.DS_Store | Bin 6148 -> 6148 bytes src/orca/README.md | 59 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/.DS_Store b/.DS_Store index 21d441a442cabeee3ae1a79c56561f03745f3c0c..85a482636d8b88ca4010540160edaf4a08030d17 100644 GIT binary patch delta 16 XcmZoMXffEZmv!<2R?*FuSdD}LH*p2_ delta 18 ZcmZoMXffEZmz9xm@gaAE01^55} diff --git a/src/.DS_Store b/src/.DS_Store index 0f06121b24c64feead832822a923448e4b38e8d1..24a07385b1c009d7f334dbf6daf43926f2d4f49c 100644 GIT binary patch delta 112 zcmZoMXfc=|&e%S&P;8=}Hg`NjF+&MM5ko3N;>3gMlMO^z^n@7FfdT~#$qY!647m)M z40%AAc!m_9;=MdmvY~OhBJM(0I5nV=x&5k06nI|@| F005M`9`OJG delta 92 zcmZoMXfc=|&e%4wP;8=}Hg_sR5kqlGadJ*l{=|pslMO^zCLRzMV`N}pU||Sg$Opn4 qh-`ii=QqzZf55Y;9zXq`0zXPWPTA{R*>QYn{7o7GXnr6fgBD1 diff --git a/src/orca/README.md b/src/orca/README.md index e69de29..bb431d7 100644 --- a/src/orca/README.md +++ b/src/orca/README.md @@ -0,0 +1,59 @@ +# Orca DEX Usage Examples + +### Buy token through cli +` +ts-node src/orca/buy.ts --token --sol +` + +### Sell token through cli +` +ts-node src/orca/sell.ts --token --percentage +` +### buy/sell token by calling the function +```typescript +import {buy, sell} from "../orca"; +import {wallet} from "../helpers/config"; +async function main() { + const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; + const sol = 1; // buy 1 SOL worth of token using WSOL + const sellPercentage = 50; // sell 50% of the token + await buy("buy", tokenAddress, sol); // buy 1 SOL worth of token + sell("sell", tokenAddress, sellPercentage); // sell 50% of the token +} +``` + +### Fetch the price +```typescript +import {getCurrentPriceInUSD, getCurrentPriceInSOL} from "../orca"; + +const currentPopcatPriceInSOL = await getCurrentPriceInSOL("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); +const currentPopcatPriceInUSD = await getCurrentPriceInUSD("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); + +console.log(currentPopcatPriceInSOL); +console.log(currentPopcatPriceInUSD); +``` + +### Fetch the pool address for the target token +```typescript +import {fetchWhirlPoolId} from "../orca"; + +async function main(){ + const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; + const poolId = await fetchWhirlPoolId(tokenAddress); // output Address: POPCAT/WSOL or WSOL/ + console.log(poolId); +} +``` + +### Fetch the metrics of the pool +```typescript +import {getCurrentMarketCap, getCurrentSolInPool} from "../orca"; + +async function main(){ + const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; + const currentMarketCap = await getCurrentMarketCap(tokenAddress); // to get the current market cap of the token + const currentSolInPool = await getCurrentSolInPool(tokenAddress); // to get the current number of SOL in the pool + +} +``` + + From 930a0a6c3b26cf2d81f096e1b9339eed7319e01d Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 6 Sep 2024 18:59:53 +0800 Subject: [PATCH 079/140] add meteora document in src/meteora/README.md --- src/meteora/README.md | 64 +++++++++++++++++++++++++++++++++++++++++++ src/orca/README.md | 4 +-- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/meteora/README.md b/src/meteora/README.md index e69de29..54c643e 100644 --- a/src/meteora/README.md +++ b/src/meteora/README.md @@ -0,0 +1,64 @@ +# Meteora DEX Usage Examples + +### Buy token through cli +` +ts-node src/meteora/buy.ts --token --sol +` + +### Sell token through cli +` +ts-node src/meteora/sell.ts --token --percentage +` +### buy/sell token by calling the function +```typescript +import {buy, sell} from "../meteora"; +import {wallet} from "../helpers/config"; +async function main() { + const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; + const sol = 1; // buy 1 SOL worth of token using WSOL + const sellPercentage = 50; // sell 50% of the token + await buy(tokenAddress, sol) // buy 1 SOL worth of token + await sell(tokenAddress, sellPercentage); // sell 50% of the token +} +``` + +### Fetch the price +```typescript +import {getCurrentPriceInUSD, getCurrentPriceInSOL} from "../meteora"; + +const currentPopcatPriceInSOL = await getCurrentPriceInSOL("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); +const currentPopcatPriceInUSD = await getCurrentPriceInUSD("7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"); + +console.log(currentPopcatPriceInSOL); +console.log(currentPopcatPriceInUSD); +``` + +### Fetch the pool address for the target token +```typescript +import {fetchWhirlPoolId} from "../meteora"; + +async function main(){ + const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; + const poolId = await fetchDLMMPoolId(tokenAddress); // output Address: POPCAT/WSOL or WSOL/ + console.log(poolId); +} +``` + +### Fetch the metrics of the pool +```typescript +import {getCurrentMarketCap, getCurrentSolInPool, getLastNDayVolume, getDayVolume, getWeekVolume, getMonthVolume} from "../meteora"; + +async function main(){ + const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; + const currentMarketCap = await getCurrentMarketCap(tokenAddress); // to get the current market cap of the token + const currentSolInPool = await getCurrentSolInPool(tokenAddress); // to get the current number of SOL in the pool + const n = 14; // last 14 days + const lastNDayVolume = await getLastNDayVolume(tokenAddress, n); // to get the volume of last n days + const dayVolume = await getDayVolume(tokenAddress); // to get the volume of last 24 hours + const weekVolume = await getWeekVolume(tokenAddress); // to get the volume of last 7 days + const monthVolume = await getMonthVolume(tokenAddress); // to get the volume of last 30 days + +} +``` + + diff --git a/src/orca/README.md b/src/orca/README.md index bb431d7..3763551 100644 --- a/src/orca/README.md +++ b/src/orca/README.md @@ -17,8 +17,8 @@ async function main() { const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; const sol = 1; // buy 1 SOL worth of token using WSOL const sellPercentage = 50; // sell 50% of the token - await buy("buy", tokenAddress, sol); // buy 1 SOL worth of token - sell("sell", tokenAddress, sellPercentage); // sell 50% of the token + await buy(tokenAddress, sol) // buy 1 SOL worth of token + await sell(tokenAddress, sellPercentage); // sell 50% of the token } ``` From 765b8ae2443d3416ce9529e6f573ccd6d79876f2 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 6 Sep 2024 20:12:59 +0800 Subject: [PATCH 080/140] write document on every dex and jupiter --- src/jupiter/README.md | 52 ++++++++++++++++++++++++++++++++++++++ src/jupiter/buy.ts | 38 ++++++++++++++++++++++++++++ src/jupiter/constants.ts | 4 +++ src/jupiter/fetch-price.ts | 29 +++++++++++++++++++++ src/jupiter/index.ts | 4 +-- src/jupiter/sell.ts | 42 ++++++++++++++++++++++++++++++ src/jupiter/swap/index.ts | 3 +++ src/meteora/README.md | 4 +-- src/orca/README.md | 4 +-- src/raydium/README.md | 4 +-- 10 files changed, 175 insertions(+), 9 deletions(-) create mode 100644 src/jupiter/buy.ts create mode 100644 src/jupiter/constants.ts create mode 100644 src/jupiter/fetch-price.ts create mode 100644 src/jupiter/sell.ts create mode 100644 src/jupiter/swap/index.ts diff --git a/src/jupiter/README.md b/src/jupiter/README.md index e69de29..f5fa12c 100644 --- a/src/jupiter/README.md +++ b/src/jupiter/README.md @@ -0,0 +1,52 @@ +# Jupiter DEX Aggregator Usage Examples + +### Buy token through cli +` +ts-node src/jupiter/buy.ts --token --sol +` + +### Sell token through cli +` +ts-node src/jupiter/sell.ts --token --percentage +` + +### swap token on Jupiter +```typescript +import {swap} from "../jupiter"; +import {getSPLTokenBalance} from "../helpers/check_balance"; +import {wallet, connection} from "../helpers/config"; +import {usdc} from "../jupiter/constants"; +async function main() { + const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; + await swap(tokenAddress, usdc, 5000, 1) // swapping 5000 popcat to usdc, using 1% slippage +} + +``` +### buy/sell token on Jupiter +```typescript +import {buy, sell} from "../jupiter"; +import {getSPLTokenBalance} from "../helpers/check_balance"; +import {wallet, connection} from "../helpers/config"; +async function main() { + const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; + const sol = 1; // buy 1 SOL worth of token using WSOL + const sellPercentage = 50; // sell 50% of the token + await buy(tokenAddress, sol, 1) // buy 1 SOL worth of token, using 1% slippage + const balance = await getSPLTokenBalance(connection, new PublicKey(tokenAddress), wallet.publicKey); + await sell(tokenAddress, balance*sellPercentage/100, 1); // sell 50% of the token, using 1% slippage +} +``` + +### Fetch the price from Jupiter +```typescript +import {getCurrentPriceInSOL, getCurrentPriceInUSD} from "../jupiter"; +async function main() { + const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; + const currentPopcatPriceInSOL = await getCurrentPriceInSOL(tokenAddress); + const currentPopcatPriceInUSD = await getCurrentPriceInUSD(tokenAddress); +} + +``` + + + diff --git a/src/jupiter/buy.ts b/src/jupiter/buy.ts new file mode 100644 index 0000000..4566081 --- /dev/null +++ b/src/jupiter/buy.ts @@ -0,0 +1,38 @@ +import { logger } from "../helpers/logger"; +import { program } from "commander"; +import { buy } from "./swap"; +import { wallet } from "../helpers/config"; +let token:string="", + sol:number=0; +program + .option("--token ", "Specify the token address") + .option("--sol ", "Specify the number of SOL") + .option("-h, --help", "display help for command") + .action((options) => { + if (options.help) { + logger.info( + "ts-node buy --token --sol " + ); + process.exit(0); + } + if (!options.token || !options.sol) { + console.error("❌ Missing required options"); + process.exit(1); + } + token = options.token; + sol = options.sol; + }); +program.parse(); + +/** + * Buy function to perform a swap on Jupiter. + * + * @param {string} side - The side of the trade (buy/sell). + * @param {string} token_address - The address of the token to trade. + * @param {number} no_of_sol - The amount of SOL to trade. + * @returns {Promise} - A promise that resolves when the swap is completed. + */ +async function buy_cli(side:string, token_address:string, no_of_sol:number) { + await buy(token_address, no_of_sol, 1); // using 1% slippage +} +buy_cli("buy", token, sol); diff --git a/src/jupiter/constants.ts b/src/jupiter/constants.ts new file mode 100644 index 0000000..4eaf39d --- /dev/null +++ b/src/jupiter/constants.ts @@ -0,0 +1,4 @@ +export const wsol = "So11111111111111111111111111111111111111112"; +export const usdc = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; +export const usdt = "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"; // USDT + diff --git a/src/jupiter/fetch-price.ts b/src/jupiter/fetch-price.ts new file mode 100644 index 0000000..5fdc108 --- /dev/null +++ b/src/jupiter/fetch-price.ts @@ -0,0 +1,29 @@ +import fetch from 'cross-fetch'; +import {wsol, usdc} from './constants'; +export async function getCurrentPriceInSOL(tokenAddress:string){ + try{ + const response = await( await fetch(`https://price.jup.ag/v6/price?ids=${tokenAddress}&vsToken=${wsol}`)).json(); + //const response = await( await fetch(`https://quote-api.jup.ag/v6/quote?inputMint=${wsol}&outputMint=${tokenAddress}&amount=1000000&slippageBps=50`) ).json() + console.log(response); + return response.data[tokenAddress].price; + }catch(e){ + console.log(`Error when getting current price of ${tokenAddress} `, e) + } +} + +export async function getCurrentPriceInUSD(tokenAddress:string){ + try{ + const response = await( await fetch(`https://price.jup.ag/v6/price?ids=${tokenAddress}&vsToken=${usdc}`)).json(); + //const response = await( await fetch(`https://quote-api.jup.ag/v6/quote?inputMint=${wsol}&outputMint=${tokenAddress}&amount=1000000&slippageBps=50`) ).json() + console.log(response); + return response.data[tokenAddress].price; + }catch(e){ + console.log(`Error when getting current price of ${tokenAddress} `, e) + } +} + +async function main(){ + const tokenAddress = "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"; + console.log(await getCurrentPriceInUSD(tokenAddress)); +} +//main(); \ No newline at end of file diff --git a/src/jupiter/index.ts b/src/jupiter/index.ts index 06a050f..5b5ad35 100644 --- a/src/jupiter/index.ts +++ b/src/jupiter/index.ts @@ -1,3 +1 @@ -export * from "./swap/swap-helper"; -export * from "./swap/buy-helper"; -export * from "./swap/sell-helper"; \ No newline at end of file +export * from "./swap"; \ No newline at end of file diff --git a/src/jupiter/sell.ts b/src/jupiter/sell.ts new file mode 100644 index 0000000..6ee2a74 --- /dev/null +++ b/src/jupiter/sell.ts @@ -0,0 +1,42 @@ +import { logger } from "../helpers/logger"; +import {sell} from "./swap" +import { program } from "commander"; +import {getSPLTokenBalance} from "../helpers/check_balance" +import { connection, wallet } from "../helpers/config"; +import { PublicKey } from "@solana/web3.js"; + +let token:string="", + percentage:number=0; +program + .option("--token ", "Specify the token address") + .option("--percentage ", "Specify the sell percentage") + .option("-h, --help", "display help for command") + .action((options) => { + if (options.help) { + logger.info( + "ts-node sell --token --percentage " + ); + process.exit(0); + } + if (!options.token || !options.percentage) { + console.error("❌ Missing required options"); + process.exit(1); + } + token = options.token; + percentage = options.percentage; + }); +program.parse(); + +/** + * Sell function to perform a swap on the Meteora DEX. + * + * @param {string} side - The side of the trade (buy/sell). + * @param {string} token_address - The address of the token to trade. + * @param {number} sell_percentage - The sell percentage. + * @returns {Promise} - A promise that resolves when the swap is completed. + */ +async function sell_cli(side:string, token_address:string, sell_percentage:number) { + const balance = await getSPLTokenBalance(connection, new PublicKey(token_address), wallet.publicKey); + await sell(token_address, balance*percentage/100, 1); // using 1% slippage +} +sell_cli("sell", token, percentage); diff --git a/src/jupiter/swap/index.ts b/src/jupiter/swap/index.ts new file mode 100644 index 0000000..a5a5715 --- /dev/null +++ b/src/jupiter/swap/index.ts @@ -0,0 +1,3 @@ +export * from "./buy-helper"; +export * from "./swap-helper"; +export * from "./sell-helper"; \ No newline at end of file diff --git a/src/meteora/README.md b/src/meteora/README.md index 54c643e..e6729de 100644 --- a/src/meteora/README.md +++ b/src/meteora/README.md @@ -9,7 +9,7 @@ ts-node src/meteora/buy.ts --token --sol ` ts-node src/meteora/sell.ts --token --percentage ` -### buy/sell token by calling the function +### buy/sell token on Meteora ```typescript import {buy, sell} from "../meteora"; import {wallet} from "../helpers/config"; @@ -22,7 +22,7 @@ async function main() { } ``` -### Fetch the price +### Fetch the price from Meteora DLMM pool ```typescript import {getCurrentPriceInUSD, getCurrentPriceInSOL} from "../meteora"; diff --git a/src/orca/README.md b/src/orca/README.md index 3763551..d2edcdb 100644 --- a/src/orca/README.md +++ b/src/orca/README.md @@ -9,7 +9,7 @@ ts-node src/orca/buy.ts --token --sol ` ts-node src/orca/sell.ts --token --percentage ` -### buy/sell token by calling the function +### buy/sell token on Orca ```typescript import {buy, sell} from "../orca"; import {wallet} from "../helpers/config"; @@ -22,7 +22,7 @@ async function main() { } ``` -### Fetch the price +### Fetch the price from Orca whirpool ```typescript import {getCurrentPriceInUSD, getCurrentPriceInSOL} from "../orca"; diff --git a/src/raydium/README.md b/src/raydium/README.md index 211525f..bbcb334 100644 --- a/src/raydium/README.md +++ b/src/raydium/README.md @@ -9,7 +9,7 @@ ts-node src/raydium/buy.ts --token_address --sol ` ts-node src/raydium/sell.ts --token_address --percentage ` -### buy/sell token by calling the function +### buy/sell token on Raydium ```typescript import {buy, sell} from "../raydium"; import {wallet} from "../helpers/config"; @@ -22,7 +22,7 @@ async function main() { } ``` -### Fetch the price +### Fetch the price from Raydium pool ```typescript import {getCurrentPriceInUSD, getCurrentPriceInSOL} from "../raydium"; From 3c881ae8563d71191efffe9c789b6daedf9ba4d5 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 6 Sep 2024 20:18:19 +0800 Subject: [PATCH 081/140] Update README.md --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dec2449..b86a911 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,13 @@ ## Main Features -- Trading any token using Jupiter API & Raydium swap function - - Create your own Solana **_SPL tokens_** on mainnet | Pump.fun -- Swap tokens on Raydium, Orca, Meteora, and pump.fun +- Swap tokens on Jupiter, Raydium, Orca, Meteora, and pump.fun + - how to use Jupiter cli & trading functions: [here](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/jupiter/README.md) + - how to use Raydium cli & trading functions: [here](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/raydium/README.md) + - how to use Orca cli & trading functions: [here](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/orca/README.md) + - how to use Meteora cli & trading functions: [here](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/meteora/README.md) - land transactions faster using Jito/bloXroute From 875262e737b0f4b634c16483e8a0c7cdf5562f7d Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 6 Sep 2024 23:18:41 +0800 Subject: [PATCH 082/140] add mode to snipe any on raydium --- .../grpc-raydium-sniper/README.md | 8 ++++++++ .../grpc-raydium-sniper/src/streaming/raydium.ts | 5 ++++- .../src/streaming/snipe-normal-raydium.ts | 14 ++++++++------ .../src/streaming/snipe-pump.ts | 13 +++++++------ 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/README.md b/src/grpc_streaming_dev/grpc-raydium-sniper/README.md index 520bbb9..dc09d0e 100755 --- a/src/grpc_streaming_dev/grpc-raydium-sniper/README.md +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/README.md @@ -11,10 +11,18 @@ A sniper bot that uses gRPC streaming to monitor and interact with Raydium and O 3. When a target token is detected, it attempts to execute a buy transaction. 4. Optionally uses Jito leader schedule for transaction timing optimization. +## Usage +- run `ts-node src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-pump.ts -h` to test the snipe-pump command and see the available options +- run `ts-node src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-normal-raydium.ts -h` to test the snipe-raydium command and see the available options +- run `ts-node src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-pump.ts` to snipe any pump token that mirigating from pump.fun to raydium +- run `ts-node src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-normal-raydium.ts` to snipe any new created pool on raydium + ## Features - Real-time streaming of Openbook and Raydium data - swap tokens in milliseconds +- snipe pump tokens that mirigating from pump.fun to raydium +- snipe normal new created pool on raydium - Configurable for different token types (e.g., "pump" tokens) - Integration with Jito leader schedule (optional) - Customizable logging with Pino diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/raydium.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/raydium.ts index 4bcd93a..0cea20c 100755 --- a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/raydium.ts +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/raydium.ts @@ -80,7 +80,7 @@ export async function streamNewTokens(snipeTokenType:string, targetToken:string) const marketDetails = bufferRing.findPattern(poolstate.baseMint); console.log("Token incoming: ", TokenToBuy); console.log("Market Details: ", marketDetails) - if(TokenToBuy.toBase58() !== targetToken) clearInterval(intervalId); + if(targetToken !== "" && TokenToBuy.toBase58() !== targetToken) clearInterval(intervalId); else if (Buffer.isBuffer(marketDetails)) { const fullMarketDetailsDecoded = MARKET_STATE_LAYOUT_V3.decode(marketDetails); const marketDetailsDecoded = { @@ -90,6 +90,9 @@ export async function streamNewTokens(snipeTokenType:string, targetToken:string) }; console.log(`Sniping ${targetToken}`) if(TokenToBuy.toBase58() === targetToken) buy(latestBlockHash, tokenAccount, poolstate, marketDetailsDecoded, snipeTokenType); + else { + if(targetToken === "") buy(latestBlockHash, tokenAccount, poolstate, marketDetailsDecoded, snipeTokenType); + } clearInterval(intervalId); } else if(Attempt>=maxAttempts){ logger.error("Invalid market details") diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-normal-raydium.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-normal-raydium.ts index 224ee81..9d0fb1b 100755 --- a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-normal-raydium.ts +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-normal-raydium.ts @@ -13,10 +13,7 @@ program.option("--targetToken ", "Specify the token you want to s ); process.exit(0); } - if (!options.targetToken){ - console.error("❌ Missing required options"); - process.exit(1); - } + targetTokenToSnipe = options.targetToken }); program.parse(); @@ -24,8 +21,13 @@ program.parse(); async function snipe(){ console.log(`Siping ${targetTokenToSnipe}`) await init(); - streamNewTokens("normal", targetTokenToSnipe) - streamOpenbook("normal", targetTokenToSnipe) + if(targetTokenToSnipe!== ""){ + streamNewTokens("normal", targetTokenToSnipe) + streamOpenbook("normal", targetTokenToSnipe) + }else{ + streamNewTokens("normal", ""); + streamOpenbook("normal", ""); + } } snipe(); \ No newline at end of file diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-pump.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-pump.ts index 2785c95..e7834bf 100755 --- a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-pump.ts +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-pump.ts @@ -13,10 +13,6 @@ program.option("--token ", "Specify the token you want to snipe") ); process.exit(0); } - if (!options.token ) { - console.error("❌ Missing required options"); - process.exit(1); - } targetTokenToSnipe = options.token }); program.parse(); @@ -24,8 +20,13 @@ program.parse(); async function snipe(){ console.log(`Siping ${targetTokenToSnipe}`) await init(); - streamNewTokens("pump", targetTokenToSnipe) - streamOpenbook("pump", targetTokenToSnipe) + if(targetTokenToSnipe!== ""){ + streamNewTokens("pump", targetTokenToSnipe) + streamOpenbook("pump", targetTokenToSnipe) + }else{ + streamNewTokens("pump", ""); + streamOpenbook("pump", ""); + } } snipe(); \ No newline at end of file From 9b92197e88f3bc8ee1224f62a04f21797fc36b70 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 6 Sep 2024 23:25:12 +0800 Subject: [PATCH 083/140] small update on src/grpc_streaming_dev/grpc-raydium-sniper/README.md --- src/grpc_streaming_dev/grpc-raydium-sniper/README.md | 6 +++--- .../grpc-raydium-sniper/src/streaming/pump-listeners.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/README.md b/src/grpc_streaming_dev/grpc-raydium-sniper/README.md index dc09d0e..49b1c73 100755 --- a/src/grpc_streaming_dev/grpc-raydium-sniper/README.md +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/README.md @@ -12,11 +12,14 @@ A sniper bot that uses gRPC streaming to monitor and interact with Raydium and O 4. Optionally uses Jito leader schedule for transaction timing optimization. ## Usage + - run `ts-node src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-pump.ts -h` to test the snipe-pump command and see the available options - run `ts-node src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-normal-raydium.ts -h` to test the snipe-raydium command and see the available options - run `ts-node src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-pump.ts` to snipe any pump token that mirigating from pump.fun to raydium - run `ts-node src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/snipe-normal-raydium.ts` to snipe any new created pool on raydium +- run `ts-node src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/pump-listeners.ts` to see the pump token which completed the bonding curve in real-time + ## Features - Real-time streaming of Openbook and Raydium data @@ -31,7 +34,6 @@ A sniper bot that uses gRPC streaming to monitor and interact with Raydium and O Contributions are welcome. Please submit pull requests with any improvements or bug fixes. - ## Disclaimer This software is in beta and for educational purposes only. Use at your own risk. The authors are not responsible for any financial losses incurred while using this software. @@ -39,5 +41,3 @@ This software is in beta and for educational purposes only. Use at your own risk ## Note The current implementation includes commented-out code for Jito leader schedule integration. Uncomment and configure as needed for advanced usage. - - diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/pump-listeners.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/pump-listeners.ts index 73ce885..e7a22fe 100755 --- a/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/pump-listeners.ts +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/streaming/pump-listeners.ts @@ -45,7 +45,7 @@ async function main() { const sdk = new PumpFunSDK(provider); // Set up event listeners - await subscribeToCreatePumpTokenEvent(sdk); + await subscribeToCompleteBondingCurveEvent(sdk); } catch (error) { console.error("An error occurred:", error); } From 04351a36fd55276503f827c41912ec78db78d5d7 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 6 Sep 2024 23:35:12 +0800 Subject: [PATCH 084/140] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b86a911..7d208f4 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ - ws copy bot with auto-buy&sell - geyser **grpc Pump.fun sniper bot** with 0.4-2 seconds latency - geyser **grpc Copy bot** to copy trades from a target wallet address +- geyser **grpc Raydium sniper bot** - easy-to-use tp/sl module ## Features in Development 🚧: From 2ddb81d882bf2a2336ea57f944b63725e9caea38 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 7 Sep 2024 10:58:41 +0800 Subject: [PATCH 085/140] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7d208f4..fdc89e6 100644 --- a/README.md +++ b/README.md @@ -52,16 +52,16 @@ - Check the balance of a token in your wallet - wrap/unwrap solana - Create a new SPL token or zk-compressed token (on SOL mainnet/devnet/zk-devnet) and it will automatically mint to your wallet -- Integrates both **jito tips, bloXroute fee** that land transactions faster - boost volume of a token by creating buy and sell orders in just **one transaction** - **Add or Remove liquidity** to a pool -- Swap tokens in a **raydium, orca, meteora dex's AMM pool** -- Swap tokens using JUP Swap API - **Buy, Sell, and launch token in pump.fun** - monitor real-time pump-fun's create, trade, and complete bonding curve events ### Trader CLI: +- integrates both **jito tips, bloXroute fee** that land transactions faster +- swap tokens on **Raydium, Meteora, and Orca** +- swap tokens using Jupiter API - ws copy bot with auto-buy&sell - geyser **grpc Pump.fun sniper bot** with 0.4-2 seconds latency - geyser **grpc Copy bot** to copy trades from a target wallet address From b5f4ee305c0b818402de13a915aa5451b1c17e47 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sat, 7 Sep 2024 11:06:14 +0800 Subject: [PATCH 086/140] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fdc89e6..12a9ace 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ 1. Add your mainnet wallet secret key(must), devnet wallet secret key (optional), RPC endpoint(must) and shyft api key(optional) 2. rename the .env.copy file to .env -## Features ✅: +## Usage ✅: ### Developer CLI: From 3393229c4a5a43bba381a27a2e7b60d779e2a5a0 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Fri, 13 Sep 2024 12:50:30 +0800 Subject: [PATCH 087/140] update grpc-pool-price --- src/grpc_intro_projects/README.md | 0 .../grpc-jupiter-trades/README.md | 0 .../src/constants/constants.ts | 11 +++ .../src/constants/index.ts | 1 + .../src/streaming/stream-trades.ts | 0 .../grpc-jupiter-trades/src/utils/index.ts | 2 + .../grpc-jupiter-trades/src/utils/logger.ts | 17 ++++ .../grpc-jupiter-trades/src/utils/utils.ts | 70 ++++++++++++++ .../grpc-pool-price/README.md | 0 .../src/constants/constants.ts | 50 ++++++++++ .../grpc-pool-price/src/constants/index.ts | 1 + .../grpc-pool-price/src/data/index.ts | 1 + .../grpc-pool-price/src/data/tokens.txt | 6 ++ .../grpc-pool-price/src/data/utils.ts | 19 ++++ .../src/streaming/grpc-requests-type.ts | 46 +++++++++ .../grpc-pool-price/src/streaming/main.ts | 51 ++++++++++ .../src/streaming/stream-price.ts | 93 +++++++++++++++++++ .../grpc-pool-price/src/streaming/utils.ts | 73 +++++++++++++++ .../grpc-pool-price/src/utils/index.ts | 2 + .../grpc-pool-price/src/utils/logger.ts | 17 ++++ .../grpc-pool-price/src/utils/utils.ts | 72 ++++++++++++++ .../grpc-raydium-trades/README.md | 0 .../src/constants/constants.ts | 11 +++ .../src/constants/index.ts | 1 + .../src/streaming/stream-trades.ts | 0 .../grpc-raydium-trades/src/utils/index.ts | 2 + .../grpc-raydium-trades/src/utils/logger.ts | 17 ++++ .../grpc-raydium-trades/src/utils/utils.ts | 70 ++++++++++++++ src/pumpfunsdk/README.md | 0 src/raydium/Pool/fetch_pool.ts | 1 + src/trading_dev/README.md | 0 31 files changed, 634 insertions(+) create mode 100644 src/grpc_intro_projects/README.md create mode 100644 src/grpc_intro_projects/grpc-jupiter-trades/README.md create mode 100644 src/grpc_intro_projects/grpc-jupiter-trades/src/constants/constants.ts create mode 100644 src/grpc_intro_projects/grpc-jupiter-trades/src/constants/index.ts create mode 100644 src/grpc_intro_projects/grpc-jupiter-trades/src/streaming/stream-trades.ts create mode 100644 src/grpc_intro_projects/grpc-jupiter-trades/src/utils/index.ts create mode 100644 src/grpc_intro_projects/grpc-jupiter-trades/src/utils/logger.ts create mode 100644 src/grpc_intro_projects/grpc-jupiter-trades/src/utils/utils.ts create mode 100644 src/grpc_intro_projects/grpc-pool-price/README.md create mode 100644 src/grpc_intro_projects/grpc-pool-price/src/constants/constants.ts create mode 100644 src/grpc_intro_projects/grpc-pool-price/src/constants/index.ts create mode 100644 src/grpc_intro_projects/grpc-pool-price/src/data/index.ts create mode 100644 src/grpc_intro_projects/grpc-pool-price/src/data/tokens.txt create mode 100644 src/grpc_intro_projects/grpc-pool-price/src/data/utils.ts create mode 100644 src/grpc_intro_projects/grpc-pool-price/src/streaming/grpc-requests-type.ts create mode 100644 src/grpc_intro_projects/grpc-pool-price/src/streaming/main.ts create mode 100644 src/grpc_intro_projects/grpc-pool-price/src/streaming/stream-price.ts create mode 100644 src/grpc_intro_projects/grpc-pool-price/src/streaming/utils.ts create mode 100644 src/grpc_intro_projects/grpc-pool-price/src/utils/index.ts create mode 100644 src/grpc_intro_projects/grpc-pool-price/src/utils/logger.ts create mode 100644 src/grpc_intro_projects/grpc-pool-price/src/utils/utils.ts create mode 100644 src/grpc_intro_projects/grpc-raydium-trades/README.md create mode 100644 src/grpc_intro_projects/grpc-raydium-trades/src/constants/constants.ts create mode 100644 src/grpc_intro_projects/grpc-raydium-trades/src/constants/index.ts create mode 100644 src/grpc_intro_projects/grpc-raydium-trades/src/streaming/stream-trades.ts create mode 100644 src/grpc_intro_projects/grpc-raydium-trades/src/utils/index.ts create mode 100644 src/grpc_intro_projects/grpc-raydium-trades/src/utils/logger.ts create mode 100644 src/grpc_intro_projects/grpc-raydium-trades/src/utils/utils.ts create mode 100644 src/pumpfunsdk/README.md create mode 100644 src/trading_dev/README.md diff --git a/src/grpc_intro_projects/README.md b/src/grpc_intro_projects/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/grpc_intro_projects/grpc-jupiter-trades/README.md b/src/grpc_intro_projects/grpc-jupiter-trades/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/grpc_intro_projects/grpc-jupiter-trades/src/constants/constants.ts b/src/grpc_intro_projects/grpc-jupiter-trades/src/constants/constants.ts new file mode 100644 index 0000000..4b1c18d --- /dev/null +++ b/src/grpc_intro_projects/grpc-jupiter-trades/src/constants/constants.ts @@ -0,0 +1,11 @@ +import { logger, retrieveEnvVariable } from "../../../../utils"; +import { + Commitment + } from "@solana/web3.js"; +export const NETWORK = 'mainnet-beta'; +export const COMMITMENT_LEVEL: Commitment = retrieveEnvVariable('COMMITMENT_LEVEL', logger) as Commitment; +export const RPC_ENDPOINT = retrieveEnvVariable('MAINNET_ENDPOINT', logger); +export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable('WS_MAINNET_ENDPOINT', logger); +export const GRPC_XTOKEN = retrieveEnvVariable('GRPC_XTOKEN', logger); +export const GRPC_URL = retrieveEnvVariable('GRPC_URL', logger); +export const LOG_LEVEL = retrieveEnvVariable('LOG_LEVEL', logger); \ No newline at end of file diff --git a/src/grpc_intro_projects/grpc-jupiter-trades/src/constants/index.ts b/src/grpc_intro_projects/grpc-jupiter-trades/src/constants/index.ts new file mode 100644 index 0000000..c7582ff --- /dev/null +++ b/src/grpc_intro_projects/grpc-jupiter-trades/src/constants/index.ts @@ -0,0 +1 @@ +export * from "./constants" \ No newline at end of file diff --git a/src/grpc_intro_projects/grpc-jupiter-trades/src/streaming/stream-trades.ts b/src/grpc_intro_projects/grpc-jupiter-trades/src/streaming/stream-trades.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/grpc_intro_projects/grpc-jupiter-trades/src/utils/index.ts b/src/grpc_intro_projects/grpc-jupiter-trades/src/utils/index.ts new file mode 100644 index 0000000..d90cdf8 --- /dev/null +++ b/src/grpc_intro_projects/grpc-jupiter-trades/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './utils'; +export * from './logger'; \ No newline at end of file diff --git a/src/grpc_intro_projects/grpc-jupiter-trades/src/utils/logger.ts b/src/grpc_intro_projects/grpc-jupiter-trades/src/utils/logger.ts new file mode 100644 index 0000000..393068e --- /dev/null +++ b/src/grpc_intro_projects/grpc-jupiter-trades/src/utils/logger.ts @@ -0,0 +1,17 @@ +import pino from "pino"; + +const transport = pino.transport({ + target: 'pino-pretty', +}); + +export const logger = pino( + { + level: 'info', + redact: ['poolKeys'], + serializers: { + error: pino.stdSerializers.err, + }, + base: undefined, + }, + transport, +); diff --git a/src/grpc_intro_projects/grpc-jupiter-trades/src/utils/utils.ts b/src/grpc_intro_projects/grpc-jupiter-trades/src/utils/utils.ts new file mode 100644 index 0000000..0d22abd --- /dev/null +++ b/src/grpc_intro_projects/grpc-jupiter-trades/src/utils/utils.ts @@ -0,0 +1,70 @@ +import { Logger } from 'pino'; +import dotenv from 'dotenv'; +import fs from "fs"; +import { Keypair, LAMPORTS_PER_SOL } from '@solana/web3.js'; +import { Connection } from '@solana/web3.js'; +import { PublicKey } from '@solana/web3.js'; +import { getAssociatedTokenAddressSync } from '@solana/spl-token'; +dotenv.config(); + +export const retrieveEnvVariable = (variableName: string, logger: Logger) => { + const variable = process.env[variableName] || ''; + if (!variable) { + logger.error(`${variableName} is not set`); + process.exit(1); + } + return variable; +}; + +export function getKeypairByJsonPath(jsonPath: string): any { + try { + const keypairJson = fs.readFileSync(jsonPath, "utf-8"); + const data = JSON.parse(keypairJson); + const mintKeypair = Keypair.fromSecretKey(Uint8Array.from(data)); + return mintKeypair + } catch (e) { + console.log(e); + } +} +export async function printSOLBalance ( + connection: Connection, + pubKey: PublicKey, + info = "" +) { + const balance = await connection.getBalance(pubKey); + console.log( + `${info ? info + " " : ""}${pubKey.toBase58()}:`, + balance / LAMPORTS_PER_SOL, + `SOL` + ); +}; + +export async function getSPLBalance ( + connection: Connection, + mintAddress: PublicKey, + pubKey: PublicKey, + allowOffCurve = false +) { + try { + let ata = getAssociatedTokenAddressSync(mintAddress, pubKey, allowOffCurve); + const balance = await connection.getTokenAccountBalance(ata, "processed"); + return balance.value.uiAmount; + } catch (e) {} + return null; +}; +async function printSPLBalance ( + connection: Connection, + mintAddress: PublicKey, + user: PublicKey, + info = "" +) { + const balance = await getSPLBalance(connection, mintAddress, user); + if (balance === null) { + console.log( + `${info ? info + " " : ""}${user.toBase58()}:`, + "No Account Found" + ); + } else { + console.log(`${info ? info + " " : ""}${user.toBase58()}:`, balance); + } +}; \ No newline at end of file diff --git a/src/grpc_intro_projects/grpc-pool-price/README.md b/src/grpc_intro_projects/grpc-pool-price/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/grpc_intro_projects/grpc-pool-price/src/constants/constants.ts b/src/grpc_intro_projects/grpc-pool-price/src/constants/constants.ts new file mode 100644 index 0000000..007eedb --- /dev/null +++ b/src/grpc_intro_projects/grpc-pool-price/src/constants/constants.ts @@ -0,0 +1,50 @@ +import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; +import { logger, retrieveEnvVariable } from "../../../../utils"; +import { + Currency, + Token, + TOKEN_PROGRAM_ID, +} from "@raydium-io/raydium-sdk"; +import { Commitment, Connection, Keypair, PublicKey } from "@solana/web3.js"; +export const NETWORK = "mainnet-beta"; +export const COMMITMENT_LEVEL: Commitment = retrieveEnvVariable( + "COMMITMENT_LEVEL", + logger +) as Commitment; +export const RPC_ENDPOINT = retrieveEnvVariable("MAINNET_ENDPOINT", logger); +export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable( + "WS_MAINNET_ENDPOINT", + logger +); +export const GRPC_XTOKEN = retrieveEnvVariable("GRPC_XTOKEN", logger); +export const LOG_LEVEL = retrieveEnvVariable("LOG_LEVEL", logger); +export const GRPC_URL = retrieveEnvVariable("GRPC_URL", logger); +export const PRIVATE_KEY = retrieveEnvVariable("PRIVATE_KEY", logger); +export const JITO_TIPS = retrieveEnvVariable("JITO_FEE", logger); +export const connection = new Connection(RPC_ENDPOINT, "processed"); +export const wallet = Keypair.fromSecretKey(bs58.decode(PRIVATE_KEY)); +export const wsol = "So11111111111111111111111111111111111111112"; +const usdc = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; +export const quoteToken = [ + usdc, // USDC + "SOL", // SOL + "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", // USDT + wsol, // WSOL +]; +export const DEFAULT_TOKEN = { + SOL: new Currency(9, "SOL", "SOL"), + WSOL: new Token( + TOKEN_PROGRAM_ID, + new PublicKey("So11111111111111111111111111111111111111112"), + 9, + "WSOL", + "WSOL" + ), + USDC: new Token( + TOKEN_PROGRAM_ID, + new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), + 6, + "USDC", + "USDC" + ), +}; diff --git a/src/grpc_intro_projects/grpc-pool-price/src/constants/index.ts b/src/grpc_intro_projects/grpc-pool-price/src/constants/index.ts new file mode 100644 index 0000000..c7582ff --- /dev/null +++ b/src/grpc_intro_projects/grpc-pool-price/src/constants/index.ts @@ -0,0 +1 @@ +export * from "./constants" \ No newline at end of file diff --git a/src/grpc_intro_projects/grpc-pool-price/src/data/index.ts b/src/grpc_intro_projects/grpc-pool-price/src/data/index.ts new file mode 100644 index 0000000..037b90c --- /dev/null +++ b/src/grpc_intro_projects/grpc-pool-price/src/data/index.ts @@ -0,0 +1 @@ +export * from "./utils"; \ No newline at end of file diff --git a/src/grpc_intro_projects/grpc-pool-price/src/data/tokens.txt b/src/grpc_intro_projects/grpc-pool-price/src/data/tokens.txt new file mode 100644 index 0000000..17cb011 --- /dev/null +++ b/src/grpc_intro_projects/grpc-pool-price/src/data/tokens.txt @@ -0,0 +1,6 @@ +EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm +7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr +ukHH6c7mMyiWCf1b9pnWe25TSpkDDt3H5pQZgZ74J82 +63LfDmNb3MQ8mw9MtZ2To9bEA2M71kZUUGq5tiJxcqj9 +5z3EqYQo9HiCEs3R84RCDMu2n7anpDMxRhdK8PSWmrRC +6ogzHhzdrQr9Pgv6hZ2MNze7UrzBMAFyBBWUYp1Fhitx \ No newline at end of file diff --git a/src/grpc_intro_projects/grpc-pool-price/src/data/utils.ts b/src/grpc_intro_projects/grpc-pool-price/src/data/utils.ts new file mode 100644 index 0000000..36afcf5 --- /dev/null +++ b/src/grpc_intro_projects/grpc-pool-price/src/data/utils.ts @@ -0,0 +1,19 @@ +import fs from 'fs/promises'; +import path from 'path'; +import {fetchAMMPoolId} from "../../../../raydium/Pool/fetch_pool"; +const tokens_path = path.join(__dirname, "tokens.txt"); +export async function fetchPoolsFromTokens(){ + let res:string[] = []; + const fileContent = await fs.readFile(tokens_path, 'utf8'); + + // Split the file content into an array of addresses + const tokensList = fileContent.trim().split('\n'); + for(const token of tokensList){ + if(token==="") continue; + const pool = await fetchAMMPoolId(token); + res.push(pool); + } + return res; +} + + diff --git a/src/grpc_intro_projects/grpc-pool-price/src/streaming/grpc-requests-type.ts b/src/grpc_intro_projects/grpc-pool-price/src/streaming/grpc-requests-type.ts new file mode 100644 index 0000000..e537e3f --- /dev/null +++ b/src/grpc_intro_projects/grpc-pool-price/src/streaming/grpc-requests-type.ts @@ -0,0 +1,46 @@ +import { + CommitmentLevel, + SubscribeRequest, + } from "@triton-one/yellowstone-grpc"; +import { req } from "pino-std-serializers"; +const RaydiumProgram = "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8" +const RaydiumRoute = "routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS" +const RaydiumCAMM = "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK" +const tokenAccountProgram = "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" +export async function createSubscribePoolsRequest(pools: string[]) { + let request: any = null; + request = { + slots: {}, + accounts: {}, + transactions: { + pumpdotfun: { + vote: false, + failed: false, + signature: undefined, + accountInclude: [...pools], + accountExclude: [], + accountRequired: [RaydiumProgram], + }, + }, + transactionsStatus: {}, + blocks: {}, + blocksMeta: {}, + accountsDataSlice: [], + commitment: CommitmentLevel.PROCESSED, // Subscribe to processed blocks for the fastest updates + entry: {}, + }; + return request; +} +export async function createClearAllSubscriptionsRequest() { + const request = { + "slots": {}, + "accounts": {}, + "transactions": {}, + "blocks": {}, + "blocksMeta": {}, + "accountsDataSlice": [] + }; + return request; +} + + diff --git a/src/grpc_intro_projects/grpc-pool-price/src/streaming/main.ts b/src/grpc_intro_projects/grpc-pool-price/src/streaming/main.ts new file mode 100644 index 0000000..5e6bf4c --- /dev/null +++ b/src/grpc_intro_projects/grpc-pool-price/src/streaming/main.ts @@ -0,0 +1,51 @@ +import {streamPoolsPrice} from "./stream-price" +import { logger } from "../../../../helpers/logger"; +import { fork } from "child_process"; +import bs58 from "bs58"; +import {fetchPoolsFromTokens} from "../data" +import path from "path"; +import { program } from "commander"; +import { fetchAMMPoolId } from "../../../../raydium/Pool/fetch_pool"; +let oneToken = ""; +program + .option("--token ", "Specify the token address to copy") + .option("-h, --help", "display help for command") + .action((options: any) => { + if (options.help) { + logger.info("ts-node main --token "); + process.exit(0); + } + if (options.token) { + oneToken = options.token; + } + }); +program.parse(); + +async function snipe() { + // show the options + if(oneToken !== ""){ + logger.info(`We are going to track the price of ${oneToken}`); + }else{ + logger.info(`We are going to track the price of all the tokens from src/data/tokens.txt`); + } + + let pools = []; + if(oneToken !== ""){ + const pool = await fetchAMMPoolId(oneToken); + pools.push(pool); + }else{ + pools = await fetchPoolsFromTokens(); + } + // initialize the bot + try { + // Start copy_buy in a separate process + await streamPoolsPrice(pools); + } catch (e) { + logger.error(`error when streaming ${e}`); + logger.info("Retrying in 1 second"); + await new Promise((resolve) => setTimeout(resolve, 1000)); + await snipe(); + } +} + +snipe(); diff --git a/src/grpc_intro_projects/grpc-pool-price/src/streaming/stream-price.ts b/src/grpc_intro_projects/grpc-pool-price/src/streaming/stream-price.ts new file mode 100644 index 0000000..2c60726 --- /dev/null +++ b/src/grpc_intro_projects/grpc-pool-price/src/streaming/stream-price.ts @@ -0,0 +1,93 @@ +import pino from "pino"; +import Client from "@triton-one/yellowstone-grpc"; +import { PublicKey } from "@solana/web3.js"; +import bs58 from "bs58"; +import { + createClearAllSubscriptionsRequest, + createSubscribePoolsRequest, +} from "./grpc-requests-type"; +import { handleSubscribe, wsol } from "./utils"; +import { getSPLBalance, retriveWalletState } from "../../../../utils"; +import { connection, wallet, GRPC_XTOKEN, GRPC_URL } from "../constants/constants"; +let trader_balance_wallet:any = {}; +let targetTrader = ""; +export const raydium_authority = "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1"; // ***it represent the person who extract/put the sol/token to the pool for every raydium swap txn*** +const client = new Client( + GRPC_URL, + GRPC_XTOKEN, + { + "grpc.max_receive_message_length": 64 * 1024 * 1024, // 64MiB + } +); //grpc endpoint +const transport = pino.transport({ + target: "pino-pretty", +}); + +export const logger = pino( + { + level: "info", + serializers: { + error: pino.stdSerializers.err, + }, + base: undefined, + }, + transport +); +// Array to store Jito leaders for current epoch + +(async () => { + const version = await client.getVersion(); // gets the version information + logger.info(version); +})(); + +export async function checkPoolPrice(data: any) { + const preTokenBalances = data.transaction.transaction.meta.preTokenBalances; + const postTokenBalances = data.transaction.transaction.meta.postTokenBalances; + const latestBlockhash = await connection.getLatestBlockhash("processed"); + let targetToken = "", postPoolSOL=0, postPoolToken=0, prePoolSOL=0, prePoolToken=0, side = ""; + // look for the token that the trader is buying or selling + for (const account of preTokenBalances) { + if (targetToken !== "" && prePoolSOL !== 0 && prePoolToken!==0) break; // make sure we get the target token and pool sol balances and trader address only + if (account.owner === raydium_authority && account.mint !== wsol) targetToken = account.mint; + if (account.owner === raydium_authority && account.mint === wsol) { + prePoolSOL = account.uiTokenAmount.uiAmount; + } + if (account.owner === raydium_authority && account.mint !== wsol) { + prePoolToken = account.uiTokenAmount.uiAmount; + } + } + for (const account of postTokenBalances) { + if (postPoolSOL !== 0 && postPoolToken!==0) break; // make sure we get the target token and pool sol balances and trader address only + if (account.owner === raydium_authority && account.mint !== wsol ) targetToken = account.mint; + if (account.owner === raydium_authority && account.mint === wsol) { + postPoolSOL = account.uiTokenAmount.uiAmount; + } + if (account.owner === raydium_authority && account.mint !== wsol) { + postPoolToken = account.uiTokenAmount.uiAmount; + } + } + if (targetToken === "") return; + logger.info(`The current price in SOL of ${targetToken} is ${postPoolSOL/postPoolToken}`) + + + +} + +export async function streamPoolsPrice(pools:string[]) { + try { + + const stream = await client.subscribe(); + const r1 = await createSubscribePoolsRequest(pools); + handleSubscribe(stream, r1); + stream.on("data", (data) => { + // receive an update when trader makes a transaction + if (data.transaction !== undefined) { + logger.info(`Current slot: ${data.transaction.slot}`); + checkPoolPrice(data); + } + }); + } catch (e) { + logger.error(e); + throw e; + } +} diff --git a/src/grpc_intro_projects/grpc-pool-price/src/streaming/utils.ts b/src/grpc_intro_projects/grpc-pool-price/src/streaming/utils.ts new file mode 100644 index 0000000..fe474f5 --- /dev/null +++ b/src/grpc_intro_projects/grpc-pool-price/src/streaming/utils.ts @@ -0,0 +1,73 @@ +import { + CommitmentLevel, + SubscribeRequest, +} from "@triton-one/yellowstone-grpc"; +import Client from "@triton-one/yellowstone-grpc"; +import { logger } from "../../../../utils"; +const PING_INTERVAL_MS = 100_000; +export const wsol = "So11111111111111111111111111111111111111112"; +export async function handleSubscribe( + client_stream: any, + args: SubscribeRequest +) { + try { + const streamClosed = new Promise((resolve, reject) => { + client_stream.on("error", (error:any) => { + console.log("ERROR", error); + reject(error); + client_stream.end(); + }); + client_stream.on("end", () => { + resolve(); + }); + client_stream.on("close", () => { + resolve(); + }); + }); + + // Send subscribe request + await new Promise((resolve, reject) => { + client_stream.write(args, (err: any) => { + if (err === null || err === undefined) { + resolve(); + } else { + reject(err); + } + }); + }).catch((reason) => { + console.error(reason); + throw reason; + }); + // Send pings every 5s to keep the connection open + const pingRequest: SubscribeRequest = { + ping: { id: 1 }, + // Required, but unused arguments + accounts: {}, + accountsDataSlice: [], + transactions: {}, + blocks: {}, + blocksMeta: {}, + entry: {}, + slots: {}, + }; + setInterval(async () => { + await new Promise((resolve, reject) => { + client_stream.write(pingRequest, (err:any) => { + if (err === null || err === undefined) { + resolve(); + } else { + reject(err); + } + }); + }).catch((reason) => { + console.error(reason); + throw reason; + }); + }, PING_INTERVAL_MS); + + await streamClosed; + } catch (e) { + logger.error(e); + throw e; + } +} diff --git a/src/grpc_intro_projects/grpc-pool-price/src/utils/index.ts b/src/grpc_intro_projects/grpc-pool-price/src/utils/index.ts new file mode 100644 index 0000000..d90cdf8 --- /dev/null +++ b/src/grpc_intro_projects/grpc-pool-price/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './utils'; +export * from './logger'; \ No newline at end of file diff --git a/src/grpc_intro_projects/grpc-pool-price/src/utils/logger.ts b/src/grpc_intro_projects/grpc-pool-price/src/utils/logger.ts new file mode 100644 index 0000000..393068e --- /dev/null +++ b/src/grpc_intro_projects/grpc-pool-price/src/utils/logger.ts @@ -0,0 +1,17 @@ +import pino from "pino"; + +const transport = pino.transport({ + target: 'pino-pretty', +}); + +export const logger = pino( + { + level: 'info', + redact: ['poolKeys'], + serializers: { + error: pino.stdSerializers.err, + }, + base: undefined, + }, + transport, +); diff --git a/src/grpc_intro_projects/grpc-pool-price/src/utils/utils.ts b/src/grpc_intro_projects/grpc-pool-price/src/utils/utils.ts new file mode 100644 index 0000000..77a7c62 --- /dev/null +++ b/src/grpc_intro_projects/grpc-pool-price/src/utils/utils.ts @@ -0,0 +1,72 @@ +import { Logger } from 'pino'; +import dotenv from 'dotenv'; +import fs from "fs"; +import { Keypair, LAMPORTS_PER_SOL } from '@solana/web3.js'; +import { Connection } from '@solana/web3.js'; +import { PublicKey } from '@solana/web3.js'; +import { getAssociatedTokenAddressSync } from '@solana/spl-token'; +dotenv.config(); + + +export const retrieveEnvVariable = (variableName: string, logger: Logger) => { + const variable = process.env[variableName] || ''; + if (!variable) { + logger.error(`${variableName} is not set`); + process.exit(1); + } + return variable; +}; + +export function getKeypairByJsonPath(jsonPath: string): any { + try { + const keypairJson = fs.readFileSync(jsonPath, "utf-8"); + const data = JSON.parse(keypairJson); + const mintKeypair = Keypair.fromSecretKey(Uint8Array.from(data)); + return mintKeypair + } catch (e) { + console.log(e); + } +} +export async function printSOLBalance ( + connection: Connection, + pubKey: PublicKey, + info = "" +) { + const balance = await connection.getBalance(pubKey); + console.log( + `${info ? info + " " : ""}${pubKey.toBase58()}:`, + balance / LAMPORTS_PER_SOL, + `SOL` + ); +}; + +export async function getSPLBalance ( + connection: Connection, + mintAddress: PublicKey, + pubKey: PublicKey, + allowOffCurve = false +) { + try { + let ata = getAssociatedTokenAddressSync(mintAddress, pubKey, allowOffCurve); + const balance = await connection.getTokenAccountBalance(ata, "processed"); + return balance.value.uiAmount; + } catch (e) {} + return null; +}; +async function printSPLBalance ( + connection: Connection, + mintAddress: PublicKey, + user: PublicKey, + info = "" +) { + const balance = await getSPLBalance(connection, mintAddress, user); + if (balance === null) { + console.log( + `${info ? info + " " : ""}${user.toBase58()}:`, + "No Account Found" + ); + } else { + console.log(`${info ? info + " " : ""}${user.toBase58()}:`, balance); + } +}; + diff --git a/src/grpc_intro_projects/grpc-raydium-trades/README.md b/src/grpc_intro_projects/grpc-raydium-trades/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/grpc_intro_projects/grpc-raydium-trades/src/constants/constants.ts b/src/grpc_intro_projects/grpc-raydium-trades/src/constants/constants.ts new file mode 100644 index 0000000..4b1c18d --- /dev/null +++ b/src/grpc_intro_projects/grpc-raydium-trades/src/constants/constants.ts @@ -0,0 +1,11 @@ +import { logger, retrieveEnvVariable } from "../../../../utils"; +import { + Commitment + } from "@solana/web3.js"; +export const NETWORK = 'mainnet-beta'; +export const COMMITMENT_LEVEL: Commitment = retrieveEnvVariable('COMMITMENT_LEVEL', logger) as Commitment; +export const RPC_ENDPOINT = retrieveEnvVariable('MAINNET_ENDPOINT', logger); +export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable('WS_MAINNET_ENDPOINT', logger); +export const GRPC_XTOKEN = retrieveEnvVariable('GRPC_XTOKEN', logger); +export const GRPC_URL = retrieveEnvVariable('GRPC_URL', logger); +export const LOG_LEVEL = retrieveEnvVariable('LOG_LEVEL', logger); \ No newline at end of file diff --git a/src/grpc_intro_projects/grpc-raydium-trades/src/constants/index.ts b/src/grpc_intro_projects/grpc-raydium-trades/src/constants/index.ts new file mode 100644 index 0000000..c7582ff --- /dev/null +++ b/src/grpc_intro_projects/grpc-raydium-trades/src/constants/index.ts @@ -0,0 +1 @@ +export * from "./constants" \ No newline at end of file diff --git a/src/grpc_intro_projects/grpc-raydium-trades/src/streaming/stream-trades.ts b/src/grpc_intro_projects/grpc-raydium-trades/src/streaming/stream-trades.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/grpc_intro_projects/grpc-raydium-trades/src/utils/index.ts b/src/grpc_intro_projects/grpc-raydium-trades/src/utils/index.ts new file mode 100644 index 0000000..d90cdf8 --- /dev/null +++ b/src/grpc_intro_projects/grpc-raydium-trades/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './utils'; +export * from './logger'; \ No newline at end of file diff --git a/src/grpc_intro_projects/grpc-raydium-trades/src/utils/logger.ts b/src/grpc_intro_projects/grpc-raydium-trades/src/utils/logger.ts new file mode 100644 index 0000000..393068e --- /dev/null +++ b/src/grpc_intro_projects/grpc-raydium-trades/src/utils/logger.ts @@ -0,0 +1,17 @@ +import pino from "pino"; + +const transport = pino.transport({ + target: 'pino-pretty', +}); + +export const logger = pino( + { + level: 'info', + redact: ['poolKeys'], + serializers: { + error: pino.stdSerializers.err, + }, + base: undefined, + }, + transport, +); diff --git a/src/grpc_intro_projects/grpc-raydium-trades/src/utils/utils.ts b/src/grpc_intro_projects/grpc-raydium-trades/src/utils/utils.ts new file mode 100644 index 0000000..0d22abd --- /dev/null +++ b/src/grpc_intro_projects/grpc-raydium-trades/src/utils/utils.ts @@ -0,0 +1,70 @@ +import { Logger } from 'pino'; +import dotenv from 'dotenv'; +import fs from "fs"; +import { Keypair, LAMPORTS_PER_SOL } from '@solana/web3.js'; +import { Connection } from '@solana/web3.js'; +import { PublicKey } from '@solana/web3.js'; +import { getAssociatedTokenAddressSync } from '@solana/spl-token'; +dotenv.config(); + +export const retrieveEnvVariable = (variableName: string, logger: Logger) => { + const variable = process.env[variableName] || ''; + if (!variable) { + logger.error(`${variableName} is not set`); + process.exit(1); + } + return variable; +}; + +export function getKeypairByJsonPath(jsonPath: string): any { + try { + const keypairJson = fs.readFileSync(jsonPath, "utf-8"); + const data = JSON.parse(keypairJson); + const mintKeypair = Keypair.fromSecretKey(Uint8Array.from(data)); + return mintKeypair + } catch (e) { + console.log(e); + } +} +export async function printSOLBalance ( + connection: Connection, + pubKey: PublicKey, + info = "" +) { + const balance = await connection.getBalance(pubKey); + console.log( + `${info ? info + " " : ""}${pubKey.toBase58()}:`, + balance / LAMPORTS_PER_SOL, + `SOL` + ); +}; + +export async function getSPLBalance ( + connection: Connection, + mintAddress: PublicKey, + pubKey: PublicKey, + allowOffCurve = false +) { + try { + let ata = getAssociatedTokenAddressSync(mintAddress, pubKey, allowOffCurve); + const balance = await connection.getTokenAccountBalance(ata, "processed"); + return balance.value.uiAmount; + } catch (e) {} + return null; +}; +async function printSPLBalance ( + connection: Connection, + mintAddress: PublicKey, + user: PublicKey, + info = "" +) { + const balance = await getSPLBalance(connection, mintAddress, user); + if (balance === null) { + console.log( + `${info ? info + " " : ""}${user.toBase58()}:`, + "No Account Found" + ); + } else { + console.log(`${info ? info + " " : ""}${user.toBase58()}:`, balance); + } +}; \ No newline at end of file diff --git a/src/pumpfunsdk/README.md b/src/pumpfunsdk/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/raydium/Pool/fetch_pool.ts b/src/raydium/Pool/fetch_pool.ts index 4fbdba5..bb38f8b 100644 --- a/src/raydium/Pool/fetch_pool.ts +++ b/src/raydium/Pool/fetch_pool.ts @@ -73,3 +73,4 @@ export async function fetchLPToken(tokenAddress:string) { } //fetchLPToken("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP"); +//fetchAMMPoolId("ukHH6c7mMyiWCf1b9pnWe25TSpkDDt3H5pQZgZ74J82") \ No newline at end of file diff --git a/src/trading_dev/README.md b/src/trading_dev/README.md new file mode 100644 index 0000000..e69de29 From 7d271f5f9ea9095469644f0ab95b6243df50a198 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 15 Sep 2024 10:51:47 +0800 Subject: [PATCH 088/140] Update README.md --- src/grpc_streaming_dev/grpc-pf-sniper/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/grpc_streaming_dev/grpc-pf-sniper/README.md b/src/grpc_streaming_dev/grpc-pf-sniper/README.md index 8a125a2..0fd3e9d 100644 --- a/src/grpc_streaming_dev/grpc-pf-sniper/README.md +++ b/src/grpc_streaming_dev/grpc-pf-sniper/README.md @@ -2,14 +2,14 @@ ## Overview -A sniper bot that uses gRPC streaming to monitor and interact with Pump.fun's create token's txns. It's designed to quickly detect and trade new tokens or specific target tokens on pump.fun +A sniper bot that uses gRPC streaming to stream the new txns from mint authority of Pump.fun. It's designed to quickly detect and trade new any tokens or target new token on pump.fun ## How it works - It uses the geyser grpc plugin that subscribe all the latest slot that receive from the grpc server. - It basically only consider the slot or block in "processed" commitment level to make sure the request can land in the next block or next few block(what we expected). -- Use a grpc subscription to subscribe the transactions that including the solana account of the Pump.fun Token Mint Authority and listen for the mint event (https://solscan.io/account/TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM). +- Use a grpc subscription to subscribe the transactions that includes the solana account of the Pump.fun Token Mint Authority and listen for the mint event (https://solscan.io/account/TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM). - Once the mint event is detected, it will send a snipe transaction to snipe the token! - it uses SOL for settlement, buy using SOL, sell for SOL. From 89e76529dbb0c9aa7066108c5e79d7635dc6cfa1 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 15 Sep 2024 10:52:02 +0800 Subject: [PATCH 089/140] Update README.md --- src/grpc_streaming_dev/grpc-pf-sniper/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grpc_streaming_dev/grpc-pf-sniper/README.md b/src/grpc_streaming_dev/grpc-pf-sniper/README.md index 0fd3e9d..0abfaf9 100644 --- a/src/grpc_streaming_dev/grpc-pf-sniper/README.md +++ b/src/grpc_streaming_dev/grpc-pf-sniper/README.md @@ -2,7 +2,7 @@ ## Overview -A sniper bot that uses gRPC streaming to stream the new txns from mint authority of Pump.fun. It's designed to quickly detect and trade new any tokens or target new token on pump.fun +A sniper bot that uses gRPC streaming to stream the new txns from mint authority of Pump.fun. It's designed to quickly detect and trade any new tokens or target new token on pump.fun ## How it works From dc524d1af414561c9008f52c224090005107a6d5 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 15 Sep 2024 10:53:20 +0800 Subject: [PATCH 090/140] Update README.md --- src/grpc_streaming_dev/grpc-pf-sniper/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/grpc_streaming_dev/grpc-pf-sniper/README.md b/src/grpc_streaming_dev/grpc-pf-sniper/README.md index 0abfaf9..0e35f4b 100644 --- a/src/grpc_streaming_dev/grpc-pf-sniper/README.md +++ b/src/grpc_streaming_dev/grpc-pf-sniper/README.md @@ -11,7 +11,7 @@ A sniper bot that uses gRPC streaming to stream the new txns from mint authority - Use a grpc subscription to subscribe the transactions that includes the solana account of the Pump.fun Token Mint Authority and listen for the mint event (https://solscan.io/account/TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM). - Once the mint event is detected, it will send a snipe transaction to snipe the token! -- it uses SOL for settlement, buy using SOL, sell for SOL. +- it uses SOL for trading. ## Prerequisites @@ -25,7 +25,7 @@ A sniper bot that uses gRPC streaming to stream the new txns from mint authority - streaming/pump.fun.ts: subscribing any pump.fun create token's txns of newest block in processed level -- src/jito/bundle.ts: sending the bundle with tips to jito +- src/jito/bundle.ts: sending the bundle with tips to jito blockengine - src/transaction/transaction.ts: main functions of createAndBuy, buy, and sell From e4afa3e544ee46dbc55cc770144dc26c82726091 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 15 Sep 2024 10:55:01 +0800 Subject: [PATCH 091/140] Update README.md --- src/grpc_streaming_dev/grpc-copy-bot/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/grpc_streaming_dev/grpc-copy-bot/README.md b/src/grpc_streaming_dev/grpc-copy-bot/README.md index c666fc6..43f2a47 100644 --- a/src/grpc_streaming_dev/grpc-copy-bot/README.md +++ b/src/grpc_streaming_dev/grpc-copy-bot/README.md @@ -2,7 +2,7 @@ ## Overview -A copy trading bot that uses gRPC streaming to monitor and interact with a target trader's swap txns. It's designed to quickly detect and trade the target trader's swap txns. +A copy trading bot that uses gRPC to stream target trader's swap txns. It's designed to quickly detect and trade the target trader's Raydium swap txns. ## How it works @@ -15,7 +15,7 @@ A copy trading bot that uses gRPC streaming to monitor and interact with a targe ## Limitations - It only works on raydium swap transactions now. -- It uses WSOL for settlement, buy using WSOL and sell for WSOL. +- It uses WSOL. ## Prerequisites From e7fd46ac875f75eb71a827363d5ee411260b2944 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 15 Sep 2024 10:55:15 +0800 Subject: [PATCH 092/140] Update README.md --- src/grpc_streaming_dev/grpc-pf-sniper/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grpc_streaming_dev/grpc-pf-sniper/README.md b/src/grpc_streaming_dev/grpc-pf-sniper/README.md index 0e35f4b..9de15f9 100644 --- a/src/grpc_streaming_dev/grpc-pf-sniper/README.md +++ b/src/grpc_streaming_dev/grpc-pf-sniper/README.md @@ -2,7 +2,7 @@ ## Overview -A sniper bot that uses gRPC streaming to stream the new txns from mint authority of Pump.fun. It's designed to quickly detect and trade any new tokens or target new token on pump.fun +A sniper bot that uses gRPC to stream the new txns from mint authority of Pump.fun. It's designed to quickly detect and trade any new tokens or target new token on pump.fun ## How it works From ac2719d83f8a88f821b0cd76a5b0363e5517c564 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Mon, 16 Sep 2024 09:26:41 +0800 Subject: [PATCH 093/140] fix GRPC_XTOKEN issue --- .../grpc-pf-sniper/src/constants/constants.ts | 1 + src/helpers/.env.copy | 2 +- src/helpers/utils.ts | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/grpc_streaming_dev/grpc-pf-sniper/src/constants/constants.ts b/src/grpc_streaming_dev/grpc-pf-sniper/src/constants/constants.ts index 7cfa46b..f0145d9 100644 --- a/src/grpc_streaming_dev/grpc-pf-sniper/src/constants/constants.ts +++ b/src/grpc_streaming_dev/grpc-pf-sniper/src/constants/constants.ts @@ -7,6 +7,7 @@ export const COMMITMENT_LEVEL: Commitment = retrieveEnvVariable('COMMITMENT_LEVE export const RPC_ENDPOINT = retrieveEnvVariable('MAINNET_ENDPOINT', logger); export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable('WS_MAINNET_ENDPOINT', logger); export const GRPC_XTOKEN = retrieveEnvVariable('GRPC_XTOKEN', logger); +console.log('GRPC_XTOKEN: ', GRPC_XTOKEN); export const GRPC_URL = retrieveEnvVariable('GRPC_URL', logger); export const LOG_LEVEL = retrieveEnvVariable('LOG_LEVEL', logger); export const PRIVATE_KEY = retrieveEnvVariable('PRIVATE_KEY', logger); diff --git a/src/helpers/.env.copy b/src/helpers/.env.copy index f5004dd..6f26b57 100644 --- a/src/helpers/.env.copy +++ b/src/helpers/.env.copy @@ -19,7 +19,7 @@ BLOXROUTE_AUTH_HEADER = "BLOXROUTE_AUTH_HEADER" # to get, go to https://docs.blo # for grpc development COMMITMENT_LEVEL=confirmed -GRPC_XTOKEN=09644c06-7573-4231-9d99-f9bf54341e7b # just a example,the shyft one is good enough +GRPC_XTOKEN="" # you can fill this with your token, or leave it empty depends on the provider GRPC_URL="https://grpc.fra.shyft.to" # just a example, you can use another one or another grpc provider LOG_LEVEL=info BLOCK_ENGINE_URL=tokyo.mainnet.block-engine.jito.wtf diff --git a/src/helpers/utils.ts b/src/helpers/utils.ts index d5961b7..ff8f791 100644 --- a/src/helpers/utils.ts +++ b/src/helpers/utils.ts @@ -12,6 +12,7 @@ export const TOKEN_PROGRAM_ID = new PublicKey( ); export const retrieveEnvVariable = (variableName: string, logger: Logger) => { const variable = process.env[variableName] || ""; + if(variableName === "GRPC_XTOKEN") return variable; if (!variable) { logger.error(`${variableName} is not set`); process.exit(1); From 52ad43482e027a37645985959b6d504ca7a1cd40 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 17 Sep 2024 10:40:24 +0800 Subject: [PATCH 094/140] Update README.md --- src/grpc_streaming_dev/grpc-pf-sniper/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grpc_streaming_dev/grpc-pf-sniper/README.md b/src/grpc_streaming_dev/grpc-pf-sniper/README.md index 9de15f9..3396a58 100644 --- a/src/grpc_streaming_dev/grpc-pf-sniper/README.md +++ b/src/grpc_streaming_dev/grpc-pf-sniper/README.md @@ -2,7 +2,7 @@ ## Overview -A sniper bot that uses gRPC to stream the new txns from mint authority of Pump.fun. It's designed to quickly detect and trade any new tokens or target new token on pump.fun +A sniper bot uses gRPC to stream the new txns from mint authority of Pump.fun. It's designed to quickly detect and trade any new tokens or target new token on pump.fun ## How it works From 5e63aa35940b2d9c9602972ce579ea4edd020e79 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 17 Sep 2024 10:40:46 +0800 Subject: [PATCH 095/140] Update README.md --- src/grpc_streaming_dev/grpc-copy-bot/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grpc_streaming_dev/grpc-copy-bot/README.md b/src/grpc_streaming_dev/grpc-copy-bot/README.md index 43f2a47..db541be 100644 --- a/src/grpc_streaming_dev/grpc-copy-bot/README.md +++ b/src/grpc_streaming_dev/grpc-copy-bot/README.md @@ -2,7 +2,7 @@ ## Overview -A copy trading bot that uses gRPC to stream target trader's swap txns. It's designed to quickly detect and trade the target trader's Raydium swap txns. +A copy trading bot uses gRPC to stream target trader's swap txns. It's designed to quickly detect and trade the target trader's Raydium swap txns. ## How it works From 77af9c082bc8456b4a1106b6e66bdd498bc4b926 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 11:52:22 +0800 Subject: [PATCH 096/140] Update README.md --- README.md | 113 ------------------------------------------------------ 1 file changed, 113 deletions(-) diff --git a/README.md b/README.md index 12a9ace..df98acb 100644 --- a/README.md +++ b/README.md @@ -203,119 +203,6 @@ - src/helpers/check_balance.js: check the balance of a given token in your wallet -## Project Structure - -```sh -.solana-memecoin-cli -├── data -| ├── Image_file # store image file (jpeg, jpg,...) -| ├── metadata_file # store .json file about the token metadata -| ├── payer_keypair # store wallet keypair .json -| └── token_keypair # store token keypair .json -├── examples (Screenshots of Commands) # all screenshot to show how we use the command line tool -| ├── add_liquidity # see how to add liquidity to a pool on Raydium -| ├── burn_token # see how to burn a token with WSOL using Raydium swap -| ├── create_token # see how to create a SPL token on mainnet or devnet -| ├── buy_token # buy a token using raydium with both jito bundles and priority fees -| ├── create_token # create a token with 0% extra fees on solana (mainnet or devnet) -| ├── remove_liquidity # remove some liquidity from a pool on Raydium -| ├── boost_volume # boost the volume of a token on raydium -| ├── pump_createAndInitialBuy # create and initial buy token on pump.fun -| ├── pump_buy # buy token on pump.fun -| ├── pump_sell # sell token on pump.fun -| └── sell_token # sell the token with a percentage using Raydium swap -└── src - ├── helpers - │ ├── .env - │ ├── .env.copy - │ ├── check_balance.js - │ ├── config.js - │ ├── unwrap_sol.js - │ ├── util.js - │ └── wrap_sol.js - ├── Trading_dev - │ ├── dex - │ │ ├── meteora - │ │ │ ├── swap.js - │ │ │ ├── buy.js - │ │ │ ├── sell.js - │ │ │ ├── constants.js - │ │ │ ├── fetch-pool.js - │ │ │ ├── fetch-price.js - │ │ │ └── idl.js - │ │ └── orca - │ │ └── #same as meteora/raydium - │ └── memecoin_trading_strategies/ - │ ├── copy-trading/ - │ │ ├── copy-buy.js - │ │ ├── copy-sell.js - │ │ ├── copy-trade.js - │ │ └── grpc-copy-bot/ - │ └── tp_sl - │ ├── stop-loss.js - │ └── take-profit.js - ├── Memecoin_dev - │ ├── bundled_launcher - │ ├── market-making_dev/ - │ │ └── boost_volume.js - │ └── sniping_dev - │ ├── grpc_pump_sniper/ - │ └── grpc_raydium_sniper/ - ├── Transactions - │ ├── bloXroute_tips_tx_executor.js - │ ├── jito_tips_tx_executor.js - │ └── simple_tx_executor.js - ├── Token - │ ├── zk-compression/ - │ ├── burn.js - │ ├── create.js - │ └── revoke_authority.js - ├── raydium - │ ├── Pool/ - │ │ ├── add_pool.js - │ │ ├── create_pool.js - │ │ ├── fetch_pool.js - │ │ ├── formatAmmKeysById.js - │ │ ├── query_pool.js - │ │ ├── remove_pool.js - │ │ └── swap.js - │ ├── token-filters - │ │ ├── lp-burn.js - │ │ ├── maker-count.js - │ │ ├── marketcap.js - │ │ ├── pool-sol.js - │ │ ├── tx-count.js - │ │ └── volume.js - │ ├── buy.js - │ ├── constants.js - │ ├── fetch-price.js - │ ├── raydium_config.js - │ └── sell.js - ├── jupiter - │ ├── swap/ - │ │ ├── buy-helper.js - │ │ ├── sell-helper.js - │ │ └── swap-helper.js - │ ├── dca.js - │ └── limit-order.js - └── pumpfunsdk - ├── pump-keypair/ - └── pumpdotfun-sdk - ├── images/ - └── src - ├── IDL/ - ├── pump-events-listener/ - │ └── listeners.js - ├── amm.js - ├── buy.js - ├── createAndBuy.js - ├── pumpfun.js - ├── sell.js - ├── tools.js - └── util.js - -``` - ## Contributing - Contributions is wellcome!!! From 0ae54a394c0e5dd3d28f624f2d90dc4ed627e28b Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 14:11:22 +0800 Subject: [PATCH 097/140] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index df98acb..e4ef0fb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ [🔗doc](https://outsmartchad.github.io/solana-trading-cli/) - +## High-Performance Solana trading Bot +A open-sourced, free, low-latency trading bot designed for developing your own trading bot. It provides swap functions of multiple dexes, and uses low-latency infrastructures like Jito and BloXroute to minimize the time it takes to execute trades, as well as the real-time metric of the liquidity pool. + ## Main Features - Create your own Solana **_SPL tokens_** on mainnet | Pump.fun From 53bd93ceafb296188d850e9248208b5f2ce31f02 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 14:32:37 +0800 Subject: [PATCH 098/140] Update README.md --- README.md | 67 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index e4ef0fb..6723da9 100644 --- a/README.md +++ b/README.md @@ -163,47 +163,76 @@ A open-sourced, free, low-latency trading bot designed for developing your own t # Code Usage -## Token: +## Raydium/Orca/Meteora as dex: -- src/Token/create.js: create a spl token on devnet or mainnet with a given name, symbol, token image(using irys decentralized storage), metadata json file, supply, decimals, the code by default revokes the mint authority and freeze authority after creating the token so that the token has a cap and no one can feeze the token of the token holder, it will then mint all the token to your wallet +- src/dex/sell_helper.ts: selling spl token to SOL using the dex swap function (use WSOL in Raydium, SOL in Orca/Meteora) -- src/Token/burn.js: burn spl token with a given percentage of the token from your wallet +- src/dex/buy_helper.ts: buying spl token using SOL using dex swap function (use WSOL in Raydium, SOL in Orca/Meteora) -- src/Token/revoke_authority.js: revoke mint and freeze authority of a given token +- src/dex/fetch-price.ts: fetch the current price of a token -## Trading: +- src/dex/Pool/swap.ts: swap function for buy/sell/swap token -- src/Trading/dex/raydium/sell.js: selling spl token for SOL in your wallet using raydium dex swap function +- src/dex/Pool/fetch_pool.ts: fetch the current address of a liquidity pool -- src/Trading/dex/raydium/buy.js: buying spl token using SOL in your wallet using raydium dex swap function +- src/dex/token-filters/lp-burn.ts: fetch current burn percentage of liquidity pool token -- src/Trading/volume/boost_volume.js: boost the volume of a token by creating a buy and sell order in just one transaction in a way to avoid possible MEV +- src/dex/token-filters/marketcap.ts: fetch current market cap of a token + +- src/dex/token-filters/pool-sol.ts: fetch current SOL reserver in a liquidity pool + +- src/dex/token-filters/volume.ts: fetch current/historical volume of a liquidity pool + +## Jupiter + +- src/jupiter/swap/*.ts: helper functions for swap/sell/buy using Jupiter + +- src/jupiter/buy.ts: buy a token using Jupiter (using SOL) + +- src/jupiter/sell.ts: sell a token using Jupiter (using SOL) + +- src/jupiter/fetch-price.ts: fetch the current price of a token + +## gRPC bots + +- src/grpc_streaming_dev/grpc-copy-bot: first grpc copy trading bot on Raydium + +- src/grpc_streaming_dev/grpc-pf-sniper: first, fastest grpc sniper bot on Pump.fun + +- src/grpc_streaming_dev/grpc-raydium-sniper: fastest grpc sniper bot on raydium for sniping pump.fun-migrated token or raydium-launched token + +## gRPC projects for beginner: + +- src/grpc_intro_projects/grpc-pool-price: grpc bot for streaming the pool price on Raydium + +- src/grpc_intro_projects/grpc-raydium-trades: grpc bot for streaming the trades on Raydium + +- src/grpc_intro_projects/grpc-jupiter-trades: grpc bot for streaming the trades on Jupiter -- src/Trading/memecoin_trading_strategies/copy-trading/copy-trade.js: copy trading program to follow a user-defined wallet address to auto-buy&sell ## Transactions: -- src/Transactions/jito_tips_tx_executor.js: execute the transaction by sending the bundles to Jito validators, they help us to land the transaction to the Solana blockchain faster than just using priority fee. +- src/transactions/jito_tips_tx_executor.ts: execute the transaction by sending the bundles to Jito validators, they help us to land the transaction to the Solana blockchain faster than just using priority fee. -- src/Transactions/simple_tx_executor.js: execute the transaction by sending the request to the Solana blockchain with a given priority gas fee. +- src/transactions/bloXroute_tips_tx_executor.ts: execute the transaction by sending the transaction to bloXroute node, they help us to prevent MEV and forward the transaction to current/next few block leaders for faster execution. -## Pool: +- src/transactions/simple_tx_executor.ts: execute the transaction by sending the request to the Solana blockchain with a given priority gas fee. -- src/Pool/add_pool.js: add liquidity to a pool in a given token address, the code find the most liquid pool (TOKEN_ADDRESS/SOL) in the raydium dex and add liquidity to it. You need to specify the amount of liquidity(sol) you want to add. +## token: -- src/Pool/remove_pool.js: remove liquidity from a pool in a given token address, the code find the most liquid pool (TOKEN_ADDRESS/SOL) in the raydium dex and remove liquidity from it. You need to specify the amount of percentage of liquidity you want to remove. +- src/token/create.ts: create a spl token on devnet or mainnet with a given name, symbol, token image(using irys decentralized storage), metadata json file, supply, decimals, the code by default revokes the mint authority and freeze authority after creating the token so that the token has a cap and no one can feeze the token of the token holder, it will then mint all the token to your wallet -- src/Pool/swap.js: swap token for another token in the raydium dex, src/Trading/dex/raydium/buy.js and src/Trading/dex/raydium/sell.js are based on this code. +- src/token/burn.ts: burn spl token with a given percentage of the token from your wallet -- src/Pool/query_pool.js: query the pool information of a given pool address in the raydium dex, it use shyft api to get the pool information. Please make sure you have your shyft api key inside the code before running this code. +- src/token/revoke_authority.ts: revoke mint and freeze authority of a given token ## Helper methods: -- src/helpers/config.js: configuration file for the code. +- src/helpers/config.ts: configuration file for the code. -- src/helpers/util.js: utility functions for the code, including: send transactions to Solana blockchain, dropped transactions handling, etc. +- src/helpers/util.ts: utility functions for the code, including: send transactions to Solana blockchain, dropped transactions handling, etc. -- src/helpers/check_balance.js: check the balance of a given token in your wallet +- src/helpers/check_balance.ts: check the balance of a given token in your wallet ## Contributing From ad0c6abf9413a60d4fb79619180f6a157c49a2b0 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 14:35:41 +0800 Subject: [PATCH 099/140] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6723da9..81b87ba 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ A open-sourced, free, low-latency trading bot designed for developing your own t 1. Add your mainnet wallet secret key(must), devnet wallet secret key (optional), RPC endpoint(must) and shyft api key(optional) 2. rename the .env.copy file to .env -## Usage ✅: +# Documentation ### Developer CLI: From 84b73aef058083b7b810268ac7891b3f65c2fb0b Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 14:36:18 +0800 Subject: [PATCH 100/140] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 81b87ba..ec4f036 100644 --- a/README.md +++ b/README.md @@ -77,9 +77,7 @@ A open-sourced, free, low-latency trading bot designed for developing your own t - **More Strategies** for Trading dev - more features to come... -# Commands (Please see the command examples in examples/ to get start~) - -### payer options is by default use the private key in .env file, but you can also specify the path to the secret key if you want to use another wallet +# Commands 1. Specify the token symbol, name, mint keypair(optional, will help u to generate), supply, decimals, path to metadata json file, path to image file, the cluster you want to use, and the file type(png, jpg, jpeg). From 90d6cdf5ece9da40ea204cc39dd56b0bb974b88e Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 14:37:59 +0800 Subject: [PATCH 101/140] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec4f036..6c2b317 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [🔗doc](https://outsmartchad.github.io/solana-trading-cli/) ## High-Performance Solana trading Bot -A open-sourced, free, low-latency trading bot designed for developing your own trading bot. It provides swap functions of multiple dexes, and uses low-latency infrastructures like Jito and BloXroute to minimize the time it takes to execute trades, as well as the real-time metric of the liquidity pool. +A open-sourced, free, low-latency trading bot designed for developing your own trading bot. It provides swap functions of multiple dexes, and uses low-latency infrastructures like Jito and BloXroute to minimize the time it takes to execute trades, as well as fetch the real-time metric of the liquidity pool. ## Main Features From f482b4c2435620f90bf109977142e9a7bab6776c Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 14:41:49 +0800 Subject: [PATCH 102/140] updated src/raydium/Pool/swap.ts --- src/raydium/Pool/swap.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/raydium/Pool/swap.ts b/src/raydium/Pool/swap.ts index adc8d64..827694f 100644 --- a/src/raydium/Pool/swap.ts +++ b/src/raydium/Pool/swap.ts @@ -95,11 +95,8 @@ async function swapOnlyAmm(input: any) { recentBlockhash: latestBlockhash.blockhash, instructions: [ ...[ - ComputeBudgetProgram.setComputeUnitPrice({ - microLamports: 305290, - }), ComputeBudgetProgram.setComputeUnitLimit({ - units: 312750, + units: 70000, }), ], ...(input.side === "buy" From 7b62e4242f760e76ecc76dd9f884023de3666f81 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 14:44:48 +0800 Subject: [PATCH 103/140] updated src/raydium/Pool/swap.ts --- src/raydium/Pool/swap.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/raydium/Pool/swap.ts b/src/raydium/Pool/swap.ts index 827694f..3c34afd 100644 --- a/src/raydium/Pool/swap.ts +++ b/src/raydium/Pool/swap.ts @@ -183,11 +183,8 @@ async function swapOnlyAmmUsingBloXRoute(input: any) { const latestBlockhash = await connection.getLatestBlockhash(); let tx = new Transaction(); tx.add( - ComputeBudgetProgram.setComputeUnitPrice({ - microLamports: 305290, - }), ComputeBudgetProgram.setComputeUnitLimit({ - units: 312750, + units: 70000, }), ...(input.side === "buy" ? [ @@ -235,9 +232,6 @@ export async function swapForVolume(tokenAddr: string, sol_per_order: number) { ComputeBudgetProgram.setComputeUnitLimit({ units: 70000, }), - ComputeBudgetProgram.setComputeUnitPrice({ - microLamports: 90000, - }), ], ...sell_instruction.instructions, ...buy_instruction.instructions, From 8dd9a0019c9fd9b6351dc5fa368f12906b5ea065 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 14:53:18 +0800 Subject: [PATCH 104/140] updated src/raydium/buy.ts & sell.ts from --token_address to --token --- src/raydium/buy.ts | 9 ++++----- src/raydium/sell.ts | 8 ++++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/raydium/buy.ts b/src/raydium/buy.ts index 1541c02..2c328b1 100644 --- a/src/raydium/buy.ts +++ b/src/raydium/buy.ts @@ -11,25 +11,25 @@ let payer_keypair:any = null, cluster:any = null; program .option("--payer ", "Specify the path to the secret key") - .option("--token_address ", "Specify the token address") + .option("--token ", "Specify the token address") .option("--sol ", "Specify the number of SOL") .option("--cluster ", "Specify the cluster") .option("-h, --help", "display help for command") .action((options) => { if (options.help) { logger.info( - "ts-node buy --token_address --sol " + "ts-node buy --token --sol " ); process.exit(0); } - if (!options.token_address || !options.sol) { + if (!options.token || !options.sol) { console.error("❌ Missing required options"); process.exit(1); } if (options.payer) { payer_keypair = options.payer; } - token_address = options.token_address; + token_address = options.token; sol = options.sol; cluster = options.cluster; }); @@ -50,7 +50,6 @@ async function buy(side:string, address:string, no_of_sol:number, payer:Keypair) payer_wallet = await loadOrCreateKeypair_wallet(payer_keypair); await swap(side, address, no_of_sol, -1, payer_wallet, "trade"); } else { - console.log("here") await swap(side, address, no_of_sol, -1, wallet, "trade"); } } diff --git a/src/raydium/sell.ts b/src/raydium/sell.ts index d0c553e..a4190d0 100644 --- a/src/raydium/sell.ts +++ b/src/raydium/sell.ts @@ -11,25 +11,25 @@ let payer_keypair:any = null, cluster = null; program .option("--payer ", "Specify the path to the secret key") - .option("--token_address ", "Specify the token address") + .option("--token ", "Specify the token address") .option("--percentage ", "Specify the percentage") .option("--cluster ", "Specify the cluster") .option("-h, --help", "display help for command") .action((options:any) => { if (options.help) { logger.info( - "ts-node sell --token_address --percentage " + "ts-node sell --token --percentage " ); process.exit(0); } - if (!options.token_address || !options.percentage) { + if (!options.token || !options.percentage) { console.error("❌ Missing required options"); process.exit(1); } if (options.payer) { payer_keypair = options.payer; } - token_address = options.token_address; + token_address = options.token; percentage = options.percentage; cluster = options.cluster; }); From ce7f8a550f6683fe64226317346a0d38498fdf4d Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 18:43:16 +0800 Subject: [PATCH 105/140] updated a limit order, and tp/sl module --- .../ProfitAndLoss/bought-tokens.json | 3 ++ src/trading_dev/ProfitAndLoss/constants.ts | 4 +- src/trading_dev/ProfitAndLoss/sell-checker.ts | 54 +++++++++++++++++++ src/trading_dev/ProfitAndLoss/utils.ts | 54 +++++++++++++++++++ 4 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 src/trading_dev/ProfitAndLoss/bought-tokens.json create mode 100644 src/trading_dev/ProfitAndLoss/sell-checker.ts diff --git a/src/trading_dev/ProfitAndLoss/bought-tokens.json b/src/trading_dev/ProfitAndLoss/bought-tokens.json new file mode 100644 index 0000000..544b7b4 --- /dev/null +++ b/src/trading_dev/ProfitAndLoss/bought-tokens.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/src/trading_dev/ProfitAndLoss/constants.ts b/src/trading_dev/ProfitAndLoss/constants.ts index e001b60..37dd596 100644 --- a/src/trading_dev/ProfitAndLoss/constants.ts +++ b/src/trading_dev/ProfitAndLoss/constants.ts @@ -5,8 +5,10 @@ import { TOKEN_PROGRAM_ID, } from "@raydium-io/raydium-sdk"; import { PublicKey } from "@solana/web3.js"; +import path from "path"; +export const path_To_bought_tokens = path.join(__dirname, "bought_tokens.json"); export const tp = retrieveEnvVariable("TAKE_PROFIT", logger); -export const sl = retrieveEnvVariable("STOP_LOSS", logger); +export const sl = retrieveEnvVariable("STOP_LOSS", logger); export const wsol = "So11111111111111111111111111111111111111112" export const usdc = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" export const quoteToken = [ diff --git a/src/trading_dev/ProfitAndLoss/sell-checker.ts b/src/trading_dev/ProfitAndLoss/sell-checker.ts new file mode 100644 index 0000000..84455a7 --- /dev/null +++ b/src/trading_dev/ProfitAndLoss/sell-checker.ts @@ -0,0 +1,54 @@ +import { deleteBoughtTokens, getSPLTokenBalance, loadBoughtTokens, logExitPrice, readBoughtTokens, writeBoughtTokens} from "./utils"; +import {checkStopLoss } from "./stop-loss" +import { checkTakeProfit } from "./take-profit"; +import {retriveWalletState, writeLineToLogFile} from "./utils"; +import { logger, retrieveEnvVariable } from "../../utils"; +import {wsol, path_To_bought_tokens} from "./constants" +import {connection, wallet} from "../../helpers/config"; +import { sell } from "../../raydium/sell_helper"; +import Decimal from "decimal.js"; +import { PublicKey, SYSVAR_EPOCH_SCHEDULE_PUBKEY } from "@solana/web3.js"; +let boughtTokens:string[] = [], currentOurWalletState = {}; + +async function checkIsPricesHitTPorSL(){ + + + try{ + if(boughtTokens.length > 0){ + + for(let i=0; i0){ // check if already bought + const balance = await getSPLTokenBalance(connection, new PublicKey(token), wallet.publicKey); // check if still holding the token + if(balance > 0) { + logger.info(`selling ${token}...`); + writeLineToLogFile(`selling ${token}...`); + sell("sell", token, 100, wallet); + + } + } + } + } + }catch(err){ + console.log(err); + + } + +} +export async function main() { + logger.info("Starting sell..."); + while (true) { + boughtTokens = await loadBoughtTokens(path_To_bought_tokens); + + // Run both check functions concurrently + await Promise.all([ + checkIsPricesHitTPorSL().then(() => new Promise(resolve => setTimeout(resolve, 3000))), + ]); + + // If you want a consistent delay after both checks are complete, you can add it here + // await new Promise(resolve => setTimeout(resolve, 1000)); + } +} +main(); \ No newline at end of file diff --git a/src/trading_dev/ProfitAndLoss/utils.ts b/src/trading_dev/ProfitAndLoss/utils.ts index 76ec1b3..0084bb7 100644 --- a/src/trading_dev/ProfitAndLoss/utils.ts +++ b/src/trading_dev/ProfitAndLoss/utils.ts @@ -2,11 +2,62 @@ import * as fs from 'fs/promises'; import fetch from 'cross-fetch'; import {sl, tp, wsol} from "./constants" import Decimal from 'decimal.js'; +import { Connection, PublicKey } from "@solana/web3.js"; +import {connection} from "../../helpers/config"; import {getCurrentMarketCap, getDayVolume, getCurrentSolInPool } from "../../raydium/token-filters"; import {initSdk} from "../../raydium/raydium_config" +import { getAssociatedTokenAddressSync, TOKEN_PROGRAM_ID } from '@solana/spl-token'; import {fetchAMMPoolId} from "../../raydium/Pool/fetch_pool" import {logger} from "../../utils" +import path from "path"; let sdkCache = {sdk: null, expiry: 0} +const log_path = path.join(__dirname, "info.log"); +export async function retriveWalletState(wallet_address: string) { + try{ + const filters = [ + { + dataSize: 165, //size of account (bytes) + }, + { + memcmp: { + offset: 32, //location of our query in the account (bytes) + bytes: wallet_address, //our search criteria, a base58 encoded string + }, + }, + ]; + const accounts = await connection.getParsedProgramAccounts( + TOKEN_PROGRAM_ID, //new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") + { filters: filters } + ); + let results:any = {}; + const solBalance = await connection.getBalance(new PublicKey(wallet_address)); + accounts.forEach((account:any, i:any) => { + //Parse the account data + const parsedAccountInfo = account.account.data; + const mintAddress = parsedAccountInfo["parsed"]["info"]["mint"]; + const tokenBalance = + parsedAccountInfo["parsed"]["info"]["tokenAmount"]["uiAmount"]; + results[mintAddress] = tokenBalance; + }); + results["SOL"] = solBalance / 10 ** 9; + return results || {}; + }catch(e){ + console.log(e) + } + return {}; + } + +export async function getSPLTokenBalance(connection:Connection, tokenAccount:PublicKey, payerPubKey:PublicKey) { + try{ + const address = getAssociatedTokenAddressSync(tokenAccount, payerPubKey); + const info = await connection.getTokenAccountBalance(address, "finalized"); + if (info.value.uiAmount == null) throw new Error("No balance found"); + return info.value.uiAmount; + }catch(err:any){ + logger.error(`Errr when checking token balance...`) + } + return 0; +} export async function loadBoughtTokens(path_To_bought_tokens:string) { try { let boughtTokens:any = []; @@ -199,6 +250,9 @@ export async function getCurrentPriceRaydium(tokenAddress:string, path_To_bought }catch(e){ logger.error(`Error when getting current price of ${tokenAddress} `, e) } +} +export async function writeLineToLogFile(logMessage:string){ + fs.appendFile(log_path, `${logMessage}\n`, 'utf8'); } //"tokenA": { // "trader_entry_price": 0.5312, From 221af5c29d847edec25053e76426f57169b9d996 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 19:30:20 +0800 Subject: [PATCH 106/140] write a doc how to use the limit order and tp/sl without any dependencies --- src/helpers/.env.copy | 4 ++ src/trading_dev/ProfitAndLoss/constants.ts | 2 + src/trading_dev/ProfitAndLoss/index.ts | 5 ++ src/trading_dev/ProfitAndLoss/utils.ts | 50 ++++++++++++-------- src/trading_dev/README.md | 54 ++++++++++++++++++++++ 5 files changed, 96 insertions(+), 19 deletions(-) create mode 100644 src/trading_dev/ProfitAndLoss/index.ts diff --git a/src/helpers/.env.copy b/src/helpers/.env.copy index 6f26b57..4dc79db 100644 --- a/src/helpers/.env.copy +++ b/src/helpers/.env.copy @@ -11,8 +11,12 @@ MAINNET_ENDPOINT = "https://mainnet.helius-rpc.com/?api-key== 10000000){ - solPerOrder = 2; - tpPriceDec = ourEntryPriceDec.mul(new Decimal(1).plus(new Decimal(0.05))); - } - if((mc||0) >= 5000000){ - solPerOrder = 1.5 - tpPriceDec = ourEntryPriceDec.mul(new Decimal(1).plus(new Decimal(0.05))); - } - else if((mc||0) >= 1000000){ - solPerOrder = 1; - tpPriceDec = ourEntryPriceDec.mul(new Decimal(1).plus(new Decimal(0.05))); - }else{ - solPerOrder = 0.5; - tpPriceDec = ourEntryPriceDec.mul(new Decimal(1).plus(new Decimal(0.05))); - } + let solPerOrder = order_size; + const poolId = await fetchAMMPoolId(tokenAddress); + // if((mc||0) >= 10000000){ + // solPerOrder = 2; + // tpPriceDec = ourEntryPriceDec.mul(new Decimal(1).plus(new Decimal(0.05))); + // } + // if((mc||0) >= 5000000){ + // solPerOrder = 1.5 + // tpPriceDec = ourEntryPriceDec.mul(new Decimal(1).plus(new Decimal(0.05))); + // } + // else if((mc||0) >= 1000000){ + // solPerOrder = 1; + // tpPriceDec = ourEntryPriceDec.mul(new Decimal(1).plus(new Decimal(0.05))); + // }else{ + // solPerOrder = 0.5; + // tpPriceDec = ourEntryPriceDec.mul(new Decimal(1).plus(new Decimal(0.05))); + // } const tokenObj = { "entry_price": ourEntryPriceDec, @@ -197,6 +199,16 @@ export async function setInitTokenObj(tokenAddress: string, ourEntryPrice: numbe console.log("Init our trade successfully!", tokenObj) await writeBoughtTokens(tokenAddress, tokenObj, path_To_bought_tokens); } + +export async function checkIfHitEntryPrice(tokenAddress:string, path_To_bought_tokens:string){ + const tokenObj = await readBoughtTokens(tokenAddress, path_To_bought_tokens); + const currentPrice = await getCurrentPriceRaydium(tokenAddress, path_To_bought_tokens); + const entryPrice = tokenObj.entry_price; + if(currentPrice <= entryPrice){ + return true; + } + return false; +} export async function getCurrentPriceRaydium(tokenAddress:string, path_To_bought_tokens:string){ try{ // Check if poolId is already set diff --git a/src/trading_dev/README.md b/src/trading_dev/README.md index e69de29..5d54f0f 100644 --- a/src/trading_dev/README.md +++ b/src/trading_dev/README.md @@ -0,0 +1,54 @@ +## Limit Order + +- it depends on the buy in percentage from the .env file + +### HOW TO USE + +```typescript +import { + setInitTokenObj, + checkIfHitEntryPrice, + path_To_bought_tokens, + loadBoughtTokens, + order_size +} from "./trading_dev/ProfitAndLoss"; +import { wallet} from "./helpers/config"; +import { buy } from "./raydium/buy_helper"; + +// create a limit order object locally +async function main() { + + // when your searcher bot finds a token, you can create a limit order object + while(true){ + // logic to find a target token... + // ... + // ... + const tokenAddress = "token address"; + await setInitTokenObj(tokenAddress, path_To_bought_tokens); // successfully create a limit order object in the bought_tokens.json file, please see the implementation of setInitTokenObj() in src/trading_dev/ProfitAndLoss/utils.ts + + } + + // logic to check if the token has hit the entry price, if so, buy the token + while (true) { + const bought_tokens = await loadBoughtTokens(path_To_bought_tokens); + for (const token in bought_tokens) { + const tokenObj = bought_tokens[token]; + if (checkIfHitEntryPrice(tokenObj, path_To_bought_tokens)) { + // buy the token + buy("buy", token, order_size, wallet); + } + } + } +} +``` + +## take profit / stop-loss module + +- it depends on the tp/sl percentage from the .env file + +### HOW TO USE + +```shell +ts-node src/trading_dev/ProfitAndLoss/sell-checker.ts +``` + From 708ec99add1d3a0f5b9fddd0314a683810643451 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 19:31:43 +0800 Subject: [PATCH 107/140] write a doc how to use the limit order and tp/sl without any dependencies --- src/trading_dev/README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/trading_dev/README.md b/src/trading_dev/README.md index 5d54f0f..a707d3b 100644 --- a/src/trading_dev/README.md +++ b/src/trading_dev/README.md @@ -15,8 +15,8 @@ import { import { wallet} from "./helpers/config"; import { buy } from "./raydium/buy_helper"; -// create a limit order object locally -async function main() { +// create a limit order object locally when your searcher bot finds a token +async function searcherLogic() { // when your searcher bot finds a token, you can create a limit order object while(true){ @@ -27,8 +27,10 @@ async function main() { await setInitTokenObj(tokenAddress, path_To_bought_tokens); // successfully create a limit order object in the bought_tokens.json file, please see the implementation of setInitTokenObj() in src/trading_dev/ProfitAndLoss/utils.ts } +} - // logic to check if the token has hit the entry price, if so, buy the token +// check if the token has hit the entry price, if so, buy the token +async function buy_checker(){ while (true) { const bought_tokens = await loadBoughtTokens(path_To_bought_tokens); for (const token in bought_tokens) { From ab4cf7ca2b0fb82783c48569a10635750cf9c24f Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 19:37:28 +0800 Subject: [PATCH 108/140] write a doc how to use the limit order and tp/sl without any dependencies --- src/trading_dev/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/trading_dev/README.md b/src/trading_dev/README.md index a707d3b..f6133b3 100644 --- a/src/trading_dev/README.md +++ b/src/trading_dev/README.md @@ -42,9 +42,10 @@ async function buy_checker(){ } } } + ``` -## take profit / stop-loss module +## take profit / stop-loss - it depends on the tp/sl percentage from the .env file @@ -54,3 +55,4 @@ async function buy_checker(){ ts-node src/trading_dev/ProfitAndLoss/sell-checker.ts ``` +### it will automatically sell the token from the bought_tokens.json if it hits the take profit or stop-loss percentage \ No newline at end of file From 49e0d3a2c57f4b86c2d731338deda8922afebdea Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 19:41:08 +0800 Subject: [PATCH 109/140] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6c2b317..0b3e056 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ A open-sourced, free, low-latency trading bot designed for developing your own t - Fetch the real-time price, lp-burn percentage, pool reserve and market cap of any liquidity pool -- fixed % tp/sl module +- Using the limit order & tp/sl module locally without any dependencies [here](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/trading_dev/README.md) - First Open-Source gRPC pump.fun sniper bot (0.4-2 seconds latency) [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-pf-sniper) From 39e647311b0b3b7d7bc766ead34f74558d00fff8 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 19:41:38 +0800 Subject: [PATCH 110/140] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b3e056..99381a1 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## High-Performance Solana trading Bot A open-sourced, free, low-latency trading bot designed for developing your own trading bot. It provides swap functions of multiple dexes, and uses low-latency infrastructures like Jito and BloXroute to minimize the time it takes to execute trades, as well as fetch the real-time metric of the liquidity pool. -## Main Features +## Key Features - Create your own Solana **_SPL tokens_** on mainnet | Pump.fun From 5083faa581158d8a406a77dd56f5032bfd9b4709 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 19:50:50 +0800 Subject: [PATCH 111/140] write a doc how to use the limit order and tp/sl without any dependencies --- src/trading_dev/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/trading_dev/README.md b/src/trading_dev/README.md index f6133b3..b2f0a67 100644 --- a/src/trading_dev/README.md +++ b/src/trading_dev/README.md @@ -24,7 +24,8 @@ async function searcherLogic() { // ... // ... const tokenAddress = "token address"; - await setInitTokenObj(tokenAddress, path_To_bought_tokens); // successfully create a limit order object in the bought_tokens.json file, please see the implementation of setInitTokenObj() in src/trading_dev/ProfitAndLoss/utils.ts + await setInitTokenObj(tokenAddress, path_To_bought_tokens); // successfully create a limit order object in the bought_tokens.json file, + // before using it, please see the implementation of setInitTokenObj() in src/trading_dev/ProfitAndLoss/utils.ts } } From 939104dbac4f16a2d9c5c45440aaab139c8d7587 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 19:54:52 +0800 Subject: [PATCH 112/140] write a doc how to use the limit order and tp/sl without any dependencies --- src/trading_dev/ProfitAndLoss/sell-checker.ts | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/trading_dev/ProfitAndLoss/sell-checker.ts b/src/trading_dev/ProfitAndLoss/sell-checker.ts index 84455a7..c65f331 100644 --- a/src/trading_dev/ProfitAndLoss/sell-checker.ts +++ b/src/trading_dev/ProfitAndLoss/sell-checker.ts @@ -21,13 +21,32 @@ async function checkIsPricesHitTPorSL(){ let tokenObj = await readBoughtTokens(token, path_To_bought_tokens); const entry_price = tokenObj.entry_price; if(entry_price>0){ // check if already bought - const balance = await getSPLTokenBalance(connection, new PublicKey(token), wallet.publicKey); // check if still holding the token - if(balance > 0) { - logger.info(`selling ${token}...`); - writeLineToLogFile(`selling ${token}...`); - sell("sell", token, 100, wallet); - + + if(await checkTakeProfit(token, path_To_bought_tokens)){ + logger.info(`Take profit price reached for token ${token}`); + writeLineToLogFile(`Take profit price reached for token ${token}`); + const balance = await getSPLTokenBalance(connection, new PublicKey(token), wallet.publicKey); // check if still holding the token + if(balance > 0) { + logger.info(`selling ${token}...`); + writeLineToLogFile(`selling ${token}...`); + sell("sell", token, 100, wallet); // sell all + + } + continue; + } + if(await checkStopLoss(token, path_To_bought_tokens)){ + logger.info(`Stop loss price reached for token ${token}`); + writeLineToLogFile(`Stop loss price reached for token ${token}`); + const balance = await getSPLTokenBalance(connection, new PublicKey(token), wallet.publicKey); // check if still holding the token + if(balance > 0) { + logger.info(`selling ${token}...`); + writeLineToLogFile(`selling ${token}...`); + sell("sell", token, 100, wallet); // sell all + + } } + + } } } From 75890ce28efaacc466dfa461d428b647bd33711d Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Sun, 22 Sep 2024 19:57:00 +0800 Subject: [PATCH 113/140] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 99381a1..beb120a 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ A open-sourced, free, low-latency trading bot designed for developing your own t - Fetch the real-time price, lp-burn percentage, pool reserve and market cap of any liquidity pool -- Using the limit order & tp/sl module locally without any dependencies [here](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/trading_dev/README.md) +- Use the limit order & tp/sl module locally without any dependencies [here](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/trading_dev/README.md) - First Open-Source gRPC pump.fun sniper bot (0.4-2 seconds latency) [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-pf-sniper) From 822f55679c68f08ea0badda85f71c3679ba4eafc Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Mon, 23 Sep 2024 10:07:04 +0800 Subject: [PATCH 114/140] Update README.md --- src/trading_dev/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trading_dev/README.md b/src/trading_dev/README.md index b2f0a67..dc0246c 100644 --- a/src/trading_dev/README.md +++ b/src/trading_dev/README.md @@ -56,4 +56,4 @@ async function buy_checker(){ ts-node src/trading_dev/ProfitAndLoss/sell-checker.ts ``` -### it will automatically sell the token from the bought_tokens.json if it hits the take profit or stop-loss percentage \ No newline at end of file +### it will automatically sell the token from the bought_tokens.json if it hits the take profit or stop-loss price From 984f90485cfe7a7927a0eb96dca53e097515f540 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 24 Sep 2024 16:06:43 +0800 Subject: [PATCH 115/140] update new README.md --- README.md | 317 +++++++++++++++++++++--------------------------------- 1 file changed, 124 insertions(+), 193 deletions(-) diff --git a/README.md b/README.md index 99381a1..a720bc4 100644 --- a/README.md +++ b/README.md @@ -1,238 +1,163 @@ -[🔗doc](https://outsmartchad.github.io/solana-trading-cli/) -## High-Performance Solana trading Bot -A open-sourced, free, low-latency trading bot designed for developing your own trading bot. It provides swap functions of multiple dexes, and uses low-latency infrastructures like Jito and BloXroute to minimize the time it takes to execute trades, as well as fetch the real-time metric of the liquidity pool. - -## Key Features - -- Create your own Solana **_SPL tokens_** on mainnet | Pump.fun - -- Swap tokens on Jupiter, Raydium, Orca, Meteora, and pump.fun - - how to use Jupiter cli & trading functions: [here](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/jupiter/README.md) - - how to use Raydium cli & trading functions: [here](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/raydium/README.md) - - how to use Orca cli & trading functions: [here](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/orca/README.md) - - how to use Meteora cli & trading functions: [here](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/meteora/README.md) - -- land transactions faster using Jito/bloXroute - -- Fetch the real-time price, lp-burn percentage, pool reserve and market cap of any liquidity pool - -- Using the limit order & tp/sl module locally without any dependencies [here](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/trading_dev/README.md) - -- First Open-Source gRPC pump.fun sniper bot (0.4-2 seconds latency) [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-pf-sniper) - -- First Open-Source gRPC copy bot [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-copy-bot) - -- Open-source gRPC Raydium sniper bot [here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-raydium-sniper) - -- **_Got everything needed to create your own trading bot_** - -## Credits +## Table of Contents +- [About](#-about) +- [Key Features](#-key-features) +- [Installation](#-installation) +- [Prerequisites](#-prerequisites) +- [Feedback and Contributions](#-feedback-and-contributions) +- [Credits](#-credits) +- [Disclaimer](#-disclaimer) +- [Documentation](https://outsmartchad.github.io/solana-trading-cli/) -- https://github.com/raydium-io/raydium-sdk-V2 -- https://github.com/rckprtr/pumpdotfun-sdk -- https://github.com/Al366io/solana-transactions-wrapper +## 🚀 About -### Installation 🛠️ +**Solana Trading Client** is a free, highly efficient library designed to facilitate rapid development and deployment of custom trading strategies across multiple Solana decentralized exchanges (DEXs). It emphasizes low-latency performance, flexibility, and real-time data processing, utilizing cutting-edge infrastructure and well-established software design principles. These features ensure the following benefits: -1. `git clone https://github.com/outsmartchad/solana-trading-cli.git` -2. `cd solana-trading-cli` -3. `nvm install` -4. `nvm use` -5. `npm install` -6. `ts-node test.ts` (**Remember to run this to test all the cli script**) +* **Speed:** Leverages low-latency infrastructures like Jito and BloXroute to minimize trade execution times, giving your strategies a competitive edge. +* **Versatility:** Supports multiple DEXs, allowing for diverse trading opportunities and cross-platform arbitrage. +* **Real-time Insights:** Fetches and processes real-time live metrics using gRPC from liquidity pools, enabling data-driven decision making. -### Prerequisites 🚨 +The library is built with modularity and extensibility in mind, employing software design patterns that promote: -0. we have added a .env.copy file in src/helpers/.env.copy for you to follow and paste your keys to the code (specify the custom jito fee if you need). -1. Add your mainnet wallet secret key(must), devnet wallet secret key (optional), RPC endpoint(must) and shyft api key(optional) -2. rename the .env.copy file to .env +* **Customizability:** Easily integrate your own trading strategies and extend the bot's functionality. +* **Testability:** Well-separated components facilitate comprehensive testing of individual modules. +* **Maintainability:** Clear structure and separation of concerns simplify ongoing development and updates. -# Documentation - -### Developer CLI: - -- Check the balance of a token in your wallet -- wrap/unwrap solana -- Create a new SPL token or zk-compressed token (on SOL mainnet/devnet/zk-devnet) and it will automatically mint to your wallet -- boost volume of a token by creating buy and sell orders in just **one transaction** -- **Add or Remove liquidity** to a pool -- **Buy, Sell, and launch token in pump.fun** -- monitor real-time pump-fun's create, trade, and complete bonding curve events +Designed for seamless integration into existing trading systems, the Open-Source Low-Latency Trading Bot provides a robust foundation for both novice algo-traders and experienced quantitative analysts. Its open-source nature encourages community contributions and continuous improvement, ensuring the bot evolves alongside the fast-paced world of decentralized finance. -### Trader CLI: - -- integrates both **jito tips, bloXroute fee** that land transactions faster -- swap tokens on **Raydium, Meteora, and Orca** -- swap tokens using Jupiter API -- ws copy bot with auto-buy&sell -- geyser **grpc Pump.fun sniper bot** with 0.4-2 seconds latency -- geyser **grpc Copy bot** to copy trades from a target wallet address -- geyser **grpc Raydium sniper bot** -- easy-to-use tp/sl module - -## Features in Development 🚧: - -- With user-defined Jito tips and priority Lamports supported for every command -- sniping tools on raydium using yellowstone geyser grpc -- **More Strategies** for Trading dev -- more features to come... - -# Commands - -1. Specify the token symbol, name, mint keypair(optional, will help u to generate), supply, decimals, path to metadata json file, path to image file, the cluster you want to use, and the file type(png, jpg, jpeg). - - ```sh - ts-node create --payer --symbol --token_name --mint --supply --decimals --metadata --image --cluster --priority-fee --file_type - ``` - -2. Specify the token address, the percentage of the token you want to burn and the cluster you want to use. - - ```sh - ts-node burn --payer --token_address --percentage --cluster - ``` - -3. Specify the token address and the cluster you want to use. - - ```sh - ts-node revoke_authority --payer --mint_address --cluster --mint --freeze - ``` - -4. Specify the token address you want to query and the cluster for boosting the volume of the token. +## ⭐ Key Features - ```sh - ts-node boost_volume --token_address --payer --cluster --sol_per_order - ``` +### Token Creation and Multi-DEX Support +Create your own Solana SPL tokens on mainnet via Pump.fun and swap tokens across multiple decentralized exchanges: -5. Specify the token address, the amount of Sol you want to swap, and the cluster you want to use. +| Exchange | Documentation | +|----------|---------------| +| Jupiter | [CLI & trading functions guide](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/jupiter/README.md) | +| Raydium | [CLI & trading functions guide](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/raydium/README.md) | +| Orca | [CLI & trading functions guide](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/orca/README.md) | +| Meteora | [CLI & trading functions guide](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/meteora/README.md) | +| Pump.fun | Integrated support | - ```sh - ts-node buy --payer --token_address --sol --cluster - ``` +### Low-Latency Infrastructure +Accelerate transaction finality using Jito and bloXroute for lightning-fast trades. Both capable of pushing your trasaction faster then any other service provider on the market -6. Specify the token address, the percentage of the token you want to sell, and the cluster you want to use. +| Provider | Description | +|----------|---------------| +| Jito | Fast trascation and optimizes transaction ordering and execution specifically | +| Bloxroute | Fast trascation and accelerates transaction propagation | - ```sh - ts-node sell --payer --token_address --percentage --cluster - ``` +### Real-Time Market Data +Fetch critical metrics for any liquidity pool in real-time: +- Price +- LP-burn percentage +- Pool reserve +- Market cap -7. Specify the token address, the pool id(optional, will help to find the pool with the most liquidity using the given token address), the amount of Sol you want to add, and the cluster you want to use. +### Advanced Trading Tools +Utilize our local limit order and TP/SL module with zero dependencies. +[Explore the documentation](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/trading_dev/README.md) - ```sh - ts-node add_pool --payer --token_address --pool_id --sol --cluster --priority_fee - ``` +### Open-Source Bots +Leverage our cutting-edge, open-source trading bots: -8. Specify the token address, the percentage of the LP token you want to remove(1=1%), and the cluster you want to use. +| Bot Name | Features | Source | +|----------|----------|--------| +| gRPC Pump.fun Sniper Bot | Ultra-low latency (0.4-2 seconds) | [View source](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-pf-sniper) | +| gRPC Copy Bot | Replicate successful trading strategies | [View source](https://github.com/outsmartchad/solana-trading-cli/tree/typescriptmain/src/grpc_streaming_dev/grpc-copy-bot) | +| gRPC Raydium Sniper Bot | Optimized for Raydium DEX | [View source](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-raydium-sniper) | - ```sh - ts-node remove_pool --payer --token_address --percentage --cluster - ``` +### Extensibility +Our comprehensive toolkit provides everything you need to create your own custom trading bot, tailored to your unique strategies and requirements. -9. wrap your sol to wsol. +## 🛠️ Installation +Follow these steps to get your development environment set up: - ```sh - ts-node wrap_sol.js --size - ``` +1. **Clone the repository** + ```bash + git clone https://github.com/outsmartchad/solana-trading-cli.git + ``` -10. unwrap your wsol to sol. +2. **Navigate to the project directory** + ```bash + cd solana-trading-cli + ``` - ```sh - ts-node unwrap_sol.js - ``` +3. **Install the correct Node.js version** + ```bash + nvm install + nvm use + ``` -### Pump.fun commands +4. **Install dependencies** + ```bash + npm install + ``` -9. Specify the path to your mint keypair, the amount of Sol you want to buy, the name of the token, the symbol of the token, the description of the token, the telegram link, the twitter link, the website link, and the image file path. +5. **Run the test script** + ```bash + ts-node test.ts + ``` - ```sh - ts-node createAndBuy --pathToMintKeypair --sol --name --symbol --description --telegram --twitter --website --file - ``` +### Installation Prerequisites -10. Specify the token address, the sol you want to buy +- [Node Version Manager (nvm)](https://github.com/nvm-sh/nvm) +- [Node.js](https://nodejs.org/) (version specified in `.nvmrc`) +- [npm](https://www.npmjs.com/) (comes with Node.js) - ```sh - ts-node buy --token_address --sol - ``` +### Troubleshooting -11. Specify the token address, the percentage of the token you want to sell +If you encounter any issues during installation, please check our [FAQ](link-to-faq) or [open an issue](https://github.com/outsmartchad/solana-trading-cli/issues). - ```sh - ts-node sell --token_address --percentage - ``` +## 🚨 Set Up -# Code Usage +Before you begin, ensure you have completed the following steps: -## Raydium/Orca/Meteora as dex: +### 1. Environment Configuration -- src/dex/sell_helper.ts: selling spl token to SOL using the dex swap function (use WSOL in Raydium, SOL in Orca/Meteora) +1. Locate the template file: + ``` + src/helpers/.env.copy + ``` -- src/dex/buy_helper.ts: buying spl token using SOL using dex swap function (use WSOL in Raydium, SOL in Orca/Meteora) +2. Copy this file and rename it to `.env` in the same directory. -- src/dex/fetch-price.ts: fetch the current price of a token +3. Open the `.env` file and add the following required information: + - Mainnet wallet secret key (required) + - RPC endpoint (required) + - Custom Jito fee (if needed) -- src/dex/Pool/swap.ts: swap function for buy/sell/swap token +4. Optional configurations: + - Devnet wallet secret key + - Shyft API key -- src/dex/Pool/fetch_pool.ts: fetch the current address of a liquidity pool +### 2. API Keys and Wallet Setup -- src/dex/token-filters/lp-burn.ts: fetch current burn percentage of liquidity pool token +- **Mainnet Wallet**: Ensure you have a funded Solana mainnet wallet. The secret key is required for mainnet transactions. +- **RPC Endpoint**: Obtain a reliable RPC endpoint for connecting to the Solana network. +- **Jito Integration**: If using Jito, prepare your custom fee configuration. +- **Devnet Wallet** (Optional): For testing purposes, set up a devnet wallet. +- **Shyft API** (Optional): If you plan to use Shyft services, obtain an API key from [Shyft](https://shyft.to/). -- src/dex/token-filters/marketcap.ts: fetch current market cap of a token +### 3. Final Check -- src/dex/token-filters/pool-sol.ts: fetch current SOL reserver in a liquidity pool +- Confirm that your `.env` file is properly configured and saved. +- Ensure the `.env` file is in the correct location: `src/helpers/.env` +- Verify that you haven't accidentally committed your `.env` file to version control. -- src/dex/token-filters/volume.ts: fetch current/historical volume of a liquidity pool +> ⚠️ **Security Note**: Never share or commit your `.env` file or any private keys. The `.env` file is included in `.gitignore` for your safety. -## Jupiter +For any issues with configuration, please refer to our [Troubleshooting Guide](link-to-troubleshooting) or [open an issue](https://github.com/yourusername/your-repo-name/issues). -- src/jupiter/swap/*.ts: helper functions for swap/sell/buy using Jupiter +## 🤝 Feedback and Contributions +We've made every effort to implement all the main aspects of solana trading in the best possible way. However, the development journey doesn't end here, and your input is crucial for our continuous improvement. -- src/jupiter/buy.ts: buy a token using Jupiter (using SOL) +> [!IMPORTANT] +> Whether you have feedback on features, have encountered any bugs, or have suggestions for enhancements, we're eager to hear from you. Your insights help us make the Solana Trading Client library more robust and user-friendly. -- src/jupiter/sell.ts: sell a token using Jupiter (using SOL) +Please feel free to contribute by submitting an issue, joining the discussions, or joining our discord. Each contribution helps us grow and improve. -- src/jupiter/fetch-price.ts: fetch the current price of a token +We appreciate your support and look forward to making our product even better with your help! -## gRPC bots - -- src/grpc_streaming_dev/grpc-copy-bot: first grpc copy trading bot on Raydium - -- src/grpc_streaming_dev/grpc-pf-sniper: first, fastest grpc sniper bot on Pump.fun - -- src/grpc_streaming_dev/grpc-raydium-sniper: fastest grpc sniper bot on raydium for sniping pump.fun-migrated token or raydium-launched token - -## gRPC projects for beginner: - -- src/grpc_intro_projects/grpc-pool-price: grpc bot for streaming the pool price on Raydium - -- src/grpc_intro_projects/grpc-raydium-trades: grpc bot for streaming the trades on Raydium - -- src/grpc_intro_projects/grpc-jupiter-trades: grpc bot for streaming the trades on Jupiter - - -## Transactions: - -- src/transactions/jito_tips_tx_executor.ts: execute the transaction by sending the bundles to Jito validators, they help us to land the transaction to the Solana blockchain faster than just using priority fee. - -- src/transactions/bloXroute_tips_tx_executor.ts: execute the transaction by sending the transaction to bloXroute node, they help us to prevent MEV and forward the transaction to current/next few block leaders for faster execution. - -- src/transactions/simple_tx_executor.ts: execute the transaction by sending the request to the Solana blockchain with a given priority gas fee. - -## token: - -- src/token/create.ts: create a spl token on devnet or mainnet with a given name, symbol, token image(using irys decentralized storage), metadata json file, supply, decimals, the code by default revokes the mint authority and freeze authority after creating the token so that the token has a cap and no one can feeze the token of the token holder, it will then mint all the token to your wallet - -- src/token/burn.ts: burn spl token with a given percentage of the token from your wallet - -- src/token/revoke_authority.ts: revoke mint and freeze authority of a given token - -## Helper methods: - -- src/helpers/config.ts: configuration file for the code. - -- src/helpers/util.ts: utility functions for the code, including: send transactions to Solana blockchain, dropped transactions handling, etc. - -- src/helpers/check_balance.ts: check the balance of a given token in your wallet - -## Contributing +### How to Contribute - Contributions is wellcome!!! - Fork it @@ -241,13 +166,19 @@ A open-sourced, free, low-latency trading bot designed for developing your own t - `git push origin feature/YourNewFeature` - And Please open a pull request -## Apply Latest Changes from remote repo +### Apply Latest Changes from remote repo - `git stash -u # Stash your changes` - `git pull --rebase # Pull the latest changes` - `git stash pop # Apply Your stashed changes` -## Disclaimer +## ✅ Credits + +- https://github.com/raydium-io/raydium-sdk-V2 +- https://github.com/rckprtr/pumpdotfun-sdk +- https://github.com/Al366io/solana-transactions-wrapper + +## ‼️ Disclaimer This software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software. From 36b8cfe87f3f906f85ca7439bbbf556f27241dea Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 24 Sep 2024 16:21:18 +0800 Subject: [PATCH 116/140] fixed wrong link --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a720bc4..88c140c 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Accelerate transaction finality using Jito and bloXroute for lightning-fast trad | Bloxroute | Fast trascation and accelerates transaction propagation | ### Real-Time Market Data -Fetch critical metrics for any liquidity pool in real-time: +Fetch critical metrics for any liquidity pool in real-time with RPC calls: - Price - LP-burn percentage - Pool reserve @@ -62,7 +62,7 @@ Leverage our cutting-edge, open-source trading bots: | Bot Name | Features | Source | |----------|----------|--------| | gRPC Pump.fun Sniper Bot | Ultra-low latency (0.4-2 seconds) | [View source](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-pf-sniper) | -| gRPC Copy Bot | Replicate successful trading strategies | [View source](https://github.com/outsmartchad/solana-trading-cli/tree/typescriptmain/src/grpc_streaming_dev/grpc-copy-bot) | +| gRPC Copy Bot | Replicate successful trading strategies | [View source](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-copy-bot) | | gRPC Raydium Sniper Bot | Optimized for Raydium DEX | [View source](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src/grpc_streaming_dev/grpc-raydium-sniper) | ### Extensibility From ccc5a1fc007c483167febac943a0747884be2025 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 26 Sep 2024 12:58:11 +0800 Subject: [PATCH 117/140] added WS_MAINNET_ENDPOINT in .env.copy and rename it as .env.example --- src/helpers/.env.copy | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/helpers/.env.copy b/src/helpers/.env.copy index 4dc79db..6d5ef85 100644 --- a/src/helpers/.env.copy +++ b/src/helpers/.env.copy @@ -7,6 +7,8 @@ PRIVATE_KEY = YOUR_PRIVATE_KEY # or https://shyft.to/dashboard/overview DEVNET_ENDPOINT = "https://devnet-rpc.shyft.to?api_key=" MAINNET_ENDPOINT = "https://mainnet.helius-rpc.com/?api-key=" + +WS_MAINNET_ENDPOINT = "wss://mainnet.helius-rpc.com/?api-key=" # recommend to use 0.00009 # specify the fee for jito if you want to land your transaction faster JITO_FEE = "0.0001" From 57230b2e9007e1e74d9efc507cd2fbac0054be1f Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 26 Sep 2024 13:00:15 +0800 Subject: [PATCH 118/140] rename .env.copy as .env.example and updated README.md --- README.md | 2 +- src/helpers/{.env.copy => .env.example} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/helpers/{.env.copy => .env.example} (100%) diff --git a/README.md b/README.md index 88c140c..6368b9b 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ Before you begin, ensure you have completed the following steps: 1. Locate the template file: ``` - src/helpers/.env.copy + src/helpers/.env.example ``` 2. Copy this file and rename it to `.env` in the same directory. diff --git a/src/helpers/.env.copy b/src/helpers/.env.example similarity index 100% rename from src/helpers/.env.copy rename to src/helpers/.env.example From f60e212f8aced2e945b76086d928dc4a33fd6e34 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Mon, 7 Oct 2024 21:25:12 +0800 Subject: [PATCH 119/140] fixed errors in raydium buy --- src/raydium/Pool/swap.ts | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/raydium/Pool/swap.ts b/src/raydium/Pool/swap.ts index 3c34afd..65e2906 100644 --- a/src/raydium/Pool/swap.ts +++ b/src/raydium/Pool/swap.ts @@ -40,8 +40,9 @@ import { simple_executeAndConfirm } from "../../transactions/simple_tx_executor" import { jito_executeAndConfirm } from "../../transactions/jito_tips_tx_executor"; import { bloXroute_executeAndConfirm } from "../../transactions/bloXroute_tips_tx_executor"; import { Keypair } from "@solana/web3.js"; +import { initSdk } from "../raydium_config"; let tokenToPoolIdMap: any = {}; - +let sdkCache = { sdk: null, expiry: 0 }; /** * Performs a swap transaction using an Automated Market Maker (AMM) pool. * @param {Object} input - The input parameters for the swap transaction. @@ -57,15 +58,22 @@ let tokenToPoolIdMap: any = {}; */ async function swapOnlyAmm(input: any) { // -------- pre-action: get pool info --------\ - + let raydium: any = null; + if (sdkCache.sdk) { + raydium = sdkCache.sdk; + } else { + raydium = await initSdk(); + sdkCache.sdk = raydium; + } const poolKeys: any = await formatAmmKeysById_swap( new PublicKey(input.targetPool) ); assert(poolKeys, "cannot find the target pool"); - const poolInfo = await Liquidity.fetchInfo({ - connection: connection, - poolKeys: poolKeys, - }); + // const poolInfo = await Liquidity.fetchInfo({ + // connection: connection, + // poolKeys: poolKeys, + // }); + const poolInfo = await raydium.liquidity.getRpcPoolInfo(input.targetPool); // -------- step 1: coumpute amount out -------- const { amountOut, minAmountOut } = Liquidity.computeAmountOut({ poolKeys: poolKeys, @@ -74,6 +82,7 @@ async function swapOnlyAmm(input: any) { currencyOut: input.outputToken, slippage: input.slippage, }); + // -------- step 2: create instructions by SDK function -------- const { innerTransaction } = await Liquidity.makeSwapFixedInInstruction( { From 2430b39755e23d9f9e28c038bfa186903e60805d Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Mon, 7 Oct 2024 21:36:36 +0800 Subject: [PATCH 120/140] updated tick spacing of whirlpool --- src/orca/constants.ts | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/orca/constants.ts b/src/orca/constants.ts index 8e3ecf0..3aed848 100644 --- a/src/orca/constants.ts +++ b/src/orca/constants.ts @@ -1,28 +1,31 @@ import { PublicKey } from "@solana/web3.js"; import { AnchorProvider, Wallet } from "@coral-xyz/anchor"; -import { connection, wallet} from "../helpers/config" +import { connection, wallet } from "../helpers/config"; import { - WhirlpoolContext, - buildWhirlpoolClient, - ORCA_WHIRLPOOL_PROGRAM_ID + WhirlpoolContext, + buildWhirlpoolClient, + ORCA_WHIRLPOOL_PROGRAM_ID, } from "@orca-so/whirlpools-sdk"; export const ourWallet = new Wallet(wallet); export const provider = new AnchorProvider(connection, ourWallet, { - commitment: "confirmed", - }); + commitment: "confirmed", +}); export const ctx = WhirlpoolContext.withProvider( - provider, - ORCA_WHIRLPOOL_PROGRAM_ID + provider, + ORCA_WHIRLPOOL_PROGRAM_ID ); export const client = buildWhirlpoolClient(ctx); export const PROGRAM_ID = "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc"; -export const MAINNET_WHIRLPOOLS_CONFIG = new PublicKey("2LecshUwdy9xi7meFgHtFJQNSKk4KdTrcpvaB56dP2NQ"); -export const DEVNET_WHIRLPOOLS_CONFIG = new PublicKey("FcrweFY1G9HJAHG5inkGB6pKg1HZ6x9UC2WioAfWrGkR"); +export const MAINNET_WHIRLPOOLS_CONFIG = new PublicKey( + "2LecshUwdy9xi7meFgHtFJQNSKk4KdTrcpvaB56dP2NQ" +); +export const DEVNET_WHIRLPOOLS_CONFIG = new PublicKey( + "FcrweFY1G9HJAHG5inkGB6pKg1HZ6x9UC2WioAfWrGkR" +); export const wsol = "So11111111111111111111111111111111111111112"; export const usdc = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; export const usdt = "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"; -export const USDC = {mint: new PublicKey(usdc), decimals: 6}; -export const WSOL = {mint: new PublicKey(wsol), decimals: 9}; -export const USDT = {mint: new PublicKey(usdt), decimals: 6}; -export const tick_spacing = 64; - +export const USDC = { mint: new PublicKey(usdc), decimals: 6 }; +export const WSOL = { mint: new PublicKey(wsol), decimals: 9 }; +export const USDT = { mint: new PublicKey(usdt), decimals: 6 }; +export const tick_spacing = 256; From 14f6389450d5f0f128c12c6b8abff12736f8762d Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 29 Oct 2024 11:02:48 +0800 Subject: [PATCH 121/140] added dexscreener module & fixed can't fetch new token's pool address using raydium api issue --- src/dexscreener/index.ts | 1 + src/dexscreener/info.ts | 102 +++++++++++++++++++++++++++++++++ src/helpers/config.ts | 3 + src/jupiter/test.ts | 10 ++++ src/raydium/Pool/fetch_pool.ts | 12 +++- 5 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 src/dexscreener/index.ts create mode 100644 src/dexscreener/info.ts create mode 100644 src/jupiter/test.ts diff --git a/src/dexscreener/index.ts b/src/dexscreener/index.ts new file mode 100644 index 0000000..4a99aab --- /dev/null +++ b/src/dexscreener/index.ts @@ -0,0 +1 @@ +export * from "./info"; \ No newline at end of file diff --git a/src/dexscreener/info.ts b/src/dexscreener/info.ts new file mode 100644 index 0000000..5a8f5d6 --- /dev/null +++ b/src/dexscreener/info.ts @@ -0,0 +1,102 @@ +import {wsol} from "../helpers/config"; + +export async function getInfoFromDexscreener(tokenAddress: string) { + let data: any = {}; + + const url = "https://api.dexscreener.com/latest/dex/tokens/" + tokenAddress; + let res = { + pairAge: "", + name: "", + address: "", + priceInUSD: 0, + marketCap: 0, + dexscreenerURL: "", + twitterURL: "", + telegramURL: "", + websiteURL: "", + buyers5m: 0, + buyers1h: 0, + buyers6h: 0, + buyers24h: 0, + volume5m: 0, + volume1h: 0, + volume6h: 0, + volume24h: 0, + liquidityInSOL: 0, + poolId: "", + }; + try { + let response: any = await fetch(url); + while ( + response === undefined || + response === null || + response.status !== 200 + ) { + console.log("retrying"); + response = await fetch(url); + if (response.Response.statusText === "Too Many Requests") + await new Promise((resolve) => setTimeout(resolve, 2000)); + } + data = await response.json(); + //console.log(data); + let raydiumPair; + + // find the first pair in raydium + for (const pair of data.pairs) { + if (pair.dexId === "raydium") { + raydiumPair = pair; + break; + } + } + //console.log(raydiumPair); + const info = raydiumPair.info; + + const createTimestamp = raydiumPair.pairCreatedAt; + res.address = tokenAddress; + + const pairAgeTimestamp = Date.now() - createTimestamp; + // convert pair age to day and hour format + const days = Math.floor(pairAgeTimestamp / (1000 * 60 * 60 * 24)); + const hours = Math.floor( + (pairAgeTimestamp % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60) + ); + const mins = Math.floor( + (pairAgeTimestamp % (1000 * 60 * 60)) / (1000 * 60) + ); + const seconds = Math.floor((pairAgeTimestamp % (1000 * 60)) / 1000); + res.pairAge = days + "d " + hours + "h " + mins + "m " + seconds + "s"; + if(raydiumPair.baseToken.address === wsol) res.name = raydiumPair.quoteToken.name; + else res.name = raydiumPair.baseToken.name; + // res.name = await getTokenName(tokenAddress); + res.poolId = raydiumPair.pairAddress; + res.marketCap = raydiumPair.marketCap; + res.priceInUSD = raydiumPair.priceUsd; + res.dexscreenerURL = raydiumPair.url; + res.volume5m = raydiumPair.volume.m5; + res.volume1h = raydiumPair.volume.h1; + res.volume6h = raydiumPair.volume.h6; + res.volume24h = raydiumPair.volume.h24; + res.buyers5m = raydiumPair.txns.m5.buys; + res.buyers1h = raydiumPair.txns.h1.buys; + res.buyers6h = raydiumPair.txns.h6.buys; + res.buyers24h = raydiumPair.txns.h24.buys; + if (raydiumPair.liquidity.base > raydiumPair.liquidity.quote) + res.liquidityInSOL = raydiumPair.liquidity.quote; + else res.liquidityInSOL = raydiumPair.liquidity.base; + if (info !== undefined && info.socials.length > 0) { + for (const site of info.socials) { + if (site.type === "twitter") res.twitterURL = site.url; + if (site.type === "telegram") res.telegramURL = site.url; + } + } + if (info !== undefined && info.websites.length > 0) + res.websiteURL = info.websites[0].url; + //console.log(res); + return res; + } catch (error) { + console.log(error); + return res; + } +} + +//getInfoFromDexscreener("4cfyJweLzYvvPAjztjWs8QpzXqSuHsY572EwsebWpump"); diff --git a/src/helpers/config.ts b/src/helpers/config.ts index e28f93f..313eab6 100644 --- a/src/helpers/config.ts +++ b/src/helpers/config.ts @@ -75,3 +75,6 @@ export const DEFAULT_TOKEN = { "USDC" ), }; + + +export const wsol = "So11111111111111111111111111111111111111112"; \ No newline at end of file diff --git a/src/jupiter/test.ts b/src/jupiter/test.ts new file mode 100644 index 0000000..a733ad3 --- /dev/null +++ b/src/jupiter/test.ts @@ -0,0 +1,10 @@ +import { getCurrentPriceInSOL, getCurrentPriceInUSD } from "./fetch-price"; +async function main() { + const tokenAddress = "2SEUhUGpKMPuyDysMFfKNRLBxVf9kG2xBxW16FVopump"; + const currentPopcatPriceInSOL = await getCurrentPriceInSOL(tokenAddress); + const currentPopcatPriceInUSD = await getCurrentPriceInUSD(tokenAddress); + console.log(`Current price in SOL: ${currentPopcatPriceInSOL}`); + console.log(`Current price in USD: ${currentPopcatPriceInUSD}`); +} + +main(); diff --git a/src/raydium/Pool/fetch_pool.ts b/src/raydium/Pool/fetch_pool.ts index bb38f8b..cc16884 100644 --- a/src/raydium/Pool/fetch_pool.ts +++ b/src/raydium/Pool/fetch_pool.ts @@ -1,7 +1,17 @@ import { initSdk } from "../raydium_config"; import { wsol } from "../constants"; +import {getInfoFromDexscreener} from "../../dexscreener"; let sdkCache = { sdk: null, expiry: 0 }; export async function fetchAMMPoolId(tokenAddress:string) { + try{ + const info = await getInfoFromDexscreener(tokenAddress); + const poolId = info.poolId; + console.log(`AMM Pool ID: ${poolId}`); + if(poolId !== "") return poolId; + }catch(e){ + console.log("Error getting AMM pool ID using dexscreener api: ", e); + console.log("Trying to get AMM pool ID using raydium api"); + } let raydium:any = null; if (sdkCache.sdk) { raydium = sdkCache.sdk; @@ -73,4 +83,4 @@ export async function fetchLPToken(tokenAddress:string) { } //fetchLPToken("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP"); -//fetchAMMPoolId("ukHH6c7mMyiWCf1b9pnWe25TSpkDDt3H5pQZgZ74J82") \ No newline at end of file +fetchAMMPoolId("ukHH6c7mMyiWCf1b9pnWe25TSpkDDt3H5pQZgZ74J82") \ No newline at end of file From fcc2b1526614aa8287d5f77f58b3a88a59e1b93e Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 29 Oct 2024 11:03:27 +0800 Subject: [PATCH 122/140] added dexscreener module & fixed can't fetch new token's pool address using raydium api issue --- src/raydium/Pool/fetch_pool.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/raydium/Pool/fetch_pool.ts b/src/raydium/Pool/fetch_pool.ts index cc16884..678fee6 100644 --- a/src/raydium/Pool/fetch_pool.ts +++ b/src/raydium/Pool/fetch_pool.ts @@ -83,4 +83,4 @@ export async function fetchLPToken(tokenAddress:string) { } //fetchLPToken("3XTp12PmKMHxB6YkejaGPUjMGBLKRGgzHWgJuVTsBCoP"); -fetchAMMPoolId("ukHH6c7mMyiWCf1b9pnWe25TSpkDDt3H5pQZgZ74J82") \ No newline at end of file +//fetchAMMPoolId("ukHH6c7mMyiWCf1b9pnWe25TSpkDDt3H5pQZgZ74J82") \ No newline at end of file From 5b7f4f183c9b1ba4579ef86e442888cc70a27468 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 29 Oct 2024 11:59:53 +0800 Subject: [PATCH 123/140] deleted data/ --- data/.DS_Store | Bin 6148 -> 0 bytes data/Image_file/FTW.jpeg | Bin 5695 -> 0 bytes data/metadata_file/metadata.json | 5 - data/payer_keypair/.DS_Store | Bin 6148 -> 0 bytes data/payer_keypair/devnet/.DS_Store | Bin 6148 -> 0 bytes data/payer_keypair/mainnet/.DS_Store | Bin 6148 -> 0 bytes data/payer_keypair/mainnet/test1_wallet.json | 1 - data/payer_keypair/mainnet/test_wallet.json | 1 - data/token_keypair/.DS_Store | Bin 6148 -> 0 bytes data/token_keypair/devnet/.DS_Store | Bin 6148 -> 0 bytes package-lock.json | 6996 ++++++++++++------ package.json | 4 +- 12 files changed, 4644 insertions(+), 2363 deletions(-) delete mode 100644 data/.DS_Store delete mode 100644 data/Image_file/FTW.jpeg delete mode 100644 data/metadata_file/metadata.json delete mode 100644 data/payer_keypair/.DS_Store delete mode 100644 data/payer_keypair/devnet/.DS_Store delete mode 100644 data/payer_keypair/mainnet/.DS_Store delete mode 100644 data/payer_keypair/mainnet/test1_wallet.json delete mode 100644 data/payer_keypair/mainnet/test_wallet.json delete mode 100644 data/token_keypair/.DS_Store delete mode 100644 data/token_keypair/devnet/.DS_Store diff --git a/data/.DS_Store b/data/.DS_Store deleted file mode 100644 index ef7ab4c14714ef352ca294d26c76809ae3a48f56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 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 M|5+I_01batvj6}9 diff --git a/data/metadata_file/metadata.json b/data/metadata_file/metadata.json deleted file mode 100644 index 25d86b2..0000000 --- a/data/metadata_file/metadata.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "FuCK The WorLd", - "symbol": "FTW", - "description": "you mfers." -} diff --git a/data/payer_keypair/.DS_Store b/data/payer_keypair/.DS_Store deleted file mode 100644 index ed4e49ecc93295dbcbd298b9e07b892da88dc461..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKJ5EC}5S)bwBGIIz^cA>)6@?Sz0(@Qyq(BM?^{Y4+N6YL-k)jtwMT2Ig-Lcm@ zwmik#X8^X`4|l)nS3Kf{3zMbuyD2LLq<|EV0#ZN<{HB1nSlaw1QBev=0V!})z`qZT?$`^*#Q1bD z#1nuxV>*oEcuNqQCy2dpOk{>;NhK!L>WN`VXTDWkFB}t-4vUkyPn~S_La{iV`4;7{ zo~S4Vq`;{HmpNT{|G%gI@cus~X(k1vz`s(!W~=pT$tzWFom|d)ZKFTXz2=+l#&J*> mq8$^X9dqLC_%@2NuKAejy>LtnI`cs%>Sw@pkx7BSR^R|;vm4+5 diff --git a/data/payer_keypair/devnet/.DS_Store b/data/payer_keypair/devnet/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0)6@?Sz0(@Qyq(BM?^{Y4+N6YL-k)jtwMT2Ig-Lcm@ zwmik#X8^X`4|l)nS3Kf{3zMbuyD2LLq<|EV0#ZN<{HB1nSlaw1QBev=0V!})z`qZT?$`^*#Q1bD z#1nuxV>*oEcuNqQCy2dpOk{>;NhK!L>WN`VXTDWkFB}t-4vUkyPn~S_La{iV`4;7{ zo~S4Vq`;{HmpNT{|G%gI@cus~X(k1vz`s(!W~=pT$tzWFom|d)ZKFTXz2=+l#&J*> mq8$^X9dqLC_%@2NuKAejy>LtnI`cs%>Sw@pkx7BSR^R|;vm4+5 diff --git a/data/token_keypair/devnet/.DS_Store b/data/token_keypair/devnet/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/runtime": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", - "license": "MIT", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -224,10 +151,9 @@ } }, "node_modules/@bloxroute/solana-trader-client-ts": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@bloxroute/solana-trader-client-ts/-/solana-trader-client-ts-2.1.6.tgz", - "integrity": "sha512-xqbaJOGQJaA8NtH9YKCv7uwmNUiuhymoy0Yowe2d/MTvZFcAkfsB13wVFjq3yLNfqxSVvFK5O+COfjSFifvw1A==", - "license": "MIT", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@bloxroute/solana-trader-client-ts/-/solana-trader-client-ts-2.2.0.tgz", + "integrity": "sha512-FpTb5+j8et2lJ9lTHJvGY9S8dBHG2iv7kETYDMt2ZJirUzjOeQboAogz2RW5RtY/iqvS2JIYkuGf0zsJSGPwcQ==", "dependencies": { "@grpc/grpc-js": "^1.10.2", "@pbkit/grpc-client": "^0.0.3", @@ -250,7 +176,6 @@ "version": "1.73.2", "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.73.2.tgz", "integrity": "sha512-9WACF8W4Nstj7xiDw3Oom22QmrhBh0VyZyZ7JvvG3gOxLWLlX3hvm5nPVJOGcCE/9fFavBbCUb5A6CIuvMGdoA==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "@noble/ed25519": "^1.7.0", @@ -277,7 +202,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", "dependencies": { "base-x": "^3.0.2" } @@ -285,14 +209,12 @@ "node_modules/@bloxroute/solana-trader-client-ts/node_modules/@types/node": { "version": "12.20.55", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "license": "MIT" + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, "node_modules/@bloxroute/solana-trader-client-ts/node_modules/axios": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.2.tgz", "integrity": "sha512-bznQyETwElsXl2RK7HLLwb5GPpOLlycxHCtrpDR/4RqqBzjARaOTo3jz4IgtntWUYee7Ne4S8UHd92VCuzPaWA==", - "license": "MIT", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -303,7 +225,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } @@ -312,7 +233,6 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", - "license": "Apache-2.0", "dependencies": { "bn.js": "^5.2.0", "bs58": "^4.0.0", @@ -323,7 +243,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", "dependencies": { "base-x": "^3.0.2" } @@ -346,7 +265,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -355,23 +273,12 @@ "node_modules/@bloxroute/solana-trader-client-ts/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/@bloxroute/solana-trader-client-ts/node_modules/isomorphic-ws": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", - "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", - "license": "MIT", - "peerDependencies": { - "ws": "*" - } + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/@bloxroute/solana-trader-client-ts/node_modules/jayson": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.7.0.tgz", "integrity": "sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ==", - "license": "MIT", "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", @@ -398,7 +305,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "license": "MIT", "peerDependencies": { "ws": "*" } @@ -407,7 +313,6 @@ "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -424,17 +329,39 @@ } } }, + "node_modules/@bloxroute/solana-trader-client-ts/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/@bloxroute/solana-trader-client-ts/node_modules/superstruct": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==", - "license": "MIT" + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" + }, + "node_modules/@bloxroute/solana-trader-client-ts/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/@bloxroute/solana-trader-client-ts/node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -443,6 +370,20 @@ "node": ">=4.2.0" } }, + "node_modules/@bloxroute/solana-trader-client-ts/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/@bloxroute/solana-trader-client-ts/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/@bonfida/sns-records": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@bonfida/sns-records/-/sns-records-0.0.1.tgz", @@ -462,9 +403,9 @@ "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==" }, "node_modules/@bonfida/spl-name-service": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@bonfida/spl-name-service/-/spl-name-service-2.5.2.tgz", - "integrity": "sha512-b6kKIB0AQZPpygITUaJT/eVJ8MDHTgDvk06Gyzm/4NmXqsLl0IVu7pYj8gcFZfZqiyKl0dYh/k2m5LdyO8eU6w==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@bonfida/spl-name-service/-/spl-name-service-2.5.4.tgz", + "integrity": "sha512-HPdvdt6mgP6zoNMxPkCADgvqr//8U5Xli/k4whZL5ALtuVB4Jt4nssUKbNR4YJZ9NuMkyzgLyZ9iLUgSNHW4Lw==", "dependencies": { "@bonfida/sns-records": "0.0.1", "@noble/curves": "^1.3.0", @@ -501,7 +442,6 @@ "version": "0.30.1", "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.30.1.tgz", "integrity": "sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ==", - "license": "(MIT OR Apache-2.0)", "dependencies": { "@coral-xyz/anchor-errors": "^0.30.1", "@coral-xyz/borsh": "^0.30.1", @@ -527,15 +467,14 @@ "version": "0.30.1", "resolved": "https://registry.npmjs.org/@coral-xyz/anchor-errors/-/anchor-errors-0.30.1.tgz", "integrity": "sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ==", - "license": "Apache-2.0", "engines": { "node": ">=10" } }, "node_modules/@coral-xyz/anchor/node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dependencies": { "safe-buffer": "^5.0.1" } @@ -552,7 +491,6 @@ "version": "0.30.1", "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.30.1.tgz", "integrity": "sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ==", - "license": "Apache-2.0", "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" @@ -568,7 +506,6 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -576,6 +513,21 @@ "node": ">=12" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.16.17", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", @@ -583,7 +535,6 @@ "cpu": [ "arm" ], - "license": "MIT", "optional": true, "os": [ "android" @@ -599,7 +550,6 @@ "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "android" @@ -615,7 +565,6 @@ "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "android" @@ -631,7 +580,6 @@ "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -647,7 +595,6 @@ "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -663,7 +610,6 @@ "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -679,7 +625,6 @@ "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -695,7 +640,6 @@ "cpu": [ "arm" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -711,7 +655,6 @@ "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -727,7 +670,6 @@ "cpu": [ "ia32" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -743,7 +685,6 @@ "cpu": [ "loong64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -759,7 +700,6 @@ "cpu": [ "mips64el" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -775,7 +715,6 @@ "cpu": [ "ppc64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -791,7 +730,6 @@ "cpu": [ "riscv64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -807,7 +745,6 @@ "cpu": [ "s390x" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -823,7 +760,6 @@ "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -839,7 +775,6 @@ "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "netbsd" @@ -848,6 +783,21 @@ "node": ">=12" } }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/openbsd-x64": { "version": "0.16.17", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", @@ -855,7 +805,6 @@ "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "openbsd" @@ -871,7 +820,6 @@ "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "sunos" @@ -887,7 +835,6 @@ "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -903,7 +850,6 @@ "cpu": [ "ia32" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -919,7 +865,6 @@ "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -1381,7 +1326,6 @@ "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -1602,10 +1546,9 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.11.1.tgz", - "integrity": "sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw==", - "license": "Apache-2.0", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.2.tgz", + "integrity": "sha512-bgxdZmgTrJZX50OjyVwz3+mNEnCTNkh3cIqGPWVNeW9jX6bn1ZkU80uPd+67/ZpIJIjRQ9qaHCjhavyoWYxumg==", "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" @@ -1618,7 +1561,6 @@ "version": "0.7.13", "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", - "license": "Apache-2.0", "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", @@ -1635,46 +1577,59 @@ "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, "node_modules/@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } }, + "node_modules/@inquirer/checkbox": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.1.tgz", + "integrity": "sha512-ehJjmNPdguajc1hStvjN7DJNVjwG5LC1mgGMGFjCmdkn2fxB2GtULftMnlaqNmvMdPpqdaSoOFpl86VkLtG4pQ==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/figures": "^1.0.7", + "@inquirer/type": "^3.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, "node_modules/@inquirer/confirm": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.14.tgz", - "integrity": "sha512-nbLSX37b2dGPtKWL3rPuR/5hOuD30S+pqJ/MuFiUEgN6GiMs8UMxiurKAMDzKt6C95ltjupa8zH6+3csXNHWpA==", - "license": "MIT", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.1.tgz", + "integrity": "sha512-6ycMm7k7NUApiMGfVc32yIPp28iPKxhGRMqoNDiUjq2RyTAkbs5Fx0TdzBqhabcKvniDdAAvHCmsRjnNfTsogw==", "dependencies": { - "@inquirer/core": "^9.0.2", - "@inquirer/type": "^1.4.0" + "@inquirer/core": "^10.0.1", + "@inquirer/type": "^3.0.0" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@inquirer/core": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.2.tgz", - "integrity": "sha512-nguvH3TZar3ACwbytZrraRTzGqyxJfYJwv+ZwqZNatAosdWQMP1GV8zvmkNlBe2JeZSaw0WYBHZk52pDpWC9qA==", - "license": "MIT", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.0.1.tgz", + "integrity": "sha512-KKTgjViBQUi3AAssqjUFMnMO3CM3qwCHvePV9EW+zTKGKafFGFF01sc1yOIYjLJ7QU52G/FbzKc+c01WLzXmVQ==", "dependencies": { - "@inquirer/figures": "^1.0.3", - "@inquirer/type": "^1.4.0", - "@types/mute-stream": "^0.0.4", - "@types/node": "^20.14.9", - "@types/wrap-ansi": "^3.0.0", + "@inquirer/figures": "^1.0.7", + "@inquirer/type": "^3.0.0", "ansi-escapes": "^4.3.2", - "cli-spinners": "^2.9.2", "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", + "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", @@ -1684,64 +1639,188 @@ "node": ">=18" } }, - "node_modules/@inquirer/core/node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "license": "ISC", + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">= 12" + "node": ">=8" } }, - "node_modules/@inquirer/core/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "license": "ISC", + "node_modules/@inquirer/editor": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.0.1.tgz", + "integrity": "sha512-qAHHJ6hs343eNtCKgV2wV5CImFxYG8J1pl/YCeI5w9VoW7QpulRUU26+4NsMhjR6zDRjKBsH/rRjCIcaAOHsrg==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/type": "^3.0.0", + "external-editor": "^3.1.0" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, - "node_modules/@inquirer/core/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", + "node_modules/@inquirer/expand": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.1.tgz", + "integrity": "sha512-9anjpdc802YInXekwePsa5LWySzVMHbhVS6v6n5IJxrl8w09mODOeP69wZ1d0WrOvot2buQSmYp4lW/pq8y+zQ==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/type": "^3.0.0", + "yoctocolors-cjs": "^2.1.2" + }, "engines": { - "node": ">=14" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@inquirer/figures": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", - "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==", - "license": "MIT", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.7.tgz", + "integrity": "sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==", "engines": { "node": ">=18" } }, - "node_modules/@inquirer/type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.4.0.tgz", - "integrity": "sha512-AjOqykVyjdJQvtfkNDGUyMYGF8xN50VUxftCQWsOyIo4DFRLr6VQhW0VItGI1JIyQGCGgIpKa7hMMwNhZb4OIw==", - "license": "MIT", + "node_modules/@inquirer/input": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.0.1.tgz", + "integrity": "sha512-m+SliZ2m43cDRIpAdQxfv5QOeAQCuhS8TGLvtzEP1An4IH1kBES4RLMRgE/fC+z29aN8qYG8Tq/eXQQKTYwqAg==", "dependencies": { - "mute-stream": "^1.0.0" + "@inquirer/core": "^10.0.1", + "@inquirer/type": "^3.0.0" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, - "node_modules/@inquirer/type/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "license": "ISC", + "node_modules/@inquirer/number": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.1.tgz", + "integrity": "sha512-gF3erqfm0snpwBjbyKXUUe17QJ7ebm49btXApajrM0rgCCoYX0o9W5NCuYNae87iPxaIJVjtuoQ42DX32IdbMA==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/type": "^3.0.0" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.1.tgz", + "integrity": "sha512-D7zUuX4l4ZpL3D7/SWu9ibijP09jigwHi/gfUHLx5GMS5oXzuMfPV2xPMG1tskco4enTx70HA0VtMXecerpvbg==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/type": "^3.0.0", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.0.1.tgz", + "integrity": "sha512-cu2CpGC2hz7WTt2VBvdkzahDvYice6vYA/8Dm7Fy3tRNzKuQTF2EY3CV4H2GamveWE6tA2XzyXtbWX8+t4WMQg==", + "dependencies": { + "@inquirer/checkbox": "^4.0.1", + "@inquirer/confirm": "^5.0.1", + "@inquirer/editor": "^4.0.1", + "@inquirer/expand": "^4.0.1", + "@inquirer/input": "^4.0.1", + "@inquirer/number": "^3.0.1", + "@inquirer/password": "^4.0.1", + "@inquirer/rawlist": "^4.0.1", + "@inquirer/search": "^3.0.1", + "@inquirer/select": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.1.tgz", + "integrity": "sha512-0LuMOgaWs7W8JNcbiKkoFwyWFDEeCmLqDCygF0hidQUVa6J5grFVRZxrpompiWDFM49Km2rf7WoZwRo1uf1yWQ==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/type": "^3.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/search": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.1.tgz", + "integrity": "sha512-ehMqjiO0pAf+KtdONKeCLVy4i3fy3feyRRhDrvzWhiwB8JccgKn7eHFr39l+Nx/FaZAhr0YxIJvkK5NuNvG+Ww==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/figures": "^1.0.7", + "@inquirer/type": "^3.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.1.tgz", + "integrity": "sha512-tVRatFRGU49bxFCKi/3P+C0E13KZduNFbWuHWRx0L2+jbiyKRpXgHp9qiRHWRk/KarhYBXzH/di6w3VQ5aJd5w==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/figures": "^1.0.7", + "@inquirer/type": "^3.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.0.tgz", + "integrity": "sha512-YYykfbw/lefC7yKj7nanzQXILM7r3suIvyFlCcMskc99axmsSewXWkAfXKwMbgxL76iAFVmRwmYdwNZNc8gjog==", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@irys/arweave": { @@ -1769,11 +1848,12 @@ } }, "node_modules/@irys/sdk": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@irys/sdk/-/sdk-0.2.1.tgz", - "integrity": "sha512-ylSjawDGSgAxMwXxEiZBpY+QKHXR2Df1v0QSLED7vByt2D7NhZI1gBS1yoSUokSRuzuYJDlIPAe8ITQ1cVY7nQ==", + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@irys/sdk/-/sdk-0.2.11.tgz", + "integrity": "sha512-z3zKlKYEqRHuCGyyVoikL1lT4Jwt8wv7e4MrMThNfhfT/bdKQHD9lEVsX77DBnLJrBBKKg5rRcEzMtVkpNx3QA==", + "deprecated": "Arweave support is deprecated - We recommend migrating to the Irys datachain: https://migrate-to.irys.xyz/", "dependencies": { - "@aptos-labs/ts-sdk": "^1.9.0", + "@aptos-labs/ts-sdk": "^1.26.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/contracts": "^5.7.0", "@ethersproject/providers": "^5.7.2", @@ -1816,11 +1896,129 @@ "node": ">= 12" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } @@ -1828,14 +2026,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -1845,7 +2041,6 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" @@ -1855,7 +2050,6 @@ "version": "0.3.4", "resolved": "https://registry.npmjs.org/@lightprotocol/compressed-token/-/compressed-token-0.3.4.tgz", "integrity": "sha512-nq39drCLuaFE+dahINlHnlQaCz73As3g3ewkjMXtEG6dGYvRHuGRd+xVtl6BhC6Ww1pMRxYxNhR4hXbPgaYB8Q==", - "license": "Apache-2.0", "dependencies": { "@coral-xyz/anchor": "0.29.0", "@solana/spl-token": "^0.3.11", @@ -1871,7 +2065,6 @@ "version": "0.29.0", "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", - "license": "(MIT OR Apache-2.0)", "dependencies": { "@coral-xyz/borsh": "^0.29.0", "@noble/hashes": "^1.3.1", @@ -1896,7 +2089,6 @@ "version": "0.29.0", "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", - "license": "Apache-2.0", "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" @@ -1912,7 +2104,6 @@ "version": "0.3.11", "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.11.tgz", "integrity": "sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==", - "license": "Apache-2.0", "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", @@ -1930,7 +2121,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } @@ -1939,7 +2129,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", "dependencies": { "base-x": "^3.0.2" } @@ -1947,14 +2136,12 @@ "node_modules/@lightprotocol/hasher.rs": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@lightprotocol/hasher.rs/-/hasher.rs-0.2.0.tgz", - "integrity": "sha512-ttKBiKNmq0xJbKzT02r7KJH9Pmigu/8C2LJFCsz0aQNh6Xh3nH2by6RwxHTImE/N4UyAVb6ii0zAJl0DnZo/0w==", - "license": "ISC" + "integrity": "sha512-ttKBiKNmq0xJbKzT02r7KJH9Pmigu/8C2LJFCsz0aQNh6Xh3nH2by6RwxHTImE/N4UyAVb6ii0zAJl0DnZo/0w==" }, "node_modules/@lightprotocol/stateless.js": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@lightprotocol/stateless.js/-/stateless.js-0.4.4.tgz", "integrity": "sha512-FmnbH62G9BDtIwz3RF/j+dJsWy/dRRUJZ+AE2W6GsTzzebx6qkR8YvHh6spuEBFJSrJT9C2aHHVJ4uaxRcGeMg==", - "license": "Apache-2.0", "dependencies": { "@coral-xyz/anchor": "0.29.0", "@noble/hashes": "^1.3.2", @@ -1970,7 +2157,6 @@ "version": "0.29.0", "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", - "license": "(MIT OR Apache-2.0)", "dependencies": { "@coral-xyz/borsh": "^0.29.0", "@noble/hashes": "^1.3.1", @@ -1994,14 +2180,12 @@ "node_modules/@lightprotocol/stateless.js/node_modules/@coral-xyz/anchor/node_modules/superstruct": { "version": "0.15.5", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", - "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==", - "license": "MIT" + "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==" }, "node_modules/@lightprotocol/stateless.js/node_modules/@coral-xyz/borsh": { "version": "0.29.0", "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", - "license": "Apache-2.0", "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" @@ -2017,7 +2201,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } @@ -2026,7 +2209,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", "dependencies": { "base-x": "^3.0.2" } @@ -2035,7 +2217,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", - "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -2045,7 +2226,6 @@ "resolved": "https://registry.npmjs.org/@lightprotocol/zk-compression-cli/-/zk-compression-cli-0.4.7.tgz", "integrity": "sha512-tNWWRaS1vF4Jxe/jMg8Xtjy+vy3C/Jbx6x7EQnRc8InMtZkTHn+7IcrmBt9iTtEsBtZnSvE/b7dn2aOl41VL9A==", "hasInstallScript": true, - "license": "Apache-2.0", "dependencies": { "@coral-xyz/anchor": "0.29.0", "@lightprotocol/compressed-token": "0.3.4", @@ -2083,7 +2263,6 @@ "version": "0.29.0", "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", - "license": "(MIT OR Apache-2.0)", "dependencies": { "@coral-xyz/borsh": "^0.29.0", "@noble/hashes": "^1.3.1", @@ -2108,7 +2287,6 @@ "version": "0.29.0", "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", - "license": "Apache-2.0", "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" @@ -2124,7 +2302,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } @@ -2133,44 +2310,26 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", "dependencies": { "base-x": "^3.0.2" } }, - "node_modules/@lightprotocol/zk-compression-cli/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "license": "MIT", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, "node_modules/@mercurial-finance/dynamic-amm-sdk": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@mercurial-finance/dynamic-amm-sdk/-/dynamic-amm-sdk-1.0.3.tgz", - "integrity": "sha512-xrlhaGndacLrBGXGruPpsqhdYj4uxS/DSuTCxmzMb966Vt9rgV5OgO+KtCk8h8slzwFoyKyRLJzVKcos5IdxtA==", - "license": "MIT", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@mercurial-finance/dynamic-amm-sdk/-/dynamic-amm-sdk-1.1.7.tgz", + "integrity": "sha512-Fk97eWTgkn6WVfPMnRJlJE4lH4f1w72RLzqkvafj/cORYnyNuhI0x5hbIawdm/nUez6vpvf8IygX8IX+ppHNTA==", "dependencies": { "@coral-xyz/anchor": "^0.28.0", "@coral-xyz/borsh": "^0.28.0", "@mercurial-finance/token-math": "6.0.0", - "@mercurial-finance/vault-sdk": "2.1.0", + "@mercurial-finance/vault-sdk": "2.2.0", + "@metaplex-foundation/mpl-token-metadata": "~2.13.0", + "@meteora-ag/stake-for-fee": "1.0.12", "@project-serum/anchor": "^0.24.2", "@solana/buffer-layout": "^3 || ^4", "@solana/spl-token": "^0.4.6", "@solana/spl-token-registry": "^0.2.4574", - "@solana/web3.js": "^1.91.6", + "@solana/web3.js": "^1.95.4", "bn-sqrt": "^1.0.0", "bn.js": "5.2.1", "decimal.js": "^10.4.1", @@ -2185,7 +2344,6 @@ "version": "0.28.0", "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.28.0.tgz", "integrity": "sha512-kQ02Hv2ZqxtWP30WN1d4xxT4QqlOXYDxmEd3k/bbneqhV3X5QMO4LAtoUFs7otxyivOgoqam5Il5qx81FuI4vw==", - "license": "(MIT OR Apache-2.0)", "dependencies": { "@coral-xyz/borsh": "^0.28.0", "@solana/web3.js": "^1.68.0", @@ -2211,7 +2369,6 @@ "version": "0.28.0", "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.28.0.tgz", "integrity": "sha512-/u1VTzw7XooK7rqeD7JLUSwOyRSesPUk0U37BV9zK0axJc1q0nRbKFGFLYCQ16OtdOJTTwGfGp11Lx9B45bRCQ==", - "license": "Apache-2.0", "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" @@ -2223,11 +2380,60 @@ "@solana/web3.js": "^1.68.0" } }, + "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/@metaplex-foundation/beet-solana": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet-solana/-/beet-solana-0.4.1.tgz", + "integrity": "sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==", + "dependencies": { + "@metaplex-foundation/beet": ">=0.1.0", + "@solana/web3.js": "^1.56.2", + "bs58": "^5.0.0", + "debug": "^4.3.4" + } + }, + "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/@metaplex-foundation/beet-solana/node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "dependencies": { + "base-x": "^4.0.0" + } + }, + "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/@metaplex-foundation/mpl-token-metadata": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/mpl-token-metadata/-/mpl-token-metadata-2.13.0.tgz", + "integrity": "sha512-Fl/8I0L9rv4bKTV/RAl5YIbJe9SnQPInKvLz+xR1fEc4/VQkuCn3RPgypfUMEKWmCznzaw4sApDxy6CFS4qmJw==", + "dependencies": { + "@metaplex-foundation/beet": "^0.7.1", + "@metaplex-foundation/beet-solana": "^0.4.0", + "@metaplex-foundation/cusper": "^0.0.2", + "@solana/spl-token": "^0.3.6", + "@solana/web3.js": "^1.66.2", + "bn.js": "^5.2.0", + "debug": "^4.3.4" + } + }, + "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/@metaplex-foundation/mpl-token-metadata/node_modules/@solana/spl-token": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.11.tgz", + "integrity": "sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==", + "dependencies": { + "@solana/buffer-layout": "^4.0.0", + "@solana/buffer-layout-utils": "^0.2.0", + "@solana/spl-token-metadata": "^0.1.2", + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.88.0" + } + }, "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/@project-serum/anchor": { "version": "0.24.2", "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.24.2.tgz", "integrity": "sha512-0/718g8/DnEuwAidUwh5wLYphUYXhUbiClkuRNhvNoa+1Y8a4g2tJyxoae+emV+PG/Gikd/QUBNMkIcimiIRTA==", - "license": "(MIT OR Apache-2.0)", "dependencies": { "@project-serum/borsh": "^0.2.5", "@solana/web3.js": "^1.36.0", @@ -2252,34 +2458,30 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", "dependencies": { "base-x": "^3.0.2" } }, + "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/bs58/node_modules/base-x": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/@mercurial-finance/token-math": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@mercurial-finance/token-math/-/token-math-6.0.0.tgz", "integrity": "sha512-/o2Kr+gXXE4UvkBJ4QLcbiBmKUyBvU1C0tty6y4smJxEItJYiH6yQzRSWpkBhP5Q387n/j05nqoizX4uZkBlwg==", - "license": "MIT", "dependencies": { "@types/big.js": "^6.2.2", "big.js": "^6.2.1", @@ -2291,10 +2493,9 @@ } }, "node_modules/@mercurial-finance/vault-sdk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@mercurial-finance/vault-sdk/-/vault-sdk-2.1.0.tgz", - "integrity": "sha512-B3HQD9gQ6l6nAMN5DItgYZP3RZXzhQgZiaNqong4GkEmMkPQaNep4K5kokBAPksWAWCpELi0u+TcpOc/6S4u2g==", - "license": "MIT", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@mercurial-finance/vault-sdk/-/vault-sdk-2.2.0.tgz", + "integrity": "sha512-Q6Ejkl/mDXR+d4K1p9TL0FJ8p18hQH2rUwPwq+1twLxoHvmHeHM+9bfU3iMLQ+odcC6vh3LXBiMEBdyzgMGXlg==", "dependencies": { "@coral-xyz/anchor": "^0.28.0", "@solana/buffer-layout": "^4.0.1", @@ -2311,7 +2512,6 @@ "version": "0.28.0", "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.28.0.tgz", "integrity": "sha512-kQ02Hv2ZqxtWP30WN1d4xxT4QqlOXYDxmEd3k/bbneqhV3X5QMO4LAtoUFs7otxyivOgoqam5Il5qx81FuI4vw==", - "license": "(MIT OR Apache-2.0)", "dependencies": { "@coral-xyz/borsh": "^0.28.0", "@solana/web3.js": "^1.68.0", @@ -2337,7 +2537,6 @@ "version": "0.28.0", "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.28.0.tgz", "integrity": "sha512-/u1VTzw7XooK7rqeD7JLUSwOyRSesPUk0U37BV9zK0axJc1q0nRbKFGFLYCQ16OtdOJTTwGfGp11Lx9B45bRCQ==", - "license": "Apache-2.0", "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" @@ -2353,7 +2552,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } @@ -2362,7 +2560,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", "dependencies": { "base-x": "^3.0.2" } @@ -2370,8 +2567,7 @@ "node_modules/@mercurial-finance/vault-sdk/node_modules/decimal.js": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "license": "MIT" + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" }, "node_modules/@metaplex-foundation/beet": { "version": "0.7.1", @@ -2403,6 +2599,7 @@ "version": "0.20.1", "resolved": "https://registry.npmjs.org/@metaplex-foundation/js/-/js-0.20.1.tgz", "integrity": "sha512-aqiLoEiToXdfI5pS+17/GN/dIO2D31gLoVQvEKDQi9XcnOPVhfJerXDmwgKbhp79OGoYxtlvVw+b2suacoUzGQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dependencies": { "@irys/sdk": "^0.0.2", "@metaplex-foundation/beet": "0.7.1", @@ -2446,6 +2643,7 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/@irys/sdk/-/sdk-0.0.2.tgz", "integrity": "sha512-un/e/CmTpgT042gDwCN3AtISrR9OYGMY6V+442pFmSWKrwrsDoIXZ8VlLiYKnrtTm+yquGhjfYy0LDqGWq41pA==", + "deprecated": "Arweave support is deprecated - We recommend migrating to the Irys datachain: https://migrate-to.irys.xyz/", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/contracts": "^5.7.0", @@ -2570,9 +2768,9 @@ } }, "node_modules/@metaplex-foundation/js/node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dependencies": { "safe-buffer": "^5.0.1" } @@ -2585,6 +2783,44 @@ "node": ">= 12" } }, + "node_modules/@metaplex-foundation/js/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@metaplex-foundation/js/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/@metaplex-foundation/js/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/@metaplex-foundation/js/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/@metaplex-foundation/mpl-auction-house": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@metaplex-foundation/mpl-auction-house/-/mpl-auction-house-2.5.1.tgz", @@ -2796,9 +3032,9 @@ } }, "node_modules/@metaplex-foundation/umi": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi/-/umi-0.9.1.tgz", - "integrity": "sha512-IhHoOvp4vfO/++YL+78+iVuLM53+FDwUOZDYgH6lx0jYXyQ27BeaieeR5i+q3A9dz4KxQo5Nzc5aCA1109QGCQ==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi/-/umi-0.9.2.tgz", + "integrity": "sha512-9i4Acm4pruQfJcpRrc2EauPBwkfDN0I9QTvJyZocIlKgoZwD6A6wH0PViH1AjOVG5CQCd1YI3tJd5XjYE1ElBw==", "dependencies": { "@metaplex-foundation/umi-options": "^0.8.9", "@metaplex-foundation/umi-public-keys": "^0.8.9", @@ -2806,54 +3042,92 @@ } }, "node_modules/@metaplex-foundation/umi-bundle-defaults": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-bundle-defaults/-/umi-bundle-defaults-0.9.1.tgz", - "integrity": "sha512-QBaCLrb2D5uhY6pbWdxGPdD3LNKOAZ/Wfp7gEzhAipWmEV75KO7ya3AzaU4JZPHaf9juwdU4wO50WEPRb7YyQg==", - "dependencies": { - "@metaplex-foundation/umi-downloader-http": "^0.9.1", - "@metaplex-foundation/umi-eddsa-web3js": "^0.9.1", - "@metaplex-foundation/umi-http-fetch": "^0.9.1", - "@metaplex-foundation/umi-program-repository": "^0.9.1", - "@metaplex-foundation/umi-rpc-chunk-get-accounts": "^0.9.1", - "@metaplex-foundation/umi-rpc-web3js": "^0.9.1", - "@metaplex-foundation/umi-serializer-data-view": "^0.9.1", - "@metaplex-foundation/umi-transaction-factory-web3js": "^0.9.1" + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-bundle-defaults/-/umi-bundle-defaults-0.9.2.tgz", + "integrity": "sha512-kV3tfvgvRjVP1p9OFOtH+ibOtN9omVJSwKr0We4/9r45e5LTj+32su0V/rixZUkG1EZzzOYBsxhtIE0kIw/Hrw==", + "dependencies": { + "@metaplex-foundation/umi-downloader-http": "^0.9.2", + "@metaplex-foundation/umi-eddsa-web3js": "^0.9.2", + "@metaplex-foundation/umi-http-fetch": "^0.9.2", + "@metaplex-foundation/umi-program-repository": "^0.9.2", + "@metaplex-foundation/umi-rpc-chunk-get-accounts": "^0.9.2", + "@metaplex-foundation/umi-rpc-web3js": "^0.9.2", + "@metaplex-foundation/umi-serializer-data-view": "^0.9.2", + "@metaplex-foundation/umi-transaction-factory-web3js": "^0.9.2" }, "peerDependencies": { - "@metaplex-foundation/umi": "^0.9.1", + "@metaplex-foundation/umi": "^0.9.2", "@solana/web3.js": "^1.72.0" } }, "node_modules/@metaplex-foundation/umi-downloader-http": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-downloader-http/-/umi-downloader-http-0.9.1.tgz", - "integrity": "sha512-T/t9YtkDxovIz5hG0SEBolzet0nTd77hZJSSGCNfrhhgJJtNeIHz+/0K+o7U+ubLddFmtPNxF4KBfmh1jCYCQQ==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-downloader-http/-/umi-downloader-http-0.9.2.tgz", + "integrity": "sha512-tzPT9hBwenzTzAQg07rmsrqZfgguAXELbcJrsYMoASp5VqWFXYIP00g94KET6XLjWUXH4P1J2zoa6hGennPXHA==", "peerDependencies": { - "@metaplex-foundation/umi": "^0.9.1" + "@metaplex-foundation/umi": "^0.9.2" } }, "node_modules/@metaplex-foundation/umi-eddsa-web3js": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-eddsa-web3js/-/umi-eddsa-web3js-0.9.1.tgz", - "integrity": "sha512-D+ZP8jOEzfr1ncF18zRdxfE820xjTf6AIBZd926TRj8dlOFIDfu1J0FGS7pC+52CAC9BRNrRvYQyc1TPORkfTQ==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-eddsa-web3js/-/umi-eddsa-web3js-0.9.2.tgz", + "integrity": "sha512-hhPCxXbYIp4BC4z9gK78sXpWLkNSrfv4ndhF5ruAkdIp7GcRVYKj0QnOUO6lGYGiIkNlw20yoTwOe1CT//OfTQ==", "dependencies": { - "@metaplex-foundation/umi-web3js-adapters": "^0.9.1", + "@metaplex-foundation/umi-web3js-adapters": "^0.9.2", "@noble/curves": "^1.0.0" }, "peerDependencies": { - "@metaplex-foundation/umi": "^0.9.1", + "@metaplex-foundation/umi": "^0.9.2", "@solana/web3.js": "^1.72.0" } }, "node_modules/@metaplex-foundation/umi-http-fetch": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-http-fetch/-/umi-http-fetch-0.9.1.tgz", - "integrity": "sha512-Flh5wSbiYmeDg4V6IE9BNX1BH3eewcIzHxZ1RT1sagU0PlDwy37dm0gcU+svYM/usDvnbk4hwOMGcZkhQLN1QQ==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-http-fetch/-/umi-http-fetch-0.9.2.tgz", + "integrity": "sha512-YCZuBu24T9ZzEDe4+w12LEZm/fO9pkyViZufGgASC5NX93814Lvf6Ssjn/hZzjfA7CvZbvLFbmujc6CV3Q/m9Q==", "dependencies": { "node-fetch": "^2.6.7" }, "peerDependencies": { - "@metaplex-foundation/umi": "^0.9.1" + "@metaplex-foundation/umi": "^0.9.2" + } + }, + "node_modules/@metaplex-foundation/umi-http-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@metaplex-foundation/umi-http-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/@metaplex-foundation/umi-http-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/@metaplex-foundation/umi-http-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/@metaplex-foundation/umi-options": { @@ -2862,11 +3136,11 @@ "integrity": "sha512-jSQ61sZMPSAk/TXn8v8fPqtz3x8d0/blVZXLLbpVbo2/T5XobiI6/MfmlUosAjAUaQl6bHRF8aIIqZEFkJiy4A==" }, "node_modules/@metaplex-foundation/umi-program-repository": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-program-repository/-/umi-program-repository-0.9.1.tgz", - "integrity": "sha512-6SawFMO4IZdk4y+D/+o8CyYnfmy8kcOqhQsX3fUMqIXSzz0vzMT2/dDTMfLsuTVyULnaW/VYm26cmYBjVqZTlw==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-program-repository/-/umi-program-repository-0.9.2.tgz", + "integrity": "sha512-g3+FPqXEmYsBa8eETtUE2gb2Oe3mqac0z3/Ur1TvAg5TtIy3mzRzOy/nza+sgzejnfcxcVg835rmpBaxpBnjDA==", "peerDependencies": { - "@metaplex-foundation/umi": "^0.9.1" + "@metaplex-foundation/umi": "^0.9.2" } }, "node_modules/@metaplex-foundation/umi-public-keys": { @@ -2878,31 +3152,31 @@ } }, "node_modules/@metaplex-foundation/umi-rpc-chunk-get-accounts": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-rpc-chunk-get-accounts/-/umi-rpc-chunk-get-accounts-0.9.1.tgz", - "integrity": "sha512-WxF4DxSBJXzrGfmJ+X4DjF4rk9as/0EnkpGo0DdtHTZNqIfRY9mqi8OPRe/JhSjYzWFCC0ngjanqShhcEetB4A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-rpc-chunk-get-accounts/-/umi-rpc-chunk-get-accounts-0.9.2.tgz", + "integrity": "sha512-YRwVf6xH0jPBAUgMhEPi+UbjioAeqTXmjsN2TnmQCPAmHbrHrMRj0rlWYwFLWAgkmoxazYrXP9lqOFRrfOGAEA==", "peerDependencies": { - "@metaplex-foundation/umi": "^0.9.1" + "@metaplex-foundation/umi": "^0.9.2" } }, "node_modules/@metaplex-foundation/umi-rpc-web3js": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-rpc-web3js/-/umi-rpc-web3js-0.9.1.tgz", - "integrity": "sha512-kOJEc9IWMX+H7dI5zZZimww1w0A6yd2V/fsQHKB/kHddja7JoPK4Au68n45Pi0vb3HY7riCQN9XMqOOPD5tcxA==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-rpc-web3js/-/umi-rpc-web3js-0.9.2.tgz", + "integrity": "sha512-MqcsBz8B4wGl6jxsf2Jo/rAEpYReU9VCSR15QSjhvADHMmdFxCIZCCAgE+gDE2Vuanfl437VhOcP3g5Uw8C16Q==", "dependencies": { - "@metaplex-foundation/umi-web3js-adapters": "^0.9.1" + "@metaplex-foundation/umi-web3js-adapters": "^0.9.2" }, "peerDependencies": { - "@metaplex-foundation/umi": "^0.9.1", + "@metaplex-foundation/umi": "^0.9.2", "@solana/web3.js": "^1.72.0" } }, "node_modules/@metaplex-foundation/umi-serializer-data-view": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-serializer-data-view/-/umi-serializer-data-view-0.9.1.tgz", - "integrity": "sha512-teilMc3abBrdLtgQ0PqnNXvmdsjNFPk4sVbM/flxoh9edyRQCAJmyK7DEA7cXCYfhBVX0jwSJIEcqTDa+r+jdw==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-serializer-data-view/-/umi-serializer-data-view-0.9.2.tgz", + "integrity": "sha512-5vGptadJxUxvUcyrwFZxXlEc6Q7AYySBesizCtrBFUY8w8PnF2vzmS45CP1MLySEATNH6T9mD4Rs0tLb87iQyA==", "peerDependencies": { - "@metaplex-foundation/umi": "^0.9.1" + "@metaplex-foundation/umi": "^0.9.2" } }, "node_modules/@metaplex-foundation/umi-serializers": { @@ -2939,40 +3213,42 @@ } }, "node_modules/@metaplex-foundation/umi-transaction-factory-web3js": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-transaction-factory-web3js/-/umi-transaction-factory-web3js-0.9.1.tgz", - "integrity": "sha512-DBBvaMpR6pR3ZpyaRD/0QSTjS+3lxHIUZYAqZi0JYsTyYqNTNsdKVbeu6uLjbeyoJbmqgKVZ0nZgcokEKx49eg==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-transaction-factory-web3js/-/umi-transaction-factory-web3js-0.9.2.tgz", + "integrity": "sha512-fR1Kf21uylMFd1Smkltmj4jTNxhqSWf416owsJ+T+cvJi2VCOcOwq/3UFzOrpz78fA0RhsajKYKj0HYsRnQI1g==", "dependencies": { - "@metaplex-foundation/umi-web3js-adapters": "^0.9.1" + "@metaplex-foundation/umi-web3js-adapters": "^0.9.2" }, "peerDependencies": { - "@metaplex-foundation/umi": "^0.9.1", + "@metaplex-foundation/umi": "^0.9.2", "@solana/web3.js": "^1.72.0" } }, "node_modules/@metaplex-foundation/umi-web3js-adapters": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-web3js-adapters/-/umi-web3js-adapters-0.9.1.tgz", - "integrity": "sha512-O6lQGJFebRM8P67ajvUpuctJ/J39Lylp4wyg8E1tHmFxUsdBC7M9qBixi/WmCiNKgSfVrq6MmiYaba3OSrtqwg==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-web3js-adapters/-/umi-web3js-adapters-0.9.2.tgz", + "integrity": "sha512-RQqUTtHYY9fmEMnq7s3Hiv/81flGaoI0ZVVoafnFVaQLnxU6QBKxtboRZHk43XtD9CiFh5f9izrMJX7iK7KlOA==", "dependencies": { "buffer": "^6.0.3" }, "peerDependencies": { - "@metaplex-foundation/umi": "^0.9.1", + "@metaplex-foundation/umi": "^0.9.2", "@solana/web3.js": "^1.72.0" } }, "node_modules/@meteora-ag/dlmm": { - "version": "1.0.54", - "resolved": "https://registry.npmjs.org/@meteora-ag/dlmm/-/dlmm-1.0.54.tgz", - "integrity": "sha512-CDPsGgrqpv1LlQGb7y3rnogRJMh29pGtWigmtbD9aoBl90L/nj1jAeJStyqpij3zsG6Eeo2EG6QvL0nqLtbi6Q==", - "license": "ISC", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@meteora-ag/dlmm/-/dlmm-1.2.3.tgz", + "integrity": "sha512-V6Nund7IAQ4/6tNKQU+sKeKsvzRJrEtCTm3x20q+By7YkMIKmEILffGCQMTQBozkIl0BaUidkYpE1v04KihrAw==", "dependencies": { "@coral-xyz/anchor": "^0.28.0", + "@coral-xyz/borsh": "^0.28.0", "@solana/buffer-layout": "^4.0.1", - "@solana/spl-token": "0.3.5", - "@solana/web3.js": "~1.78.3", + "@solana/spl-token": "^0.4.6", + "@solana/web3.js": "^1.91.6", + "bn.js": "^5.2.1", "decimal.js": "^10.4.2", + "express": "^4.19.2", "gaussian": "^1.3.0" } }, @@ -2980,7 +3256,6 @@ "version": "0.28.0", "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.28.0.tgz", "integrity": "sha512-kQ02Hv2ZqxtWP30WN1d4xxT4QqlOXYDxmEd3k/bbneqhV3X5QMO4LAtoUFs7otxyivOgoqam5Il5qx81FuI4vw==", - "license": "(MIT OR Apache-2.0)", "dependencies": { "@coral-xyz/borsh": "^0.28.0", "@solana/web3.js": "^1.68.0", @@ -3006,7 +3281,6 @@ "version": "0.28.0", "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.28.0.tgz", "integrity": "sha512-/u1VTzw7XooK7rqeD7JLUSwOyRSesPUk0U37BV9zK0axJc1q0nRbKFGFLYCQ16OtdOJTTwGfGp11Lx9B45bRCQ==", - "license": "Apache-2.0", "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" @@ -3018,77 +3292,87 @@ "@solana/web3.js": "^1.68.0" } }, - "node_modules/@meteora-ag/dlmm/node_modules/@solana/spl-token": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.5.tgz", - "integrity": "sha512-0bGC6n415lGjKu02gkLOIpP1wzndSP0SHwN9PefJ+wKAhmfU1rl3AV1Pa41uap2kzSCD6F9642ngNO8KXPvh/g==", - "license": "Apache-2.0", + "node_modules/@meteora-ag/dlmm/node_modules/base-x": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dependencies": { - "@solana/buffer-layout": "^4.0.0", - "@solana/buffer-layout-utils": "^0.2.0", - "buffer": "^6.0.3" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.47.4" + "safe-buffer": "^5.0.1" } }, - "node_modules/@meteora-ag/dlmm/node_modules/@solana/web3.js": { - "version": "1.78.8", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.78.8.tgz", - "integrity": "sha512-y6kMa0ohRjamBGtxIGX4TkdAzL8Cs2bzM4JDPCyYLFPdo7kWk0Cx+BkbhX8hEV4IfvCONF92KIniV7hDvHuq8A==", - "license": "MIT", + "node_modules/@meteora-ag/dlmm/node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "dependencies": { - "@babel/runtime": "^7.22.6", - "@noble/curves": "^1.2.0", - "@noble/hashes": "^1.3.1", - "@solana/buffer-layout": "^4.0.0", - "agentkeepalive": "^4.3.0", - "bigint-buffer": "^1.1.5", + "base-x": "^3.0.2" + } + }, + "node_modules/@meteora-ag/stake-for-fee": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@meteora-ag/stake-for-fee/-/stake-for-fee-1.0.12.tgz", + "integrity": "sha512-LRRwKe2g+S4rIrksEqonREIgmnBY22/xGDKOkgZTXhHPF0ON/DWwThUMmhay2scI9D8YypzHQHDYmfjLjoc/7A==", + "dependencies": { + "@coral-xyz/anchor": "0.28.0", + "@coral-xyz/borsh": "^0.30.1", + "@solana/spl-token": "^0.4.8", + "@solana/web3.js": "^1.95.3", "bn.js": "^5.2.1", - "borsh": "^0.7.0", + "decimal.js": "^10.4.3" + } + }, + "node_modules/@meteora-ag/stake-for-fee/node_modules/@coral-xyz/anchor": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.28.0.tgz", + "integrity": "sha512-kQ02Hv2ZqxtWP30WN1d4xxT4QqlOXYDxmEd3k/bbneqhV3X5QMO4LAtoUFs7otxyivOgoqam5Il5qx81FuI4vw==", + "dependencies": { + "@coral-xyz/borsh": "^0.28.0", + "@solana/web3.js": "^1.68.0", + "base64-js": "^1.5.1", + "bn.js": "^5.1.2", "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.0", - "node-fetch": "^2.6.12", - "rpc-websockets": "^7.5.1", - "superstruct": "^0.14.2" + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "js-sha256": "^0.9.0", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" } }, - "node_modules/@meteora-ag/dlmm/node_modules/@solana/web3.js/node_modules/superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==", - "license": "MIT" + "node_modules/@meteora-ag/stake-for-fee/node_modules/@coral-xyz/anchor/node_modules/@coral-xyz/borsh": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.28.0.tgz", + "integrity": "sha512-/u1VTzw7XooK7rqeD7JLUSwOyRSesPUk0U37BV9zK0axJc1q0nRbKFGFLYCQ16OtdOJTTwGfGp11Lx9B45bRCQ==", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } }, - "node_modules/@meteora-ag/dlmm/node_modules/base-x": { + "node_modules/@meteora-ag/stake-for-fee/node_modules/base-x": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } }, - "node_modules/@meteora-ag/dlmm/node_modules/borsh": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", - "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", - "license": "Apache-2.0", - "dependencies": { - "bn.js": "^5.2.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" - } - }, - "node_modules/@meteora-ag/dlmm/node_modules/bs58": { + "node_modules/@meteora-ag/stake-for-fee/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", "dependencies": { "base-x": "^3.0.2" } @@ -3105,9 +3389,9 @@ } }, "node_modules/@near-js/crypto/node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dependencies": { "safe-buffer": "^5.0.1" } @@ -3189,9 +3473,9 @@ } }, "node_modules/@near-js/providers/node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dependencies": { "safe-buffer": "^5.0.1" } @@ -3214,6 +3498,48 @@ "base-x": "^3.0.2" } }, + "node_modules/@near-js/providers/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "optional": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@near-js/providers/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "optional": true + }, + "node_modules/@near-js/providers/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "optional": true + }, + "node_modules/@near-js/providers/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "optional": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/@near-js/signers": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/@near-js/signers/-/signers-0.0.4.tgz", @@ -3253,9 +3579,9 @@ } }, "node_modules/@near-js/signers/node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dependencies": { "safe-buffer": "^5.0.1" } @@ -3323,9 +3649,9 @@ } }, "node_modules/@near-js/transactions/node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dependencies": { "safe-buffer": "^5.0.1" } @@ -3368,11 +3694,14 @@ } }, "node_modules/@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", + "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", "dependencies": { - "@noble/hashes": "1.4.0" + "@noble/hashes": "1.5.0" + }, + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -3390,11 +3719,11 @@ ] }, "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", "engines": { - "node": ">= 16" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -3409,14 +3738,12 @@ "type": "individual", "url": "https://paulmillr.com/funding/" } - ], - "license": "MIT" + ] }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3429,7 +3756,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -3438,7 +3764,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3451,7 +3776,6 @@ "version": "3.27.0", "resolved": "https://registry.npmjs.org/@oclif/core/-/core-3.27.0.tgz", "integrity": "sha512-Fg93aNFvXzBq5L7ztVHFP2nYwWU1oTCq48G0TjF/qC1UN36KWa2H5Hsm72kERd5x/sjy2M2Tn4kDEorUlpXOlw==", - "license": "MIT", "dependencies": { "@types/cli-progress": "^3.11.5", "ansi-escapes": "^4.3.2", @@ -3486,75 +3810,14 @@ "node": ">=18.0.0" } }, - "node_modules/@oclif/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@oclif/core/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@oclif/core/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@oclif/plugin-autocomplete": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-3.1.6.tgz", - "integrity": "sha512-Eo13RHSr7c5I5miatEBGhKVkLEADzN8taUlYOs5vbRWtWlR/FoDnwSZJ72gBvvayvCHEqlBOaNBn/wufxdrDAg==", - "license": "MIT", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-3.2.7.tgz", + "integrity": "sha512-mjXaBwN972UaOj1pjBCy60io4HzGoGjXDC7pUSlpb5BrKY20U0ggkZAehK4EF/DxuMfDz5sHk+8f5Lsgxfm54g==", "dependencies": { "@oclif/core": "^4", - "ansis": "^3.2.0", - "debug": "^4.3.5", + "ansis": "^3.3.1", + "debug": "^4.3.6", "ejs": "^3.1.10" }, "engines": { @@ -3562,16 +3825,15 @@ } }, "node_modules/@oclif/plugin-autocomplete/node_modules/@oclif/core": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.11.tgz", - "integrity": "sha512-cZLLdSm9tGSbuoRjjgXf128zvPZH+afjQMQcrvDfoN347KvPg75ne8YJ8qHix+T3Vl03iXfgIH6guQN0kLgmjg==", - "license": "MIT", + "version": "4.0.31", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.31.tgz", + "integrity": "sha512-7oyIZv/C1TP+fPc2tSzVPYqG1zU+nel1QvJxjAWyVhud0J8B5SpKZnryedxs3nlSVPJ6K1MT31C9esupCBYgZw==", "dependencies": { "ansi-escapes": "^4.3.2", - "ansis": "^3.1.1", + "ansis": "^3.3.2", "clean-stack": "^3.0.1", "cli-spinners": "^2.9.2", - "debug": "^4.3.5", + "debug": "^4.3.7", "ejs": "^3.1.10", "get-package-type": "^0.1.0", "globby": "^11.1.0", @@ -3579,6 +3841,7 @@ "is-wsl": "^2.2.0", "lilconfig": "^3.1.2", "minimatch": "^9.0.5", + "semver": "^7.6.3", "string-width": "^4.2.3", "supports-color": "^8", "widest-line": "^3.1.0", @@ -3589,43 +3852,10 @@ "node": ">=18.0.0" } }, - "node_modules/@oclif/plugin-autocomplete/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@oclif/plugin-autocomplete/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@oclif/plugin-help": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.5.tgz", - "integrity": "sha512-/NgP6j5THCWDxQj3Mba+IIidf8fBtOT5Wh6ygb2WdWLSxcsRXSQUiJKKOXu8e/N5+KQeuG2Yko2hFxd2cZUzMQ==", - "license": "MIT", + "version": "6.2.16", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.16.tgz", + "integrity": "sha512-1x/Bm0LebDouDOfsjkOz+6AXqY6gIZ6JmmU/KuF/GnUmowDvj5i3MFlP9uBTiN8UsOUeT9cdLwnc1kmitHWFTg==", "dependencies": { "@oclif/core": "^4" }, @@ -3634,16 +3864,15 @@ } }, "node_modules/@oclif/plugin-help/node_modules/@oclif/core": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.11.tgz", - "integrity": "sha512-cZLLdSm9tGSbuoRjjgXf128zvPZH+afjQMQcrvDfoN347KvPg75ne8YJ8qHix+T3Vl03iXfgIH6guQN0kLgmjg==", - "license": "MIT", + "version": "4.0.31", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.31.tgz", + "integrity": "sha512-7oyIZv/C1TP+fPc2tSzVPYqG1zU+nel1QvJxjAWyVhud0J8B5SpKZnryedxs3nlSVPJ6K1MT31C9esupCBYgZw==", "dependencies": { "ansi-escapes": "^4.3.2", - "ansis": "^3.1.1", + "ansis": "^3.3.2", "clean-stack": "^3.0.1", "cli-spinners": "^2.9.2", - "debug": "^4.3.5", + "debug": "^4.3.7", "ejs": "^3.1.10", "get-package-type": "^0.1.0", "globby": "^11.1.0", @@ -3651,6 +3880,7 @@ "is-wsl": "^2.2.0", "lilconfig": "^3.1.2", "minimatch": "^9.0.5", + "semver": "^7.6.3", "string-width": "^4.2.3", "supports-color": "^8", "widest-line": "^3.1.0", @@ -3661,47 +3891,14 @@ "node": ">=18.0.0" } }, - "node_modules/@oclif/plugin-help/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@oclif/plugin-help/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@oclif/plugin-not-found": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.10.tgz", - "integrity": "sha512-Bevp3hcv1IhNgljugIhxL5ARcwxsQmiR9yGOozURuZBX3IjsHBPhI2I92wKA2KM5zRgh4zOm6gvoP8gcHlhLJA==", - "license": "MIT", + "version": "3.2.24", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.24.tgz", + "integrity": "sha512-oseOiNfvcaB4tB9YLnUo16DlW61yi/glfpxk6Z6e5BzQkmD0D0vptfBB6/gLf0/vP+0/C8NZbJoqwae08mRpOA==", "dependencies": { - "@inquirer/confirm": "^3.1.14", + "@inquirer/prompts": "^7.0.1", "@oclif/core": "^4", - "ansis": "^3.2.0", + "ansis": "^3.3.1", "fast-levenshtein": "^3.0.0" }, "engines": { @@ -3709,16 +3906,15 @@ } }, "node_modules/@oclif/plugin-not-found/node_modules/@oclif/core": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.11.tgz", - "integrity": "sha512-cZLLdSm9tGSbuoRjjgXf128zvPZH+afjQMQcrvDfoN347KvPg75ne8YJ8qHix+T3Vl03iXfgIH6guQN0kLgmjg==", - "license": "MIT", + "version": "4.0.31", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.31.tgz", + "integrity": "sha512-7oyIZv/C1TP+fPc2tSzVPYqG1zU+nel1QvJxjAWyVhud0J8B5SpKZnryedxs3nlSVPJ6K1MT31C9esupCBYgZw==", "dependencies": { "ansi-escapes": "^4.3.2", - "ansis": "^3.1.1", + "ansis": "^3.3.2", "clean-stack": "^3.0.1", "cli-spinners": "^2.9.2", - "debug": "^4.3.5", + "debug": "^4.3.7", "ejs": "^3.1.10", "get-package-type": "^0.1.0", "globby": "^11.1.0", @@ -3726,6 +3922,7 @@ "is-wsl": "^2.2.0", "lilconfig": "^3.1.2", "minimatch": "^9.0.5", + "semver": "^7.6.3", "string-width": "^4.2.3", "supports-color": "^8", "widest-line": "^3.1.0", @@ -3736,52 +3933,19 @@ "node": ">=18.0.0" } }, - "node_modules/@oclif/plugin-not-found/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@oclif/plugin-not-found/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@oclif/plugin-plugins": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/@oclif/plugin-plugins/-/plugin-plugins-5.3.4.tgz", - "integrity": "sha512-gbLe+rfqP3dlphqOisFvbZ+adjobvIEhc78ferl3wFL4EazkIrcqrHYle77EjsaEiATqtCIeh3Ef41QCGoK9pA==", - "license": "MIT", - "dependencies": { - "@oclif/core": "^4", - "ansis": "^3.2.0", - "debug": "^4.3.4", - "npm": "^10.8.1", - "npm-package-arg": "^11.0.2", + "version": "5.4.15", + "resolved": "https://registry.npmjs.org/@oclif/plugin-plugins/-/plugin-plugins-5.4.15.tgz", + "integrity": "sha512-0cnTFaRWdXkWgKTrwgjoggcq/A3MaIl1GkDs3BFFjesYlFEs5Fb2HcN42rY+2ja4jBkXrjXBkLS+9faAtdCH6A==", + "dependencies": { + "@oclif/core": "^4.0.28", + "ansis": "^3.3.2", + "debug": "^4.3.7", + "npm": "^10.9.0", + "npm-package-arg": "^11.0.3", "npm-run-path": "^5.3.0", "object-treeify": "^4.0.1", - "semver": "^7.6.2", + "semver": "^7.6.3", "validate-npm-package-name": "^5.0.1", "which": "^4.0.0", "yarn": "^1.22.22" @@ -3791,16 +3955,15 @@ } }, "node_modules/@oclif/plugin-plugins/node_modules/@oclif/core": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.11.tgz", - "integrity": "sha512-cZLLdSm9tGSbuoRjjgXf128zvPZH+afjQMQcrvDfoN347KvPg75ne8YJ8qHix+T3Vl03iXfgIH6guQN0kLgmjg==", - "license": "MIT", + "version": "4.0.31", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.31.tgz", + "integrity": "sha512-7oyIZv/C1TP+fPc2tSzVPYqG1zU+nel1QvJxjAWyVhud0J8B5SpKZnryedxs3nlSVPJ6K1MT31C9esupCBYgZw==", "dependencies": { "ansi-escapes": "^4.3.2", - "ansis": "^3.1.1", + "ansis": "^3.3.2", "clean-stack": "^3.0.1", "cli-spinners": "^2.9.2", - "debug": "^4.3.5", + "debug": "^4.3.7", "ejs": "^3.1.10", "get-package-type": "^0.1.0", "globby": "^11.1.0", @@ -3808,6 +3971,7 @@ "is-wsl": "^2.2.0", "lilconfig": "^3.1.2", "minimatch": "^9.0.5", + "semver": "^7.6.3", "string-width": "^4.2.3", "supports-color": "^8", "widest-line": "^3.1.0", @@ -3822,47 +3986,14 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-4.0.1.tgz", "integrity": "sha512-Y6tg5rHfsefSkfKujv2SwHulInROy/rCL5F4w0QOWxut8AnxYxf0YmNhTh95Zfyxpsudo66uqkux0ACFnyMSgQ==", - "license": "MIT", "engines": { "node": ">= 16" } }, - "node_modules/@oclif/plugin-plugins/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@oclif/plugin-plugins/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@orca-so/common-sdk": { - "version": "0.6.0-alpha.3", - "resolved": "https://registry.npmjs.org/@orca-so/common-sdk/-/common-sdk-0.6.0-alpha.3.tgz", - "integrity": "sha512-+M+i/B/Ol+FqphJYwQaTds67G1ZNNQNLnebFpN4sBdxUucmWzuzZ/W75GSlIaT5XSZ8UqUjSEe/LAxauNyvfiQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@orca-so/common-sdk/-/common-sdk-0.6.3.tgz", + "integrity": "sha512-jeLAjQfr3R1Mg72+hlu5tPih0qY2o9WV00o/nSIR/GtpIWsRPb4Ep0FzYQSI1XH7s+XfSXNuhEWFGsFA/qPMLQ==", "dependencies": { "tiny-invariant": "^1.3.1" }, @@ -3889,7 +4020,6 @@ "version": "0.27.0", "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.27.0.tgz", "integrity": "sha512-+P/vPdORawvg3A9Wj02iquxb4T0C5m4P6aZBVYysKl4Amk+r6aMPZkUhilBkD6E4Nuxnoajv3CFykUfkGE0n5g==", - "license": "(MIT OR Apache-2.0)", "dependencies": { "@coral-xyz/borsh": "^0.27.0", "@solana/web3.js": "^1.68.0", @@ -3915,7 +4045,6 @@ "version": "0.27.0", "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.27.0.tgz", "integrity": "sha512-tJKzhLukghTWPLy+n8K8iJKgBq1yLT/AxaNd10yJrX8mI56ao5+OFAKAqW/h0i79KCvb4BK0VGO5ECmmolFz9A==", - "license": "Apache-2.0", "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" @@ -3959,7 +4088,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } @@ -3968,7 +4096,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", "dependencies": { "base-x": "^3.0.2" } @@ -3977,7 +4104,6 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/@pbkit/grpc-client/-/grpc-client-0.0.3.tgz", "integrity": "sha512-VVWZ15jDxoAXNylW+dp6eRfxSaXlZwN/emPhxrHGhIj97K87VnVyl+532A6kEAhBldjJLTIoZQ/9dth1qIlGvQ==", - "license": "(MIT OR Apache-2.0)", "dependencies": { "@pbkit/runtime": "^0.0.35" }, @@ -3988,14 +4114,21 @@ "node_modules/@pbkit/runtime": { "version": "0.0.35", "resolved": "https://registry.npmjs.org/@pbkit/runtime/-/runtime-0.0.35.tgz", - "integrity": "sha512-QPey6r26Dfh1gVfUmGH0qn4lhbH2RVRC7St3mnERISyT1Gx1RgBpGIQJs14Pwt8E7TfJB+a0Btj6nr6teUADTg==", - "license": "(MIT OR Apache-2.0)" + "integrity": "sha512-QPey6r26Dfh1gVfUmGH0qn4lhbH2RVRC7St3mnERISyT1Gx1RgBpGIQJs14Pwt8E7TfJB+a0Btj6nr6teUADTg==" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "license": "MIT", "engines": { "node": ">=12.22.0" } @@ -4004,7 +4137,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "license": "MIT", "dependencies": { "graceful-fs": "4.2.10" }, @@ -4015,14 +4147,12 @@ "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "license": "ISC" + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/@pnpm/npm-conf": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", - "license": "MIT", "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", @@ -4036,7 +4166,6 @@ "version": "0.26.0", "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.26.0.tgz", "integrity": "sha512-Nq+COIjE1135T7qfnOHEn7E0q39bQTgXLFk837/rgFe6Hkew9WML7eHsS+lSYD2p3OJaTiUOHTAq1lHy36oIqQ==", - "license": "(MIT OR Apache-2.0)", "dependencies": { "@coral-xyz/borsh": "^0.26.0", "@solana/web3.js": "^1.68.0", @@ -4062,7 +4191,6 @@ "version": "0.26.0", "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.26.0.tgz", "integrity": "sha512-uCZ0xus0CszQPHYfWAqKS5swS1UxvePu83oOF+TWpUkedsNlg6p2p4azxZNSSqwXb9uXMFgxhuMBX9r3Xoi0vQ==", - "license": "Apache-2.0", "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" @@ -4075,9 +4203,9 @@ } }, "node_modules/@project-serum/anchor/node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dependencies": { "safe-buffer": "^5.0.1" } @@ -4094,7 +4222,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/@project-serum/borsh/-/borsh-0.2.5.tgz", "integrity": "sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==", - "license": "Apache-2.0", "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" @@ -4125,7 +4252,6 @@ "version": "0.11.1", "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.11.1.tgz", "integrity": "sha512-oIdm4vTJkUy6GmE6JgqDAuQPKI7XM4TPJkjtoIzp69RZe0iAD9JP2XHx7lV1jLdYXeYHqDXfBt3zcq7W91K6PA==", - "license": "(MIT OR Apache-2.0)", "dependencies": { "@project-serum/borsh": "^0.2.2", "@solana/web3.js": "^1.17.0", @@ -4166,7 +4292,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } @@ -4175,7 +4300,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", "dependencies": { "base-x": "^3.0.2" } @@ -4184,7 +4308,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -4200,32 +4323,27 @@ "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -4234,32 +4352,27 @@ "node_modules/@protobufjs/float": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@randlabs/communication-bridge": { "version": "1.0.1", @@ -4277,9 +4390,9 @@ } }, "node_modules/@raydium-io/raydium-sdk": { - "version": "1.3.1-beta.52", - "resolved": "https://registry.npmjs.org/@raydium-io/raydium-sdk/-/raydium-sdk-1.3.1-beta.52.tgz", - "integrity": "sha512-NnCIfmFLT5QZLjeMhAwEofNuzZEPAU7q2O0P0o67O1fsGdVq5HJgLL8bI6UMKX2d2Ed4MEz7ip2bSng2tHp+5w==", + "version": "1.3.1-beta.58", + "resolved": "https://registry.npmjs.org/@raydium-io/raydium-sdk/-/raydium-sdk-1.3.1-beta.58.tgz", + "integrity": "sha512-9SMneQktR6CvxOJ6C3PxW8aMtBsg28+OViaSDwNHgZ/gJP47bvUgUTsFSmnut4Mv9blsnYFxyc5eVoIfPdXeJg==", "dependencies": { "@solana/buffer-layout": "^4.0.1", "@solana/spl-token": "^0.3.9", @@ -4290,7 +4403,8 @@ "decimal.js-light": "^2.5.1", "fecha": "^4.2.3", "lodash": "^4.17.21", - "toformat": "^2.0.0" + "toformat": "^2.0.0", + "tsup": "^8.1.0" }, "peerDependencies": { "@solana/web3.js": "^1.73.0" @@ -4336,7 +4450,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", - "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.1.0" }, @@ -4353,14 +4466,13 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", - "license": "MIT", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "picomatch": "^4.0.2" }, "engines": { "node": ">=14.0.0" @@ -4374,54 +4486,269 @@ } } }, - "node_modules/@samverschueren/stream-to-observable": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", - "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", - "license": "MIT", - "dependencies": { - "any-observable": "^0.3.0" - }, - "engines": { - "node": ">=6" - }, - "peerDependenciesMeta": { - "rxjs": { - "optional": true - }, - "zen-observable": { - "optional": true - } - } - }, - "node_modules/@scure/base": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz", - "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==", - "funding": { + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.2.tgz", + "integrity": "sha512-ufoveNTKDg9t/b7nqI3lwbCG/9IJMhADBNjjz/Jn6LxIZxD7T5L8l2uO/wD99945F1Oo8FvgbbZJRguyk/BdzA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.2.tgz", + "integrity": "sha512-iZoYCiJz3Uek4NI0J06/ZxUgwAfNzqltK0MptPDO4OR0a88R4h0DSELMsflS6ibMCJ4PnLvq8f7O1d7WexUvIA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.2.tgz", + "integrity": "sha512-/UhrIxobHYCBfhi5paTkUDQ0w+jckjRZDZ1kcBL132WeHZQ6+S5v9jQPVGLVrLbNUebdIRpIt00lQ+4Z7ys4Rg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.2.tgz", + "integrity": "sha512-1F/jrfhxJtWILusgx63WeTvGTwE4vmsT9+e/z7cZLKU8sBMddwqw3UV5ERfOV+H1FuRK3YREZ46J4Gy0aP3qDA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.2.tgz", + "integrity": "sha512-1YWOpFcGuC6iGAS4EI+o3BV2/6S0H+m9kFOIlyFtp4xIX5rjSnL3AwbTBxROX0c8yWtiWM7ZI6mEPTI7VkSpZw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.2.tgz", + "integrity": "sha512-3qAqTewYrCdnOD9Gl9yvPoAoFAVmPJsBvleabvx4bnu1Kt6DrB2OALeRVag7BdWGWLhP1yooeMLEi6r2nYSOjg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.2.tgz", + "integrity": "sha512-ArdGtPHjLqWkqQuoVQ6a5UC5ebdX8INPuJuJNWRe0RGa/YNhVvxeWmCTFQ7LdmNCSUzVZzxAvUznKaYx645Rig==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.2.tgz", + "integrity": "sha512-B6UHHeNnnih8xH6wRKB0mOcJGvjZTww1FV59HqJoTJ5da9LCG6R4SEBt6uPqzlawv1LoEXSS0d4fBlHNWl6iYw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.2.tgz", + "integrity": "sha512-kr3gqzczJjSAncwOS6i7fpb4dlqcvLidqrX5hpGBIM1wtt0QEVtf4wFaAwVv8QygFU8iWUMYEoJZWuWxyua4GQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.2.tgz", + "integrity": "sha512-TDdHLKCWgPuq9vQcmyLrhg/bgbOvIQ8rtWQK7MRxJ9nvaxKx38NvY7/Lo6cYuEnNHqf6rMqnivOIPIQt6H2AoA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.2.tgz", + "integrity": "sha512-xv9vS648T3X4AxFFZGWeB5Dou8ilsv4VVqJ0+loOIgDO20zIhYfDLkk5xoQiej2RiSQkld9ijF/fhLeonrz2mw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.2.tgz", + "integrity": "sha512-tbtXwnofRoTt223WUZYiUnbxhGAOVul/3StZ947U4A5NNjnQJV5irKMm76G0LGItWs6y+SCjUn/Q0WaMLkEskg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.2.tgz", + "integrity": "sha512-gc97UebApwdsSNT3q79glOSPdfwgwj5ELuiyuiMY3pEWMxeVqLGKfpDFoum4ujivzxn6veUPzkGuSYoh5deQ2Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.2.tgz", + "integrity": "sha512-jOG/0nXb3z+EM6SioY8RofqqmZ+9NKYvJ6QQaa9Mvd3RQxlH68/jcB/lpyVt4lCiqr04IyaC34NzhUqcXbB5FQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.2.tgz", + "integrity": "sha512-XAo7cJec80NWx9LlZFEJQxqKOMz/lX3geWs2iNT5CHIERLFfd90f3RYLLjiCBm1IMaQ4VOX/lTC9lWfzzQm14Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.2.tgz", + "integrity": "sha512-A+JAs4+EhsTjnPQvo9XY/DC0ztaws3vfqzrMNMKlwQXuniBKOIIvAAI8M0fBYiTCxQnElYu7mLk7JrhlQ+HeOw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.2.tgz", + "integrity": "sha512-ZhcrakbqA1SCiJRMKSU64AZcYzlZ/9M5LaYil9QWxx9vLnkQ9Vnkve17Qn4SjlipqIIBFKjBES6Zxhnvh0EAEw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.2.tgz", + "integrity": "sha512-2mLH46K1u3r6uwc95hU+OR9q/ggYMpnS7pSp83Ece1HUQgF9Nh/QwTK5rcgbFnV9j+08yBrU5sA/P0RK2MSBNA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@samverschueren/stream-to-observable": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", + "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", + "dependencies": { + "any-observable": "^0.3.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "rxjs": { + "optional": true + }, + "zen-observable": { + "optional": true + } + } + }, + "node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.5.0.tgz", + "integrity": "sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==", "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" + "@noble/curves": "~1.6.0", + "@noble/hashes": "~1.5.0", + "@scure/base": "~1.1.7" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.4.0.tgz", + "integrity": "sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==", "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" + "@noble/hashes": "~1.5.0", + "@scure/base": "~1.1.8" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -4431,7 +4758,6 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -4439,14 +4765,12 @@ "node_modules/@sideway/formula": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "license": "BSD-3-Clause" + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "license": "BSD-3-Clause" + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, "node_modules/@sindresorhus/is": { "version": "4.6.0", @@ -4463,7 +4787,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/@solana-developers/helpers/-/helpers-1.5.1.tgz", "integrity": "sha512-FysSkUc6fkmK7sQ3wFyIZovSvQqFQjIj9MMy0lVRfNhIJ+24G24qztGxx0IosGSbuxtO97sN6Ij09la/4Bvwlg==", - "license": "MIT", "dependencies": { "@solana/web3.js": "^1.78.4", "bs58": "^5.0.0", @@ -4498,76 +4821,109 @@ } }, "node_modules/@solana/codecs": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-preview.2.tgz", - "integrity": "sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==", + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-rc.1.tgz", + "integrity": "sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==", "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-data-structures": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2", - "@solana/codecs-strings": "2.0.0-preview.2", - "@solana/options": "2.0.0-preview.2" + "@solana/codecs-core": "2.0.0-rc.1", + "@solana/codecs-data-structures": "2.0.0-rc.1", + "@solana/codecs-numbers": "2.0.0-rc.1", + "@solana/codecs-strings": "2.0.0-rc.1", + "@solana/options": "2.0.0-rc.1" + }, + "peerDependencies": { + "typescript": ">=5" } }, "node_modules/@solana/codecs-core": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-preview.2.tgz", - "integrity": "sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==", + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-rc.1.tgz", + "integrity": "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==", "dependencies": { - "@solana/errors": "2.0.0-preview.2" + "@solana/errors": "2.0.0-rc.1" + }, + "peerDependencies": { + "typescript": ">=5" } }, "node_modules/@solana/codecs-data-structures": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.2.tgz", - "integrity": "sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==", + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-rc.1.tgz", + "integrity": "sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==", "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2", - "@solana/errors": "2.0.0-preview.2" + "@solana/codecs-core": "2.0.0-rc.1", + "@solana/codecs-numbers": "2.0.0-rc.1", + "@solana/errors": "2.0.0-rc.1" + }, + "peerDependencies": { + "typescript": ">=5" } }, "node_modules/@solana/codecs-numbers": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.2.tgz", - "integrity": "sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==", + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-rc.1.tgz", + "integrity": "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==", "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/errors": "2.0.0-preview.2" + "@solana/codecs-core": "2.0.0-rc.1", + "@solana/errors": "2.0.0-rc.1" + }, + "peerDependencies": { + "typescript": ">=5" } }, "node_modules/@solana/codecs-strings": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.2.tgz", - "integrity": "sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==", + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-rc.1.tgz", + "integrity": "sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==", "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2", - "@solana/errors": "2.0.0-preview.2" + "@solana/codecs-core": "2.0.0-rc.1", + "@solana/codecs-numbers": "2.0.0-rc.1", + "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22" + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": ">=5" } }, "node_modules/@solana/errors": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-preview.2.tgz", - "integrity": "sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==", + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-rc.1.tgz", + "integrity": "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==", "dependencies": { "chalk": "^5.3.0", - "commander": "^12.0.0" + "commander": "^12.1.0" }, "bin": { - "errors": "bin/cli.js" + "errors": "bin/cli.mjs" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/errors/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@solana/options": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-preview.2.tgz", - "integrity": "sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==", + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-rc.1.tgz", + "integrity": "sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==", "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2" + "@solana/codecs-core": "2.0.0-rc.1", + "@solana/codecs-data-structures": "2.0.0-rc.1", + "@solana/codecs-numbers": "2.0.0-rc.1", + "@solana/codecs-strings": "2.0.0-rc.1", + "@solana/errors": "2.0.0-rc.1" + }, + "peerDependencies": { + "typescript": ">=5" } }, "node_modules/@solana/spl-account-compression": { @@ -4601,9 +4957,9 @@ } }, "node_modules/@solana/spl-account-compression/node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dependencies": { "safe-buffer": "^5.0.1" } @@ -4627,58 +4983,55 @@ } }, "node_modules/@solana/spl-token": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.6.tgz", - "integrity": "sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA==", + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.9.tgz", + "integrity": "sha512-g3wbj4F4gq82YQlwqhPB0gHFXfgsC6UmyGMxtSLf/BozT/oKd59465DbnlUK8L8EcimKMavxsVAMoLcEdeCicg==", "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", - "@solana/spl-token-group": "^0.0.4", - "@solana/spl-token-metadata": "^0.1.4", + "@solana/spl-token-group": "^0.0.7", + "@solana/spl-token-metadata": "^0.1.6", "buffer": "^6.0.3" }, "engines": { "node": ">=16" }, "peerDependencies": { - "@solana/web3.js": "^1.91.6" + "@solana/web3.js": "^1.95.3" } }, "node_modules/@solana/spl-token-group": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.4.tgz", - "integrity": "sha512-7+80nrEMdUKlK37V6kOe024+T7J4nNss0F8LQ9OOPYdWCCfJmsGUzVx2W3oeizZR4IHM6N4yC9v1Xqwc3BTPWw==", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.7.tgz", + "integrity": "sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug==", "dependencies": { - "@solana/codecs": "2.0.0-preview.2", - "@solana/spl-type-length-value": "0.1.0" + "@solana/codecs": "2.0.0-rc.1" }, "engines": { "node": ">=16" }, "peerDependencies": { - "@solana/web3.js": "^1.91.6" + "@solana/web3.js": "^1.95.3" } }, "node_modules/@solana/spl-token-metadata": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.4.tgz", - "integrity": "sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.6.tgz", + "integrity": "sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==", "dependencies": { - "@solana/codecs": "2.0.0-preview.2", - "@solana/spl-type-length-value": "0.1.0" + "@solana/codecs": "2.0.0-rc.1" }, "engines": { "node": ">=16" }, "peerDependencies": { - "@solana/web3.js": "^1.91.6" + "@solana/web3.js": "^1.95.3" } }, "node_modules/@solana/spl-token-registry": { "version": "0.2.4574", "resolved": "https://registry.npmjs.org/@solana/spl-token-registry/-/spl-token-registry-0.2.4574.tgz", "integrity": "sha512-JzlfZmke8Rxug20VT/VpI2XsXlsqMlcORIUivF+Yucj7tFi7A0dXG7h+2UnD0WaZJw8BrUz2ABNkUnv89vbv1A==", - "license": "Apache", "dependencies": { "cross-fetch": "3.0.6" }, @@ -4690,7 +5043,6 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", - "license": "MIT", "dependencies": { "node-fetch": "2.6.1" } @@ -4699,7 +5051,6 @@ "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "license": "MIT", "engines": { "node": "4.x || >=6.0.0" } @@ -4716,10 +5067,9 @@ } }, "node_modules/@solana/web3.js": { - "version": "1.95.3", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.95.3.tgz", - "integrity": "sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og==", - "license": "MIT", + "version": "1.95.4", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.95.4.tgz", + "integrity": "sha512-sdewnNEA42ZSMxqkzdwEWi6fDgzwtJHaQa5ndUGEJYtoOnM6X5cvPmjoTUp7/k7bRrVAxfBgDnvQQHD6yhlLYw==", "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", @@ -4738,31 +5088,18 @@ "superstruct": "^2.0.2" } }, - "node_modules/@solana/web3.js/node_modules/@noble/curves": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.5.0.tgz", - "integrity": "sha512-J5EKamIHnKPyClwVrzmaf5wSdQXgdHcPZIZLu3bwnbeCx8/7NPK5q2ZBWF+5FvYGByjiQQsJYX6jfgB2wDPn3A==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@solana/web3.js/node_modules/@types/ws": { "version": "8.5.12", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@solana/web3.js/node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dependencies": { "safe-buffer": "^5.0.1" } @@ -4788,14 +5125,31 @@ "node_modules/@solana/web3.js/node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/@solana/web3.js/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } }, "node_modules/@solana/web3.js/node_modules/rpc-websockets": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.0.2.tgz", - "integrity": "sha512-YzggvfItxMY3Lwuax5rC18inhbjJv9Py7JXRHxTIi94JOLrqBsSsUUc5bbl5W6c11tXhdfpDPK0KzBhoGe8jjw==", - "license": "LGPL-3.0-only", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.0.4.tgz", + "integrity": "sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==", "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", @@ -4818,11 +5172,29 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", - "license": "MIT", "engines": { "node": ">=14.0.0" } }, + "node_modules/@solana/web3.js/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/@solana/web3.js/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/@solana/web3.js/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/@supercharge/promise-pool": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@supercharge/promise-pool/-/promise-pool-3.2.0.tgz", @@ -4832,10 +5204,9 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.12.tgz", - "integrity": "sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==", - "license": "Apache-2.0", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", + "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", "dependencies": { "tslib": "^2.4.0" } @@ -4855,7 +5226,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/@triton-one/yellowstone-grpc/-/yellowstone-grpc-0.4.0.tgz", "integrity": "sha512-YJaX+ByPtN6aG4HiKfd62Yd5NUZIiEMoBmSfxdRLBEgT3J9WWqoCRqVTzS93sWpP7IJ5pkGBfxMpDlugM8zn3g==", - "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.0" } @@ -4863,38 +5233,32 @@ "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "license": "MIT" + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "license": "MIT" + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "license": "MIT" + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "license": "MIT" + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, "node_modules/@types/big.js": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.2.2.tgz", - "integrity": "sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==", - "license": "MIT" + "integrity": "sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==" }, "node_modules/@types/bs58": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/bs58/-/bs58-4.0.4.tgz", "integrity": "sha512-0IEpMFXXQi2zXaXl9GJ3sRwQo0uEkD+yFOv+FnAU5lkPtcu6h61xb7jc2CFPEZ5BUOaiP13ThuGc9HD4R8lR5g==", - "license": "MIT", "dependencies": { "@types/node": "*", "base-x": "^3.0.6" @@ -4904,7 +5268,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } @@ -4924,7 +5287,6 @@ "version": "3.11.6", "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.6.tgz", "integrity": "sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==", - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4940,14 +5302,12 @@ "node_modules/@types/emscripten": { "version": "1.39.13", "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.13.tgz", - "integrity": "sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==", - "license": "MIT" + "integrity": "sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==" }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "license": "MIT" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "node_modules/@types/http-cache-semantics": { "version": "4.0.4", @@ -4962,29 +5322,18 @@ "@types/node": "*" } }, - "node_modules/@types/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "license": "MIT", + "version": "22.8.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.2.tgz", + "integrity": "sha512-NzaRNFV+FZkvK/KLCsNdTvID0SThyrs5SHB6tsD/lajr22FGC73N2QeDPM2wHtVde8mgcXuSsHQkH5cX1pbPLw==", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.8" } }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT" + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" }, "node_modules/@types/responselike": { "version": "1.0.3", @@ -4997,14 +5346,7 @@ "node_modules/@types/uuid": { "version": "8.3.4", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "license": "MIT" - }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", - "license": "MIT" + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" }, "node_modules/@types/ws": { "version": "7.4.7", @@ -5018,7 +5360,6 @@ "version": "2.10.4", "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.10.4.tgz", "integrity": "sha512-WhaLwvXEMjCjGxOraQx+Qtmst13iAPOlSElSZfQFdLohva5owlqACRapJ78zZFEW6M9ArqdQlZaHKVN5/mM+SA==", - "license": "BSD-2-Clause", "dependencies": { "@yarnpkg/libzip": "^2.3.0", "tslib": "^1.13.0" @@ -5030,14 +5371,12 @@ "node_modules/@yarnpkg/fslib/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@yarnpkg/libzip": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@yarnpkg/libzip/-/libzip-2.3.0.tgz", "integrity": "sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==", - "license": "BSD-2-Clause", "dependencies": { "@types/emscripten": "^1.39.6", "tslib": "^1.13.0" @@ -5049,8 +5388,7 @@ "node_modules/@yarnpkg/libzip/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/abort-controller": { "version": "3.0.0", @@ -5063,11 +5401,22 @@ "node": ">=6.5" } }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "license": "MIT", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "bin": { "acorn": "bin/acorn" }, @@ -5076,10 +5425,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", - "license": "MIT", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dependencies": { "acorn": "^8.11.0" }, @@ -5107,7 +5455,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "license": "MIT", "dependencies": { "clean-stack": "^4.0.0", "indent-string": "^5.0.0" @@ -5123,7 +5470,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "license": "MIT", "dependencies": { "escape-string-regexp": "5.0.0" }, @@ -5138,7 +5484,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -5150,7 +5495,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -5190,7 +5534,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "license": "ISC", "dependencies": { "string-width": "^4.1.0" } @@ -5237,10 +5580,9 @@ "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==" }, "node_modules/ansis": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.2.1.tgz", - "integrity": "sha512-SgzY+k2aa9UqJe3jzrPZhSVzLc2XrE4/h7rk0dMCDwhCq7ipmpPZvyODoxPCms4OpMLTiBTS+Mpl4VZQ6FDitw==", - "license": "ISC", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.3.2.tgz", + "integrity": "sha512-cFthbBlt+Oi0i9Pv/j6YdVWJh54CtjGACaMPCIrEV4Ha7HWsIjXDwseYV79TIL0B4+KfSwD5S70PeQDkPUd1rA==", "engines": { "node": ">=15" } @@ -5249,15 +5591,20 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", - "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, "node_modules/aptos": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/aptos/-/aptos-1.8.5.tgz", "integrity": "sha512-iQxliWesNHjGQ5YYXCyss9eg4+bDGQWqAZa73vprqGQ9tungK0cRjUI2fmnp63Ed6UG6rurHrL+b0ckbZAOZZQ==", + "deprecated": "Package aptos is no longer supported, please migrate to https://www.npmjs.com/package/@aptos-labs/ts-sdk", "dependencies": { "@noble/hashes": "1.1.3", "@scure/bip39": "1.1.0", @@ -5304,10 +5651,23 @@ "form-data": "^4.0.0" } }, + "node_modules/aptos/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/arbundles": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/arbundles/-/arbundles-0.11.1.tgz", - "integrity": "sha512-H1hyI98VTggH7pyxaa6jKuzB3UYHKSwRQChT2pJp8uGGv20FQEQjug/n+mza4yM8dMcLHwXji0PLpmKQKoJs+g==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/arbundles/-/arbundles-0.11.2.tgz", + "integrity": "sha512-vyX7vY6S8B4RFhGSoCixbnR/Z7ckpJjK+b/H7zcgRWJqqXjZqQ+3DQIJ19vKl5AvzNSsj5ja9kQDoZhMiGpBFw==", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", @@ -5331,9 +5691,9 @@ } }, "node_modules/arbundles/node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dependencies": { "safe-buffer": "^5.0.1" } @@ -5359,31 +5719,33 @@ "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "license": "MIT" + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/arweave": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/arweave/-/arweave-1.15.1.tgz", - "integrity": "sha512-rT7FOwqdudd5npqp4xOYdDT2035LtpcqePjwirh4wjRiEtVsz1FZkRiM2Yj+fOAwYzOm/hNG0GDOipDSaiEGGQ==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/arweave/-/arweave-1.15.5.tgz", + "integrity": "sha512-Zj3b8juz1ZtDaQDPQlzWyk2I4wZPx3RmcGq8pVJeZXl2Tjw0WRy5ueHPelxZtBLqCirGoZxZEAFRs6SZUSCBjg==", "optional": true, "peer": true, "dependencies": { @@ -5428,16 +5790,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "license": "MIT" + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" }, "node_modules/async-retry": { "version": "1.3.3", @@ -5470,9 +5830,9 @@ } }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -5482,8 +5842,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base-x": { "version": "4.0.0", @@ -5523,9 +5882,9 @@ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "node_modules/big.js": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", - "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", + "integrity": "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==", "engines": { "node": "*" }, @@ -5616,7 +5975,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/bn-sqrt/-/bn-sqrt-1.0.0.tgz", "integrity": "sha512-XdCMQ7tfEF/f7nrQgnrJ+DLQBwQzSQyPOKIXdUOTcGEvsRKBcIsdfORp7B5H8DWo8FOzZ4+a2TjSZzaqKgzicg==", - "license": "MIT", "dependencies": { "bn.js": "^5.2.0" } @@ -5626,6 +5984,57 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/borsh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/borsh/-/borsh-2.0.0.tgz", @@ -5635,7 +6044,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", - "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", @@ -5654,10 +6062,9 @@ } }, "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "engines": { "node": ">=12" }, @@ -5669,7 +6076,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -5681,7 +6087,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", - "license": "MIT", "engines": { "node": ">=16" }, @@ -5689,17 +6094,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/boxen/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "license": "MIT" + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" }, "node_modules/boxen/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -5716,7 +6130,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -5728,10 +6141,9 @@ } }, "node_modules/boxen/node_modules/type-fest": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.25.0.tgz", - "integrity": "sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==", - "license": "(MIT OR CC0-1.0)", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", "engines": { "node": ">=16" }, @@ -5743,7 +6155,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", - "license": "MIT", "dependencies": { "string-width": "^7.0.0" }, @@ -5758,7 +6169,6 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -5775,7 +6185,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -5784,7 +6193,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -5858,7 +6266,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "license": "MIT", "dependencies": { "run-applescript": "^7.0.0" }, @@ -5869,6 +6276,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", @@ -5894,11 +6317,28 @@ "node": ">=8" } }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", "engines": { "node": ">=6" } @@ -5918,7 +6358,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "license": "MIT", "dependencies": { "ansicolors": "~0.3.2", "redeyed": "~2.1.0" @@ -5931,7 +6370,6 @@ "version": "2.1.13", "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==", - "license": "MIT", "engines": { "node": ">=12.13" }, @@ -5940,11 +6378,15 @@ } }, "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" @@ -5954,7 +6396,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.0.tgz", "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==", - "license": "MIT", "dependencies": { "chalk": "^5.2.0" }, @@ -5965,16 +6406,51 @@ "url": "https://github.com/chalk/chalk-template?sponsor=1" } }, + "node_modules/chalk-template/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, + "node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", "engines": { "node": ">=10" } @@ -5992,7 +6468,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "license": "MIT", "dependencies": { "escape-string-regexp": "4.0.0" }, @@ -6003,23 +6478,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/clean-stack/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-boxes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -6042,7 +6504,6 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", - "license": "MIT", "dependencies": { "string-width": "^4.2.3" }, @@ -6065,7 +6526,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", "integrity": "sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==", - "license": "MIT", "dependencies": { "slice-ansi": "0.0.4", "string-width": "^1.0.1" @@ -6078,7 +6538,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6087,7 +6546,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "license": "MIT", "dependencies": { "number-is-nan": "^1.0.0" }, @@ -6099,7 +6557,6 @@ "version": "0.0.4", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6108,7 +6565,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "license": "MIT", "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -6122,7 +6578,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -6131,18 +6586,17 @@ } }, "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -6152,23 +6606,6 @@ "node": ">=12" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -6192,7 +6629,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6201,7 +6637,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" @@ -6230,7 +6665,6 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -6263,14 +6697,12 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "license": "MIT", "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -6279,14 +6711,12 @@ "node_modules/config-chain/node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/configstore": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-7.0.0.tgz", "integrity": "sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ==", - "license": "BSD-2-Clause", "dependencies": { "atomically": "^2.0.3", "dot-prop": "^9.0.0", @@ -6300,13 +6730,52 @@ "url": "https://github.com/yeoman/configstore?sponsor=1" } }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "node_modules/core-js": { "version": "3.18.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.1.tgz", "integrity": "sha512-vJlUi/7YdlCZeL6fXvWNaLUPh/id12WXj3MbkMw5uOyF0PfWPBNOCNbs53YqgrvtujLNlt9JQpruyIKkUZ+PKA==", "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", "hasInstallScript": true, - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -6316,7 +6785,6 @@ "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -6341,14 +6809,12 @@ "node_modules/cosmiconfig/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/cosmiconfig/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -6384,8 +6850,7 @@ "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "license": "MIT" + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "node_modules/cross-fetch": { "version": "3.1.8", @@ -6395,11 +6860,48 @@ "node-fetch": "^2.6.12" } }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/cross-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/cross-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/cross-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6412,23 +6914,12 @@ "node_modules/cross-spawn/node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/cross-spawn/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -6488,7 +6979,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "license": "MIT", "engines": { "node": ">= 12" } @@ -6496,8 +6986,7 @@ "node_modules/date-fns": { "version": "1.30.1", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", - "license": "MIT" + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" }, "node_modules/dateformat": { "version": "4.6.3", @@ -6508,16 +6997,16 @@ } }, "node_modules/dayjs": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", - "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -6567,7 +7056,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -6576,7 +7064,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" @@ -6592,7 +7079,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "license": "MIT", "engines": { "node": ">=18" }, @@ -6619,11 +7105,26 @@ "node": ">=10" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -6635,7 +7136,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/del/-/del-7.1.0.tgz", "integrity": "sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==", - "license": "MIT", "dependencies": { "globby": "^13.1.2", "graceful-fs": "^4.2.10", @@ -6657,7 +7157,6 @@ "version": "13.2.2", "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", @@ -6676,7 +7175,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -6711,11 +7209,19 @@ "node": ">= 0.8" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -6724,7 +7230,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -6745,7 +7250,6 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", - "license": "MIT", "dependencies": { "type-fest": "^4.18.2" }, @@ -6757,10 +7261,9 @@ } }, "node_modules/dot-prop/node_modules/type-fest": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.25.0.tgz", - "integrity": "sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==", - "license": "(MIT OR CC0-1.0)", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", "engines": { "node": ">=16" }, @@ -6779,11 +7282,20 @@ "url": "https://dotenvx.com" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -6798,7 +7310,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6827,6 +7338,14 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -6839,16 +7358,28 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, - "node_modules/error-ex/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } }, "node_modules/es6-promise": { "version": "4.2.8", @@ -6868,7 +7399,6 @@ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -6901,10 +7431,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "license": "MIT", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { "node": ">=6" } @@ -6913,7 +7442,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -6921,19 +7449,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -6945,28 +7480,82 @@ "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } }, "node_modules/ethereum-bloom-filters": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.1.0.tgz", - "integrity": "sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz", + "integrity": "sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==", "dependencies": { "@noble/hashes": "^1.4.0" } }, "node_modules/ethereum-cryptography": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.0.tgz", - "integrity": "sha512-hsm9JhfytIf8QME/3B7j4bc8V+VdTU+Vas1aJlvIS96ffoNAosudXvGoEvWmc7QZYdkC8mrMJz9r0fcbw7GyCA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dependencies": { - "@noble/curves": "1.4.0", + "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", "@scure/bip32": "1.4.0", "@scure/bip39": "1.3.0" } }, + "node_modules/ethereum-cryptography/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/ethjs-unit": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", @@ -7010,7 +7599,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", @@ -7033,7 +7621,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "license": "MIT", "engines": { "node": ">=16" }, @@ -7041,23 +7628,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/execa/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/execa/node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -7068,23 +7642,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/execa/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/exit-hook": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-4.0.0.tgz", "integrity": "sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==", - "license": "MIT", "engines": { "node": ">=18" }, @@ -7098,6 +7659,75 @@ "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", "optional": true }, + "node_modules/express": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -7139,7 +7769,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -7155,7 +7784,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", - "license": "MIT", "dependencies": { "fastest-levenshtein": "^1.0.7" } @@ -7182,7 +7810,6 @@ "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "license": "MIT", "engines": { "node": ">= 4.9.1" } @@ -7197,11 +7824,23 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, + "node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/fecha": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", @@ -7221,7 +7860,6 @@ "url": "https://paypal.me/jimmywarting" } ], - "license": "MIT", "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -7231,10 +7869,9 @@ } }, "node_modules/ffjavascript": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.3.0.tgz", - "integrity": "sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ==", - "license": "GPL-3.0", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.3.1.tgz", + "integrity": "sha512-4PbK1WYodQtuF47D4pRI5KUg3Q392vuP5WjE1THSnceHdXwU3ijaoS0OqxTzLknCtz4Z2TtABzkBdBdMn3B/Aw==", "dependencies": { "wasmbuilder": "0.0.16", "wasmcurves": "0.2.2", @@ -7255,6 +7892,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -7264,7 +7909,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } @@ -7273,7 +7917,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7285,7 +7928,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -7293,11 +7935,40 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/find": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/find/-/find-0.3.0.tgz", "integrity": "sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw==", - "license": "MIT", "dependencies": { "traverse-chain": "~0.1.0" } @@ -7306,7 +7977,6 @@ "version": "1.4.7", "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "commander": "^5.1.0", @@ -7316,27 +7986,10 @@ "find-process": "bin/find-process.js" } }, - "node_modules/find-process/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/find-process/node_modules/commander": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "license": "MIT", "engines": { "node": ">= 6" } @@ -7345,7 +7998,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -7358,7 +8010,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", - "license": "MIT", "engines": { "node": ">=18" }, @@ -7370,15 +8021,14 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -7394,10 +8044,25 @@ } } }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -7411,7 +8076,6 @@ "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "license": "MIT", "dependencies": { "fetch-blob": "^3.1.2" }, @@ -7419,11 +8083,26 @@ "node": ">=12.20.0" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -7435,7 +8114,6 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -7446,14 +8124,33 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gaussian": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/gaussian/-/gaussian-1.3.0.tgz", "integrity": "sha512-rYQ0ESfB+z0t7G95nHH80Zh7Pgg9A0FUYoZqV0yPec5WJZWKIHV2MPYpiJNy8oZAeVqyKwC10WXKSCnUQ5iDVg==", - "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -7462,16 +8159,14 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", - "license": "MIT", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", "engines": { "node": ">=18" }, @@ -7479,11 +8174,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -7505,15 +8217,13 @@ "node_modules/github-url-from-git": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.5.0.tgz", - "integrity": "sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==", - "license": "MIT" + "integrity": "sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==" }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7533,7 +8243,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -7545,7 +8254,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7555,7 +8263,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7567,7 +8274,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", - "license": "MIT", "dependencies": { "ini": "4.1.1" }, @@ -7582,7 +8288,6 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -7601,8 +8306,18 @@ "node_modules/google-protobuf": { "version": "3.21.4", "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.4.tgz", - "integrity": "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==", - "license": "(BSD-3-Clause AND Apache-2.0)" + "integrity": "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==" + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/got": { "version": "11.8.6", @@ -7631,8 +8346,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemesplit": { "version": "2.4.4", @@ -7644,9 +8358,9 @@ } }, "node_modules/graphql": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz", - "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", "peer": true, "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" @@ -7666,9 +8380,9 @@ } }, "node_modules/graphql-request/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.2.tgz", + "integrity": "sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -7682,7 +8396,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -7694,7 +8407,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7707,6 +8419,39 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -7729,6 +8474,17 @@ "minimalistic-assert": "^1.0.1" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/help-me": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", @@ -7753,7 +8509,6 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -7789,6 +8544,14 @@ "node": ">= 0.6" } }, + "node_modules/http-errors/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/http2-wrapper": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", @@ -7805,7 +8568,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "license": "Apache-2.0", "engines": { "node": ">=16.17.0" } @@ -7822,7 +8584,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -7866,10 +8627,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "license": "MIT", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "engines": { "node": ">= 4" } @@ -7878,7 +8638,6 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", - "license": "ISC", "dependencies": { "minimatch": "^9.0.0" }, @@ -7890,7 +8649,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7902,20 +8660,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -7934,7 +8682,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -7946,7 +8693,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", "engines": { "node": ">=8" } @@ -7955,7 +8701,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", - "license": "MIT", "engines": { "node": ">=18" }, @@ -7968,7 +8713,6 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -7983,7 +8727,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -8017,7 +8760,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/inquirer-autosubmit-prompt/-/inquirer-autosubmit-prompt-0.2.0.tgz", "integrity": "sha512-mzNrusCk5L6kSzlN0Ioddn8yzrhYNLli+Sn2ZxMuLechMYAzakiFCIULxsxlQb5YKzthLGfrFACcWoAvM7p04Q==", - "license": "MIT", "dependencies": { "chalk": "^2.4.1", "inquirer": "^6.2.1", @@ -8028,7 +8770,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -8037,7 +8778,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "license": "MIT", "engines": { "node": ">=6" } @@ -8046,7 +8786,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -8058,7 +8797,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -8072,7 +8810,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "license": "MIT", "dependencies": { "restore-cursor": "^2.0.0" }, @@ -8083,14 +8820,12 @@ "node_modules/inquirer-autosubmit-prompt/node_modules/cli-width": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "license": "ISC" + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" }, "node_modules/inquirer-autosubmit-prompt/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -8098,14 +8833,20 @@ "node_modules/inquirer-autosubmit-prompt/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/inquirer-autosubmit-prompt/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } }, "node_modules/inquirer-autosubmit-prompt/node_modules/figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -8117,7 +8858,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", "engines": { "node": ">=4" } @@ -8126,7 +8866,6 @@ "version": "6.5.2", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "license": "MIT", "dependencies": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -8150,7 +8889,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "license": "MIT", "engines": { "node": ">=4" } @@ -8159,7 +8897,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -8167,14 +8904,12 @@ "node_modules/inquirer-autosubmit-prompt/node_modules/mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "license": "ISC" + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==" }, "node_modules/inquirer-autosubmit-prompt/node_modules/onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "license": "MIT", "dependencies": { "mimic-fn": "^1.0.0" }, @@ -8186,7 +8921,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "license": "MIT", "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -8199,7 +8933,6 @@ "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" }, @@ -8207,11 +8940,15 @@ "npm": ">=2.0.0" } }, + "node_modules/inquirer-autosubmit-prompt/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/inquirer-autosubmit-prompt/node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "license": "MIT", "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -8224,7 +8961,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "license": "MIT", "engines": { "node": ">=4" } @@ -8233,7 +8969,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "license": "MIT", "dependencies": { "ansi-regex": "^3.0.0" }, @@ -8245,7 +8980,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "license": "MIT", "dependencies": { "ansi-regex": "^4.1.0" }, @@ -8257,7 +8991,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -8268,29 +9001,38 @@ "node_modules/inquirer-autosubmit-prompt/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/inquirer/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/inquirer/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } @@ -8304,16 +9046,14 @@ } }, "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -8328,7 +9068,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8345,7 +9084,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -8366,7 +9104,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-1.0.0.tgz", "integrity": "sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==", - "license": "MIT", "bin": { "is-in-ci": "cli.js" }, @@ -8381,7 +9118,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "license": "MIT", "dependencies": { "is-docker": "^3.0.0" }, @@ -8399,7 +9135,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -8414,7 +9149,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", - "license": "MIT", "dependencies": { "global-directory": "^4.0.1", "is-path-inside": "^4.0.0" @@ -8427,18 +9161,20 @@ } }, "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-npm": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -8450,7 +9186,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -8459,7 +9194,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", - "license": "MIT", "dependencies": { "symbol-observable": "^1.1.0" }, @@ -8471,7 +9205,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8480,7 +9213,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -8492,7 +9224,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -8503,14 +9234,12 @@ "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "license": "MIT" + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, "node_modules/is-scoped": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-3.0.0.tgz", "integrity": "sha512-ezxLUq30kiTvP0w/5n9tj4qTOKlrA07Oty1hwTQ+lcqw11x6uc8sp7VRb2OVGRzKfCHZ2A22T5Zsau/Q2Akb0g==", - "license": "MIT", "dependencies": { "scoped-regex": "^3.0.0" }, @@ -8525,7 +9254,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -8534,11 +9262,11 @@ } }, "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8548,7 +9276,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-6.1.0.tgz", "integrity": "sha512-LXdhGlYqUPdvEyIhWPEEwYYK3yrUiPcBjmFGlZNv1u5GtIL5qQRf7ddDyPNAvsMFqdzS923FROpTQU97tLe3JQ==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -8560,7 +9287,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -8572,24 +9298,22 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", "engines": { "node": ">=16" } }, "node_modules/isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", "peerDependencies": { "ws": "*" } }, "node_modules/issue-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/issue-regex/-/issue-regex-4.1.0.tgz", - "integrity": "sha512-X3HBmm7+Th+l4/kMtqwcHHgELD0Lfl0Ina6S3+grr+mKmTxsrM84NAO1UuRPIxIbGLIl3TCEu45S1kdu21HYbQ==", - "license": "MIT", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/issue-regex/-/issue-regex-4.3.0.tgz", + "integrity": "sha512-7731a/t2llyrk8Hdwl1x3LkhIFGzxHQGpJA7Ur9cIRViakQF2y25Lwhx8Ziy1B068+kBYUmYPBzw5uo3DdWrdQ==", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -8597,11 +9321,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", - "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", - "license": "Apache-2.0", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -8619,33 +9356,15 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/jake/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8657,7 +9376,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.2.tgz", "integrity": "sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==", - "license": "MIT", "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", @@ -8689,11 +9407,18 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "node_modules/jayson/node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "peerDependencies": { + "ws": "*" + } + }, "node_modules/jayson/node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -8714,7 +9439,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/jito-ts/-/jito-ts-4.1.1.tgz", "integrity": "sha512-5a/z7AvtitpExcyxYh1RhPoWRfCA4IPopE5hM5Cxw7/zHnV+VBNZL0m4t3fjfPgMnmPkeoTx2xTw+mSD4PDG7w==", - "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.13", "@noble/ed25519": "^1.7.1", @@ -8732,7 +9456,6 @@ "version": "1.77.4", "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.77.4.tgz", "integrity": "sha512-XdN0Lh4jdY7J8FYMyucxCwzn6Ga2Sr1DHDWRbqVzk7ZPmmpSPOVWHzO67X1cVT+jNi1D6gZi2tgjHgDPuj6e9Q==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "@noble/curves": "^1.0.0", @@ -8755,7 +9478,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } @@ -8764,7 +9486,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", "dependencies": { "base-x": "^3.0.2" } @@ -8772,20 +9493,17 @@ "node_modules/jito-ts/node_modules/@solana/web3.js/node_modules/superstruct": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==", - "license": "MIT" + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" }, "node_modules/jito-ts/node_modules/base-x": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.0.tgz", - "integrity": "sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==", - "license": "MIT" + "integrity": "sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==" }, "node_modules/jito-ts/node_modules/borsh": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", - "license": "Apache-2.0", "dependencies": { "bn.js": "^5.2.0", "bs58": "^4.0.0", @@ -8796,7 +9514,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } @@ -8805,7 +9522,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", "dependencies": { "base-x": "^3.0.2" } @@ -8814,25 +9530,60 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", - "license": "MIT", "dependencies": { "base-x": "^5.0.0" } }, + "node_modules/jito-ts/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/jito-ts/node_modules/superstruct": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", - "license": "MIT", "engines": { "node": ">=14.0.0" } }, + "node_modules/jito-ts/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/jito-ts/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/jito-ts/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/joi": { "version": "17.13.3", "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -8872,14 +9623,12 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -8891,8 +9640,7 @@ "node_modules/jsbi": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", - "integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==", - "license": "Apache-2.0" + "integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==" }, "node_modules/json-bigint": { "version": "1.0.0", @@ -8910,8 +9658,7 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -8972,10 +9719,9 @@ } }, "node_modules/ky": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/ky/-/ky-1.7.1.tgz", - "integrity": "sha512-KJ/IXXkFhTDqxcN8wKqMXk1/UoOpc0UnOB6H7QcqlPInh/M2B5Mlj+i9exez1w4RSwJhNFmHiUDPriAYFwb5VA==", - "license": "MIT", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.7.2.tgz", + "integrity": "sha512-OzIvbHKKDpi60TnF9t7UUVAF1B4mcqc02z5PIvrm08Wyb+yOcz63GRvEuVxNT18a9E1SrNouhB4W2NNLeD7Ykg==", "engines": { "node": ">=18" }, @@ -8987,7 +9733,6 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-9.0.0.tgz", "integrity": "sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==", - "license": "MIT", "dependencies": { "package-json": "^10.0.0" }, @@ -9002,7 +9747,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "license": "MIT", "engines": { "node": ">=14" }, @@ -9013,14 +9757,12 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/listr": { "version": "0.14.3", "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", - "license": "MIT", "dependencies": { "@samverschueren/stream-to-observable": "^0.3.0", "is-observable": "^1.1.0", @@ -9040,7 +9782,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/listr-input/-/listr-input-0.2.1.tgz", "integrity": "sha512-oa8iVG870qJq+OuuMK3DjGqFcwsK1SDu+kULp9kEq09TY231aideIZenr3lFOQdASpAr6asuyJBbX62/a3IIhg==", - "license": "MIT", "dependencies": { "inquirer": "^7.0.0", "inquirer-autosubmit-prompt": "^0.2.0", @@ -9051,27 +9792,18 @@ "node": ">=6" } }, - "node_modules/listr-input/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/listr-input/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 10" } }, "node_modules/listr-input/node_modules/inquirer": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.0", @@ -9091,11 +9823,15 @@ "node": ">=8.0.0" } }, + "node_modules/listr-input/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, "node_modules/listr-input/node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" }, @@ -9106,14 +9842,12 @@ "node_modules/listr-input/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/listr-silent-renderer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", "integrity": "sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==", - "license": "MIT", "engines": { "node": ">=4" } @@ -9122,7 +9856,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", - "license": "MIT", "dependencies": { "chalk": "^1.1.3", "cli-truncate": "^0.2.1", @@ -9144,7 +9877,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9153,7 +9885,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9162,7 +9893,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "license": "MIT", "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -9174,11 +9904,18 @@ "node": ">=0.10.0" } }, + "node_modules/listr-update-renderer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/listr-update-renderer/node_modules/figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", - "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5", "object-assign": "^4.1.0" @@ -9191,7 +9928,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -9200,7 +9936,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", - "license": "MIT", "dependencies": { "chalk": "^1.0.0" }, @@ -9212,7 +9947,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -9224,7 +9958,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -9233,7 +9966,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", - "license": "MIT", "dependencies": { "chalk": "^2.4.1", "cli-cursor": "^2.1.0", @@ -9248,7 +9980,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -9260,7 +9991,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -9274,7 +10004,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "license": "MIT", "dependencies": { "restore-cursor": "^2.0.0" }, @@ -9286,7 +10015,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -9294,14 +10022,20 @@ "node_modules/listr-verbose-renderer/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/listr-verbose-renderer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } }, "node_modules/listr-verbose-renderer/node_modules/figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -9313,7 +10047,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", "engines": { "node": ">=4" } @@ -9322,7 +10055,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -9331,7 +10063,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "license": "MIT", "dependencies": { "mimic-fn": "^1.0.0" }, @@ -9343,7 +10074,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "license": "MIT", "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -9352,11 +10082,15 @@ "node": ">=4" } }, + "node_modules/listr-verbose-renderer/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/listr-verbose-renderer/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -9368,7 +10102,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9377,7 +10110,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "license": "MIT", "engines": { "node": ">=6" } @@ -9386,7 +10118,6 @@ "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" }, @@ -9397,14 +10128,20 @@ "node_modules/listr/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -9420,8 +10157,7 @@ "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT" + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, "node_modules/lodash.clonedeep": { "version": "4.5.0", @@ -9433,37 +10169,37 @@ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, "node_modules/lodash.zip": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", - "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", - "license": "MIT" + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==" }, "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" @@ -9473,7 +10209,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", - "license": "MIT", "dependencies": { "ansi-escapes": "^3.0.0", "cli-cursor": "^2.0.0", @@ -9487,7 +10222,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -9496,7 +10230,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "license": "MIT", "engines": { "node": ">=4" } @@ -9505,7 +10238,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "license": "MIT", "dependencies": { "restore-cursor": "^2.0.0" }, @@ -9517,7 +10249,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "license": "MIT", "engines": { "node": ">=4" } @@ -9526,7 +10257,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -9535,7 +10265,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "license": "MIT", "dependencies": { "mimic-fn": "^1.0.0" }, @@ -9547,7 +10276,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "license": "MIT", "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -9556,11 +10284,15 @@ "node": ">=4" } }, + "node_modules/log-update/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/log-update/node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "license": "MIT", "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -9573,7 +10305,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "license": "MIT", "dependencies": { "ansi-regex": "^3.0.0" }, @@ -9585,7 +10316,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", - "license": "MIT", "dependencies": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0" @@ -9597,14 +10327,12 @@ "node_modules/long": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", - "license": "Apache-2.0" + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -9631,14 +10359,12 @@ "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "license": "ISC" + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, "node_modules/md5.js": { "version": "1.3.5", @@ -9650,11 +10376,18 @@ "safe-buffer": "^5.1.2" } }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/meow": { "version": "13.2.0", "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", - "license": "MIT", "engines": { "node": ">=18" }, @@ -9662,17 +10395,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -9692,16 +10431,23 @@ "node": ">= 7.6.0" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micro-ftch": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==" }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "license": "MIT", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -9710,6 +10456,17 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", @@ -9741,18 +10498,20 @@ } }, "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "license": "MIT", "engines": { "node": ">=18" }, @@ -9782,7 +10541,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9805,7 +10563,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", "engines": { "node": ">=8" } @@ -9814,7 +10571,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -9827,7 +10583,6 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -9847,7 +10602,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -9859,15 +10613,14 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/multistream": { "version": "4.1.0", @@ -9902,15 +10655,27 @@ } }, "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } }, "node_modules/natural-orderby": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==", - "license": "MIT", "engines": { "node": "*" } @@ -9942,9 +10707,9 @@ } }, "node_modules/near-seed-phrase": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/near-seed-phrase/-/near-seed-phrase-0.2.0.tgz", - "integrity": "sha512-NpmrnejpY1AdlRpDZ0schJQJtfBaoUheRfiYtQpcq9TkwPgqKZCRULV5L3hHmLc0ep7KRtikbPQ9R2ztN/3cyQ==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/near-seed-phrase/-/near-seed-phrase-0.2.1.tgz", + "integrity": "sha512-feMuums+kVL3LSuPcP4ld07xHCb2mu6z48SGfP3W+8tl1Qm5xIcjiQzY2IDPBvFgajRDxWSb8GzsRHoInazByw==", "dependencies": { "bip39-light": "^1.0.7", "bs58": "^4.0.1", @@ -9953,9 +10718,9 @@ } }, "node_modules/near-seed-phrase/node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dependencies": { "safe-buffer": "^5.0.1" } @@ -9968,11 +10733,18 @@ "base-x": "^3.0.2" } }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/new-github-release-url": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", - "license": "MIT", "dependencies": { "type-fest": "^2.5.1" }, @@ -9987,7 +10759,6 @@ "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -10023,34 +10794,31 @@ "url": "https://paypal.me/jimmywarting" } ], - "license": "MIT", "engines": { "node": ">=10.5.0" } }, "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "dependencies": { - "whatwg-url": "^5.0.0" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, "node_modules/node-gyp-build": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", - "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", + "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -10061,7 +10829,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", @@ -10086,7 +10853,6 @@ "version": "10.0.7", "resolved": "https://registry.npmjs.org/np/-/np-10.0.7.tgz", "integrity": "sha512-vIPKQwOYKpQU40PU5x/vLfN2haj8ObxMvR1QGt7EZnBPWdm4WEbHdumYAnMV7AeR9kACsMqcqAP37sAo5cW5jA==", - "license": "MIT", "dependencies": { "chalk": "^5.3.0", "chalk-template": "^1.1.0", @@ -10139,20 +10905,21 @@ "url": "https://github.com/sindresorhus/np?sponsor=1" } }, - "node_modules/np/node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "license": "ISC", + "node_modules/np/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { - "node": ">= 12" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/np/node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -10161,10 +10928,9 @@ } }, "node_modules/np/node_modules/inquirer": { - "version": "9.3.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.6.tgz", - "integrity": "sha512-riK/iQB2ctwkpWYgjjWIRv3MBLt2gzb2Sj0JNQNbyTXgyXsLWcDPJ5WS5ZDTCx7BRFnJsARtYh+58fjP5M2Y0Q==", - "license": "MIT", + "version": "9.3.7", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.7.tgz", + "integrity": "sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==", "dependencies": { "@inquirer/figures": "^1.0.3", "ansi-escapes": "^4.3.2", @@ -10183,83 +10949,39 @@ "node": ">=18" } }, - "node_modules/np/node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/np/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/np/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/np/node_modules/mute-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/np/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/np/node_modules/run-async": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "license": "MIT", "engines": { "node": ">=0.12.0" } }, + "node_modules/np/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/npm": { - "version": "10.8.1", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.1.tgz", - "integrity": "sha512-Dp1C6SvSMYQI7YHq/y2l94uvI+59Eqbu1EpuKQHQ8p16txXRuRit5gH3Lnaagk2aXDIjg/Iru9pd05bnneKgdw==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.9.0.tgz", + "integrity": "sha512-ZanDioFylI9helNhl2LNd+ErmVD+H5I53ry41ixlLyCBgkuYb+58CvbAp99hW+zr5L9W4X7CchSoeqKdngOLSw==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -10339,73 +11061,73 @@ ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^7.5.3", - "@npmcli/config": "^8.3.3", - "@npmcli/fs": "^3.1.1", - "@npmcli/map-workspaces": "^3.0.6", - "@npmcli/package-json": "^5.1.1", - "@npmcli/promise-spawn": "^7.0.2", - "@npmcli/redact": "^2.0.0", - "@npmcli/run-script": "^8.1.0", + "@npmcli/arborist": "^8.0.0", + "@npmcli/config": "^9.0.0", + "@npmcli/fs": "^4.0.0", + "@npmcli/map-workspaces": "^4.0.1", + "@npmcli/package-json": "^6.0.1", + "@npmcli/promise-spawn": "^8.0.1", + "@npmcli/redact": "^3.0.0", + "@npmcli/run-script": "^9.0.1", "@sigstore/tuf": "^2.3.4", - "abbrev": "^2.0.0", + "abbrev": "^3.0.0", "archy": "~1.0.0", - "cacache": "^18.0.3", + "cacache": "^19.0.1", "chalk": "^5.3.0", "ci-info": "^4.0.0", "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", - "glob": "^10.4.1", + "glob": "^10.4.5", "graceful-fs": "^4.2.11", - "hosted-git-info": "^7.0.2", - "ini": "^4.1.3", - "init-package-json": "^6.0.3", + "hosted-git-info": "^8.0.0", + "ini": "^5.0.0", + "init-package-json": "^7.0.1", "is-cidr": "^5.1.0", - "json-parse-even-better-errors": "^3.0.2", - "libnpmaccess": "^8.0.6", - "libnpmdiff": "^6.1.3", - "libnpmexec": "^8.1.2", - "libnpmfund": "^5.0.11", - "libnpmhook": "^10.0.5", - "libnpmorg": "^6.0.6", - "libnpmpack": "^7.0.3", - "libnpmpublish": "^9.0.9", - "libnpmsearch": "^7.0.6", - "libnpmteam": "^6.0.5", - "libnpmversion": "^6.0.3", - "make-fetch-happen": "^13.0.1", - "minimatch": "^9.0.4", + "json-parse-even-better-errors": "^4.0.0", + "libnpmaccess": "^9.0.0", + "libnpmdiff": "^7.0.0", + "libnpmexec": "^9.0.0", + "libnpmfund": "^6.0.0", + "libnpmhook": "^11.0.0", + "libnpmorg": "^7.0.0", + "libnpmpack": "^8.0.0", + "libnpmpublish": "^10.0.0", + "libnpmsearch": "^8.0.0", + "libnpmteam": "^7.0.0", + "libnpmversion": "^7.0.0", + "make-fetch-happen": "^14.0.1", + "minimatch": "^9.0.5", "minipass": "^7.1.1", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^10.1.0", - "nopt": "^7.2.1", - "normalize-package-data": "^6.0.1", - "npm-audit-report": "^5.0.0", - "npm-install-checks": "^6.3.0", - "npm-package-arg": "^11.0.2", - "npm-pick-manifest": "^9.0.1", - "npm-profile": "^10.0.0", - "npm-registry-fetch": "^17.0.1", - "npm-user-validate": "^2.0.1", + "node-gyp": "^10.2.0", + "nopt": "^8.0.0", + "normalize-package-data": "^7.0.0", + "npm-audit-report": "^6.0.0", + "npm-install-checks": "^7.1.0", + "npm-package-arg": "^12.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-profile": "^11.0.1", + "npm-registry-fetch": "^18.0.1", + "npm-user-validate": "^3.0.0", "p-map": "^4.0.0", - "pacote": "^18.0.6", - "parse-conflict-json": "^3.0.1", - "proc-log": "^4.2.0", + "pacote": "^19.0.0", + "parse-conflict-json": "^4.0.0", + "proc-log": "^5.0.0", "qrcode-terminal": "^0.12.0", - "read": "^3.0.1", - "semver": "^7.6.2", + "read": "^4.0.0", + "semver": "^7.6.3", "spdx-expression-parse": "^4.0.0", - "ssri": "^10.0.6", + "ssri": "^12.0.0", "supports-color": "^9.4.0", "tar": "^6.2.1", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.1", - "which": "^4.0.0", - "write-file-atomic": "^5.0.1" + "validate-npm-package-name": "^6.0.0", + "which": "^5.0.0", + "write-file-atomic": "^6.0.0" }, "bin": { "npm": "bin/npm-cli.js", @@ -10419,7 +11141,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/npm-name/-/npm-name-8.0.0.tgz", "integrity": "sha512-DIuCGcKYYhASAZW6Xh/tiaGMko8IHOHe0n3zOA7SzTi0Yvy00x8L7sa5yNiZ75Ny58O/KeRtNouy8Ut6gPbKiw==", - "license": "MIT", "dependencies": { "is-scoped": "^3.0.0", "is-url-superb": "^6.1.0", @@ -10442,7 +11163,6 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.2.tgz", "integrity": "sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==", - "license": "MIT", "engines": { "node": ">=18" }, @@ -10451,10 +11171,9 @@ } }, "node_modules/npm-package-arg": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", - "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", - "license": "ISC", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -10469,7 +11188,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -10480,6 +11198,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/npm/node_modules/@isaacs/cliui": { "version": "8.0.2", "inBundle": true, @@ -10542,13 +11271,24 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/npm/node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/npm/node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/agent": { - "version": "2.2.2", + "version": "3.0.0", "inBundle": true, "license": "ISC", "dependencies": { @@ -10559,47 +11299,47 @@ "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.5.3", + "version": "8.0.0", "inBundle": true, "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.1", - "@npmcli/installed-package-contents": "^2.1.0", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^7.1.1", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.1.0", - "@npmcli/query": "^3.1.0", - "@npmcli/redact": "^2.0.0", - "@npmcli/run-script": "^8.1.0", - "bin-links": "^4.0.4", - "cacache": "^18.0.3", + "@npmcli/fs": "^4.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/map-workspaces": "^4.0.1", + "@npmcli/metavuln-calculator": "^8.0.0", + "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.1", + "@npmcli/query": "^4.0.0", + "@npmcli/redact": "^3.0.0", + "@npmcli/run-script": "^9.0.1", + "bin-links": "^5.0.0", + "cacache": "^19.0.1", "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^7.0.2", - "json-parse-even-better-errors": "^3.0.2", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", "json-stringify-nice": "^1.1.4", "lru-cache": "^10.2.2", "minimatch": "^9.0.4", - "nopt": "^7.2.1", - "npm-install-checks": "^6.2.0", - "npm-package-arg": "^11.0.2", - "npm-pick-manifest": "^9.0.1", - "npm-registry-fetch": "^17.0.1", - "pacote": "^18.0.6", - "parse-conflict-json": "^3.0.0", - "proc-log": "^4.2.0", - "proggy": "^2.0.0", + "nopt": "^8.0.0", + "npm-install-checks": "^7.1.0", + "npm-package-arg": "^12.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.1", + "pacote": "^19.0.0", + "parse-conflict-json": "^4.0.0", + "proc-log": "^5.0.0", + "proggy": "^3.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", - "read-package-json-fast": "^3.0.2", + "read-package-json-fast": "^4.0.0", "semver": "^7.3.7", - "ssri": "^10.0.6", + "ssri": "^12.0.0", "treeverse": "^3.0.0", "walk-up-path": "^3.0.1" }, @@ -10607,177 +11347,178 @@ "arborist": "bin/index.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.3.3", + "version": "9.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/map-workspaces": "^4.0.1", + "@npmcli/package-json": "^6.0.1", "ci-info": "^4.0.0", - "ini": "^4.1.2", - "nopt": "^7.2.1", - "proc-log": "^4.2.0", - "read-package-json-fast": "^3.0.2", + "ini": "^5.0.0", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", "walk-up-path": "^3.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/fs": { - "version": "3.1.1", + "version": "4.0.0", "inBundle": true, "license": "ISC", "dependencies": { "semver": "^7.3.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "5.0.7", + "version": "6.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^4.0.0", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^4.0.0" + "which": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "2.1.0", + "version": "3.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" }, "bin": { "installed-package-contents": "bin/index.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "3.0.6", + "version": "4.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/package-json": "^6.0.0", "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" + "minimatch": "^9.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "7.1.1", + "version": "8.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "cacache": "^18.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^18.0.0", - "proc-log": "^4.1.0", + "cacache": "^19.0.0", + "json-parse-even-better-errors": "^4.0.0", + "pacote": "^19.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", + "version": "3.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "3.0.0", + "version": "4.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "5.1.1", + "version": "6.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.0", + "@npmcli/git": "^6.0.0", "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^4.0.0", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "normalize-package-data": "^7.0.0", + "proc-log": "^5.0.0", "semver": "^7.5.3" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "7.0.2", + "version": "8.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "which": "^4.0.0" + "which": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/query": { - "version": "3.1.0", + "version": "4.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^6.1.2" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/redact": { - "version": "2.0.0", + "version": "3.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "8.1.0", + "version": "9.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", "node-gyp": "^10.0.0", - "proc-log": "^4.0.0", - "which": "^4.0.0" + "proc-log": "^5.0.0", + "which": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@pkgjs/parseargs": { @@ -10832,6 +11573,133 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent": { + "version": "2.2.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/cacache": { + "version": "18.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen": { + "version": "13.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch": { + "version": "3.0.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/proc-log": { + "version": "4.2.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/ssri": { + "version": "10.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/unique-filename": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/unique-slug": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/npm/node_modules/@sigstore/tuf": { "version": "2.3.4", "inBundle": true, @@ -10878,11 +11746,11 @@ } }, "node_modules/npm/node_modules/abbrev": { - "version": "2.0.0", + "version": "3.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/agent-base": { @@ -10943,17 +11811,18 @@ "license": "MIT" }, "node_modules/npm/node_modules/bin-links": { - "version": "4.0.4", + "version": "5.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" + "cmd-shim": "^7.0.0", + "npm-normalize-package-bin": "^4.0.0", + "proc-log": "^5.0.0", + "read-cmd-shim": "^5.0.0", + "write-file-atomic": "^6.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/binary-extensions": { @@ -10976,11 +11845,11 @@ } }, "node_modules/npm/node_modules/cacache": { - "version": "18.0.3", + "version": "19.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/fs": "^3.1.0", + "@npmcli/fs": "^4.0.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^10.0.1", @@ -10988,13 +11857,82 @@ "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/chownr": { + "version": "3.0.0", + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/minizlib": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/mkdirp": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/p-map": { + "version": "7.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/tar": { + "version": "7.4.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/yallist": { + "version": "5.0.0", + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, "node_modules/npm/node_modules/chalk": { @@ -11062,11 +12000,11 @@ } }, "node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.3", + "version": "7.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/color-convert": { @@ -11129,7 +12067,7 @@ } }, "node_modules/npm/node_modules/debug": { - "version": "4.3.4", + "version": "4.3.6", "inBundle": true, "license": "MIT", "dependencies": { @@ -11203,7 +12141,7 @@ } }, "node_modules/npm/node_modules/foreground-child": { - "version": "3.1.1", + "version": "3.3.0", "inBundle": true, "license": "ISC", "dependencies": { @@ -11228,16 +12166,8 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/npm/node_modules/glob": { - "version": "10.4.1", + "version": "10.4.5", "inBundle": true, "license": "ISC", "dependencies": { @@ -11245,14 +12175,12 @@ "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -11262,26 +12190,15 @@ "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/hasown": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/npm/node_modules/hosted-git-info": { - "version": "7.0.2", + "version": "8.0.0", "inBundle": true, "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/http-cache-semantics": { @@ -11302,7 +12219,7 @@ } }, "node_modules/npm/node_modules/https-proxy-agent": { - "version": "7.0.4", + "version": "7.0.5", "inBundle": true, "license": "MIT", "dependencies": { @@ -11326,14 +12243,14 @@ } }, "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.5", + "version": "7.0.0", "inBundle": true, "license": "ISC", "dependencies": { "minimatch": "^9.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/imurmurhash": { @@ -11353,28 +12270,28 @@ } }, "node_modules/npm/node_modules/ini": { - "version": "4.1.3", + "version": "5.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/init-package-json": { - "version": "6.0.3", + "version": "7.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/package-json": "^5.0.0", - "npm-package-arg": "^11.0.0", - "promzard": "^1.0.0", - "read": "^3.0.1", + "@npmcli/package-json": "^6.0.0", + "npm-package-arg": "^12.0.0", + "promzard": "^2.0.0", + "read": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/ip-address": { @@ -11411,17 +12328,6 @@ "node": ">=14" } }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.13.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/npm/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "inBundle": true, @@ -11441,15 +12347,12 @@ "license": "ISC" }, "node_modules/npm/node_modules/jackspeak": { - "version": "3.1.2", + "version": "3.4.3", "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -11463,11 +12366,11 @@ "license": "MIT" }, "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.2", + "version": "4.0.0", "inBundle": true, "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/json-stringify-nice": { @@ -11497,192 +12400,188 @@ "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { - "version": "8.0.6", + "version": "9.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^17.0.1" + "npm-package-arg": "^12.0.0", + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.1.3", + "version": "7.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.5.3", - "@npmcli/installed-package-contents": "^2.1.0", + "@npmcli/arborist": "^8.0.0", + "@npmcli/installed-package-contents": "^3.0.0", "binary-extensions": "^2.3.0", "diff": "^5.1.0", "minimatch": "^9.0.4", - "npm-package-arg": "^11.0.2", - "pacote": "^18.0.6", + "npm-package-arg": "^12.0.0", + "pacote": "^19.0.0", "tar": "^6.2.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "8.1.2", + "version": "9.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.5.3", - "@npmcli/run-script": "^8.1.0", + "@npmcli/arborist": "^8.0.0", + "@npmcli/run-script": "^9.0.1", "ci-info": "^4.0.0", - "npm-package-arg": "^11.0.2", - "pacote": "^18.0.6", - "proc-log": "^4.2.0", - "read": "^3.0.1", - "read-package-json-fast": "^3.0.2", + "npm-package-arg": "^12.0.0", + "pacote": "^19.0.0", + "proc-log": "^5.0.0", + "read": "^4.0.0", + "read-package-json-fast": "^4.0.0", "semver": "^7.3.7", "walk-up-path": "^3.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.11", + "version": "6.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.5.3" + "@npmcli/arborist": "^8.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmhook": { - "version": "10.0.5", + "version": "11.0.0", "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^17.0.1" + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmorg": { - "version": "6.0.6", + "version": "7.0.0", "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^17.0.1" + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "7.0.3", + "version": "8.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.5.3", - "@npmcli/run-script": "^8.1.0", - "npm-package-arg": "^11.0.2", - "pacote": "^18.0.6" + "@npmcli/arborist": "^8.0.0", + "@npmcli/run-script": "^9.0.1", + "npm-package-arg": "^12.0.0", + "pacote": "^19.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "9.0.9", + "version": "10.0.0", "inBundle": true, "license": "ISC", "dependencies": { "ci-info": "^4.0.0", - "normalize-package-data": "^6.0.1", - "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^17.0.1", - "proc-log": "^4.2.0", + "normalize-package-data": "^7.0.0", + "npm-package-arg": "^12.0.0", + "npm-registry-fetch": "^18.0.1", + "proc-log": "^5.0.0", "semver": "^7.3.7", "sigstore": "^2.2.0", - "ssri": "^10.0.6" + "ssri": "^12.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmsearch": { - "version": "7.0.6", + "version": "8.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^17.0.1" + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmteam": { - "version": "6.0.5", + "version": "7.0.0", "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^17.0.1" + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmversion": { - "version": "6.0.3", + "version": "7.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.7", - "@npmcli/run-script": "^8.1.0", - "json-parse-even-better-errors": "^3.0.2", - "proc-log": "^4.2.0", + "@npmcli/git": "^6.0.1", + "@npmcli/run-script": "^9.0.1", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.7" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/lru-cache": { - "version": "10.2.2", + "version": "10.4.3", "inBundle": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } + "license": "ISC" }, "node_modules/npm/node_modules/make-fetch-happen": { - "version": "13.0.1", + "version": "14.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", + "minipass-fetch": "^4.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", - "proc-log": "^4.2.0", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1", - "ssri": "^10.0.0" + "ssri": "^12.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/minimatch": { - "version": "9.0.4", + "version": "9.0.5", "inBundle": true, "license": "ISC", "dependencies": { @@ -11715,53 +12614,45 @@ } }, "node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.5", + "version": "4.0.0", "inBundle": true, "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "minizlib": "^3.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", + "node_modules/npm/node_modules/minipass-fetch/node_modules/minizlib": { + "version": "3.0.1", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.0.4", + "rimraf": "^5.0.5" }, "engines": { - "node": ">= 8" + "node": ">= 18" } }, - "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", "inBundle": true, "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" + "node": ">= 8" } }, - "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { + "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", "inBundle": true, "license": "ISC", @@ -11856,11 +12747,11 @@ "license": "MIT" }, "node_modules/npm/node_modules/mute-stream": { - "version": "1.0.0", + "version": "2.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/negotiator": { @@ -11872,7 +12763,7 @@ } }, "node_modules/npm/node_modules/node-gyp": { - "version": "10.1.0", + "version": "10.2.0", "inBundle": true, "license": "MIT", "dependencies": { @@ -11882,9 +12773,9 @@ "graceful-fs": "^4.2.6", "make-fetch-happen": "^13.0.0", "nopt": "^7.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.1.0", "semver": "^7.3.5", - "tar": "^6.1.2", + "tar": "^6.2.1", "which": "^4.0.0" }, "bin": { @@ -11894,155 +12785,337 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/proc-log": { - "version": "3.0.0", + "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/agent": { + "version": "2.2.2", "inBundle": true, "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/nopt": { - "version": "7.2.1", + "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/fs": { + "version": "3.1.1", "inBundle": true, "license": "ISC", "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" + "semver": "^7.3.5" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "6.0.1", + "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { + "version": "2.0.0", "inBundle": true, - "license": "BSD-2-Clause", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/cacache": { + "version": "18.0.4", + "inBundle": true, + "license": "ISC", "dependencies": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "5.0.0", + "node_modules/npm/node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=16" } }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "3.0.1", + "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "13.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "npm-normalize-package-bin": "^3.0.0" + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "6.3.0", + "node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": { + "version": "3.0.5", "inBundle": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "semver": "^7.1.1" + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "3.0.1", + "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { + "version": "7.2.1", "inBundle": true, "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "11.0.2", + "node_modules/npm/node_modules/node-gyp/node_modules/proc-log": { + "version": "4.2.0", "inBundle": true, "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "8.0.2", + "node_modules/npm/node_modules/node-gyp/node_modules/ssri": { + "version": "10.0.6", "inBundle": true, "license": "ISC", "dependencies": { - "ignore-walk": "^6.0.4" + "minipass": "^7.0.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "9.0.1", + "node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": { + "version": "3.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" + "unique-slug": "^4.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/npm-profile": { - "version": "10.0.0", + "node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": { + "version": "4.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^17.0.1", - "proc-log": "^4.0.0" + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">=18.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "8.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/nopt/node_modules/abbrev": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "7.0.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^8.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "7.1.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "12.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/npm-packlist": { + "version": "9.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^7.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "10.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^7.1.0", + "npm-normalize-package-bin": "^4.0.0", + "npm-package-arg": "^12.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/npm-profile": { + "version": "11.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "17.0.1", + "version": "18.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/redact": "^2.0.0", - "make-fetch-happen": "^13.0.0", + "@npmcli/redact": "^3.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^14.0.0", "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^4.0.0" + "minipass-fetch": "^4.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^12.0.0", + "proc-log": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch/node_modules/minizlib": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" } }, "node_modules/npm/node_modules/npm-user-validate": { - "version": "2.0.1", + "version": "3.0.0", "inBundle": true, "license": "BSD-2-Clause", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/p-map": { @@ -12059,47 +13132,52 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm/node_modules/package-json-from-dist": { + "version": "1.0.0", + "inBundle": true, + "license": "BlueOak-1.0.0" + }, "node_modules/npm/node_modules/pacote": { - "version": "18.0.6", + "version": "19.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/package-json": "^5.1.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^8.0.0", - "cacache": "^18.0.0", + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^17.0.0", - "proc-log": "^4.0.0", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^9.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1", "sigstore": "^2.2.0", - "ssri": "^10.0.0", + "ssri": "^12.0.0", "tar": "^6.1.11" }, "bin": { "pacote": "bin/index.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/parse-conflict-json": { - "version": "3.0.1", + "version": "4.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "json-parse-even-better-errors": "^3.0.0", + "json-parse-even-better-errors": "^4.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/path-key": { @@ -12126,7 +13204,7 @@ } }, "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.1.0", + "version": "6.1.2", "inBundle": true, "license": "MIT", "dependencies": { @@ -12138,19 +13216,19 @@ } }, "node_modules/npm/node_modules/proc-log": { - "version": "4.2.0", + "version": "5.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/proggy": { - "version": "2.0.0", + "version": "3.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/promise-all-reject-late": { @@ -12187,14 +13265,14 @@ } }, "node_modules/npm/node_modules/promzard": { - "version": "1.0.2", + "version": "2.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "read": "^3.0.1" + "read": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/qrcode-terminal": { @@ -12205,34 +13283,34 @@ } }, "node_modules/npm/node_modules/read": { - "version": "3.0.1", + "version": "4.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "mute-stream": "^1.0.0" + "mute-stream": "^2.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/read-cmd-shim": { - "version": "4.0.0", + "version": "5.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/read-package-json-fast": { - "version": "3.0.2", + "version": "4.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "json-parse-even-better-errors": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/retry": { @@ -12243,6 +13321,20 @@ "node": ">= 4" } }, + "node_modules/npm/node_modules/rimraf": { + "version": "5.0.10", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", "inBundle": true, @@ -12250,7 +13342,7 @@ "optional": true }, "node_modules/npm/node_modules/semver": { - "version": "7.6.2", + "version": "7.6.3", "inBundle": true, "license": "ISC", "bin": { @@ -12329,13 +13421,13 @@ } }, "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "8.0.3", + "version": "8.0.4", "inBundle": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.1", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" @@ -12384,14 +13476,14 @@ "license": "BSD-3-Clause" }, "node_modules/npm/node_modules/ssri": { - "version": "10.0.6", + "version": "12.0.0", "inBundle": true, "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/string-width": { @@ -12532,44 +13624,171 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/unique-filename": { - "version": "3.0.0", + "node_modules/npm/node_modules/tuf-js/node_modules/@npmcli/agent": { + "version": "2.2.2", "inBundle": true, "license": "ISC", "dependencies": { - "unique-slug": "^4.0.0" + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/unique-slug": { - "version": "4.0.0", + "node_modules/npm/node_modules/tuf-js/node_modules/@npmcli/fs": { + "version": "3.1.1", "inBundle": true, "license": "ISC", "dependencies": { - "imurmurhash": "^0.1.4" + "semver": "^7.3.5" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", + "node_modules/npm/node_modules/tuf-js/node_modules/cacache": { + "version": "18.0.4", "inBundle": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", + "node_modules/npm/node_modules/tuf-js/node_modules/make-fetch-happen": { + "version": "13.0.1", "inBundle": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { - "version": "3.0.1", + "node_modules/npm/node_modules/tuf-js/node_modules/minipass-fetch": { + "version": "3.0.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/tuf-js/node_modules/proc-log": { + "version": "4.2.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js/node_modules/ssri": { + "version": "10.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js/node_modules/unique-filename": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js/node_modules/unique-slug": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-filename": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/unique-slug": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", "inBundle": true, "license": "MIT", "dependencies": { @@ -12578,11 +13797,11 @@ } }, "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "5.0.1", + "version": "6.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/walk-up-path": { @@ -12591,7 +13810,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/which": { - "version": "4.0.0", + "version": "5.0.0", "inBundle": true, "license": "ISC", "dependencies": { @@ -12601,7 +13820,7 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/which/node_modules/isexe": { @@ -12706,7 +13925,7 @@ } }, "node_modules/npm/node_modules/write-file-atomic": { - "version": "5.0.1", + "version": "6.0.0", "inBundle": true, "license": "ISC", "dependencies": { @@ -12714,7 +13933,7 @@ "signal-exit": "^4.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/yallist": { @@ -12726,7 +13945,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12753,16 +13971,25 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-treeify": { "version": "1.1.33", "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", - "license": "MIT", "engines": { "node": ">= 10" } @@ -12775,6 +14002,17 @@ "node": ">=14.0.0" } }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -12784,14 +14022,14 @@ } }, "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -12801,7 +14039,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "license": "MIT", "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", @@ -12819,7 +14056,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" }, @@ -12852,26 +14088,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/ora/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/org-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/org-regex/-/org-regex-1.0.0.tgz", "integrity": "sha512-7bqkxkEJwzJQUAlyYniqEZ3Ilzjh0yoa62c7gL6Ijxj5bEpPL+8IE1Z0PFj0ywjjXQcdrwR51g9MIcLezR0hKQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -12896,7 +14150,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -12911,7 +14164,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -12923,7 +14175,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "license": "MIT", "dependencies": { "aggregate-error": "^4.0.0" }, @@ -12938,7 +14189,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/p-memoize/-/p-memoize-7.1.1.tgz", "integrity": "sha512-DZ/bONJILHkQ721hSr/E9wMz5Am/OTJ9P6LhLFo2Tu+jL8044tgc9LwHO8g4PiaYePnlVVRAJcKmgy8J9MVFrA==", - "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0", "type-fest": "^3.0.0" @@ -12950,23 +14200,10 @@ "url": "https://github.com/sindresorhus/p-memoize?sponsor=1" } }, - "node_modules/p-memoize/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-memoize/node_modules/type-fest": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=14.16" }, @@ -12975,10 +14212,9 @@ } }, "node_modules/p-timeout": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", - "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", - "license": "MIT", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.3.tgz", + "integrity": "sha512-UJUyfKbwvr/uZSV6btANfb+0t/mOhKV/KXcCUTp8FcQI+v/0d+wXqH4htrW0E4rR6WiEO/EPvUFiV9D5OI4vlw==", "engines": { "node": ">=14.16" }, @@ -12990,7 +14226,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", "engines": { "node": ">=6" } @@ -12999,7 +14234,6 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-10.0.1.tgz", "integrity": "sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==", - "license": "MIT", "dependencies": { "ky": "^1.2.0", "registry-auth-token": "^5.0.2", @@ -13013,6 +14247,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", @@ -13022,7 +14261,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -13034,7 +14272,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -13048,11 +14285,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/password-prompt": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.3.tgz", "integrity": "sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==", - "license": "0BSD", "dependencies": { "ansi-escapes": "^4.3.2", "cross-spawn": "^7.0.3" @@ -13062,7 +14306,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -13071,28 +14314,42 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "license": "MIT", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "engines": { - "node": ">=12" + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", "engines": { "node": ">=8" } @@ -13116,7 +14373,6 @@ "version": "0.0.53", "resolved": "https://registry.npmjs.org/pbkit/-/pbkit-0.0.53.tgz", "integrity": "sha512-NUt7lFsiM+JQKioA0ZhRM+UdW/Z2p/akC41wgRo7j8Vo5CJRLm3LTKQmVav05wH+r7BDbjpH0eOhwAC+8tbidQ==", - "license": "(MIT OR Apache-2.0)", "dependencies": { "@yarnpkg/fslib": "^2.6.0-rc.8", "@yarnpkg/libzip": "^2.2.2", @@ -13129,18 +14385,16 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "license": "ISC" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -13235,11 +14489,18 @@ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/pkg-dir": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-8.0.0.tgz", "integrity": "sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==", - "license": "MIT", "dependencies": { "find-up-simple": "^1.0.0" }, @@ -13251,31 +14512,70 @@ } }, "node_modules/poseidon-lite": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/poseidon-lite/-/poseidon-lite-0.2.0.tgz", - "integrity": "sha512-vivDZnGmz8W4G/GzVA72PXkfYStjilu83rjjUfpL4PueKcC8nfX6hCPh2XhoC5FBgC6y0TA3YuUeUo5YCcNoig==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/poseidon-lite/-/poseidon-lite-0.2.1.tgz", + "integrity": "sha512-xIr+G6HeYfOhCuswdqcFpSX47SPhm0EpisWJ6h7fHlWwaVIvH3dLnejpatrtw6Xc6HaLrpq05y7VRfvDmDGIog==" }, - "node_modules/prettier": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", - "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.1.1" }, "engines": { - "node": ">=14" + "node": ">= 18" }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "license": "ISC", - "engines": { + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, @@ -13295,15 +14595,13 @@ "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "license": "ISC" + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" }, "node_modules/protobufjs": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.3.tgz", - "integrity": "sha512-HaYi2CVjiPoBR1d2zTVKVHXr9IUnpJizCjUu19vxdD3B8o4z+vfOHpIEB1358w8nv8dfUNEfDHFvMsH7QlLt/Q==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", "hasInstallScript": true, - "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -13322,15 +14620,35 @@ "node": ">=12.0.0" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -13340,7 +14658,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/pumpdotfun-sdk/-/pumpdotfun-sdk-1.3.2.tgz", "integrity": "sha512-TkYY+ZztxyPzv1f38evgdam92Po3YATI8s6BzmvxH8FypBpPs3pBKS301z7k3KXc1WWfjGWG79K/BANWaAcvkQ==", - "license": "ISC", "dependencies": { "@coral-xyz/anchor": "^0.30.1", "@rollup/plugin-json": "^6.1.0", @@ -13348,6 +14665,123 @@ "@solana/web3.js": "^1.92.1" } }, + "node_modules/pumpdotfun-sdk/node_modules/@solana/codecs": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-preview.2.tgz", + "integrity": "sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-data-structures": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2", + "@solana/codecs-strings": "2.0.0-preview.2", + "@solana/options": "2.0.0-preview.2" + } + }, + "node_modules/pumpdotfun-sdk/node_modules/@solana/codecs-core": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-preview.2.tgz", + "integrity": "sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==", + "dependencies": { + "@solana/errors": "2.0.0-preview.2" + } + }, + "node_modules/pumpdotfun-sdk/node_modules/@solana/codecs-data-structures": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.2.tgz", + "integrity": "sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2", + "@solana/errors": "2.0.0-preview.2" + } + }, + "node_modules/pumpdotfun-sdk/node_modules/@solana/codecs-numbers": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.2.tgz", + "integrity": "sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/errors": "2.0.0-preview.2" + } + }, + "node_modules/pumpdotfun-sdk/node_modules/@solana/codecs-strings": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.2.tgz", + "integrity": "sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2", + "@solana/errors": "2.0.0-preview.2" + }, + "peerDependencies": { + "fastestsmallesttextencoderdecoder": "^1.0.22" + } + }, + "node_modules/pumpdotfun-sdk/node_modules/@solana/errors": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-preview.2.tgz", + "integrity": "sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==", + "dependencies": { + "chalk": "^5.3.0", + "commander": "^12.0.0" + }, + "bin": { + "errors": "bin/cli.js" + } + }, + "node_modules/pumpdotfun-sdk/node_modules/@solana/options": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-preview.2.tgz", + "integrity": "sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2" + } + }, + "node_modules/pumpdotfun-sdk/node_modules/@solana/spl-token": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.6.tgz", + "integrity": "sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA==", + "dependencies": { + "@solana/buffer-layout": "^4.0.0", + "@solana/buffer-layout-utils": "^0.2.0", + "@solana/spl-token-group": "^0.0.4", + "@solana/spl-token-metadata": "^0.1.4", + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.91.6" + } + }, + "node_modules/pumpdotfun-sdk/node_modules/@solana/spl-token-group": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.4.tgz", + "integrity": "sha512-7+80nrEMdUKlK37V6kOe024+T7J4nNss0F8LQ9OOPYdWCCfJmsGUzVx2W3oeizZR4IHM6N4yC9v1Xqwc3BTPWw==", + "dependencies": { + "@solana/codecs": "2.0.0-preview.2", + "@solana/spl-type-length-value": "0.1.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.91.6" + } + }, + "node_modules/pumpdotfun-sdk/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -13360,7 +14794,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "license": "MIT", "dependencies": { "escape-goat": "^4.0.0" }, @@ -13371,6 +14804,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -13388,8 +14835,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/quick-format-unescaped": { "version": "4.0.4", @@ -13420,11 +14866,47 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -13438,14 +14920,12 @@ "node_modules/rc/node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13454,7 +14934,6 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", - "license": "MIT", "dependencies": { "find-up-simple": "^1.0.0", "read-pkg": "^9.0.0", @@ -13468,10 +14947,9 @@ } }, "node_modules/read-package-up/node_modules/type-fest": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.25.0.tgz", - "integrity": "sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==", - "license": "(MIT OR CC0-1.0)", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", "engines": { "node": ">=16" }, @@ -13483,7 +14961,6 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", - "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", @@ -13502,7 +14979,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "index-to-position": "^0.1.2", @@ -13516,10 +14992,9 @@ } }, "node_modules/read-pkg/node_modules/type-fest": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.25.0.tgz", - "integrity": "sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==", - "license": "(MIT OR CC0-1.0)", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", "engines": { "node": ">=16" }, @@ -13540,6 +15015,18 @@ "node": ">= 6" } }, + "node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/real-require": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", @@ -13552,7 +15039,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "license": "MIT", "dependencies": { "esprima": "~4.0.0" } @@ -13566,7 +15052,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "license": "MIT", "dependencies": { "@pnpm/npm-conf": "^2.1.0" }, @@ -13578,7 +15063,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "license": "MIT", "dependencies": { "rc": "1.2.8" }, @@ -13593,7 +15077,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13607,7 +15090,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -13619,7 +15101,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", "engines": { "node": ">=8" } @@ -13628,7 +15109,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", "engines": { "node": ">=4" } @@ -13656,6 +15136,33 @@ "node": ">=8" } }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -13668,7 +15175,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -13679,7 +15185,6 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -13699,11 +15204,46 @@ "inherits": "^2.0.1" } }, + "node_modules/rollup": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.2.tgz", + "integrity": "sha512-do/DFGq5g6rdDhdpPq5qb2ecoczeK6y+2UAjdJ5trjQJj5f1AiVdLRWRc9A9/fFukfvJRgM0UXzxBIYMovm5ww==", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.2", + "@rollup/rollup-android-arm64": "4.24.2", + "@rollup/rollup-darwin-arm64": "4.24.2", + "@rollup/rollup-darwin-x64": "4.24.2", + "@rollup/rollup-freebsd-arm64": "4.24.2", + "@rollup/rollup-freebsd-x64": "4.24.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.2", + "@rollup/rollup-linux-arm-musleabihf": "4.24.2", + "@rollup/rollup-linux-arm64-gnu": "4.24.2", + "@rollup/rollup-linux-arm64-musl": "4.24.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.2", + "@rollup/rollup-linux-riscv64-gnu": "4.24.2", + "@rollup/rollup-linux-s390x-gnu": "4.24.2", + "@rollup/rollup-linux-x64-gnu": "4.24.2", + "@rollup/rollup-linux-x64-musl": "4.24.2", + "@rollup/rollup-win32-arm64-msvc": "4.24.2", + "@rollup/rollup-win32-ia32-msvc": "4.24.2", + "@rollup/rollup-win32-x64-msvc": "4.24.2", + "fsevents": "~2.3.2" + } + }, "node_modules/rpc-websockets": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.10.0.tgz", "integrity": "sha512-cemZ6RiDtYZpPiBzYijdOrkQQzmBCmug0E9SdRH2gIUNT15ql4mwCYWIp0VnSZq6Qrw/JkGUygp4PrK1y9KfwQ==", - "license": "LGPL-3.0-only", "dependencies": { "@babel/runtime": "^7.17.2", "eventemitter3": "^4.0.7", @@ -13723,7 +15263,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "license": "MIT", "engines": { "node": ">=18" }, @@ -13757,7 +15296,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -13790,9 +15328,9 @@ ] }, "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "engines": { "node": ">=10" } @@ -13806,7 +15344,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-3.0.0.tgz", "integrity": "sha512-yEsN6TuxZhZ1Tl9iB81frTNS292m0I/IG7+w8lTvfcJQP2x3vnpOoevjBoE3Np5A6KnZM2+RtVenihj9t6NiYg==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -13820,23 +15357,42 @@ "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, "node_modules/secp256k1": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.0.tgz", - "integrity": "sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.1.tgz", + "integrity": "sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==", "hasInstallScript": true, "dependencies": { - "elliptic": "^6.5.4", + "elliptic": "^6.5.7", "node-addon-api": "^5.0.0", "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/secp256k1/node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + "node_modules/secp256k1/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/secp256k1/node_modules/elliptic": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", + "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/secp256k1/node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" }, "node_modules/secure-json-parse": { "version": "2.7.0", @@ -13847,7 +15403,6 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -13855,19 +15410,104 @@ "node": ">=10" } }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "license": "MIT", + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dependencies": { - "semver": "^7.3.5" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": ">=12" + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/setprototypeof": { @@ -13891,7 +15531,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -13903,30 +15542,55 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", "dependencies": { "is-arrayish": "^0.3.1" } }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", "engines": { "node": ">=8" } @@ -13935,7 +15599,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -13965,11 +15628,21 @@ "atomic-sleep": "^1.0.0" } }, + "node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -13978,14 +15651,12 @@ "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0" + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -13994,8 +15665,7 @@ "node_modules/spdx-license-ids": { "version": "3.0.20", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", - "license": "CC0-1.0" + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==" }, "node_modules/split2": { "version": "4.2.0", @@ -14008,15 +15678,14 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/stream-transform": { @@ -14048,6 +15717,20 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -14059,11 +15742,22 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -14099,27 +15793,85 @@ "resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-1.2.5.tgz", "integrity": "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==" }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/superstruct": { "version": "0.15.5", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==" }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/supports-hyperlinks": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -14128,11 +15880,21 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "license": "MIT", "engines": { "node": ">=0.10" } @@ -14141,7 +15903,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -14158,7 +15919,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-3.0.0.tgz", "integrity": "sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==", - "license": "MIT", "dependencies": { "ansi-escapes": "^5.0.0", "supports-hyperlinks": "^2.2.0" @@ -14174,7 +15934,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "license": "MIT", "dependencies": { "type-fest": "^1.0.2" }, @@ -14189,7 +15948,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -14205,8 +15963,26 @@ "node_modules/thenable-reject": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/thenable-reject/-/thenable-reject-1.0.0.tgz", - "integrity": "sha512-OJLB8ApYtc21pCM8T+uifMsnhl5zsqydGNa5uC650VUpf9QALRQWwArVyFmEDrvfz+oLsCtXMmhnZ+u2o8vwmg==", - "license": "MIT" + "integrity": "sha512-OJLB8ApYtc21pCM8T+uifMsnhl5zsqydGNa5uC650VUpf9QALRQWwArVyFmEDrvfz+oLsCtXMmhnZ+u2o8vwmg==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } }, "node_modules/thread-stream": { "version": "2.7.0", @@ -14231,6 +16007,23 @@ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" }, + "node_modules/tinyexec": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==" + }, + "node_modules/tinyglobby": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "dependencies": { + "fdir": "^6.4.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -14239,123 +16032,576 @@ "os-tmpdir": "~1.0.2" }, "engines": { - "node": ">=0.6.0" + "node": ">=0.6.0" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "optional": true, + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/tmp-promise/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "optional": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/toformat/-/toformat-2.0.0.tgz", + "integrity": "sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/traverse-chain": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", + "integrity": "sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/treeify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", + "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" + }, + "node_modules/tsup": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.3.5.tgz", + "integrity": "sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==", + "dependencies": { + "bundle-require": "^5.0.0", + "cac": "^6.7.14", + "chokidar": "^4.0.1", + "consola": "^3.2.3", + "debug": "^4.3.7", + "esbuild": "^0.24.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.24.0", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.1", + "tinyglobby": "^0.2.9", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/tsup/node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsup/node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsup/node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsup/node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsup/node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsup/node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsup/node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsup/node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsup/node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsup/node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsup/node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsup/node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsup/node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsup/node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsup/node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "node_modules/tsup/node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], "optional": true, - "dependencies": { - "tmp": "^0.2.0" + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/tmp-promise/node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "node_modules/tsup/node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=14.14" + "node": ">=18" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, + "node_modules/tsup/node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=8.0" + "node": ">=18" } }, - "node_modules/toformat": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/toformat/-/toformat-2.0.0.tgz", - "integrity": "sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==" - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/tsup/node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=0.6" + "node": ">=18" } }, - "node_modules/toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "node_modules/tsup/node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/traverse-chain": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", - "integrity": "sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==", - "license": "MIT" + "node_modules/tsup/node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/treeify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", + "node_modules/tsup/node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.6" + "node": ">=18" } }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "license": "MIT", + "node_modules/tsup/node_modules/bundle-require": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.0.0.tgz", + "integrity": "sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==", "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" + "load-tsconfig": "^0.2.3" }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "esbuild": ">=0.18" } }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "node_modules/tsup/node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" + } + }, + "node_modules/tsup/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } }, "node_modules/tweetnacl": { "version": "1.0.3", @@ -14373,11 +16619,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "license": "Apache-2.0", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -14392,9 +16649,9 @@ "integrity": "sha512-7sI4e/bZijOzyURng88oOFZCISQPTHozfE2sUu5AviFYk5QV7fYGb6YiDl+vKjF/pICA354JImBImL9XJWUvdQ==" }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, "node_modules/unicode-trie": { "version": "2.0.0", @@ -14414,7 +16671,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "license": "MIT", "engines": { "node": ">=18" }, @@ -14422,23 +16678,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/update-notifier": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-7.2.0.tgz", - "integrity": "sha512-GoBCFKIbF88latQyk8HpHUoJHqZUzYSPI6BySAjs5TWd/TCTMynAsIfGfJ6Ep2DAx6O5YExYGPs3Hdnt2TWdzQ==", - "license": "BSD-2-Clause", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-7.3.1.tgz", + "integrity": "sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==", "dependencies": { - "boxen": "^8.0.0", + "boxen": "^8.0.1", "chalk": "^5.3.0", "configstore": "^7.0.0", - "import-lazy": "^4.0.0", "is-in-ci": "^1.0.0", "is-installed-globally": "^1.0.0", "is-npm": "^6.0.0", "latest-version": "^9.0.0", "pupa": "^3.1.0", "semver": "^7.6.3", - "semver-diff": "^4.0.0", "xdg-basedir": "^5.1.0" }, "engines": { @@ -14448,6 +16709,17 @@ "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/utf-8-validate": { "version": "5.0.10", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", @@ -14471,6 +16743,14 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -14482,14 +16762,12 @@ "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "license": "MIT" + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -14499,11 +16777,18 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/vlq": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/vlq/-/vlq-2.0.4.tgz", @@ -14513,7 +16798,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", - "license": "MIT", "dependencies": { "axios": "^1.6.1", "joi": "^17.11.0", @@ -14531,14 +16815,12 @@ "node_modules/wasmbuilder": { "version": "0.0.16", "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", - "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==", - "license": "GPL-3.0" + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==" }, "node_modules/wasmcurves": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", - "license": "GPL-3.0", "dependencies": { "wasmbuilder": "0.0.16" } @@ -14555,7 +16837,6 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -14563,8 +16844,7 @@ "node_modules/web-worker": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", - "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", - "license": "Apache-2.0" + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" }, "node_modules/web3-utils": { "version": "1.10.4", @@ -14585,26 +16865,26 @@ } }, "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "node_modules/websocket-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/websocket-iterator/-/websocket-iterator-1.0.1.tgz", "integrity": "sha512-NKGfOewl6ai3Ty4qIUq1S7OglCHjrEd3h8HzKpzBiyswEcB2vgE+u+Uxfarg6vJfJzy1Qorur7CXkcB1Asg3Fg==", - "license": "MIT", "dependencies": { "thenable-reject": "^1.0.0" } }, "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, "node_modules/when-exit": { @@ -14616,7 +16896,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -14631,7 +16910,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "license": "MIT", "dependencies": { "string-width": "^4.0.0" }, @@ -14642,20 +16920,39 @@ "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" }, "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrappy": { @@ -14667,7 +16964,6 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -14688,7 +16984,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -14700,7 +16995,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", "engines": { "node": ">=10" } @@ -14708,14 +17002,12 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -14733,7 +17025,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", "engines": { "node": ">=12" } @@ -14743,7 +17034,6 @@ "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.22.tgz", "integrity": "sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==", "hasInstallScript": true, - "license": "BSD-2-Clause", "bin": { "yarn": "bin/yarn.js", "yarnpkg": "bin/yarn.js" @@ -14756,7 +17046,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "license": "MIT", "engines": { "node": ">=6" } @@ -14765,7 +17054,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "license": "MIT", "engines": { "node": ">=18" }, diff --git a/package.json b/package.json index ba146a8..9ca4b67 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "solana-trading-cli", "version": "1.0.0", - "description": "Best tool for High-Frequency Trading developers on Solana", + "description": "Best development tool for Algo Trading on Solana", "main": "help.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" @@ -61,4 +61,4 @@ "engines": { "node": "22.2.0" } -} +} \ No newline at end of file From e99df181acc9e151017fcfa6dd09268ff441d198 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Wed, 30 Oct 2024 21:59:18 +0800 Subject: [PATCH 124/140] added a new method to fetch pool info --- src/raydium/Pool/formatAmmKeysById.ts | 82 ++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/src/raydium/Pool/formatAmmKeysById.ts b/src/raydium/Pool/formatAmmKeysById.ts index 1a2636f..ff7d6ae 100644 --- a/src/raydium/Pool/formatAmmKeysById.ts +++ b/src/raydium/Pool/formatAmmKeysById.ts @@ -16,7 +16,8 @@ const MINIMAL_MARKET_STATE_LAYOUT_V3 = struct([ publicKey("asks"), ]); import { connection } from "../../helpers/config"; - +import {initSdk} from "../raydium_config" +let sdkCache = { sdk: null, expiry: 0 }; // Promise /** * Formats AMM keys by ID. @@ -134,3 +135,82 @@ export async function formatAmmKeysById_pool(id:PublicKey) { }; } + + + +// usage of below two method: (it's the same as above but faster and more efficient in my vps) +// const poolKeys: any = await formatAmmKeysById_swap_1( +// new PublicKey(input.targetPool) +// ); + +// const poolInfo = await fetchPoolInfo(poolKeys, new PublicKey(input.targetPool)); + + +export async function formatAmmKeysById_swap_1(id: PublicKey):Promise { + let raydium:any = null + if(sdkCache.sdk){ + raydium = sdkCache.sdk; + } + else { + raydium = await initSdk(); + sdkCache.sdk = raydium; + } + + let poolKeys2 = await raydium.liquidity.getAmmPoolKeys(id.toBase58()); + while(poolKeys2 === null || poolKeys2===undefined){poolKeys2 = await raydium.liquidity.getAmmPoolKeys(id.toBase58());} + if(poolKeys2.programId !== '675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8') return null; + return { + id: new PublicKey(poolKeys2.id), + baseMint: new PublicKey(poolKeys2.mintA.address), + quoteMint: new PublicKey(poolKeys2.mintB.address), + lpMint: new PublicKey(poolKeys2.mintLp.address), + baseDecimals: poolKeys2.mintA.decimals, + quoteDecimals: poolKeys2.mintB.decimals, + lpDecimals: poolKeys2.mintLp.decimals, + version: 4, + programId: new PublicKey(poolKeys2.programId), + authority: new PublicKey(poolKeys2.authority), + openOrders: new PublicKey(poolKeys2.openOrders), + targetOrders: new PublicKey(poolKeys2.targetOrders), + baseVault: new PublicKey(poolKeys2.vault.A), + quoteVault: new PublicKey(poolKeys2.vault.B), + marketVersion: 3, + marketProgramId: new PublicKey(poolKeys2.marketProgramId), + marketId: new PublicKey(poolKeys2.marketId), + marketAuthority: new PublicKey(poolKeys2.marketAuthority), + marketBaseVault: new PublicKey(poolKeys2.marketBaseVault), + marketQuoteVault: new PublicKey(poolKeys2.marketQuoteVault), + marketBids: new PublicKey(poolKeys2.marketBids), + marketAsks: new PublicKey(poolKeys2.marketAsks), + marketEventQueue: new PublicKey(poolKeys2.marketEventQueue), + withdrawQueue: new PublicKey("11111111111111111111111111111111"), + lpVault: new PublicKey("11111111111111111111111111111111"), + lookupTableAccount: new PublicKey("11111111111111111111111111111111") + } +} + +export async function fetchPoolInfo(poolKeys: any, poolId: PublicKey){ + if(poolKeys===null)return null; + let raydium:any = null + if(sdkCache.sdk){ + raydium = sdkCache.sdk; + } + else { + raydium = await initSdk(); + sdkCache.sdk = raydium; + } + + let rpcData = await raydium.liquidity.getRpcPoolInfo(poolId.toBase58()); + while(rpcData === null || rpcData===undefined) {rpcData = await raydium.liquidity.getRpcPoolInfo(poolId.toBase58());} + return { + status: rpcData.status, + baseDecimals: rpcData.baseDecimal.toNumber(), + quoteDecimals: rpcData.quoteDecimal.toNumber(), + lpDecimals: poolKeys.lpDecimals, + baseReserve: rpcData.baseReserve, + quoteReserve: rpcData.quoteReserve, + lpSupply: rpcData.lpReserve, + startTime: rpcData.poolOpenTime + } +} + From 42d69b9ab4bc384f027a55aaba17ff6218476183 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 31 Oct 2024 16:28:42 +0800 Subject: [PATCH 125/140] add README.md in src/ --- src/README.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/README.md diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..bf660c3 --- /dev/null +++ b/src/README.md @@ -0,0 +1,28 @@ +# helper commands +1. ts-node wrap_sol.js --size # Wrap SOL to WSOL +2. ts-node unwrap_sol.js # Unwrap WSOL to SOL + +# Meteora +1. ts-node buy --token --sol +2. ts-node sell --token --percentage + +# Orca +1. ts-node buy --token --sol +2. ts-node sell --token --percentage + +# Raydium +1. ts-node buy --token --sol +2. ts-node sell --token --percentage + +# Pump.fun +1. ts-node buy --token_address --sol +2. ts-node sell --token_address --percentage +3. ts-node createAndBuy --pathToMintKeypair --sol --name --symbol --description --telegram --twitter --website --file + +# Token +1. ts-node create --payer --symbol --token_name --mint --supply --decimals --metadata --image --cluster --priority-fee --file_type +2. ts-node burn --payer --token_address --percentage --cluster + +# gRPC projects +- copy-bot: ts-node copy-trade.ts --trader +- pf-sniper-bot: ts-node snipe-create.ts --token --sell-after --n --auto-sell --jito \ No newline at end of file From ad51429c21fc30437b0350249136ab52c98fbcaf Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 31 Oct 2024 16:30:26 +0800 Subject: [PATCH 126/140] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 6368b9b..85c1f2b 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,9 @@ Fetch critical metrics for any liquidity pool in real-time with RPC calls: Utilize our local limit order and TP/SL module with zero dependencies. [Explore the documentation](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/trading_dev/README.md) +### All commands +[Here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src) + ### Open-Source Bots Leverage our cutting-edge, open-source trading bots: From 6ddb9b432e89ffbc0f5f3a332f6f20e55cbdf71c Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 31 Oct 2024 16:31:31 +0800 Subject: [PATCH 127/140] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 85c1f2b..7d614e1 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Utilize our local limit order and TP/SL module with zero dependencies. [Explore the documentation](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/trading_dev/README.md) ### All commands -[Here](https://github.com/outsmartchad/solana-trading-cli/tree/typescript-main/src) +[Here](https://github.com/outsmartchad/solana-trading-cli/blob/typescript-main/src/README.md) ### Open-Source Bots Leverage our cutting-edge, open-source trading bots: From 1f2b7863c34cfbdef5bde9580adcfd6cd1afa8ce Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 31 Oct 2024 16:32:52 +0800 Subject: [PATCH 128/140] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7d614e1..08bdf3d 100644 --- a/README.md +++ b/README.md @@ -179,6 +179,7 @@ We appreciate your support and look forward to making our product even better wi - https://github.com/raydium-io/raydium-sdk-V2 - https://github.com/rckprtr/pumpdotfun-sdk +- https://github.com/rpcpool/yellowstone-grpc - https://github.com/Al366io/solana-transactions-wrapper ## ‼️ Disclaimer From 264af2ac9bff64429080631f03555bb47ae3aa35 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 3 Dec 2024 22:56:22 +0800 Subject: [PATCH 129/140] Added plans in readme.md --- README.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 08bdf3d..b40c954 100644 --- a/README.md +++ b/README.md @@ -190,10 +190,16 @@ This software is provided "as is", without warranty of any kind, express or impl By using this software, you acknowledge that you have read, understood, and agree to this disclaimer. -### If you think this project is useful, please give us a star🌟, it will help us a lot. - ### Discord channel: https://discord.gg/hFhQeBCqWX -### It is a work in progress, if you have any suggestions or any problems, please let us know! +### If you think this will steal your keys, i have no time to convince you to use it. + +## Plans + +- A local-based db to store your limit orders + +- Smart scripts to help you detect potential rug pulls on pump.fun, e.g. dev sold, master wallet, similar past rug patterns + +- More gRPC bots to come -### **_Stay tuned for the updates.🤖_** +- More algos to trade on raydium/Pump.fun From bda7f738bc1c3bfa445ee7134679359bd42fb5d0 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 3 Dec 2024 23:02:27 +0800 Subject: [PATCH 130/140] added plans and goals in readme.md --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b40c954..f894b11 100644 --- a/README.md +++ b/README.md @@ -194,7 +194,7 @@ By using this software, you acknowledge that you have read, understood, and agre ### If you think this will steal your keys, i have no time to convince you to use it. -## Plans +## 🤖 Plans - A local-based db to store your limit orders @@ -203,3 +203,13 @@ By using this software, you acknowledge that you have read, understood, and agre - More gRPC bots to come - More algos to trade on raydium/Pump.fun + +## 🪙 Final State of this repo + +- Best trading framework on Solana + +- Best package/library for trading development on solana, e.g.(we could make it easy to like Raydium.buy("token", 0.01sol, 1%slippage)) + +- Best open-soured trading bot + +- Succeed with Solana dev! From acf23240dfa19d77e95f0e60088630c8be132a85 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 3 Dec 2024 23:07:43 +0800 Subject: [PATCH 131/140] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f894b11..e399c60 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ - [Disclaimer](#-disclaimer) - [Documentation](https://outsmartchad.github.io/solana-trading-cli/) -## 🚀 About +## About **Solana Trading Client** is a free, highly efficient library designed to facilitate rapid development and deployment of custom trading strategies across multiple Solana decentralized exchanges (DEXs). It emphasizes low-latency performance, flexibility, and real-time data processing, utilizing cutting-edge infrastructure and well-established software design principles. These features ensure the following benefits: @@ -24,7 +24,7 @@ The library is built with modularity and extensibility in mind, employing softwa Designed for seamless integration into existing trading systems, the Open-Source Low-Latency Trading Bot provides a robust foundation for both novice algo-traders and experienced quantitative analysts. Its open-source nature encourages community contributions and continuous improvement, ensuring the bot evolves alongside the fast-paced world of decentralized finance. -## ⭐ Key Features +## Key Features ### Token Creation and Multi-DEX Support Create your own Solana SPL tokens on mainnet via Pump.fun and swap tokens across multiple decentralized exchanges: From 4c7f615ebca4326166de57126879121ee9ff2421 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 3 Dec 2024 23:12:45 +0800 Subject: [PATCH 132/140] added p --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e399c60..2a88b9f 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,11 @@ ## About -**Solana Trading Client** is a free, highly efficient library designed to facilitate rapid development and deployment of custom trading strategies across multiple Solana decentralized exchanges (DEXs). It emphasizes low-latency performance, flexibility, and real-time data processing, utilizing cutting-edge infrastructure and well-established software design principles. These features ensure the following benefits: +**Solana Trading CLI** is a free, highly efficient library designed to facilitate rapid development of custom trading strategies across multiple Solana DEXs. It emphasizes low-latency performance, flexibility, and real-time data processing, utilizing cutting-edge infrastructure. These features ensure the following benefits: * **Speed:** Leverages low-latency infrastructures like Jito and BloXroute to minimize trade execution times, giving your strategies a competitive edge. -* **Versatility:** Supports multiple DEXs, allowing for diverse trading opportunities and cross-platform arbitrage. -* **Real-time Insights:** Fetches and processes real-time live metrics using gRPC from liquidity pools, enabling data-driven decision making. +* **Versatility:** Supports multiple DEXs like Raydium, Orca, Meteora, and Pump.fun, allowing for diverse trading opportunities. +* **Real-time Insights:** Fetches current state of an account using RPC, streams the latest transactions of accounts using geyser gRPC The library is built with modularity and extensibility in mind, employing software design patterns that promote: From 715bb936e5e3e2fdaf6c2b13cdfbed00dbe0c0c3 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Tue, 3 Dec 2024 23:14:41 +0800 Subject: [PATCH 133/140] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2a88b9f..b1828d4 100644 --- a/README.md +++ b/README.md @@ -204,6 +204,8 @@ By using this software, you acknowledge that you have read, understood, and agre - More algos to trade on raydium/Pump.fun +- Make it more easier to install, deploy the bot using docker + ## 🪙 Final State of this repo - Best trading framework on Solana From 2a71e3489ac120244e96dfa5988a008f88096646 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 16 Jan 2025 12:01:45 +0800 Subject: [PATCH 134/140] Update and rename README.md to added grpc info --- README.md => added grpc info | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) rename README.md => added grpc info (94%) diff --git a/README.md b/added grpc info similarity index 94% rename from README.md rename to added grpc info index b1828d4..1d1d791 100644 --- a/README.md +++ b/added grpc info @@ -130,15 +130,15 @@ Before you begin, ensure you have completed the following steps: 4. Optional configurations: - Devnet wallet secret key - - Shyft API key + - Helius RPC url + key (e.g. getting latest price from dexes) + - Shyft geyser gRPC token (for grpc trading bots development) ### 2. API Keys and Wallet Setup -- **Mainnet Wallet**: Ensure you have a funded Solana mainnet wallet. The secret key is required for mainnet transactions. -- **RPC Endpoint**: Obtain a reliable RPC endpoint for connecting to the Solana network. -- **Jito Integration**: If using Jito, prepare your custom fee configuration. -- **Devnet Wallet** (Optional): For testing purposes, set up a devnet wallet. -- **Shyft API** (Optional): If you plan to use Shyft services, obtain an API key from [Shyft](https://shyft.to/). +- **Solana Wallet**: Ensure you have a funded Solana mainnet wallet. The secret key is required for mainnet transactions. +- **RPC Endpoint**: Obtain a RPC endpoint from reliable node operator like Helius to connect to Solana +- **Jito Integration**: If uses Jito, prepare your custom fee configuration. +- **Shyft Geyser gRPC** (Optional): If you are developing algo trading bot, buy a grpc token from reliable operator like Shyft. ### 3. Final Check From e5101123601e5914c6f7e4c1f8c1da24efd0ed7a Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 16 Jan 2025 12:02:44 +0800 Subject: [PATCH 135/140] Update and rename README.md to change option name --- src/raydium/{README.md => change option name} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/raydium/{README.md => change option name} (93%) diff --git a/src/raydium/README.md b/src/raydium/change option name similarity index 93% rename from src/raydium/README.md rename to src/raydium/change option name index bbcb334..e6bb27d 100644 --- a/src/raydium/README.md +++ b/src/raydium/change option name @@ -2,12 +2,12 @@ ### Buy token through cli ` -ts-node src/raydium/buy.ts --token_address --sol +ts-node src/raydium/buy.ts --token --sol ` ### Sell token through cli ` -ts-node src/raydium/sell.ts --token_address --percentage +ts-node src/raydium/sell.ts --token --percentage ` ### buy/sell token on Raydium ```typescript From e83afd175850a6a7de09a2e44a9e6b85273e599e Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 16 Jan 2025 12:03:23 +0800 Subject: [PATCH 136/140] Rename change option name to README.md --- src/raydium/{change option name => README.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/raydium/{change option name => README.md} (100%) diff --git a/src/raydium/change option name b/src/raydium/README.md similarity index 100% rename from src/raydium/change option name rename to src/raydium/README.md From e86cde7dc1e3ebd8a7c32ce804169fc0594c7c8b Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 16 Jan 2025 12:04:53 +0800 Subject: [PATCH 137/140] Rename added grpc info to README.md --- added grpc info => README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename added grpc info => README.md (100%) diff --git a/added grpc info b/README.md similarity index 100% rename from added grpc info rename to README.md From 870f4fc6456521b836a3952019d04bb64cae14da Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 16 Jan 2025 15:59:31 +0800 Subject: [PATCH 138/140] Added shyft link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1d1d791..0539e1a 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ Before you begin, ensure you have completed the following steps: 4. Optional configurations: - Devnet wallet secret key - Helius RPC url + key (e.g. getting latest price from dexes) - - Shyft geyser gRPC token (for grpc trading bots development) + - Shyft geyser gRPC token (for grpc trading bots development) (Link to Shyft: https://shyft.to/) ### 2. API Keys and Wallet Setup From a4ef440ce1367d37a8cce87b03c93a9ba9f5fbe9 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 20 Feb 2025 00:26:29 -0500 Subject: [PATCH 139/140] Added Nozomi tx submission, added bought cache, mutex to grpc raydium sniper --- package-lock.json | 7657 +++++++++-------- package.json | 5 +- .../grpc-raydium-sniper/src/token-cache.ts | 25 + .../src/transaction/transaction.ts | 69 +- src/helpers/config.ts | 2 +- src/transactions/nozomi/tx-submission.ts | 117 + 6 files changed, 4471 insertions(+), 3404 deletions(-) create mode 100644 src/grpc_streaming_dev/grpc-raydium-sniper/src/token-cache.ts create mode 100644 src/transactions/nozomi/tx-submission.ts diff --git a/package-lock.json b/package-lock.json index 87411ca..ed91ffb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "@solana/spl-token": "^0.4.0", "@solana/web3.js": "^1.89.1", "@triton-one/yellowstone-grpc": "^0.4.0", + "async-mutex": "^0.5.0", "axios": "^1.6.8", "bigint-buffer": "^1.1.5", "bip39": "^3.1.0", @@ -71,34 +72,38 @@ } }, "node_modules/@aptos-labs/aptos-client": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@aptos-labs/aptos-client/-/aptos-client-0.1.1.tgz", - "integrity": "sha512-kJsoy4fAPTOhzVr7Vwq8s/AUg6BQiJDa7WOqRzev4zsuIS3+JCuIZ6vUd7UBsjnxtmguJJulMRs9qWCzVBt2XA==", - "dependencies": { - "axios": "1.7.4", - "got": "^11.8.6" - }, + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aptos-labs/aptos-client/-/aptos-client-1.0.0.tgz", + "integrity": "sha512-P/U/xz9w7+tTQDkaeAc693lDFcADO15bjD5RtP/2sa5FSIYbAyGI5A1RfSNPESuBjvskHBa6s47wajgSt4yX7g==", "engines": { "node": ">=15.10.0" + }, + "peerDependencies": { + "axios": "^1.7.7", + "got": "^11.8.6" } }, - "node_modules/@aptos-labs/aptos-client/node_modules/axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "node_modules/@aptos-labs/aptos-dynamic-transaction-composer": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@aptos-labs/aptos-dynamic-transaction-composer/-/aptos-dynamic-transaction-composer-0.1.3.tgz", + "integrity": "sha512-bJl+Zq5QbhpcPIJakAkl9tnT3T02mxCYhZThQDhUmjsOZ5wMRlKJ0P7aaq1dmlybSHkVj7vRgOy2t86/NDKKng==" + }, + "node_modules/@aptos-labs/script-composer-pack": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@aptos-labs/script-composer-pack/-/script-composer-pack-0.0.9.tgz", + "integrity": "sha512-Y3kA1rgF65HETgoTn2omDymsgO+fnZouPLrKJZ9sbxTGdOekIIHtGee3A2gk84eCqa02ZKBumZmP+IDCXRtU/g==", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "@aptos-labs/aptos-dynamic-transaction-composer": "^0.1.3" } }, "node_modules/@aptos-labs/ts-sdk": { - "version": "1.31.0", - "resolved": "https://registry.npmjs.org/@aptos-labs/ts-sdk/-/ts-sdk-1.31.0.tgz", - "integrity": "sha512-Y1jdErSMJe+2+Pm8Yrw/+TBJhGO4KX2db944QsTgqJqkbt26aSBVbeRJ7e6y12vAhsQEkTGtMm4n4Lquz2ldiA==", + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@aptos-labs/ts-sdk/-/ts-sdk-1.35.0.tgz", + "integrity": "sha512-ChW2Lvi6lKfEb0AYo0HAa98bYf0+935nMdjl40wFMWsR+mxFhtNA4EYINXsHVTMPfE/WV9sXEvDInvscJFrALQ==", "dependencies": { "@aptos-labs/aptos-cli": "^1.0.2", - "@aptos-labs/aptos-client": "^0.1.1", + "@aptos-labs/aptos-client": "^1.0.0", + "@aptos-labs/script-composer-pack": "^0.0.9", "@noble/curves": "^1.4.0", "@noble/hashes": "^1.4.0", "@scure/bip32": "^1.4.0", @@ -110,7 +115,7 @@ "poseidon-lite": "^0.2.0" }, "engines": { - "node": ">=11.0.0" + "node": ">=20.0.0" } }, "node_modules/@aptos-labs/ts-sdk/node_modules/eventemitter3": { @@ -119,9 +124,9 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "node_modules/@babel/code-frame": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz", - "integrity": "sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", @@ -140,9 +145,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz", + "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -151,9 +156,9 @@ } }, "node_modules/@bloxroute/solana-trader-client-ts": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@bloxroute/solana-trader-client-ts/-/solana-trader-client-ts-2.2.0.tgz", - "integrity": "sha512-FpTb5+j8et2lJ9lTHJvGY9S8dBHG2iv7kETYDMt2ZJirUzjOeQboAogz2RW5RtY/iqvS2JIYkuGf0zsJSGPwcQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@bloxroute/solana-trader-client-ts/-/solana-trader-client-ts-2.2.2.tgz", + "integrity": "sha512-xfBg3JqlwcpKNR9E7tMR7m+JUGz3dvOi87G/4Yf6/Nv9GAvZaDifXzjZTAwdq++aJi6Y8T+mO460zdfFbn3nVQ==", "dependencies": { "@grpc/grpc-js": "^1.10.2", "@pbkit/grpc-client": "^0.0.3", @@ -206,11 +211,6 @@ "base-x": "^3.0.2" } }, - "node_modules/@bloxroute/solana-trader-client-ts/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - }, "node_modules/@bloxroute/solana-trader-client-ts/node_modules/axios": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.2.tgz", @@ -221,143 +221,6 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/@bloxroute/solana-trader-client-ts/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/@bloxroute/solana-trader-client-ts/node_modules/borsh": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", - "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", - "dependencies": { - "bn.js": "^5.2.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" - } - }, - "node_modules/@bloxroute/solana-trader-client-ts/node_modules/borsh/node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/@bloxroute/solana-trader-client-ts/node_modules/buffer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", - "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/@bloxroute/solana-trader-client-ts/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/@bloxroute/solana-trader-client-ts/node_modules/jayson": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.7.0.tgz", - "integrity": "sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ==", - "dependencies": { - "@types/connect": "^3.4.33", - "@types/node": "^12.12.54", - "@types/ws": "^7.4.4", - "commander": "^2.20.3", - "delay": "^5.0.0", - "es6-promisify": "^5.0.0", - "eyes": "^0.1.8", - "isomorphic-ws": "^4.0.1", - "json-stringify-safe": "^5.0.1", - "JSONStream": "^1.3.5", - "lodash": "^4.17.20", - "uuid": "^8.3.2", - "ws": "^7.4.5" - }, - "bin": { - "jayson": "bin/jayson.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@bloxroute/solana-trader-client-ts/node_modules/jayson/node_modules/isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/@bloxroute/solana-trader-client-ts/node_modules/jayson/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@bloxroute/solana-trader-client-ts/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@bloxroute/solana-trader-client-ts/node_modules/superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" - }, - "node_modules/@bloxroute/solana-trader-client-ts/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/@bloxroute/solana-trader-client-ts/node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", @@ -370,20 +233,6 @@ "node": ">=4.2.0" } }, - "node_modules/@bloxroute/solana-trader-client-ts/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/@bloxroute/solana-trader-client-ts/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/@bonfida/sns-records": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@bonfida/sns-records/-/sns-records-0.0.1.tgz", @@ -402,6 +251,29 @@ "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz", "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==" }, + "node_modules/@bonfida/sns-records/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/@bonfida/spl-name-service": { "version": "2.5.4", "resolved": "https://registry.npmjs.org/@bonfida/spl-name-service/-/spl-name-service-2.5.4.tgz", @@ -438,6 +310,34 @@ "@solana/web3.js": "^1.47.4" } }, + "node_modules/@bonfida/spl-name-service/node_modules/borsh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/borsh/-/borsh-2.0.0.tgz", + "integrity": "sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==" + }, + "node_modules/@bonfida/spl-name-service/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/@coral-xyz/anchor": { "version": "0.30.1", "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.30.1.tgz", @@ -471,14 +371,6 @@ "node": ">=10" } }, - "node_modules/@coral-xyz/anchor/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/@coral-xyz/anchor/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -487,6 +379,27 @@ "base-x": "^3.0.2" } }, + "node_modules/@coral-xyz/anchor/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@coral-xyz/anchor/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/@coral-xyz/anchor/node_modules/superstruct": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", + "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==" + }, "node_modules/@coral-xyz/borsh": { "version": "0.30.1", "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.30.1.tgz", @@ -514,9 +427,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -768,6 +681,21 @@ "node": ">=12" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { "version": "0.16.17", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", @@ -784,9 +712,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], @@ -1546,9 +1474,9 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.2.tgz", - "integrity": "sha512-bgxdZmgTrJZX50OjyVwz3+mNEnCTNkh3cIqGPWVNeW9jX6bn1ZkU80uPd+67/ZpIJIjRQ9qaHCjhavyoWYxumg==", + "version": "1.12.6", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.6.tgz", + "integrity": "sha512-JXUj6PI0oqqzTGvKtzOkxtpsyPRNsrmhh41TtIz/zEB6J+AUiZZ0dxWzcMwO9Ns5rmSPuMdghlTbUuqIM48d3Q==", "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" @@ -1588,13 +1516,13 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.1.tgz", - "integrity": "sha512-ehJjmNPdguajc1hStvjN7DJNVjwG5LC1mgGMGFjCmdkn2fxB2GtULftMnlaqNmvMdPpqdaSoOFpl86VkLtG4pQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.2.tgz", + "integrity": "sha512-PL9ixC5YsPXzXhAZFUPmkXGxfgjkdfZdPEPPmt4kFwQ4LBMDG9n/nHXYRGGZSKZJs+d1sGKWgS2GiPzVRKUdtQ==", "dependencies": { - "@inquirer/core": "^10.0.1", - "@inquirer/figures": "^1.0.7", - "@inquirer/type": "^3.0.0", + "@inquirer/core": "^10.1.7", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1603,40 +1531,57 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/confirm": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.1.tgz", - "integrity": "sha512-6ycMm7k7NUApiMGfVc32yIPp28iPKxhGRMqoNDiUjq2RyTAkbs5Fx0TdzBqhabcKvniDdAAvHCmsRjnNfTsogw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", + "integrity": "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==", "dependencies": { - "@inquirer/core": "^10.0.1", - "@inquirer/type": "^3.0.0" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/core": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.0.1.tgz", - "integrity": "sha512-KKTgjViBQUi3AAssqjUFMnMO3CM3qwCHvePV9EW+zTKGKafFGFF01sc1yOIYjLJ7QU52G/FbzKc+c01WLzXmVQ==", + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.7.tgz", + "integrity": "sha512-AA9CQhlrt6ZgiSy6qoAigiA1izOa751ugX6ioSjqgJ+/Gd+tEN/TORk5sUYNjXuHWfW0r1n/a6ak4u/NqHHrtA==", "dependencies": { - "@inquirer/figures": "^1.0.7", - "@inquirer/type": "^3.0.0", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/core/node_modules/wrap-ansi": { @@ -1653,12 +1598,12 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.0.1.tgz", - "integrity": "sha512-qAHHJ6hs343eNtCKgV2wV5CImFxYG8J1pl/YCeI5w9VoW7QpulRUU26+4NsMhjR6zDRjKBsH/rRjCIcaAOHsrg==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.7.tgz", + "integrity": "sha512-gktCSQtnSZHaBytkJKMKEuswSk2cDBuXX5rxGFv306mwHfBPjg5UAldw9zWGoEyvA9KpRDkeM4jfrx0rXn0GyA==", "dependencies": { - "@inquirer/core": "^10.0.1", - "@inquirer/type": "^3.0.0", + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", "external-editor": "^3.1.0" }, "engines": { @@ -1666,15 +1611,20 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/expand": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.1.tgz", - "integrity": "sha512-9anjpdc802YInXekwePsa5LWySzVMHbhVS6v6n5IJxrl8w09mODOeP69wZ1d0WrOvot2buQSmYp4lW/pq8y+zQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.9.tgz", + "integrity": "sha512-Xxt6nhomWTAmuSX61kVgglLjMEFGa+7+F6UUtdEUeg7fg4r9vaFttUUKrtkViYYrQBA5Ia1tkOJj2koP9BuLig==", "dependencies": { - "@inquirer/core": "^10.0.1", - "@inquirer/type": "^3.0.0", + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1682,53 +1632,68 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/figures": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.7.tgz", - "integrity": "sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", + "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", "engines": { "node": ">=18" } }, "node_modules/@inquirer/input": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.0.1.tgz", - "integrity": "sha512-m+SliZ2m43cDRIpAdQxfv5QOeAQCuhS8TGLvtzEP1An4IH1kBES4RLMRgE/fC+z29aN8qYG8Tq/eXQQKTYwqAg==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.6.tgz", + "integrity": "sha512-1f5AIsZuVjPT4ecA8AwaxDFNHny/tSershP/cTvTDxLdiIGTeILNcKozB0LaYt6mojJLUbOYhpIxicaYf7UKIQ==", "dependencies": { - "@inquirer/core": "^10.0.1", - "@inquirer/type": "^3.0.0" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/number": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.1.tgz", - "integrity": "sha512-gF3erqfm0snpwBjbyKXUUe17QJ7ebm49btXApajrM0rgCCoYX0o9W5NCuYNae87iPxaIJVjtuoQ42DX32IdbMA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.9.tgz", + "integrity": "sha512-iN2xZvH3tyIYXLXBvlVh0npk1q/aVuKXZo5hj+K3W3D4ngAEq/DkLpofRzx6oebTUhBvOgryZ+rMV0yImKnG3w==", "dependencies": { - "@inquirer/core": "^10.0.1", - "@inquirer/type": "^3.0.0" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/password": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.1.tgz", - "integrity": "sha512-D7zUuX4l4ZpL3D7/SWu9ibijP09jigwHi/gfUHLx5GMS5oXzuMfPV2xPMG1tskco4enTx70HA0VtMXecerpvbg==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.9.tgz", + "integrity": "sha512-xBEoOw1XKb0rIN208YU7wM7oJEHhIYkfG7LpTJAEW913GZeaoQerzf5U/LSHI45EVvjAdgNXmXgH51cUXKZcJQ==", "dependencies": { - "@inquirer/core": "^10.0.1", - "@inquirer/type": "^3.0.0", + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2" }, "engines": { @@ -1736,38 +1701,48 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/prompts": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.0.1.tgz", - "integrity": "sha512-cu2CpGC2hz7WTt2VBvdkzahDvYice6vYA/8Dm7Fy3tRNzKuQTF2EY3CV4H2GamveWE6tA2XzyXtbWX8+t4WMQg==", - "dependencies": { - "@inquirer/checkbox": "^4.0.1", - "@inquirer/confirm": "^5.0.1", - "@inquirer/editor": "^4.0.1", - "@inquirer/expand": "^4.0.1", - "@inquirer/input": "^4.0.1", - "@inquirer/number": "^3.0.1", - "@inquirer/password": "^4.0.1", - "@inquirer/rawlist": "^4.0.1", - "@inquirer/search": "^3.0.1", - "@inquirer/select": "^4.0.1" + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", + "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", + "dependencies": { + "@inquirer/checkbox": "^4.1.2", + "@inquirer/confirm": "^5.1.6", + "@inquirer/editor": "^4.2.7", + "@inquirer/expand": "^4.0.9", + "@inquirer/input": "^4.1.6", + "@inquirer/number": "^3.0.9", + "@inquirer/password": "^4.0.9", + "@inquirer/rawlist": "^4.0.9", + "@inquirer/search": "^3.0.9", + "@inquirer/select": "^4.0.9" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.1.tgz", - "integrity": "sha512-0LuMOgaWs7W8JNcbiKkoFwyWFDEeCmLqDCygF0hidQUVa6J5grFVRZxrpompiWDFM49Km2rf7WoZwRo1uf1yWQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.9.tgz", + "integrity": "sha512-+5t6ebehKqgoxV8fXwE49HkSF2Rc9ijNiVGEQZwvbMI61/Q5RcD+jWD6Gs1tKdz5lkI8GRBL31iO0HjGK1bv+A==", "dependencies": { - "@inquirer/core": "^10.0.1", - "@inquirer/type": "^3.0.0", + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1775,16 +1750,21 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/search": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.1.tgz", - "integrity": "sha512-ehMqjiO0pAf+KtdONKeCLVy4i3fy3feyRRhDrvzWhiwB8JccgKn7eHFr39l+Nx/FaZAhr0YxIJvkK5NuNvG+Ww==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.9.tgz", + "integrity": "sha512-DWmKztkYo9CvldGBaRMr0ETUHgR86zE6sPDVOHsqz4ISe9o1LuiWfgJk+2r75acFclA93J/lqzhT0dTjCzHuoA==", "dependencies": { - "@inquirer/core": "^10.0.1", - "@inquirer/figures": "^1.0.7", - "@inquirer/type": "^3.0.0", + "@inquirer/core": "^10.1.7", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1792,16 +1772,21 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/select": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.1.tgz", - "integrity": "sha512-tVRatFRGU49bxFCKi/3P+C0E13KZduNFbWuHWRx0L2+jbiyKRpXgHp9qiRHWRk/KarhYBXzH/di6w3VQ5aJd5w==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.9.tgz", + "integrity": "sha512-BpJyJe7Dkhv2kz7yG7bPSbJLQuu/rqyNlF1CfiiFeFwouegfH+zh13KDyt6+d9DwucKo7hqM3wKLLyJxZMO+Xg==", "dependencies": { - "@inquirer/core": "^10.0.1", - "@inquirer/figures": "^1.0.7", - "@inquirer/type": "^3.0.0", + "@inquirer/core": "^10.1.7", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1810,17 +1795,27 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.0.tgz", - "integrity": "sha512-YYykfbw/lefC7yKj7nanzQXILM7r3suIvyFlCcMskc99axmsSewXWkAfXKwMbgxL76iAFVmRwmYdwNZNc8gjog==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@irys/arweave": { @@ -1888,6 +1883,40 @@ "node": ">=16.10.0" } }, + "node_modules/@irys/sdk/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@irys/sdk/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@irys/sdk/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "engines": { + "node": ">= 10" + } + }, "node_modules/@irys/sdk/node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -1896,6 +1925,137 @@ "node": ">= 12" } }, + "node_modules/@irys/sdk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@irys/sdk/node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@irys/sdk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@irys/sdk/node_modules/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@irys/sdk/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@irys/sdk/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/@irys/sdk/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@irys/sdk/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@irys/sdk/node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@irys/sdk/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/@irys/sdk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@irys/sdk/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1986,9 +2146,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2117,14 +2277,6 @@ "@solana/web3.js": "^1.88.0" } }, - "node_modules/@lightprotocol/compressed-token/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/@lightprotocol/compressed-token/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -2133,27 +2285,71 @@ "base-x": "^3.0.2" } }, - "node_modules/@lightprotocol/hasher.rs": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@lightprotocol/hasher.rs/-/hasher.rs-0.2.0.tgz", - "integrity": "sha512-ttKBiKNmq0xJbKzT02r7KJH9Pmigu/8C2LJFCsz0aQNh6Xh3nH2by6RwxHTImE/N4UyAVb6ii0zAJl0DnZo/0w==" - }, - "node_modules/@lightprotocol/stateless.js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@lightprotocol/stateless.js/-/stateless.js-0.4.4.tgz", - "integrity": "sha512-FmnbH62G9BDtIwz3RF/j+dJsWy/dRRUJZ+AE2W6GsTzzebx6qkR8YvHh6spuEBFJSrJT9C2aHHVJ4uaxRcGeMg==", + "node_modules/@lightprotocol/compressed-token/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "@coral-xyz/anchor": "0.29.0", - "@noble/hashes": "^1.3.2", - "buffer": "^6.0.3", - "superstruct": "^1.0.3", - "tweetnacl": "^1.0.3" - }, - "peerDependencies": { - "@solana/web3.js": "^1.91.8" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/@lightprotocol/stateless.js/node_modules/@coral-xyz/anchor": { + "node_modules/@lightprotocol/compressed-token/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@lightprotocol/compressed-token/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/@lightprotocol/compressed-token/node_modules/superstruct": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", + "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==" + }, + "node_modules/@lightprotocol/hasher.rs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@lightprotocol/hasher.rs/-/hasher.rs-0.2.0.tgz", + "integrity": "sha512-ttKBiKNmq0xJbKzT02r7KJH9Pmigu/8C2LJFCsz0aQNh6Xh3nH2by6RwxHTImE/N4UyAVb6ii0zAJl0DnZo/0w==" + }, + "node_modules/@lightprotocol/stateless.js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@lightprotocol/stateless.js/-/stateless.js-0.4.4.tgz", + "integrity": "sha512-FmnbH62G9BDtIwz3RF/j+dJsWy/dRRUJZ+AE2W6GsTzzebx6qkR8YvHh6spuEBFJSrJT9C2aHHVJ4uaxRcGeMg==", + "dependencies": { + "@coral-xyz/anchor": "0.29.0", + "@noble/hashes": "^1.3.2", + "buffer": "^6.0.3", + "superstruct": "^1.0.3", + "tweetnacl": "^1.0.3" + }, + "peerDependencies": { + "@solana/web3.js": "^1.91.8" + } + }, + "node_modules/@lightprotocol/stateless.js/node_modules/@coral-xyz/anchor": { "version": "0.29.0", "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", @@ -2197,14 +2393,6 @@ "@solana/web3.js": "^1.68.0" } }, - "node_modules/@lightprotocol/stateless.js/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/@lightprotocol/stateless.js/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -2213,6 +2401,45 @@ "base-x": "^3.0.2" } }, + "node_modules/@lightprotocol/stateless.js/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@lightprotocol/stateless.js/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@lightprotocol/stateless.js/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, "node_modules/@lightprotocol/stateless.js/node_modules/superstruct": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", @@ -2298,14 +2525,6 @@ "@solana/web3.js": "^1.68.0" } }, - "node_modules/@lightprotocol/zk-compression-cli/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/@lightprotocol/zk-compression-cli/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -2314,22 +2533,82 @@ "base-x": "^3.0.2" } }, + "node_modules/@lightprotocol/zk-compression-cli/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@lightprotocol/zk-compression-cli/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/@lightprotocol/zk-compression-cli/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/@lightprotocol/zk-compression-cli/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/@lightprotocol/zk-compression-cli/node_modules/superstruct": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", + "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==" + }, + "node_modules/@lightprotocol/zk-compression-cli/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, "node_modules/@mercurial-finance/dynamic-amm-sdk": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@mercurial-finance/dynamic-amm-sdk/-/dynamic-amm-sdk-1.1.7.tgz", - "integrity": "sha512-Fk97eWTgkn6WVfPMnRJlJE4lH4f1w72RLzqkvafj/cORYnyNuhI0x5hbIawdm/nUez6vpvf8IygX8IX+ppHNTA==", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@mercurial-finance/dynamic-amm-sdk/-/dynamic-amm-sdk-1.1.23.tgz", + "integrity": "sha512-bI1X+785iqGiys5iLbuI6G1oGSP5crE1Taw2HEFIhKGbEssi6nRHVI9F6YyZbKq00PKKi8DjFoVAwN7J3RNmPg==", "dependencies": { "@coral-xyz/anchor": "^0.28.0", "@coral-xyz/borsh": "^0.28.0", "@mercurial-finance/token-math": "6.0.0", "@mercurial-finance/vault-sdk": "2.2.0", "@metaplex-foundation/mpl-token-metadata": "~2.13.0", - "@meteora-ag/stake-for-fee": "1.0.12", + "@meteora-ag/m3m3": "1.0.4", "@project-serum/anchor": "^0.24.2", "@solana/buffer-layout": "^3 || ^4", "@solana/spl-token": "^0.4.6", "@solana/spl-token-registry": "^0.2.4574", - "@solana/web3.js": "^1.95.4", + "@solana/web3.js": "^1.95.8", "bn-sqrt": "^1.0.0", "bn.js": "5.2.1", "decimal.js": "^10.4.1", @@ -2380,25 +2659,6 @@ "@solana/web3.js": "^1.68.0" } }, - "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/@metaplex-foundation/beet-solana": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet-solana/-/beet-solana-0.4.1.tgz", - "integrity": "sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==", - "dependencies": { - "@metaplex-foundation/beet": ">=0.1.0", - "@solana/web3.js": "^1.56.2", - "bs58": "^5.0.0", - "debug": "^4.3.4" - } - }, - "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/@metaplex-foundation/beet-solana/node_modules/bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", - "dependencies": { - "base-x": "^4.0.0" - } - }, "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/@metaplex-foundation/mpl-token-metadata": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/@metaplex-foundation/mpl-token-metadata/-/mpl-token-metadata-2.13.0.tgz", @@ -2470,14 +2730,50 @@ "base-x": "^3.0.2" } }, - "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/bs58/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "safe-buffer": "^5.0.1" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/@mercurial-finance/dynamic-amm-sdk/node_modules/superstruct": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", + "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==" + }, "node_modules/@mercurial-finance/token-math": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@mercurial-finance/token-math/-/token-math-6.0.0.tgz", @@ -2548,14 +2844,6 @@ "@solana/web3.js": "^1.68.0" } }, - "node_modules/@mercurial-finance/vault-sdk/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/@mercurial-finance/vault-sdk/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -2564,25 +2852,47 @@ "base-x": "^3.0.2" } }, + "node_modules/@mercurial-finance/vault-sdk/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@mercurial-finance/vault-sdk/node_modules/decimal.js": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" }, + "node_modules/@mercurial-finance/vault-sdk/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/@mercurial-finance/vault-sdk/node_modules/superstruct": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", + "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==" + }, "node_modules/@metaplex-foundation/beet": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet/-/beet-0.7.1.tgz", - "integrity": "sha512-hNCEnS2WyCiYyko82rwuISsBY3KYpe828ubsd2ckeqZr7tl0WVLivGkoyA/qdiaaHEBGdGl71OpfWa2rqL3DiA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet/-/beet-0.7.2.tgz", + "integrity": "sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==", "dependencies": { "ansicolors": "^0.3.2", + "assert": "^2.1.0", "bn.js": "^5.2.0", "debug": "^4.3.3" } }, "node_modules/@metaplex-foundation/beet-solana": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet-solana/-/beet-solana-0.3.1.tgz", - "integrity": "sha512-tgyEl6dvtLln8XX81JyBvWjIiEcjTkUwZbrM5dIobTmoqMuGewSyk9CClno8qsMsFdB5T3jC91Rjeqmu/6xk2g==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet-solana/-/beet-solana-0.4.1.tgz", + "integrity": "sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==", "dependencies": { "@metaplex-foundation/beet": ">=0.1.0", "@solana/web3.js": "^1.56.2", @@ -2679,15 +2989,14 @@ "node": ">=16.10.0" } }, - "node_modules/@metaplex-foundation/js/node_modules/@metaplex-foundation/beet-solana": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet-solana/-/beet-solana-0.4.1.tgz", - "integrity": "sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==", + "node_modules/@metaplex-foundation/js/node_modules/@metaplex-foundation/beet": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet/-/beet-0.7.1.tgz", + "integrity": "sha512-hNCEnS2WyCiYyko82rwuISsBY3KYpe828ubsd2ckeqZr7tl0WVLivGkoyA/qdiaaHEBGdGl71OpfWa2rqL3DiA==", "dependencies": { - "@metaplex-foundation/beet": ">=0.1.0", - "@solana/web3.js": "^1.56.2", - "bs58": "^5.0.0", - "debug": "^4.3.4" + "ansicolors": "^0.3.2", + "bn.js": "^5.2.0", + "debug": "^4.3.3" } }, "node_modules/@metaplex-foundation/js/node_modules/@metaplex-foundation/mpl-candy-machine": { @@ -2767,14 +3076,63 @@ "base-x": "^3.0.2" } }, - "node_modules/@metaplex-foundation/js/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, + "node_modules/@metaplex-foundation/js/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@metaplex-foundation/js/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@metaplex-foundation/js/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@metaplex-foundation/js/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "engines": { + "node": ">= 10" + } + }, "node_modules/@metaplex-foundation/js/node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -2783,42 +3141,135 @@ "node": ">= 12" } }, - "node_modules/@metaplex-foundation/js/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/@metaplex-foundation/js/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@metaplex-foundation/js/node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dependencies": { - "whatwg-url": "^5.0.0" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": "4.x || >=6.0.0" + "node": ">=8" }, - "peerDependencies": { - "encoding": "^0.1.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@metaplex-foundation/js/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@metaplex-foundation/js/node_modules/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "engines": { + "node": ">=12.0.0" } }, - "node_modules/@metaplex-foundation/js/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "node_modules/@metaplex-foundation/js/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } }, - "node_modules/@metaplex-foundation/js/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "node_modules/@metaplex-foundation/js/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, - "node_modules/@metaplex-foundation/js/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "node_modules/@metaplex-foundation/js/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@metaplex-foundation/js/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@metaplex-foundation/js/node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@metaplex-foundation/js/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/@metaplex-foundation/js/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@metaplex-foundation/js/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@metaplex-foundation/mpl-auction-house": { @@ -2844,6 +3295,17 @@ "debug": "^4.3.3" } }, + "node_modules/@metaplex-foundation/mpl-auction-house/node_modules/@metaplex-foundation/beet-solana": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet-solana/-/beet-solana-0.3.1.tgz", + "integrity": "sha512-tgyEl6dvtLln8XX81JyBvWjIiEcjTkUwZbrM5dIobTmoqMuGewSyk9CClno8qsMsFdB5T3jC91Rjeqmu/6xk2g==", + "dependencies": { + "@metaplex-foundation/beet": ">=0.1.0", + "@solana/web3.js": "^1.56.2", + "bs58": "^5.0.0", + "debug": "^4.3.4" + } + }, "node_modules/@metaplex-foundation/mpl-auction-house/node_modules/@solana/spl-token": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.11.tgz", @@ -2861,6 +3323,29 @@ "@solana/web3.js": "^1.88.0" } }, + "node_modules/@metaplex-foundation/mpl-auction-house/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/@metaplex-foundation/mpl-bubblegum": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/@metaplex-foundation/mpl-bubblegum/-/mpl-bubblegum-0.6.2.tgz", @@ -2877,6 +3362,16 @@ "js-sha3": "^0.8.0" } }, + "node_modules/@metaplex-foundation/mpl-bubblegum/node_modules/@metaplex-foundation/beet": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet/-/beet-0.7.1.tgz", + "integrity": "sha512-hNCEnS2WyCiYyko82rwuISsBY3KYpe828ubsd2ckeqZr7tl0WVLivGkoyA/qdiaaHEBGdGl71OpfWa2rqL3DiA==", + "dependencies": { + "ansicolors": "^0.3.2", + "bn.js": "^5.2.0", + "debug": "^4.3.3" + } + }, "node_modules/@metaplex-foundation/mpl-bubblegum/node_modules/@metaplex-foundation/beet-solana": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet-solana/-/beet-solana-0.4.0.tgz", @@ -2935,6 +3430,29 @@ "node": ">= 10" } }, + "node_modules/@metaplex-foundation/mpl-bubblegum/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/@metaplex-foundation/mpl-bubblegum/node_modules/dotenv": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", @@ -2965,18 +3483,29 @@ "debug": "^4.3.3" } }, - "node_modules/@metaplex-foundation/mpl-candy-machine": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/mpl-candy-machine/-/mpl-candy-machine-6.0.1.tgz", - "integrity": "sha512-ODm7JWQBPg7w4DXEkLejgLtMqfjxMcQkH+GSMgq9i0KyGd0asD2PVOQoL4QMorNQ4E1pIPAdc31Td57qxG059g==", + "node_modules/@metaplex-foundation/mpl-candy-guard/node_modules/@metaplex-foundation/beet-solana": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet-solana/-/beet-solana-0.3.1.tgz", + "integrity": "sha512-tgyEl6dvtLln8XX81JyBvWjIiEcjTkUwZbrM5dIobTmoqMuGewSyk9CClno8qsMsFdB5T3jC91Rjeqmu/6xk2g==", "dependencies": { - "@metaplex-foundation/mpl-token-metadata": "3.0.0-alpha.27", - "@metaplex-foundation/mpl-toolbox": "^0.9.0", - "@noble/hashes": "^1.2.0", - "merkletreejs": "^0.3.9" - }, - "peerDependencies": { - "@metaplex-foundation/umi": ">= 0.8.2 < 1" + "@metaplex-foundation/beet": ">=0.1.0", + "@solana/web3.js": "^1.56.2", + "bs58": "^5.0.0", + "debug": "^4.3.4" + } + }, + "node_modules/@metaplex-foundation/mpl-candy-machine": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/mpl-candy-machine/-/mpl-candy-machine-6.1.0.tgz", + "integrity": "sha512-Y58wVkK9kU3ur22xnmYG/IOzJfo450dlUMl8FSuSRThV82IJte11ggtw5fEWIQQO/jhLWsjlkRHn4vd5RGmeGg==", + "dependencies": { + "@metaplex-foundation/mpl-token-metadata": "3.0.0-alpha.27", + "@metaplex-foundation/mpl-toolbox": "0.10.0", + "@noble/hashes": "^1.2.0", + "merkletreejs": "^0.3.9" + }, + "peerDependencies": { + "@metaplex-foundation/umi": ">= 0.8.2 <= 1" } }, "node_modules/@metaplex-foundation/mpl-candy-machine-core": { @@ -3001,6 +3530,17 @@ "debug": "^4.3.3" } }, + "node_modules/@metaplex-foundation/mpl-candy-machine-core/node_modules/@metaplex-foundation/beet-solana": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet-solana/-/beet-solana-0.3.1.tgz", + "integrity": "sha512-tgyEl6dvtLln8XX81JyBvWjIiEcjTkUwZbrM5dIobTmoqMuGewSyk9CClno8qsMsFdB5T3jC91Rjeqmu/6xk2g==", + "dependencies": { + "@metaplex-foundation/beet": ">=0.1.0", + "@solana/web3.js": "^1.56.2", + "bs58": "^5.0.0", + "debug": "^4.3.4" + } + }, "node_modules/@metaplex-foundation/mpl-candy-machine/node_modules/@metaplex-foundation/mpl-token-metadata": { "version": "3.0.0-alpha.27", "resolved": "https://registry.npmjs.org/@metaplex-foundation/mpl-token-metadata/-/mpl-token-metadata-3.0.0-alpha.27.tgz", @@ -3012,23 +3552,31 @@ "@metaplex-foundation/umi": "^0.8.2" } }, + "node_modules/@metaplex-foundation/mpl-candy-machine/node_modules/@metaplex-foundation/mpl-token-metadata/node_modules/@metaplex-foundation/mpl-toolbox": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/mpl-toolbox/-/mpl-toolbox-0.9.4.tgz", + "integrity": "sha512-fd6JxfoLbj/MM8FG2x91KYVy1U6AjBQw4qjt7+Da3trzQaWnSaYHDcYRG/53xqfvZ9qofY1T2t53GXPlD87lnQ==", + "peerDependencies": { + "@metaplex-foundation/umi": ">= 0.8.2 < 1" + } + }, "node_modules/@metaplex-foundation/mpl-token-metadata": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/mpl-token-metadata/-/mpl-token-metadata-3.2.1.tgz", - "integrity": "sha512-26W1NhQwDWmLOg/pBRYut7x/vEs/5kFS2sWVEY5/X0f2jJOLhnd4NaZQcq+5u+XZsXvm1jq2AtrRGPNK43oqWQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/mpl-token-metadata/-/mpl-token-metadata-3.4.0.tgz", + "integrity": "sha512-AxBAYCK73JWxY3g9//z/C9krkR0t1orXZDknUPS4+GjwGH2vgPfsk04yfZ31Htka2AdS9YE/3wH7sMUBHKn9Rg==", "dependencies": { - "@metaplex-foundation/mpl-toolbox": "^0.9.4" + "@metaplex-foundation/mpl-toolbox": "^0.10.0" }, "peerDependencies": { - "@metaplex-foundation/umi": ">= 0.8.2 < 1" + "@metaplex-foundation/umi": ">= 0.8.2 <= 1" } }, "node_modules/@metaplex-foundation/mpl-toolbox": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/mpl-toolbox/-/mpl-toolbox-0.9.4.tgz", - "integrity": "sha512-fd6JxfoLbj/MM8FG2x91KYVy1U6AjBQw4qjt7+Da3trzQaWnSaYHDcYRG/53xqfvZ9qofY1T2t53GXPlD87lnQ==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@metaplex-foundation/mpl-toolbox/-/mpl-toolbox-0.10.0.tgz", + "integrity": "sha512-84KD1L5cFyw5xnntHwL4uPwfcrkKSiwuDeypiVr92qCUFuF3ZENa2zlFVPu+pQcjTlod2LmEX3MhBmNjRMpdKg==", "peerDependencies": { - "@metaplex-foundation/umi": ">= 0.8.2 < 1" + "@metaplex-foundation/umi": ">= 0.8.2 <= 1" } }, "node_modules/@metaplex-foundation/umi": { @@ -3092,44 +3640,6 @@ "@metaplex-foundation/umi": "^0.9.2" } }, - "node_modules/@metaplex-foundation/umi-http-fetch/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@metaplex-foundation/umi-http-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/@metaplex-foundation/umi-http-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/@metaplex-foundation/umi-http-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/@metaplex-foundation/umi-options": { "version": "0.8.9", "resolved": "https://registry.npmjs.org/@metaplex-foundation/umi-options/-/umi-options-0.8.9.tgz", @@ -3236,10 +3746,33 @@ "@solana/web3.js": "^1.72.0" } }, + "node_modules/@metaplex-foundation/umi-web3js-adapters/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/@meteora-ag/dlmm": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@meteora-ag/dlmm/-/dlmm-1.2.3.tgz", - "integrity": "sha512-V6Nund7IAQ4/6tNKQU+sKeKsvzRJrEtCTm3x20q+By7YkMIKmEILffGCQMTQBozkIl0BaUidkYpE1v04KihrAw==", + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/@meteora-ag/dlmm/-/dlmm-1.3.12.tgz", + "integrity": "sha512-uoBjrl8yLVqKmpdcoC9Jj6Zg5mmo/2CeDEsWFrk6OiAoQ6g1+WBnr8lX/RWxXZ6r18YeP+QAKQbo1Tjf3HU0Cg==", "dependencies": { "@coral-xyz/anchor": "^0.28.0", "@coral-xyz/borsh": "^0.28.0", @@ -3292,14 +3825,6 @@ "@solana/web3.js": "^1.68.0" } }, - "node_modules/@meteora-ag/dlmm/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/@meteora-ag/dlmm/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -3308,20 +3833,42 @@ "base-x": "^3.0.2" } }, - "node_modules/@meteora-ag/stake-for-fee": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@meteora-ag/stake-for-fee/-/stake-for-fee-1.0.12.tgz", - "integrity": "sha512-LRRwKe2g+S4rIrksEqonREIgmnBY22/xGDKOkgZTXhHPF0ON/DWwThUMmhay2scI9D8YypzHQHDYmfjLjoc/7A==", + "node_modules/@meteora-ag/dlmm/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@meteora-ag/dlmm/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/@meteora-ag/dlmm/node_modules/superstruct": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", + "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==" + }, + "node_modules/@meteora-ag/m3m3": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@meteora-ag/m3m3/-/m3m3-1.0.4.tgz", + "integrity": "sha512-tjNsQ7qCE9LAyZ8TpyNsg8kOiaarAQ91ckAGObKO/gcDkUfm5m/qrDo3qypN9aCAcFnNmvsuJecrJnLhRGq33g==", "dependencies": { "@coral-xyz/anchor": "0.28.0", "@coral-xyz/borsh": "^0.30.1", + "@solana-developers/helpers": "^2.5.6", "@solana/spl-token": "^0.4.8", - "@solana/web3.js": "^1.95.3", + "@solana/web3.js": "^1.95.5", "bn.js": "^5.2.1", "decimal.js": "^10.4.3" } }, - "node_modules/@meteora-ag/stake-for-fee/node_modules/@coral-xyz/anchor": { + "node_modules/@meteora-ag/m3m3/node_modules/@coral-xyz/anchor": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.28.0.tgz", "integrity": "sha512-kQ02Hv2ZqxtWP30WN1d4xxT4QqlOXYDxmEd3k/bbneqhV3X5QMO4LAtoUFs7otxyivOgoqam5Il5qx81FuI4vw==", @@ -3346,7 +3893,7 @@ "node": ">=11" } }, - "node_modules/@meteora-ag/stake-for-fee/node_modules/@coral-xyz/anchor/node_modules/@coral-xyz/borsh": { + "node_modules/@meteora-ag/m3m3/node_modules/@coral-xyz/anchor/node_modules/@coral-xyz/borsh": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.28.0.tgz", "integrity": "sha512-/u1VTzw7XooK7rqeD7JLUSwOyRSesPUk0U37BV9zK0axJc1q0nRbKFGFLYCQ16OtdOJTTwGfGp11Lx9B45bRCQ==", @@ -3361,15 +3908,45 @@ "@solana/web3.js": "^1.68.0" } }, - "node_modules/@meteora-ag/stake-for-fee/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "node_modules/@meteora-ag/m3m3/node_modules/@solana-developers/helpers": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@solana-developers/helpers/-/helpers-2.7.0.tgz", + "integrity": "sha512-b00myc4LkKgdJarAk6ILAMQ4IDd+ixNua71GDCejoOie+SkL1cTedyBLQw0h6OJqA2NgigQRKM+apEop9ozXQw==", "dependencies": { - "safe-buffer": "^5.0.1" + "@coral-xyz/anchor": "^0.30.1", + "@solana/spl-token": "^0.4.8", + "@solana/spl-token-metadata": "^0.1.4", + "@solana/web3.js": "^1.98.0", + "bs58": "^6.0.0", + "dotenv": "^16.4.5" + } + }, + "node_modules/@meteora-ag/m3m3/node_modules/@solana-developers/helpers/node_modules/@coral-xyz/anchor": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.30.1.tgz", + "integrity": "sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ==", + "dependencies": { + "@coral-xyz/anchor-errors": "^0.30.1", + "@coral-xyz/borsh": "^0.30.1", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" } }, - "node_modules/@meteora-ag/stake-for-fee/node_modules/bs58": { + "node_modules/@meteora-ag/m3m3/node_modules/@solana-developers/helpers/node_modules/@coral-xyz/anchor/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", @@ -3377,36 +3954,20 @@ "base-x": "^3.0.2" } }, - "node_modules/@near-js/crypto": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@near-js/crypto/-/crypto-0.0.3.tgz", - "integrity": "sha512-3WC2A1a1cH8Cqrx+0iDjp1ASEEhxN/KHEMENYb0KZH6Hp5bXIY7Akt4quC7JlgJS5ESvEiLa40tS5h0zAhBWGw==", - "dependencies": { - "@near-js/types": "0.0.3", - "bn.js": "5.2.1", - "borsh": "^0.7.0", - "tweetnacl": "^1.0.1" - } - }, - "node_modules/@near-js/crypto/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "node_modules/@meteora-ag/m3m3/node_modules/@solana-developers/helpers/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", "dependencies": { - "safe-buffer": "^5.0.1" + "base-x": "^5.0.0" } }, - "node_modules/@near-js/crypto/node_modules/borsh": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", - "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", - "dependencies": { - "bn.js": "^5.2.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" - } + "node_modules/@meteora-ag/m3m3/node_modules/@solana-developers/helpers/node_modules/bs58/node_modules/base-x": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.0.tgz", + "integrity": "sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==" }, - "node_modules/@near-js/crypto/node_modules/bs58": { + "node_modules/@meteora-ag/m3m3/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", @@ -3414,6 +3975,38 @@ "base-x": "^3.0.2" } }, + "node_modules/@meteora-ag/m3m3/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@meteora-ag/m3m3/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/@meteora-ag/m3m3/node_modules/superstruct": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", + "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==" + }, + "node_modules/@near-js/crypto": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@near-js/crypto/-/crypto-0.0.3.tgz", + "integrity": "sha512-3WC2A1a1cH8Cqrx+0iDjp1ASEEhxN/KHEMENYb0KZH6Hp5bXIY7Akt4quC7JlgJS5ESvEiLa40tS5h0zAhBWGw==", + "dependencies": { + "@near-js/types": "0.0.3", + "bn.js": "5.2.1", + "borsh": "^0.7.0", + "tweetnacl": "^1.0.1" + } + }, "node_modules/@near-js/keystores": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@near-js/keystores/-/keystores-0.0.3.tgz", @@ -3448,16 +4041,6 @@ "node-fetch": "^2.6.1" } }, - "node_modules/@near-js/providers/node_modules/@near-js/signers": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@near-js/signers/-/signers-0.0.3.tgz", - "integrity": "sha512-u1R+DDIua5PY1PDFnpVYqdMgQ7c4dyeZsfqMjE7CtgzdqupgTYCXzJjBubqMlAyAx843PoXmLt6CSSKcMm0WUA==", - "dependencies": { - "@near-js/crypto": "0.0.3", - "@near-js/keystores": "0.0.3", - "js-sha256": "^0.9.0" - } - }, "node_modules/@near-js/providers/node_modules/@near-js/transactions": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@near-js/transactions/-/transactions-0.1.0.tgz", @@ -3472,88 +4055,34 @@ "js-sha256": "^0.9.0" } }, - "node_modules/@near-js/providers/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "node_modules/@near-js/signers": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@near-js/signers/-/signers-0.0.3.tgz", + "integrity": "sha512-u1R+DDIua5PY1PDFnpVYqdMgQ7c4dyeZsfqMjE7CtgzdqupgTYCXzJjBubqMlAyAx843PoXmLt6CSSKcMm0WUA==", "dependencies": { - "safe-buffer": "^5.0.1" + "@near-js/crypto": "0.0.3", + "@near-js/keystores": "0.0.3", + "js-sha256": "^0.9.0" } }, - "node_modules/@near-js/providers/node_modules/borsh": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", - "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", + "node_modules/@near-js/transactions": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@near-js/transactions/-/transactions-0.1.1.tgz", + "integrity": "sha512-Fk83oLLFK7nz4thawpdv9bGyMVQ2i48iUtZEVYhuuuqevl17tSXMlhle9Me1ZbNyguJG/cWPdNybe1UMKpyGxA==", "dependencies": { - "bn.js": "^5.2.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" + "@near-js/crypto": "0.0.4", + "@near-js/signers": "0.0.4", + "@near-js/types": "0.0.4", + "@near-js/utils": "0.0.4", + "bn.js": "5.2.1", + "borsh": "^0.7.0", + "js-sha256": "^0.9.0" } }, - "node_modules/@near-js/providers/node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/@near-js/providers/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "optional": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@near-js/providers/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "optional": true - }, - "node_modules/@near-js/providers/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "optional": true - }, - "node_modules/@near-js/providers/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "optional": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/@near-js/signers": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@near-js/signers/-/signers-0.0.4.tgz", - "integrity": "sha512-xCglo3U/WIGsz/izPGFMegS5Q3PxOHYB8a1E7RtVhNm5QdqTlQldLCm/BuMg2G/u1l1ZZ0wdvkqRTG9joauf3Q==", - "dependencies": { - "@near-js/crypto": "0.0.4", - "@near-js/keystores": "0.0.4", - "js-sha256": "^0.9.0" - } - }, - "node_modules/@near-js/signers/node_modules/@near-js/crypto": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@near-js/crypto/-/crypto-0.0.4.tgz", - "integrity": "sha512-2mSIVv6mZway1rQvmkktrXAFoUvy7POjrHNH3LekKZCMCs7qMM/23Hz2+APgxZPqoV2kjarSNOEYJjxO7zQ/rQ==", + "node_modules/@near-js/transactions/node_modules/@near-js/crypto": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@near-js/crypto/-/crypto-0.0.4.tgz", + "integrity": "sha512-2mSIVv6mZway1rQvmkktrXAFoUvy7POjrHNH3LekKZCMCs7qMM/23Hz2+APgxZPqoV2kjarSNOEYJjxO7zQ/rQ==", "dependencies": { "@near-js/types": "0.0.4", "bn.js": "5.2.1", @@ -3561,7 +4090,7 @@ "tweetnacl": "^1.0.1" } }, - "node_modules/@near-js/signers/node_modules/@near-js/keystores": { + "node_modules/@near-js/transactions/node_modules/@near-js/keystores": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/@near-js/keystores/-/keystores-0.0.4.tgz", "integrity": "sha512-+vKafmDpQGrz5py1liot2hYSjPGXwihveeN+BL11aJlLqZnWBgYJUWCXG+uyGjGXZORuy2hzkKK6Hi+lbKOfVA==", @@ -3570,65 +4099,16 @@ "@near-js/types": "0.0.4" } }, - "node_modules/@near-js/signers/node_modules/@near-js/types": { + "node_modules/@near-js/transactions/node_modules/@near-js/signers": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@near-js/types/-/types-0.0.4.tgz", - "integrity": "sha512-8TTMbLMnmyG06R5YKWuS/qFG1tOA3/9lX4NgBqQPsvaWmDsa+D+QwOkrEHDegped0ZHQwcjAXjKML1S1TyGYKg==", - "dependencies": { - "bn.js": "5.2.1" - } - }, - "node_modules/@near-js/signers/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/@near-js/signers/node_modules/borsh": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", - "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", - "dependencies": { - "bn.js": "^5.2.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" - } - }, - "node_modules/@near-js/signers/node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/@near-js/transactions": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@near-js/transactions/-/transactions-0.1.1.tgz", - "integrity": "sha512-Fk83oLLFK7nz4thawpdv9bGyMVQ2i48iUtZEVYhuuuqevl17tSXMlhle9Me1ZbNyguJG/cWPdNybe1UMKpyGxA==", + "resolved": "https://registry.npmjs.org/@near-js/signers/-/signers-0.0.4.tgz", + "integrity": "sha512-xCglo3U/WIGsz/izPGFMegS5Q3PxOHYB8a1E7RtVhNm5QdqTlQldLCm/BuMg2G/u1l1ZZ0wdvkqRTG9joauf3Q==", "dependencies": { "@near-js/crypto": "0.0.4", - "@near-js/signers": "0.0.4", - "@near-js/types": "0.0.4", - "@near-js/utils": "0.0.4", - "bn.js": "5.2.1", - "borsh": "^0.7.0", + "@near-js/keystores": "0.0.4", "js-sha256": "^0.9.0" } }, - "node_modules/@near-js/transactions/node_modules/@near-js/crypto": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@near-js/crypto/-/crypto-0.0.4.tgz", - "integrity": "sha512-2mSIVv6mZway1rQvmkktrXAFoUvy7POjrHNH3LekKZCMCs7qMM/23Hz2+APgxZPqoV2kjarSNOEYJjxO7zQ/rQ==", - "dependencies": { - "@near-js/types": "0.0.4", - "bn.js": "5.2.1", - "borsh": "^0.7.0", - "tweetnacl": "^1.0.1" - } - }, "node_modules/@near-js/transactions/node_modules/@near-js/types": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/@near-js/types/-/types-0.0.4.tgz", @@ -3648,32 +4128,6 @@ "mustache": "^4.0.0" } }, - "node_modules/@near-js/transactions/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/@near-js/transactions/node_modules/borsh": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", - "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", - "dependencies": { - "bn.js": "^5.2.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" - } - }, - "node_modules/@near-js/transactions/node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dependencies": { - "base-x": "^3.0.2" - } - }, "node_modules/@near-js/types": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@near-js/types/-/types-0.0.3.tgz", @@ -3694,11 +4148,11 @@ } }, "node_modules/@noble/curves": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", - "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", + "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", "dependencies": { - "@noble/hashes": "1.5.0" + "@noble/hashes": "1.7.1" }, "engines": { "node": "^14.21.3 || >=16" @@ -3719,9 +4173,9 @@ ] }, "node_modules/@noble/hashes": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", - "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", + "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", "engines": { "node": "^14.21.3 || >=16" }, @@ -3810,142 +4264,608 @@ "node": ">=18.0.0" } }, - "node_modules/@oclif/plugin-autocomplete": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-3.2.7.tgz", - "integrity": "sha512-mjXaBwN972UaOj1pjBCy60io4HzGoGjXDC7pUSlpb5BrKY20U0ggkZAehK4EF/DxuMfDz5sHk+8f5Lsgxfm54g==", + "node_modules/@oclif/core/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { - "@oclif/core": "^4", - "ansis": "^3.3.1", - "debug": "^4.3.6", - "ejs": "^3.1.10" + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@oclif/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@oclif/plugin-autocomplete/node_modules/@oclif/core": { - "version": "4.0.31", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.31.tgz", - "integrity": "sha512-7oyIZv/C1TP+fPc2tSzVPYqG1zU+nel1QvJxjAWyVhud0J8B5SpKZnryedxs3nlSVPJ6K1MT31C9esupCBYgZw==", + "node_modules/@oclif/core/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "ansi-escapes": "^4.3.2", - "ansis": "^3.3.2", - "clean-stack": "^3.0.1", - "cli-spinners": "^2.9.2", - "debug": "^4.3.7", - "ejs": "^3.1.10", - "get-package-type": "^0.1.0", - "globby": "^11.1.0", - "indent-string": "^4.0.0", - "is-wsl": "^2.2.0", - "lilconfig": "^3.1.2", - "minimatch": "^9.0.5", - "semver": "^7.6.3", - "string-width": "^4.2.3", - "supports-color": "^8", - "widest-line": "^3.1.0", - "wordwrap": "^1.0.0", - "wrap-ansi": "^7.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=8" } }, - "node_modules/@oclif/plugin-help": { - "version": "6.2.16", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.16.tgz", - "integrity": "sha512-1x/Bm0LebDouDOfsjkOz+6AXqY6gIZ6JmmU/KuF/GnUmowDvj5i3MFlP9uBTiN8UsOUeT9cdLwnc1kmitHWFTg==", + "node_modules/@oclif/core/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dependencies": { - "@oclif/core": "^4" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@oclif/plugin-help/node_modules/@oclif/core": { - "version": "4.0.31", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.31.tgz", - "integrity": "sha512-7oyIZv/C1TP+fPc2tSzVPYqG1zU+nel1QvJxjAWyVhud0J8B5SpKZnryedxs3nlSVPJ6K1MT31C9esupCBYgZw==", + "node_modules/@oclif/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/core/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@oclif/core/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/core/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@oclif/core/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dependencies": { - "ansi-escapes": "^4.3.2", - "ansis": "^3.3.2", - "clean-stack": "^3.0.1", - "cli-spinners": "^2.9.2", - "debug": "^4.3.7", - "ejs": "^3.1.10", - "get-package-type": "^0.1.0", - "globby": "^11.1.0", - "indent-string": "^4.0.0", - "is-wsl": "^2.2.0", - "lilconfig": "^3.1.2", - "minimatch": "^9.0.5", - "semver": "^7.6.3", - "string-width": "^4.2.3", - "supports-color": "^8", - "widest-line": "^3.1.0", - "wordwrap": "^1.0.0", - "wrap-ansi": "^7.0.0" + "is-docker": "^2.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=8" + } + }, + "node_modules/@oclif/core/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@oclif/core/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/core/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/@oclif/core/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@oclif/core/node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-autocomplete": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-3.2.22.tgz", + "integrity": "sha512-oj68qowjaPifKttINdTbCUUeVwMMumSn7HJck3R84E+HpkED7ih0BSO5Jx1Gs0jbH7ZfohKugSRmOCe5JZYb5A==", + "dependencies": { + "@oclif/core": "^4", + "ansis": "^3.14.0", + "debug": "^4.4.0", + "ejs": "^3.1.10" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-autocomplete/node_modules/@oclif/core": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.2.7.tgz", + "integrity": "sha512-49wtIlSEw9UyxdSMPjJ2Ookj5e056Qbqr6A+uN7Ea8XCK6b8Q03KciTEpX5t0rfNggvewJc9e3SHY6uWZIkXVw==", + "dependencies": { + "ansi-escapes": "^4.3.2", + "ansis": "^3.14.0", + "clean-stack": "^3.0.1", + "cli-spinners": "^2.9.2", + "debug": "^4.4.0", + "ejs": "^3.1.10", + "get-package-type": "^0.1.0", + "globby": "^11.1.0", + "indent-string": "^4.0.0", + "is-wsl": "^2.2.0", + "lilconfig": "^3.1.3", + "minimatch": "^9.0.5", + "semver": "^7.6.3", + "string-width": "^4.2.3", + "supports-color": "^8", + "widest-line": "^3.1.0", + "wordwrap": "^1.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-autocomplete/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@oclif/plugin-autocomplete/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-autocomplete/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@oclif/plugin-autocomplete/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-autocomplete/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@oclif/plugin-autocomplete/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-autocomplete/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-autocomplete/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@oclif/plugin-autocomplete/node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-help": { + "version": "6.2.25", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.25.tgz", + "integrity": "sha512-1WPSzSvlYaIFlGGKbefldpx49uTAtsOFuHTbjeBuzSR/MLmooQGHzluvwm2W5/vyoi4AGG+PdiDJFH/b+h+BGA==", + "dependencies": { + "@oclif/core": "^4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-help/node_modules/@oclif/core": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.2.7.tgz", + "integrity": "sha512-49wtIlSEw9UyxdSMPjJ2Ookj5e056Qbqr6A+uN7Ea8XCK6b8Q03KciTEpX5t0rfNggvewJc9e3SHY6uWZIkXVw==", + "dependencies": { + "ansi-escapes": "^4.3.2", + "ansis": "^3.14.0", + "clean-stack": "^3.0.1", + "cli-spinners": "^2.9.2", + "debug": "^4.4.0", + "ejs": "^3.1.10", + "get-package-type": "^0.1.0", + "globby": "^11.1.0", + "indent-string": "^4.0.0", + "is-wsl": "^2.2.0", + "lilconfig": "^3.1.3", + "minimatch": "^9.0.5", + "semver": "^7.6.3", + "string-width": "^4.2.3", + "supports-color": "^8", + "widest-line": "^3.1.0", + "wordwrap": "^1.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-help/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@oclif/plugin-help/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-help/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@oclif/plugin-help/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-help/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@oclif/plugin-help/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-help/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-help/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@oclif/plugin-help/node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-not-found": { + "version": "3.2.42", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.42.tgz", + "integrity": "sha512-hoPkt32xtXnsIFOHDK6ISCbh3v0FskDHvzmUpIKQYsojJhU9Xz/ygCyBVoFrOaJow9y/84ZARQWau2CswaprHQ==", + "dependencies": { + "@inquirer/prompts": "^7.3.2", + "@oclif/core": "^4", + "ansis": "^3.14.0", + "fast-levenshtein": "^3.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-not-found/node_modules/@oclif/core": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.2.7.tgz", + "integrity": "sha512-49wtIlSEw9UyxdSMPjJ2Ookj5e056Qbqr6A+uN7Ea8XCK6b8Q03KciTEpX5t0rfNggvewJc9e3SHY6uWZIkXVw==", + "dependencies": { + "ansi-escapes": "^4.3.2", + "ansis": "^3.14.0", + "clean-stack": "^3.0.1", + "cli-spinners": "^2.9.2", + "debug": "^4.4.0", + "ejs": "^3.1.10", + "get-package-type": "^0.1.0", + "globby": "^11.1.0", + "indent-string": "^4.0.0", + "is-wsl": "^2.2.0", + "lilconfig": "^3.1.3", + "minimatch": "^9.0.5", + "semver": "^7.6.3", + "string-width": "^4.2.3", + "supports-color": "^8", + "widest-line": "^3.1.0", + "wordwrap": "^1.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-not-found/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@oclif/plugin-not-found/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-not-found/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@oclif/plugin-not-found/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-not-found/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@oclif/plugin-not-found/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-not-found/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" } }, - "node_modules/@oclif/plugin-not-found": { - "version": "3.2.24", - "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.24.tgz", - "integrity": "sha512-oseOiNfvcaB4tB9YLnUo16DlW61yi/glfpxk6Z6e5BzQkmD0D0vptfBB6/gLf0/vP+0/C8NZbJoqwae08mRpOA==", + "node_modules/@oclif/plugin-not-found/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { - "@inquirer/prompts": "^7.0.1", - "@oclif/core": "^4", - "ansis": "^3.3.1", - "fast-levenshtein": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/@oclif/plugin-not-found/node_modules/@oclif/core": { - "version": "4.0.31", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.31.tgz", - "integrity": "sha512-7oyIZv/C1TP+fPc2tSzVPYqG1zU+nel1QvJxjAWyVhud0J8B5SpKZnryedxs3nlSVPJ6K1MT31C9esupCBYgZw==", + "node_modules/@oclif/plugin-not-found/node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dependencies": { - "ansi-escapes": "^4.3.2", - "ansis": "^3.3.2", - "clean-stack": "^3.0.1", - "cli-spinners": "^2.9.2", - "debug": "^4.3.7", - "ejs": "^3.1.10", - "get-package-type": "^0.1.0", - "globby": "^11.1.0", - "indent-string": "^4.0.0", - "is-wsl": "^2.2.0", - "lilconfig": "^3.1.2", - "minimatch": "^9.0.5", - "semver": "^7.6.3", - "string-width": "^4.2.3", - "supports-color": "^8", - "widest-line": "^3.1.0", - "wordwrap": "^1.0.0", - "wrap-ansi": "^7.0.0" + "string-width": "^4.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=8" } }, "node_modules/@oclif/plugin-plugins": { - "version": "5.4.15", - "resolved": "https://registry.npmjs.org/@oclif/plugin-plugins/-/plugin-plugins-5.4.15.tgz", - "integrity": "sha512-0cnTFaRWdXkWgKTrwgjoggcq/A3MaIl1GkDs3BFFjesYlFEs5Fb2HcN42rY+2ja4jBkXrjXBkLS+9faAtdCH6A==", - "dependencies": { - "@oclif/core": "^4.0.28", - "ansis": "^3.3.2", - "debug": "^4.3.7", - "npm": "^10.9.0", + "version": "5.4.33", + "resolved": "https://registry.npmjs.org/@oclif/plugin-plugins/-/plugin-plugins-5.4.33.tgz", + "integrity": "sha512-rGeYqlJ3KghB95b0SAPDTSaV8qtbxIOnH71Qgb+QqdPqKL1iD402DrjmTDT6XpaFVeK04g3XhiB7K3JKjgFABA==", + "dependencies": { + "@oclif/core": "^4.2.6", + "ansis": "^3.14.0", + "debug": "^4.4.0", + "npm": "^10.9.2", "npm-package-arg": "^11.0.3", "npm-run-path": "^5.3.0", "object-treeify": "^4.0.1", - "semver": "^7.6.3", + "semver": "^7.7.0", "validate-npm-package-name": "^5.0.1", "which": "^4.0.0", "yarn": "^1.22.22" @@ -3955,21 +4875,21 @@ } }, "node_modules/@oclif/plugin-plugins/node_modules/@oclif/core": { - "version": "4.0.31", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.31.tgz", - "integrity": "sha512-7oyIZv/C1TP+fPc2tSzVPYqG1zU+nel1QvJxjAWyVhud0J8B5SpKZnryedxs3nlSVPJ6K1MT31C9esupCBYgZw==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.2.7.tgz", + "integrity": "sha512-49wtIlSEw9UyxdSMPjJ2Ookj5e056Qbqr6A+uN7Ea8XCK6b8Q03KciTEpX5t0rfNggvewJc9e3SHY6uWZIkXVw==", "dependencies": { "ansi-escapes": "^4.3.2", - "ansis": "^3.3.2", + "ansis": "^3.14.0", "clean-stack": "^3.0.1", "cli-spinners": "^2.9.2", - "debug": "^4.3.7", + "debug": "^4.4.0", "ejs": "^3.1.10", "get-package-type": "^0.1.0", "globby": "^11.1.0", "indent-string": "^4.0.0", "is-wsl": "^2.2.0", - "lilconfig": "^3.1.2", + "lilconfig": "^3.1.3", "minimatch": "^9.0.5", "semver": "^7.6.3", "string-width": "^4.2.3", @@ -3982,6 +4902,82 @@ "node": ">=18.0.0" } }, + "node_modules/@oclif/plugin-plugins/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@oclif/plugin-plugins/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-plugins/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@oclif/plugin-plugins/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-plugins/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@oclif/plugin-plugins/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-plugins/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "engines": { + "node": ">=16" + } + }, "node_modules/@oclif/plugin-plugins/node_modules/object-treeify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-4.0.1.tgz", @@ -3990,17 +4986,64 @@ "node": ">= 16" } }, + "node_modules/@oclif/plugin-plugins/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@oclif/plugin-plugins/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@oclif/plugin-plugins/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@oclif/plugin-plugins/node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@orca-so/common-sdk": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@orca-so/common-sdk/-/common-sdk-0.6.3.tgz", - "integrity": "sha512-jeLAjQfr3R1Mg72+hlu5tPih0qY2o9WV00o/nSIR/GtpIWsRPb4Ep0FzYQSI1XH7s+XfSXNuhEWFGsFA/qPMLQ==", + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/@orca-so/common-sdk/-/common-sdk-0.6.10.tgz", + "integrity": "sha512-MpRtgIObKrs0O+DgSLTJTkVurNJj0PSBDpQ4Yq478r2VCYUi1SCfi9Wj7ZrKqByniA2gtG1Q02r7OquADX6JXw==", "dependencies": { + "decimal.js": "^10.5.0", "tiny-invariant": "^1.3.1" }, "peerDependencies": { - "@solana/spl-token": "^0.4.1", - "@solana/web3.js": "^1.90.0", - "decimal.js": "^10.4.3" + "@solana/spl-token": "^0.4.12", + "@solana/web3.js": "^1.90.0" } }, "node_modules/@orca-so/whirlpools-sdk": { @@ -4084,14 +5127,6 @@ "@solana/web3.js": "^1.88.0" } }, - "node_modules/@orca-so/whirlpools-sdk/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/@orca-so/whirlpools-sdk/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -4100,6 +5135,50 @@ "base-x": "^3.0.2" } }, + "node_modules/@orca-so/whirlpools-sdk/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@orca-so/whirlpools-sdk/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@orca-so/whirlpools-sdk/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/@orca-so/whirlpools-sdk/node_modules/superstruct": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", + "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==" + }, "node_modules/@pbkit/grpc-client": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@pbkit/grpc-client/-/grpc-client-0.0.3.tgz", @@ -4144,11 +5223,6 @@ "node": ">=12.22.0" } }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, "node_modules/@pnpm/npm-conf": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", @@ -4202,14 +5276,6 @@ "@solana/web3.js": "^1.68.0" } }, - "node_modules/@project-serum/anchor/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/@project-serum/anchor/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -4218,6 +5284,27 @@ "base-x": "^3.0.2" } }, + "node_modules/@project-serum/anchor/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@project-serum/anchor/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/@project-serum/anchor/node_modules/superstruct": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", + "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==" + }, "node_modules/@project-serum/borsh": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/@project-serum/borsh/-/borsh-0.2.5.tgz", @@ -4288,20 +5375,35 @@ "node": ">= 10" } }, - "node_modules/@project-serum/serum/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/@project-serum/serum/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "dependencies": { - "base-x": "^3.0.2" + "base-x": "^3.0.2" + } + }, + "node_modules/@project-serum/serum/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, "node_modules/@project-serum/serum/node_modules/camelcase": { @@ -4320,6 +5422,11 @@ "node": ">=10" } }, + "node_modules/@project-serum/serum/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -4429,6 +5536,29 @@ "toformat": "^2.0.0" } }, + "node_modules/@raydium-io/raydium-sdk-v2/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/@raydium-io/raydium-sdk/node_modules/@solana/spl-token": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.11.tgz", @@ -4446,6 +5576,29 @@ "@solana/web3.js": "^1.88.0" } }, + "node_modules/@raydium-io/raydium-sdk/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/@rollup/plugin-json": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", @@ -4466,9 +5619,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", - "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -4486,10 +5639,21 @@ } } }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.2.tgz", - "integrity": "sha512-ufoveNTKDg9t/b7nqI3lwbCG/9IJMhADBNjjz/Jn6LxIZxD7T5L8l2uO/wD99945F1Oo8FvgbbZJRguyk/BdzA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", + "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", "cpu": [ "arm" ], @@ -4499,9 +5663,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.2.tgz", - "integrity": "sha512-iZoYCiJz3Uek4NI0J06/ZxUgwAfNzqltK0MptPDO4OR0a88R4h0DSELMsflS6ibMCJ4PnLvq8f7O1d7WexUvIA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", + "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", "cpu": [ "arm64" ], @@ -4511,9 +5675,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.2.tgz", - "integrity": "sha512-/UhrIxobHYCBfhi5paTkUDQ0w+jckjRZDZ1kcBL132WeHZQ6+S5v9jQPVGLVrLbNUebdIRpIt00lQ+4Z7ys4Rg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", + "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", "cpu": [ "arm64" ], @@ -4523,9 +5687,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.2.tgz", - "integrity": "sha512-1F/jrfhxJtWILusgx63WeTvGTwE4vmsT9+e/z7cZLKU8sBMddwqw3UV5ERfOV+H1FuRK3YREZ46J4Gy0aP3qDA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", + "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", "cpu": [ "x64" ], @@ -4535,9 +5699,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.2.tgz", - "integrity": "sha512-1YWOpFcGuC6iGAS4EI+o3BV2/6S0H+m9kFOIlyFtp4xIX5rjSnL3AwbTBxROX0c8yWtiWM7ZI6mEPTI7VkSpZw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", + "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", "cpu": [ "arm64" ], @@ -4547,9 +5711,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.2.tgz", - "integrity": "sha512-3qAqTewYrCdnOD9Gl9yvPoAoFAVmPJsBvleabvx4bnu1Kt6DrB2OALeRVag7BdWGWLhP1yooeMLEi6r2nYSOjg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", + "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", "cpu": [ "x64" ], @@ -4559,9 +5723,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.2.tgz", - "integrity": "sha512-ArdGtPHjLqWkqQuoVQ6a5UC5ebdX8INPuJuJNWRe0RGa/YNhVvxeWmCTFQ7LdmNCSUzVZzxAvUznKaYx645Rig==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", + "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", "cpu": [ "arm" ], @@ -4571,9 +5735,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.2.tgz", - "integrity": "sha512-B6UHHeNnnih8xH6wRKB0mOcJGvjZTww1FV59HqJoTJ5da9LCG6R4SEBt6uPqzlawv1LoEXSS0d4fBlHNWl6iYw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", + "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", "cpu": [ "arm" ], @@ -4583,9 +5747,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.2.tgz", - "integrity": "sha512-kr3gqzczJjSAncwOS6i7fpb4dlqcvLidqrX5hpGBIM1wtt0QEVtf4wFaAwVv8QygFU8iWUMYEoJZWuWxyua4GQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", + "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", "cpu": [ "arm64" ], @@ -4595,9 +5759,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.2.tgz", - "integrity": "sha512-TDdHLKCWgPuq9vQcmyLrhg/bgbOvIQ8rtWQK7MRxJ9nvaxKx38NvY7/Lo6cYuEnNHqf6rMqnivOIPIQt6H2AoA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", + "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", "cpu": [ "arm64" ], @@ -4606,10 +5770,22 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", + "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.2.tgz", - "integrity": "sha512-xv9vS648T3X4AxFFZGWeB5Dou8ilsv4VVqJ0+loOIgDO20zIhYfDLkk5xoQiej2RiSQkld9ijF/fhLeonrz2mw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", + "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", "cpu": [ "ppc64" ], @@ -4619,9 +5795,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.2.tgz", - "integrity": "sha512-tbtXwnofRoTt223WUZYiUnbxhGAOVul/3StZ947U4A5NNjnQJV5irKMm76G0LGItWs6y+SCjUn/Q0WaMLkEskg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", + "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", "cpu": [ "riscv64" ], @@ -4631,9 +5807,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.2.tgz", - "integrity": "sha512-gc97UebApwdsSNT3q79glOSPdfwgwj5ELuiyuiMY3pEWMxeVqLGKfpDFoum4ujivzxn6veUPzkGuSYoh5deQ2Q==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", + "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", "cpu": [ "s390x" ], @@ -4643,9 +5819,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.2.tgz", - "integrity": "sha512-jOG/0nXb3z+EM6SioY8RofqqmZ+9NKYvJ6QQaa9Mvd3RQxlH68/jcB/lpyVt4lCiqr04IyaC34NzhUqcXbB5FQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", + "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", "cpu": [ "x64" ], @@ -4655,9 +5831,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.2.tgz", - "integrity": "sha512-XAo7cJec80NWx9LlZFEJQxqKOMz/lX3geWs2iNT5CHIERLFfd90f3RYLLjiCBm1IMaQ4VOX/lTC9lWfzzQm14Q==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", + "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", "cpu": [ "x64" ], @@ -4667,9 +5843,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.2.tgz", - "integrity": "sha512-A+JAs4+EhsTjnPQvo9XY/DC0ztaws3vfqzrMNMKlwQXuniBKOIIvAAI8M0fBYiTCxQnElYu7mLk7JrhlQ+HeOw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", + "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", "cpu": [ "arm64" ], @@ -4679,9 +5855,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.2.tgz", - "integrity": "sha512-ZhcrakbqA1SCiJRMKSU64AZcYzlZ/9M5LaYil9QWxx9vLnkQ9Vnkve17Qn4SjlipqIIBFKjBES6Zxhnvh0EAEw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", + "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", "cpu": [ "ia32" ], @@ -4691,9 +5867,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.2.tgz", - "integrity": "sha512-2mLH46K1u3r6uwc95hU+OR9q/ggYMpnS7pSp83Ece1HUQgF9Nh/QwTK5rcgbFnV9j+08yBrU5sA/P0RK2MSBNA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", + "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", "cpu": [ "x64" ], @@ -4722,33 +5898,33 @@ } }, "node_modules/@scure/base": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", - "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.4.tgz", + "integrity": "sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==", "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip32": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.5.0.tgz", - "integrity": "sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", + "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", "dependencies": { - "@noble/curves": "~1.6.0", - "@noble/hashes": "~1.5.0", - "@scure/base": "~1.1.7" + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.2" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip39": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.4.0.tgz", - "integrity": "sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", + "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", "dependencies": { - "@noble/hashes": "~1.5.0", - "@scure/base": "~1.1.8" + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.4" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -4772,15 +5948,15 @@ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@solana-developers/helpers": { @@ -4820,6 +5996,29 @@ "node": ">= 10" } }, + "node_modules/@solana/buffer-layout/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/@solana/codecs": { "version": "2.0.0-rc.1", "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-rc.1.tgz", @@ -4900,17 +6099,6 @@ "typescript": ">=5" } }, - "node_modules/@solana/errors/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@solana/options": { "version": "2.0.0-rc.1", "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-rc.1.tgz", @@ -4945,47 +6133,10 @@ "@solana/web3.js": "^1.50.1" } }, - "node_modules/@solana/spl-account-compression/node_modules/@metaplex-foundation/beet-solana": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@metaplex-foundation/beet-solana/-/beet-solana-0.4.1.tgz", - "integrity": "sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==", - "dependencies": { - "@metaplex-foundation/beet": ">=0.1.0", - "@solana/web3.js": "^1.56.2", - "bs58": "^5.0.0", - "debug": "^4.3.4" - } - }, - "node_modules/@solana/spl-account-compression/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/@solana/spl-account-compression/node_modules/borsh": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", - "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", - "dependencies": { - "bn.js": "^5.2.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" - } - }, - "node_modules/@solana/spl-account-compression/node_modules/borsh/node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dependencies": { - "base-x": "^3.0.2" - } - }, "node_modules/@solana/spl-token": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.9.tgz", - "integrity": "sha512-g3wbj4F4gq82YQlwqhPB0gHFXfgsC6UmyGMxtSLf/BozT/oKd59465DbnlUK8L8EcimKMavxsVAMoLcEdeCicg==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.12.tgz", + "integrity": "sha512-K6CxzSoO1vC+WBys25zlSDaW0w4UFZO/IvEZquEI35A/PjqXNQHeVigmDCZYEJfESvYarKwsr8tYr/29lPtvaw==", "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", @@ -4997,7 +6148,7 @@ "node": ">=16" }, "peerDependencies": { - "@solana/web3.js": "^1.95.3" + "@solana/web3.js": "^1.95.5" } }, "node_modules/@solana/spl-token-group": { @@ -5055,6 +6206,29 @@ "node": "4.x || >=6.0.0" } }, + "node_modules/@solana/spl-token/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/@solana/spl-type-length-value": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@solana/spl-type-length-value/-/spl-type-length-value-0.1.0.tgz", @@ -5066,10 +6240,33 @@ "node": ">=16" } }, + "node_modules/@solana/spl-type-length-value/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/@solana/web3.js": { - "version": "1.95.4", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.95.4.tgz", - "integrity": "sha512-sdewnNEA42ZSMxqkzdwEWi6fDgzwtJHaQa5ndUGEJYtoOnM6X5cvPmjoTUp7/k7bRrVAxfBgDnvQQHD6yhlLYw==", + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.0.tgz", + "integrity": "sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==", "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", @@ -5088,31 +6285,10 @@ "superstruct": "^2.0.2" } }, - "node_modules/@solana/web3.js/node_modules/@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@solana/web3.js/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/@solana/web3.js/node_modules/borsh": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", - "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", - "dependencies": { - "bn.js": "^5.2.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" - } + "node_modules/@solana/web3.js/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, "node_modules/@solana/web3.js/node_modules/bs58": { "version": "4.0.1", @@ -5122,28 +6298,70 @@ "base-x": "^3.0.2" } }, + "node_modules/@solana/web3.js/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@solana/web3.js/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "node_modules/@solana/web3.js/node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, - "node_modules/@solana/web3.js/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/@solana/web3.js/node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/@solana/web3.js/node_modules/jayson": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.3.tgz", + "integrity": "sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==", "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "JSONStream": "^1.3.5", + "uuid": "^8.3.2", + "ws": "^7.5.10" }, - "peerDependencies": { - "encoding": "^0.1.0" + "bin": { + "jayson": "bin/jayson.js" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "engines": { + "node": ">=8" } }, "node_modules/@solana/web3.js/node_modules/rpc-websockets": { @@ -5168,6 +6386,34 @@ "utf-8-validate": "^5.0.2" } }, + "node_modules/@solana/web3.js/node_modules/rpc-websockets/node_modules/@types/ws": { + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz", + "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@solana/web3.js/node_modules/rpc-websockets/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@solana/web3.js/node_modules/superstruct": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", @@ -5176,23 +6422,24 @@ "node": ">=14.0.0" } }, - "node_modules/@solana/web3.js/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/@solana/web3.js/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/@solana/web3.js/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "node_modules/@solana/web3.js/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/@supercharge/promise-pool": { @@ -5204,22 +6451,11 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", - "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" + "tslib": "^2.8.0" } }, "node_modules/@triton-one/yellowstone-grpc": { @@ -5264,25 +6500,6 @@ "base-x": "^3.0.6" } }, - "node_modules/@types/bs58/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, "node_modules/@types/cli-progress": { "version": "3.11.6", "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.6.tgz", @@ -5300,34 +6517,21 @@ } }, "node_modules/@types/emscripten": { - "version": "1.39.13", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.13.tgz", - "integrity": "sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==" + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.40.0.tgz", + "integrity": "sha512-MD2JJ25S4tnjnhjWyalMS6K6p0h+zQV6+Ylm+aGbiS8tSn/aHLSGNzBgduj6FB4zH0ax2GRMGYi/8G1uOxhXWA==" }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/node": { - "version": "22.8.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.2.tgz", - "integrity": "sha512-NzaRNFV+FZkvK/KLCsNdTvID0SThyrs5SHB6tsD/lajr22FGC73N2QeDPM2wHtVde8mgcXuSsHQkH5cX1pbPLw==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dependencies": { - "undici-types": "~6.19.8" + "undici-types": "~6.20.0" } }, "node_modules/@types/normalize-package-data": { @@ -5335,14 +6539,6 @@ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/uuid": { "version": "8.3.4", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", @@ -5441,9 +6637,9 @@ "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" }, "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "dependencies": { "humanize-ms": "^1.2.1" }, @@ -5451,57 +6647,6 @@ "node": ">= 8.0.0" } }, - "node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/aggregate-error/node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/aggregate-error/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/aggregate-error/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/algo-msgpack-with-bigint": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz", @@ -5530,6 +6675,29 @@ "node": ">=14.0.0" } }, + "node_modules/algosdk/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -5580,11 +6748,11 @@ "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==" }, "node_modules/ansis": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.3.2.tgz", - "integrity": "sha512-cFthbBlt+Oi0i9Pv/j6YdVWJh54CtjGACaMPCIrEV4Ha7HWsIjXDwseYV79TIL0B4+KfSwD5S70PeQDkPUd1rA==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.15.0.tgz", + "integrity": "sha512-zIcWDJ+Kwqxfdnogx66Gxzr0kVmCcRAdat9nlY2IHsshqTN4fBH6tMeRMPA/2w0rpBayIJvjQAaa2/4RDrNqwg==", "engines": { - "node": ">=15" + "node": ">=14" } }, "node_modules/any-observable": { @@ -5627,6 +6795,14 @@ } ] }, + "node_modules/aptos/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/aptos/node_modules/@scure/bip39": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", @@ -5690,14 +6866,6 @@ "tmp-promise": "^3.0.2" } }, - "node_modules/arbundles/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/arbundles/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -5706,28 +6874,15 @@ "base-x": "^3.0.2" } }, - "node_modules/arconnect": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/arconnect/-/arconnect-0.4.2.tgz", - "integrity": "sha512-Jkpd4QL3TVqnd3U683gzXmZUVqBUy17DdJDuL/3D9rkysLgX6ymJ2e+sR+xyZF5Rh42CBqDXWNMmCjBXeP7Gbw==", - "optional": true, - "peer": true, - "dependencies": { - "arweave": "^1.10.13" - } - }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-flatten": { "version": "1.1.1", @@ -5742,22 +6897,6 @@ "node": ">=8" } }, - "node_modules/arweave": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/arweave/-/arweave-1.15.5.tgz", - "integrity": "sha512-Zj3b8juz1ZtDaQDPQlzWyk2I4wZPx3RmcGq8pVJeZXl2Tjw0WRy5ueHPelxZtBLqCirGoZxZEAFRs6SZUSCBjg==", - "optional": true, - "peer": true, - "dependencies": { - "arconnect": "^0.4.2", - "asn1.js": "^5.4.1", - "base64-js": "^1.5.1", - "bignumber.js": "^9.0.2" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/arweave-stream-tx": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/arweave-stream-tx/-/arweave-stream-tx-1.2.2.tgz", @@ -5782,9 +6921,21 @@ } }, "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } }, "node_modules/astral-regex": { "version": "2.0.0", @@ -5799,6 +6950,14 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" }, + "node_modules/async-mutex": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", + "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/async-retry": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", @@ -5829,10 +6988,24 @@ "when-exit": "^2.1.1" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -5845,9 +7018,12 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base-x": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", - "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } }, "node_modules/base64-js": { "version": "1.5.1", @@ -6035,10 +7211,31 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/borsh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-2.0.0.tgz", - "integrity": "sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==" + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", + "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", + "dependencies": { + "bn.js": "^5.2.0", + "bs58": "^4.0.0", + "text-encoding-utf-8": "^1.0.2" + } + }, + "node_modules/borsh/node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dependencies": { + "base-x": "^3.0.2" + } }, "node_modules/boxen": { "version": "8.0.1", @@ -6083,28 +7280,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/boxen/node_modules/camelcase": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", - "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/boxen/node_modules/emoji-regex": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", @@ -6141,9 +7316,9 @@ } }, "node_modules/boxen/node_modules/type-fest": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", - "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.35.0.tgz", + "integrity": "sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==", "engines": { "node": ">=16" }, @@ -6151,20 +7326,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/widest-line": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", - "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", - "dependencies": { - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/boxen/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -6213,10 +7374,15 @@ "base-x": "^4.0.0" } }, + "node_modules/bs58/node_modules/base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + }, "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", + "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", "funding": [ { "type": "github", @@ -6250,9 +7416,9 @@ "integrity": "sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==" }, "node_modules/bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", + "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", "hasInstallScript": true, "optional": true, "dependencies": { @@ -6276,6 +7442,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bundle-require": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", + "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.18" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -6292,41 +7472,42 @@ "node": ">=8" } }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, "engines": { - "node": ">=10.6.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -6344,11 +7525,11 @@ } }, "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6378,15 +7559,11 @@ } }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" @@ -6406,37 +7583,15 @@ "url": "https://github.com/chalk/chalk-template?sponsor=1" } }, - "node_modules/chalk-template/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dependencies": { "readdirp": "^4.0.1" }, @@ -6456,12 +7611,15 @@ } }, "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" } }, "node_modules/clean-stack": { @@ -6478,6 +7636,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/clean-stack/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-boxes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", @@ -6490,14 +7659,14 @@ } }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/cli-progress": { @@ -6553,14 +7722,6 @@ "node": ">=0.10.0" } }, - "node_modules/cli-truncate/node_modules/slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cli-truncate/node_modules/string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -6614,17 +7775,6 @@ "node": ">=0.8" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -6730,10 +7880,15 @@ "url": "https://github.com/yeoman/configstore?sponsor=1" } }, + "node_modules/configstore/node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", + "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -6806,22 +7961,6 @@ } } }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -6853,55 +7992,17 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/cross-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/cross-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/cross-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "node-fetch": "^2.7.0" } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6911,25 +8012,6 @@ "node": ">= 8" } }, - "node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/crypto-hash": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/crypto-hash/-/crypto-hash-1.3.0.tgz", @@ -7002,56 +8084,31 @@ "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dependencies": { "ms": "^2.1.3" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" - }, - "node_modules/decimal.js-light": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, + "node_modules/decimal.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==" + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" + }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -7097,14 +8154,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -7132,51 +8181,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/del": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-7.1.0.tgz", - "integrity": "sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { - "globby": "^13.1.2", - "graceful-fs": "^4.2.10", - "is-glob": "^4.0.3", - "is-path-cwd": "^3.0.0", - "is-path-inside": "^4.0.0", - "p-map": "^5.5.0", - "rimraf": "^3.0.2", - "slash": "^4.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=14.16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/del/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "node_modules/del": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-8.0.0.tgz", + "integrity": "sha512-R6ep6JJ+eOBZsBr9esiNN1gxFbZE4Q2cULkUSFumGYecAiS6qodDvcPx/sFuWHMNul7DWmrtoEOpYSm7o6tbSA==", "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "globby": "^14.0.2", + "is-glob": "^4.0.3", + "is-path-cwd": "^3.0.0", + "is-path-inside": "^4.0.0", + "p-map": "^7.0.2", + "slash": "^5.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7261,9 +8295,9 @@ } }, "node_modules/dot-prop/node_modules/type-fest": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", - "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.35.0.tgz", + "integrity": "sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==", "engines": { "node": ">=16" }, @@ -7272,9 +8306,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", "engines": { "node": ">=12" }, @@ -7282,6 +8316,19 @@ "url": "https://dotenvx.com" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -7329,9 +8376,9 @@ } }, "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -7363,12 +8410,9 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } @@ -7381,6 +8425,31 @@ "node": ">= 0.4" } }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -7455,11 +8524,11 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7531,6 +8600,14 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/ethereum-cryptography/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/ethereum-cryptography/node_modules/@scure/bip32": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", @@ -7617,17 +8694,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/execa/node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", @@ -7654,15 +8720,15 @@ } }, "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "optional": true }, "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -7683,7 +8749,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -7698,6 +8764,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/debug": { @@ -7728,6 +8798,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -7766,15 +8844,15 @@ "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -7814,24 +8892,18 @@ "node": ">= 4.9.1" } }, - "node_modules/fastestsmallesttextencoderdecoder": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", - "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", - "peer": true - }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fdir": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", - "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -7879,17 +8951,15 @@ } }, "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", "dependencies": { - "escape-string-regexp": "^1.0.5" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/figures/node_modules/escape-string-regexp": { @@ -7965,6 +9035,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/find/-/find-0.3.0.tgz", @@ -7974,24 +9052,50 @@ } }, "node_modules/find-process": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", - "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.10.tgz", + "integrity": "sha512-ncYFnWEIwL7PzmrK1yZtaccN8GhethD37RzBHG6iOZoFYB4vSmLLXfeWJjeN5nMvCJMjOtBvBBF8OgxEcikiZg==", "dependencies": { - "chalk": "^4.0.0", - "commander": "^5.1.0", - "debug": "^4.1.1" + "chalk": "~4.1.2", + "commander": "^12.1.0", + "loglevel": "^1.9.2" }, "bin": { "find-process": "bin/find-process.js" } }, - "node_modules/find-process/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "node_modules/find-process/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/find-process/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/find-process/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/find-up": { @@ -8044,6 +9148,20 @@ } } }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/foreground-child": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", @@ -8060,12 +9178,13 @@ } }, "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" }, "engines": { @@ -8121,11 +9240,6 @@ "node": ">=8" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -8175,15 +9289,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8200,15 +9319,24 @@ "node": ">=8.0.0" } }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dependencies": { - "pump": "^3.0.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "engines": { + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8220,20 +9348,19 @@ "integrity": "sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==" }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8250,24 +9377,12 @@ "node": ">= 6" } }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" } }, "node_modules/global-directory": { @@ -8285,19 +9400,30 @@ } }, "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8309,63 +9435,30 @@ "integrity": "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==" }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "engines": { - "node": ">=10.19.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/graphemesplit": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/graphemesplit/-/graphemesplit-2.4.4.tgz", - "integrity": "sha512-lKrpp1mk1NH26USxC/Asw4OHbhSQf5XfrWZ+CDv/dFVvd1j17kFgMotdJvOesmHkbFX9P9sBfpH8VogxOWLg8w==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/graphemesplit/-/graphemesplit-2.6.0.tgz", + "integrity": "sha512-rG9w2wAfkpg0DILa1pjnjNfucng3usON360shisqIMUBw/87pojcBSrHmeE4UwryAuBih7g8m1oilf5/u8EWdQ==", "dependencies": { "js-base64": "^3.6.0", "unicode-trie": "^2.0.0" } }, - "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, "node_modules/graphql-request": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-4.3.0.tgz", @@ -8380,13 +9473,14 @@ } }, "node_modules/graphql-request/node_modules/form-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.2.tgz", - "integrity": "sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.3.tgz", + "integrity": "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -8412,11 +9506,11 @@ } }, "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/has-property-descriptors": { @@ -8430,10 +9524,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -8441,10 +9535,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -8506,21 +9603,16 @@ } }, "node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", + "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", "dependencies": { "lru-cache": "^10.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, "node_modules/http-errors": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", @@ -8544,26 +9636,6 @@ "node": ">= 0.6" } }, - "node_modules/http-errors/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, "node_modules/human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", @@ -8627,28 +9699,28 @@ ] }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", + "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", "engines": { "node": ">= 4" } }, "node_modules/ignore-walk": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", - "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", + "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", "dependencies": { "minimatch": "^9.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -8690,11 +9762,11 @@ } }, "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/index-to-position": { @@ -8708,16 +9780,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -8732,28 +9794,28 @@ } }, "node_modules/inquirer": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", - "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "version": "12.4.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.4.2.tgz", + "integrity": "sha512-reyjHcwyK2LObXgTJH4T1Dpfhwu88LNPTZmg/KenmTsy3T8lN/kZT8Oo7UwwkB9q8+ss2qjjN7GV8oFAfyz9Xg==", "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^6.0.1" + "@inquirer/core": "^10.1.7", + "@inquirer/prompts": "^7.3.2", + "@inquirer/type": "^3.0.4", + "ansi-escapes": "^4.3.2", + "mute-stream": "^2.0.0", + "run-async": "^3.0.0", + "rxjs": "^7.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/inquirer-autosubmit-prompt": { @@ -8775,11 +9837,11 @@ } }, "node_modules/inquirer-autosubmit-prompt/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/inquirer-autosubmit-prompt/node_modules/ansi-styles": { @@ -8806,17 +9868,6 @@ "node": ">=4" } }, - "node_modules/inquirer-autosubmit-prompt/node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/inquirer-autosubmit-prompt/node_modules/cli-width": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", @@ -8854,14 +9905,6 @@ "node": ">=4" } }, - "node_modules/inquirer-autosubmit-prompt/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, "node_modules/inquirer-autosubmit-prompt/node_modules/inquirer": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", @@ -8893,40 +9936,17 @@ "node": ">=4" } }, - "node_modules/inquirer-autosubmit-prompt/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "engines": { - "node": ">=4" - } - }, "node_modules/inquirer-autosubmit-prompt/node_modules/mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==" }, - "node_modules/inquirer-autosubmit-prompt/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-autosubmit-prompt/node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, + "node_modules/inquirer-autosubmit-prompt/node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "engines": { - "node": ">=4" + "node": ">=0.12.0" } }, "node_modules/inquirer-autosubmit-prompt/node_modules/rxjs": { @@ -8940,11 +9960,6 @@ "npm": ">=2.0.0" } }, - "node_modules/inquirer-autosubmit-prompt/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, "node_modules/inquirer-autosubmit-prompt/node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -8957,14 +9972,6 @@ "node": ">=4" } }, - "node_modules/inquirer-autosubmit-prompt/node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "engines": { - "node": ">=4" - } - }, "node_modules/inquirer-autosubmit-prompt/node_modules/string-width/node_modules/strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -8987,6 +9994,14 @@ "node": ">=6" } }, + "node_modules/inquirer-autosubmit-prompt/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, "node_modules/inquirer-autosubmit-prompt/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -9003,32 +10018,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/inquirer/node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/inquirer/node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -9045,20 +10034,46 @@ "node": ">= 10" } }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9080,6 +10095,23 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -9131,20 +10163,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-installed-globally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", @@ -9165,10 +10183,25 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "engines": { - "node": ">=12" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-npm": { @@ -9236,6 +10269,23 @@ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-scoped": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-3.0.0.tgz", @@ -9261,12 +10311,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9284,23 +10348,23 @@ } }, "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dependencies": { - "is-docker": "^2.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "engines": { - "node": ">=16" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isomorphic-ws": { "version": "5.0.0", @@ -9361,6 +10425,29 @@ "concat-map": "0.0.1" } }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/jake/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -9372,10 +10459,21 @@ "node": "*" } }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jayson": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.2.tgz", - "integrity": "sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.7.0.tgz", + "integrity": "sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ==", "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", @@ -9387,8 +10485,9 @@ "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "JSONStream": "^1.3.5", + "lodash": "^4.17.20", "uuid": "^8.3.2", - "ws": "^7.5.10" + "ws": "^7.4.5" }, "bin": { "jayson": "bin/jayson.js" @@ -9436,9 +10535,9 @@ } }, "node_modules/jito-ts": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jito-ts/-/jito-ts-4.1.1.tgz", - "integrity": "sha512-5a/z7AvtitpExcyxYh1RhPoWRfCA4IPopE5hM5Cxw7/zHnV+VBNZL0m4t3fjfPgMnmPkeoTx2xTw+mSD4PDG7w==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/jito-ts/-/jito-ts-4.2.0.tgz", + "integrity": "sha512-on2QaZ+6H/LgHiQgC7bz0b0Pm3UdPK2wEroX4eDMXAPDPL1C1pJyyXqyJFZ84SL+JX0ESc18zC7jaelI2IYpAQ==", "dependencies": { "@grpc/grpc-js": "^1.8.13", "@noble/ed25519": "^1.7.1", @@ -9449,6 +10548,7 @@ "dotenv": "^16.0.3", "jayson": "^4.0.0", "node-fetch": "^2.6.7", + "rpc-websockets": "7.10.0", "superstruct": "^1.0.3" } }, @@ -9474,14 +10574,6 @@ "superstruct": "^0.14.2" } }, - "node_modules/jito-ts/node_modules/@solana/web3.js/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/jito-ts/node_modules/@solana/web3.js/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -9495,62 +10587,83 @@ "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" }, - "node_modules/jito-ts/node_modules/base-x": { + "node_modules/jito-ts/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "node_modules/jito-ts/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "dependencies": { + "base-x": "^5.0.0" + } + }, + "node_modules/jito-ts/node_modules/bs58/node_modules/base-x": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.0.tgz", "integrity": "sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==" }, - "node_modules/jito-ts/node_modules/borsh": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", - "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", + "node_modules/jito-ts/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "bn.js": "^5.2.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/jito-ts/node_modules/borsh/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } + "node_modules/jito-ts/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, - "node_modules/jito-ts/node_modules/borsh/node_modules/bs58": { + "node_modules/jito-ts/node_modules/isomorphic-ws": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/jito-ts/node_modules/bs58": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", - "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", - "dependencies": { - "base-x": "^5.0.0" + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "peerDependencies": { + "ws": "*" } }, - "node_modules/jito-ts/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/jito-ts/node_modules/jayson": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.3.tgz", + "integrity": "sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==", "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "JSONStream": "^1.3.5", + "uuid": "^8.3.2", + "ws": "^7.5.10" }, - "peerDependencies": { - "encoding": "^0.1.0" + "bin": { + "jayson": "bin/jayson.js" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "engines": { + "node": ">=8" } }, "node_modules/jito-ts/node_modules/superstruct": { @@ -9561,23 +10674,24 @@ "node": ">=14.0.0" } }, - "node_modules/jito-ts/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/jito-ts/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/jito-ts/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "node_modules/jito-ts/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/joi": { @@ -9626,12 +10740,11 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -9650,11 +10763,6 @@ "bignumber.js": "^9.0.0" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -9710,18 +10818,10 @@ "node": ">=10.0.0" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/ky": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/ky/-/ky-1.7.2.tgz", - "integrity": "sha512-OzIvbHKKDpi60TnF9t7UUVAF1B4mcqc02z5PIvrm08Wyb+yOcz63GRvEuVxNT18a9E1SrNouhB4W2NNLeD7Ykg==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.7.5.tgz", + "integrity": "sha512-HzhziW6sc5m0pwi5M196+7cEBtbt0lCYi67wNsiwMUmz833wloE0gbzJPWKs1gliFKQb34huItDQX97LyOdPdA==", "engines": { "node": ">=18" }, @@ -9744,9 +10844,9 @@ } }, "node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "engines": { "node": ">=14" }, @@ -9789,7 +10889,33 @@ "through": "^2.3.8" }, "engines": { - "node": ">=6" + "node": ">=6" + } + }, + "node_modules/listr-input/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/listr-input/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/listr-input/node_modules/cli-width": { @@ -9800,6 +10926,36 @@ "node": ">= 10" } }, + "node_modules/listr-input/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/listr-input/node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr-input/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/listr-input/node_modules/inquirer": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", @@ -9823,11 +10979,53 @@ "node": ">=8.0.0" } }, + "node_modules/listr-input/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, "node_modules/listr-input/node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, + "node_modules/listr-input/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr-input/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr-input/node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/listr-input/node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -9839,6 +11037,22 @@ "npm": ">=2.0.0" } }, + "node_modules/listr-input/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/listr-input/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/listr-input/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -9912,26 +11126,6 @@ "node": ">=0.8.0" } }, - "node_modules/listr-update-renderer/node_modules/figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", - "dependencies": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/listr-update-renderer/node_modules/indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", - "engines": { - "node": ">=4" - } - }, "node_modules/listr-update-renderer/node_modules/log-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", @@ -9954,14 +11148,6 @@ "node": ">=0.10.0" } }, - "node_modules/listr-update-renderer/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/listr-verbose-renderer": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", @@ -10000,17 +11186,6 @@ "node": ">=4" } }, - "node_modules/listr-verbose-renderer/node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/listr-verbose-renderer/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -10043,50 +11218,6 @@ "node": ">=4" } }, - "node_modules/listr-verbose-renderer/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-verbose-renderer/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-verbose-renderer/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-verbose-renderer/node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-verbose-renderer/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, "node_modules/listr-verbose-renderer/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -10167,7 +11298,8 @@ "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead." }, "node_modules/lodash.sortby": { "version": "4.7.0", @@ -10180,12 +11312,12 @@ "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==" }, "node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.0.tgz", + "integrity": "sha512-zrc91EDk2M+2AXo/9BTvK91pqb7qrPg2nX/Hy+u8a5qQlbaOflCKO+6SqgZ+M+xUFxGdKTgwnGiL96b1W3ikRA==", "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" }, "engines": { "node": ">=18" @@ -10194,17 +11326,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/log-update": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", @@ -10234,17 +11355,6 @@ "node": ">=4" } }, - "node_modules/log-update/node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -10253,42 +11363,6 @@ "node": ">=4" } }, - "node_modules/log-update/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/log-update/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-update/node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-update/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, "node_modules/log-update/node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -10324,10 +11398,22 @@ "node": ">=4" } }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz", + "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -10348,14 +11434,6 @@ "tslib": "^2.0.3" } }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -10366,6 +11444,14 @@ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -10456,17 +11542,6 @@ "node": ">=8.6" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", @@ -10519,14 +11594,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -10717,14 +11784,6 @@ "tweetnacl": "^1.0.2" } }, - "node_modules/near-seed-phrase/node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/near-seed-phrase/node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -10799,26 +11858,28 @@ } }, "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" + "whatwg-url": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "4.x || >=6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/node-gyp-build": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", - "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -10838,49 +11899,49 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dependencies": { + "lru-cache": "^10.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/np": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/np/-/np-10.0.7.tgz", - "integrity": "sha512-vIPKQwOYKpQU40PU5x/vLfN2haj8ObxMvR1QGt7EZnBPWdm4WEbHdumYAnMV7AeR9kACsMqcqAP37sAo5cW5jA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/np/-/np-10.2.0.tgz", + "integrity": "sha512-7Pwk8qcsks2c9ETS35aeJSON6uJAbOsx7TwTFzZNUGgH4djT+Yt/p9S7PZuqH5pkcpNUhasne3cDRBzaUtvetg==", "dependencies": { - "chalk": "^5.3.0", + "chalk": "^5.4.1", "chalk-template": "^1.1.0", "cosmiconfig": "^8.3.6", - "del": "^7.1.0", + "del": "^8.0.0", "escape-goat": "^4.0.0", "escape-string-regexp": "^5.0.0", "execa": "^8.0.1", "exit-hook": "^4.0.0", "github-url-from-git": "^1.5.0", - "hosted-git-info": "^7.0.1", - "ignore-walk": "^6.0.4", - "import-local": "^3.1.0", - "inquirer": "^9.2.15", + "hosted-git-info": "^8.0.2", + "ignore-walk": "^7.0.0", + "import-local": "^3.2.0", + "inquirer": "^12.3.2", "is-installed-globally": "^1.0.0", "is-interactive": "^2.0.0", "is-scoped": "^3.0.0", - "issue-regex": "^4.1.0", + "issue-regex": "^4.3.0", "listr": "^0.14.3", "listr-input": "^0.2.1", - "log-symbols": "^6.0.0", + "log-symbols": "^7.0.0", "meow": "^13.2.0", "new-github-release-url": "^2.0.0", "npm-name": "^8.0.0", "onetime": "^7.0.0", "open": "^10.0.4", "p-memoize": "^7.1.1", - "p-timeout": "^6.1.2", + "p-timeout": "^6.1.4", "path-exists": "^5.0.0", "pkg-dir": "^8.0.0", "read-package-up": "^11.0.0", @@ -10889,12 +11950,13 @@ "semver": "^7.6.0", "symbol-observable": "^4.0.0", "terminal-link": "^3.0.0", - "update-notifier": "^7.0.0" + "update-notifier": "^7.3.1" }, "bin": { "np": "source/cli.js" }, "engines": { + "bun": ">=1", "git": ">=2.11.0", "node": ">=18", "npm": ">=9", @@ -10905,83 +11967,10 @@ "url": "https://github.com/sindresorhus/np?sponsor=1" } }, - "node_modules/np/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/np/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/np/node_modules/inquirer": { - "version": "9.3.7", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.7.tgz", - "integrity": "sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==", - "dependencies": { - "@inquirer/figures": "^1.0.3", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/np/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/np/node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/np/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm": { - "version": "10.9.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.9.0.tgz", - "integrity": "sha512-ZanDioFylI9helNhl2LNd+ErmVD+H5I53ry41ixlLyCBgkuYb+58CvbAp99hW+zr5L9W4X7CchSoeqKdngOLSw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.9.2.tgz", + "integrity": "sha512-iriPEPIkoMYUy3F6f3wwSZAU93E0Eg6cHwIR6jzzOXWSy+SD/rOODEs74cVONHKSx2obXtuUoyidVEhISrisgQ==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -11052,37 +12041,30 @@ "which", "write-file-atomic" ], - "workspaces": [ - "docs", - "smoke-tests", - "mock-globals", - "mock-registry", - "workspaces/*" - ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/arborist": "^8.0.0", "@npmcli/config": "^9.0.0", "@npmcli/fs": "^4.0.0", - "@npmcli/map-workspaces": "^4.0.1", - "@npmcli/package-json": "^6.0.1", - "@npmcli/promise-spawn": "^8.0.1", + "@npmcli/map-workspaces": "^4.0.2", + "@npmcli/package-json": "^6.1.0", + "@npmcli/promise-spawn": "^8.0.2", "@npmcli/redact": "^3.0.0", "@npmcli/run-script": "^9.0.1", - "@sigstore/tuf": "^2.3.4", + "@sigstore/tuf": "^3.0.0", "abbrev": "^3.0.0", "archy": "~1.0.0", "cacache": "^19.0.1", "chalk": "^5.3.0", - "ci-info": "^4.0.0", + "ci-info": "^4.1.0", "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", "glob": "^10.4.5", "graceful-fs": "^4.2.11", - "hosted-git-info": "^8.0.0", + "hosted-git-info": "^8.0.2", "ini": "^5.0.0", - "init-package-json": "^7.0.1", + "init-package-json": "^7.0.2", "is-cidr": "^5.1.0", "json-parse-even-better-errors": "^4.0.0", "libnpmaccess": "^9.0.0", @@ -11092,27 +12074,27 @@ "libnpmhook": "^11.0.0", "libnpmorg": "^7.0.0", "libnpmpack": "^8.0.0", - "libnpmpublish": "^10.0.0", + "libnpmpublish": "^10.0.1", "libnpmsearch": "^8.0.0", "libnpmteam": "^7.0.0", "libnpmversion": "^7.0.0", - "make-fetch-happen": "^14.0.1", + "make-fetch-happen": "^14.0.3", "minimatch": "^9.0.5", "minipass": "^7.1.1", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^10.2.0", + "node-gyp": "^11.0.0", "nopt": "^8.0.0", "normalize-package-data": "^7.0.0", "npm-audit-report": "^6.0.0", - "npm-install-checks": "^7.1.0", + "npm-install-checks": "^7.1.1", "npm-package-arg": "^12.0.0", "npm-pick-manifest": "^10.0.0", "npm-profile": "^11.0.1", - "npm-registry-fetch": "^18.0.1", + "npm-registry-fetch": "^18.0.2", "npm-user-validate": "^3.0.0", "p-map": "^4.0.0", - "pacote": "^19.0.0", + "pacote": "^19.0.1", "parse-conflict-json": "^4.0.0", "proc-log": "^5.0.0", "qrcode-terminal": "^0.12.0", @@ -11159,17 +12141,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-name/node_modules/p-map": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.2.tgz", - "integrity": "sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/npm-package-arg": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", @@ -11184,6 +12155,17 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/npm-run-path": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", @@ -11226,7 +12208,7 @@ } }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "6.1.0", "inBundle": true, "license": "MIT", "engines": { @@ -11414,7 +12396,7 @@ } }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "4.0.1", + "version": "4.0.2", "inBundle": true, "license": "ISC", "dependencies": { @@ -11428,13 +12410,13 @@ } }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "8.0.0", + "version": "8.0.1", "inBundle": true, "license": "ISC", "dependencies": { "cacache": "^19.0.0", "json-parse-even-better-errors": "^4.0.0", - "pacote": "^19.0.0", + "pacote": "^20.0.0", "proc-log": "^5.0.0", "semver": "^7.3.5" }, @@ -11442,287 +12424,142 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "6.0.1", + "node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote": { + "version": "20.0.0", "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/git": "^6.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^8.0.0", - "json-parse-even-better-errors": "^4.0.0", - "normalize-package-data": "^7.0.0", - "proc-log": "^5.0.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "8.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/redact": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "9.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^4.0.0", + "@npmcli/installed-package-contents": "^3.0.0", "@npmcli/package-json": "^6.0.0", "@npmcli/promise-spawn": "^8.0.0", - "node-gyp": "^10.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^9.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", "proc-log": "^5.0.0", - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "2.3.2", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/core": { - "version": "1.1.0", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/sign": { - "version": "2.3.2", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^13.0.1", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent": { - "version": "2.2.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" + "promise-retry": "^2.0.1", + "sigstore": "^3.0.0", + "ssri": "^12.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs": { - "version": "3.1.1", + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "3.0.0", "inBundle": true, "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/@sigstore/sign/node_modules/cacache": { - "version": "18.0.4", + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "4.0.0", "inBundle": true, "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen": { - "version": "13.0.1", + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "6.1.0", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" + "@npmcli/git": "^6.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "normalize-package-data": "^7.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch": { - "version": "3.0.5", + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "8.0.2", "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "which": "^5.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/@sigstore/sign/node_modules/proc-log": { - "version": "4.2.0", + "node_modules/npm/node_modules/@npmcli/query": { + "version": "4.0.0", "inBundle": true, "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.1.2" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/@sigstore/sign/node_modules/ssri": { - "version": "10.0.6", + "node_modules/npm/node_modules/@npmcli/redact": { + "version": "3.0.0", "inBundle": true, "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/@sigstore/sign/node_modules/unique-filename": { - "version": "3.0.0", + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "9.0.2", "inBundle": true, "license": "ISC", "dependencies": { - "unique-slug": "^4.0.0" + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^11.0.0", + "proc-log": "^5.0.0", + "which": "^5.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/@sigstore/sign/node_modules/unique-slug": { - "version": "4.0.0", + "node_modules/npm/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, + "license": "MIT", + "optional": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=14" } }, - "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "2.3.4", + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.3.2", "inBundle": true, "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", - "tuf-js": "^2.2.1" - }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/@sigstore/verify": { - "version": "1.2.1", + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "3.0.0", "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^3.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@tufjs/canonical-json": { @@ -11733,18 +12570,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/@tufjs/models": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, "node_modules/npm/node_modules/abbrev": { "version": "3.0.0", "inBundle": true, @@ -11955,7 +12780,7 @@ } }, "node_modules/npm/node_modules/ci-info": { - "version": "4.0.0", + "version": "4.1.0", "funding": [ { "type": "github", @@ -12029,7 +12854,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/cross-spawn": { - "version": "7.0.3", + "version": "7.0.6", "inBundle": true, "license": "MIT", "dependencies": { @@ -12067,11 +12892,11 @@ } }, "node_modules/npm/node_modules/debug": { - "version": "4.3.6", + "version": "4.3.7", "inBundle": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -12082,11 +12907,6 @@ } } }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/diff": { "version": "5.2.0", "inBundle": true, @@ -12191,7 +13011,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/hosted-git-info": { - "version": "8.0.0", + "version": "8.0.2", "inBundle": true, "license": "ISC", "dependencies": { @@ -12278,7 +13098,7 @@ } }, "node_modules/npm/node_modules/init-package-json": { - "version": "7.0.1", + "version": "7.0.2", "inBundle": true, "license": "ISC", "dependencies": { @@ -12336,11 +13156,6 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/isexe": { "version": "2.0.0", "inBundle": true, @@ -12499,7 +13314,7 @@ } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "10.0.0", + "version": "10.0.1", "inBundle": true, "license": "ISC", "dependencies": { @@ -12509,7 +13324,7 @@ "npm-registry-fetch": "^18.0.1", "proc-log": "^5.0.0", "semver": "^7.3.7", - "sigstore": "^2.2.0", + "sigstore": "^3.0.0", "ssri": "^12.0.0" }, "engines": { @@ -12560,7 +13375,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/make-fetch-happen": { - "version": "14.0.1", + "version": "14.0.3", "inBundle": true, "license": "ISC", "dependencies": { @@ -12571,7 +13386,7 @@ "minipass-fetch": "^4.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", + "negotiator": "^1.0.0", "proc-log": "^5.0.0", "promise-retry": "^2.0.1", "ssri": "^12.0.0" @@ -12580,6 +13395,14 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/npm/node_modules/minimatch": { "version": "9.0.5", "inBundle": true, @@ -12716,244 +13539,123 @@ "yallist": "^4.0.0" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "10.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^4.1.0", - "semver": "^7.3.5", - "tar": "^6.2.1", - "which": "^4.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/agent": { - "version": "2.2.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/fs": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache": { - "version": "18.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/isexe": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=16" + "node": ">= 8" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { - "version": "13.0.1", + "node_modules/npm/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": { - "version": "3.0.5", + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", "inBundle": true, "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "node": ">=10" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "7.2.1", + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "2.0.0", "inBundle": true, "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "11.0.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "abbrev": "^2.0.0" + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "tar": "^7.4.3", + "which": "^5.0.0" }, "bin": { - "nopt": "bin/nopt.js" + "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/proc-log": { - "version": "4.2.0", + "node_modules/npm/node_modules/node-gyp/node_modules/chownr": { + "version": "3.0.0", "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/ssri": { - "version": "10.0.6", + "node_modules/npm/node_modules/node-gyp/node_modules/minizlib": { + "version": "3.0.1", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "minipass": "^7.0.3" + "minipass": "^7.0.4", + "rimraf": "^5.0.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 18" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": { - "version": "3.0.0", + "node_modules/npm/node_modules/node-gyp/node_modules/mkdirp": { + "version": "3.0.1", "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": { - "version": "4.0.0", + "node_modules/npm/node_modules/node-gyp/node_modules/tar": { + "version": "7.4.3", "inBundle": true, "license": "ISC", "dependencies": { - "imurmurhash": "^0.1.4" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/which": { - "version": "4.0.0", + "node_modules/npm/node_modules/node-gyp/node_modules/yallist": { + "version": "5.0.0", "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": ">=18" } }, "node_modules/npm/node_modules/nopt": { @@ -13011,7 +13713,7 @@ } }, "node_modules/npm/node_modules/npm-install-checks": { - "version": "7.1.0", + "version": "7.1.1", "inBundle": true, "license": "BSD-2-Clause", "dependencies": { @@ -13081,7 +13783,7 @@ } }, "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "18.0.1", + "version": "18.0.2", "inBundle": true, "license": "ISC", "dependencies": { @@ -13133,12 +13835,12 @@ } }, "node_modules/npm/node_modules/package-json-from-dist": { - "version": "1.0.0", + "version": "1.0.1", "inBundle": true, "license": "BlueOak-1.0.0" }, "node_modules/npm/node_modules/pacote": { - "version": "19.0.0", + "version": "19.0.1", "inBundle": true, "license": "ISC", "dependencies": { @@ -13156,7 +13858,7 @@ "npm-registry-fetch": "^18.0.0", "proc-log": "^5.0.0", "promise-retry": "^2.0.1", - "sigstore": "^2.2.0", + "sigstore": "^3.0.0", "ssri": "^12.0.0", "tar": "^6.1.11" }, @@ -13240,7 +13942,7 @@ } }, "node_modules/npm/node_modules/promise-call-limit": { - "version": "3.0.1", + "version": "3.0.2", "inBundle": true, "license": "ISC", "funding": { @@ -13383,19 +14085,67 @@ } }, "node_modules/npm/node_modules/sigstore": { - "version": "2.3.1", + "version": "3.0.0", "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", + "@sigstore/bundle": "^3.0.0", + "@sigstore/core": "^2.0.0", "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^2.3.2", - "@sigstore/tuf": "^2.3.4", - "@sigstore/verify": "^1.2.1" + "@sigstore/sign": "^3.0.0", + "@sigstore/tuf": "^3.0.0", + "@sigstore/verify": "^2.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle": { + "version": "3.0.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core": { + "version": "2.0.0", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign": { + "version": "3.0.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.0.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^14.0.1", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify": { + "version": "2.0.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.0.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/smart-buffer": { @@ -13466,7 +14216,7 @@ } }, "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.18", + "version": "3.0.20", "inBundle": true, "license": "CC0-1.0" }, @@ -13542,213 +14292,98 @@ "license": "MIT", "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.2.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/treeverse": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/tuf-js": { - "version": "2.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "2.0.1", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/tuf-js/node_modules/@npmcli/agent": { - "version": "2.2.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/tuf-js/node_modules/@npmcli/fs": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/npm/node_modules/tuf-js/node_modules/cacache": { - "version": "18.0.4", + "node_modules/npm/node_modules/tar": { + "version": "6.2.1", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/npm/node_modules/tuf-js/node_modules/make-fetch-happen": { - "version": "13.0.1", + "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" + "minipass": "^3.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">= 8" } }, - "node_modules/npm/node_modules/tuf-js/node_modules/minipass-fetch": { - "version": "3.0.5", + "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "yallist": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "node": ">=8" } }, - "node_modules/npm/node_modules/tuf-js/node_modules/proc-log": { - "version": "4.2.0", + "node_modules/npm/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/tuf-js/node_modules/ssri": { - "version": "10.0.6", + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", "inBundle": true, "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/tuf-js/node_modules/unique-filename": { - "version": "3.0.0", + "node_modules/npm/node_modules/tuf-js": { + "version": "3.0.1", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "unique-slug": "^4.0.0" + "@tufjs/models": "3.0.1", + "debug": "^4.3.6", + "make-fetch-happen": "^14.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/tuf-js/node_modules/unique-slug": { - "version": "4.0.0", + "node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models": { + "version": "3.0.1", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/unique-filename": { @@ -13879,7 +14514,7 @@ } }, "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "6.1.0", "inBundle": true, "license": "MIT", "engines": { @@ -13976,9 +14611,24 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, "engines": { "node": ">= 0.4" }, @@ -13986,6 +14636,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object-treeify": { "version": "1.1.33", "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", @@ -13994,6 +14652,25 @@ "node": ">= 10" } }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-exit-leak-free": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", @@ -14052,20 +14729,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -14088,6 +14751,40 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/ora/node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -14122,6 +14819,56 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/org-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/org-regex/-/org-regex-1.0.0.tgz", @@ -14138,14 +14885,6 @@ "node": ">=0.10.0" } }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -14172,14 +14911,11 @@ } }, "node_modules/p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "dependencies": { - "aggregate-error": "^4.0.0" - }, + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14212,9 +14948,9 @@ } }, "node_modules/p-timeout": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.3.tgz", - "integrity": "sha512-UJUyfKbwvr/uZSV6btANfb+0t/mOhKV/KXcCUTp8FcQI+v/0d+wXqH4htrW0E4rR6WiEO/EPvUFiV9D5OI4vlw==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", "engines": { "node": ">=14.16" }, @@ -14253,9 +14989,9 @@ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" }, "node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" }, "node_modules/parent-module": { "version": "1.0.1", @@ -14310,14 +15046,6 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -14342,9 +15070,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, "node_modules/path-type": { "version": "4.0.0", @@ -14390,11 +15118,11 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { - "node": ">=12" + "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -14430,10 +15158,33 @@ "split2": "^4.0.0" } }, + "node_modules/pino-abstract-transport/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/pino-abstract-transport/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -14469,10 +15220,33 @@ "pino-pretty": "bin.js" } }, + "node_modules/pino-pretty/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/pino-pretty/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -14484,6 +15258,17 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/pino-pretty/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pino-std-serializers": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", @@ -14516,6 +15301,14 @@ "resolved": "https://registry.npmjs.org/poseidon-lite/-/poseidon-lite-0.2.1.tgz", "integrity": "sha512-xIr+G6HeYfOhCuswdqcFpSX47SPhm0EpisWJ6h7fHlWwaVIvH3dLnejpatrtw6Xc6HaLrpq05y7VRfvDmDGIog==" }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss-load-config": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", @@ -14558,9 +15351,9 @@ } }, "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz", + "integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==", "bin": { "prettier": "bin/prettier.cjs" }, @@ -14771,15 +15564,27 @@ "@solana/web3.js": "^1.91.6" } }, - "node_modules/pumpdotfun-sdk/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node_modules/pumpdotfun-sdk/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, "node_modules/punycode": { @@ -14842,17 +15647,6 @@ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/random-js": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/random-js/-/random-js-2.1.0.tgz", @@ -14903,6 +15697,14 @@ "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -14922,14 +15724,6 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/read-package-up": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", @@ -14947,9 +15741,9 @@ } }, "node_modules/read-package-up/node_modules/type-fest": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", - "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.35.0.tgz", + "integrity": "sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==", "engines": { "node": ">=16" }, @@ -14992,9 +15786,9 @@ } }, "node_modules/read-pkg/node_modules/type-fest": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", - "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.35.0.tgz", + "integrity": "sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==", "engines": { "node": ">=16" }, @@ -15002,6 +15796,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/read-pkg/node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -15016,11 +15821,11 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -15049,9 +15854,9 @@ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", + "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", "dependencies": { "@pnpm/npm-conf": "^2.1.0" }, @@ -15081,11 +15886,6 @@ "node": ">=0.10.0" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", @@ -15113,49 +15913,35 @@ "node": ">=4" } }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dependencies": { - "onetime": "^5.1.0", + "onetime": "^2.0.0", "signal-exit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-fn": "^1.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/restore-cursor/node_modules/signal-exit": { @@ -15180,21 +15966,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -15205,9 +15976,9 @@ } }, "node_modules/rollup": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.2.tgz", - "integrity": "sha512-do/DFGq5g6rdDhdpPq5qb2ecoczeK6y+2UAjdJ5trjQJj5f1AiVdLRWRc9A9/fFukfvJRgM0UXzxBIYMovm5ww==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", + "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", "dependencies": { "@types/estree": "1.0.6" }, @@ -15219,24 +15990,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.2", - "@rollup/rollup-android-arm64": "4.24.2", - "@rollup/rollup-darwin-arm64": "4.24.2", - "@rollup/rollup-darwin-x64": "4.24.2", - "@rollup/rollup-freebsd-arm64": "4.24.2", - "@rollup/rollup-freebsd-x64": "4.24.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.2", - "@rollup/rollup-linux-arm-musleabihf": "4.24.2", - "@rollup/rollup-linux-arm64-gnu": "4.24.2", - "@rollup/rollup-linux-arm64-musl": "4.24.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.2", - "@rollup/rollup-linux-riscv64-gnu": "4.24.2", - "@rollup/rollup-linux-s390x-gnu": "4.24.2", - "@rollup/rollup-linux-x64-gnu": "4.24.2", - "@rollup/rollup-linux-x64-musl": "4.24.2", - "@rollup/rollup-win32-arm64-msvc": "4.24.2", - "@rollup/rollup-win32-ia32-msvc": "4.24.2", - "@rollup/rollup-win32-x64-msvc": "4.24.2", + "@rollup/rollup-android-arm-eabi": "4.34.8", + "@rollup/rollup-android-arm64": "4.34.8", + "@rollup/rollup-darwin-arm64": "4.34.8", + "@rollup/rollup-darwin-x64": "4.34.8", + "@rollup/rollup-freebsd-arm64": "4.34.8", + "@rollup/rollup-freebsd-x64": "4.34.8", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", + "@rollup/rollup-linux-arm-musleabihf": "4.34.8", + "@rollup/rollup-linux-arm64-gnu": "4.34.8", + "@rollup/rollup-linux-arm64-musl": "4.34.8", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", + "@rollup/rollup-linux-riscv64-gnu": "4.34.8", + "@rollup/rollup-linux-s390x-gnu": "4.34.8", + "@rollup/rollup-linux-x64-gnu": "4.34.8", + "@rollup/rollup-linux-x64-musl": "4.34.8", + "@rollup/rollup-win32-arm64-msvc": "4.34.8", + "@rollup/rollup-win32-ia32-msvc": "4.34.8", + "@rollup/rollup-win32-x64-msvc": "4.34.8", "fsevents": "~2.3.2" } }, @@ -15271,9 +16043,9 @@ } }, "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", "engines": { "node": ">=0.12.0" } @@ -15327,6 +16099,22 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-stable-stringify": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", @@ -15371,14 +16159,14 @@ } }, "node_modules/secp256k1/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, "node_modules/secp256k1/node_modules/elliptic": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", - "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -15400,9 +16188,9 @@ "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "bin": { "semver": "bin/semver.js" }, @@ -15480,6 +16268,14 @@ "node": ">=4" } }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/serve-static": { "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", @@ -15547,14 +16343,65 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -15588,27 +16435,22 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "node": ">=0.10.0" } }, "node_modules/snake-case": { @@ -15639,6 +16481,29 @@ "node": ">= 8" } }, + "node_modules/source-map/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/source-map/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/source-map/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -15663,9 +16528,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==" + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==" }, "node_modules/split2": { "version": "4.2.0", @@ -15681,11 +16546,11 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, "node_modules/stream-transform": { @@ -15726,9 +16591,6 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" } }, "node_modules/strip-ansi": { @@ -15749,9 +16611,6 @@ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" } }, "node_modules/strip-final-newline": { @@ -15778,14 +16637,11 @@ } }, "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/stubborn-fs": { @@ -15822,50 +16678,17 @@ "node": ">= 6" } }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/superstruct": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", - "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==" + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" }, "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=0.8.0" } }, "node_modules/supports-hyperlinks": { @@ -15880,6 +16703,14 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/supports-hyperlinks/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -16008,20 +16839,34 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" }, "node_modules/tinyexec": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", - "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" }, "node_modules/tinyglobby": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", - "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", "dependencies": { - "fdir": "^6.4.2", + "fdir": "^6.4.3", "picomatch": "^4.0.2" }, "engines": { "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/tmp": { @@ -16083,12 +16928,9 @@ "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" }, "node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dependencies": { - "punycode": "^2.1.0" - } + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/traverse-chain": { "version": "0.1.0", @@ -16159,14 +17001,14 @@ } }, "node_modules/tslib": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", - "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tsup": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.3.5.tgz", - "integrity": "sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.3.6.tgz", + "integrity": "sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g==", "dependencies": { "bundle-require": "^5.0.0", "cac": "^6.7.14", @@ -16214,9 +17056,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -16229,9 +17071,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -16244,9 +17086,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -16259,9 +17101,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -16274,9 +17116,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -16289,9 +17131,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -16304,9 +17146,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -16319,9 +17161,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -16334,9 +17176,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -16349,9 +17191,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -16364,9 +17206,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -16379,9 +17221,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -16394,9 +17236,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -16409,9 +17251,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -16424,9 +17266,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -16439,9 +17281,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -16454,9 +17296,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -16469,9 +17311,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -16484,9 +17326,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -16499,9 +17341,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -16514,9 +17356,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -16529,9 +17371,9 @@ } }, "node_modules/tsup/node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -16543,24 +17385,10 @@ "node": ">=18" } }, - "node_modules/tsup/node_modules/bundle-require": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.0.0.tgz", - "integrity": "sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==", - "dependencies": { - "load-tsconfig": "^0.2.3" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.18" - } - }, "node_modules/tsup/node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -16569,30 +17397,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/tsup/node_modules/resolve-from": { @@ -16632,9 +17461,9 @@ } }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -16649,9 +17478,9 @@ "integrity": "sha512-7sI4e/bZijOzyURng88oOFZCISQPTHozfE2sUu5AviFYk5QV7fYGb6YiDl+vKjF/pICA354JImBImL9XJWUvdQ==" }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" }, "node_modules/unicode-trie": { "version": "2.0.0", @@ -16662,15 +17491,10 @@ "tiny-inflate": "^1.0.0" } }, - "node_modules/unicode-trie/node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" - }, "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "engines": { "node": ">=18" }, @@ -16709,17 +17533,6 @@ "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/utf-8-validate": { "version": "5.0.10", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", @@ -16738,6 +17551,18 @@ "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16865,9 +17690,9 @@ } }, "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/websocket-iterator": { "version": "1.0.1", @@ -16878,43 +17703,110 @@ } }, "node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/when-exit": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.3.tgz", - "integrity": "sha512-uVieSTccFIr/SFQdFWN/fFaQYmV37OKtuaGphMAzi4DmmUlrvRBJW5WSLkHyjNQY/ePJMz3LoiX9R3yy1Su6Hw==" + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.4.tgz", + "integrity": "sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==" }, "node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dependencies": { - "isexe": "^3.1.1" + "isexe": "^2.0.0" }, "bin": { - "node-which": "bin/which.js" + "node-which": "bin/node-which" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", "dependencies": { - "string-width": "^4.0.0" + "string-width": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/wordwrap": { @@ -16947,12 +17839,6 @@ "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrappy": { @@ -17050,6 +17936,17 @@ "node": ">=6" } }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/yoctocolors-cjs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", diff --git a/package.json b/package.json index 9ca4b67..b26e25b 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,8 @@ "random-js": "^2.1.0", "rpc-websockets": "7.10.0", "@triton-one/yellowstone-grpc": "^0.4.0", - "jito-ts": "^4.0.0" + "jito-ts": "^4.0.0", + "async-mutex": "^0.5.0" }, "devDependencies": { "typescript": "^5.5.4" @@ -61,4 +62,4 @@ "engines": { "node": "22.2.0" } -} \ No newline at end of file +} diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/token-cache.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/token-cache.ts new file mode 100644 index 0000000..d5cd725 --- /dev/null +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/token-cache.ts @@ -0,0 +1,25 @@ + +export class BoughtCache { + private readonly keys: Map = new Map< + string, + { tokenAddress: string; isCached: boolean } + >(); + + public save(tokenAddress: string, isCached: boolean) { + if (!this.keys.has(tokenAddress)) { + console.log(`Caching new bought token: ${tokenAddress}`); + this.keys.set(tokenAddress, { tokenAddress, isCached }); + } + } + + public async get(mint: string): Promise<{ tokenAddress: string; isCached: boolean } | undefined> { + return this.keys.get(mint)!; + } + + public async deleteKey(mint: string): Promise { + return this.keys.delete(mint); + } + + + +} diff --git a/src/grpc_streaming_dev/grpc-raydium-sniper/src/transaction/transaction.ts b/src/grpc_streaming_dev/grpc-raydium-sniper/src/transaction/transaction.ts index e7f8e63..16b94c9 100755 --- a/src/grpc_streaming_dev/grpc-raydium-sniper/src/transaction/transaction.ts +++ b/src/grpc_streaming_dev/grpc-raydium-sniper/src/transaction/transaction.ts @@ -40,6 +40,11 @@ import { MinimalMarketLayoutV3, getMinimalMarketV3 } from "../market"; import { createPoolKeys, getTokenAccounts } from "../liquidity"; import { populateJitoLeaderArray } from "../streaming/raydium"; import { retrieveEnvVariable } from "../utils"; +import {sendNozomiTx} from "../../../../transactions/nozomi/tx-submission"; +import {BoughtCache} from "../token-cache"; +import { Mutex } from 'async-mutex'; +let mutexForSnipe = new Mutex(); +let boughtCache = new BoughtCache(); let wallet: Keypair; let quoteToken: Token; @@ -167,14 +172,27 @@ export async function buy( tokenType: string ): Promise { try { + if(mutexForSnipe.isLocked()) { + logger.debug( "Skipping buy because one token at a time and token is already being processed"); + //writeLineToBundleBuyBotFile(`Skipping buy because one token at a time and token is already being processed, token: ${tokenAddress}, percentage: ${percentage}`); + return; + } let ata:any = null; - if (tokenType === "pump") + let target_token = ""; + if (tokenType === "pump"){ ata = getAssociatedTokenAddressSync( poolState.quoteMint, wallet.publicKey ); - else + target_token = poolState.quoteMint.toBase58(); + } + else{ ata = getAssociatedTokenAddressSync(poolState.baseMint, wallet.publicKey); + target_token = poolState.baseMint.toBase58(); + } + const exists = await boughtCache.get(target_token); + if(exists) { logger.debug("Skipping buy because token is already bought");return;} + await mutexForSnipe.acquire(); // one token at a time const poolKeys = createPoolKeys(newTokenAccount, poolState, marketDetails!); const { innerTransaction } = Liquidity.makeSwapFixedInInstruction( { @@ -190,26 +208,28 @@ export async function buy( poolKeys.version ); + const ix_list = [ + ...[ + ComputeBudgetProgram.setComputeUnitLimit({ + units: 80000, + }), + ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: 0.004 * LAMPORTS_PER_SOL, + }), + ], + createAssociatedTokenAccountIdempotentInstruction( + wallet.publicKey, + ata, + wallet.publicKey, + tokenType == "pump" ? poolState.quoteMint : poolState.baseMint + ), + ...innerTransaction.instructions, + ]; + const messageV0 = new TransactionMessage({ payerKey: wallet.publicKey, recentBlockhash: latestBlockhash, - instructions: [ - ...[ - ComputeBudgetProgram.setComputeUnitLimit({ - units: 80000, - }), - ComputeBudgetProgram.setComputeUnitPrice({ - microLamports: 0.04 * LAMPORTS_PER_SOL, - }), - ], - createAssociatedTokenAccountIdempotentInstruction( - wallet.publicKey, - ata, - wallet.publicKey, - tokenType == "pump" ? poolState.quoteMint : poolState.baseMint - ), - ...innerTransaction.instructions, - ], + instructions: ix_list, }).compileToV0Message(); let commitment: Commitment = retrieveEnvVariable( @@ -221,6 +241,9 @@ export async function buy( transaction.sign([wallet, ...innerTransaction.signers]); + // uncomment if you want to land ur buy though nozomi + //sendNozomiTx(ix_list, wallet, latestBlockhash, "RAY", "Buy"); + //await sleep(30000); /*const signature = await solanaConnection.sendRawTransaction(transaction.serialize(), { @@ -232,20 +255,24 @@ export async function buy( // if(tokenType==="pump") sendBundle(latestBlockhash, messageV0, poolState.quoteMint); // else sendBundle(latestBlockhash, messageV0, poolState.baseMint); - if (tokenType === "pump") + if (tokenType === "pump"){ simple_executeAndConfirm( transaction, wallet, latestBlockhash, poolState.quoteMint.toBase58() ); - else + } + else{ simple_executeAndConfirm( transaction, wallet, latestBlockhash, poolState.baseMint.toBase58() ); + } + boughtCache.save(target_token, true); + mutexForSnipe.release(); } catch (error) { logger.error(error); } diff --git a/src/helpers/config.ts b/src/helpers/config.ts index 313eab6..4ef2a19 100644 --- a/src/helpers/config.ts +++ b/src/helpers/config.ts @@ -23,7 +23,7 @@ export function loadKeypairFromFile(filename: string) { const secret = fs.readFileSync(filename, { encoding: "utf8" }); return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(secret))); } -export const jito_fee = process.env.JITO_FEE; // 0.00009 SOL +export const jito_fee:any = process.env.JITO_FEE; // 0.00009 SOL export const shyft_api_key = process.env.SHYFT_API_KEY; // your shyft api key export const wallet = Keypair.fromSecretKey( bs58.decode(process.env.PRIVATE_KEY || "") diff --git a/src/transactions/nozomi/tx-submission.ts b/src/transactions/nozomi/tx-submission.ts new file mode 100644 index 0000000..c7bd325 --- /dev/null +++ b/src/transactions/nozomi/tx-submission.ts @@ -0,0 +1,117 @@ + +import { PublicKey, TransactionInstruction, Keypair, Connection, SystemProgram, Transaction, LAMPORTS_PER_SOL } from "@solana/web3.js"; +import {connection, jito_fee} from "../../helpers/config"; +import bs58 from "bs58"; +import axios from "axios"; +export const nozomi_connection = new Connection("https://ams1.secure.nozomi.temporal.xyz/?c=YOUR_API_KEY"); // +// Define constants +const NOZOMI_TIP = new PublicKey("TEMPaMeCRFAS9EKF53Jd6KpHxgL47uWLcpFArU1Fanq"); +const MIN_TIP_AMOUNT = 1_000_000; + +const listOfValidators = [ + "TEMPaMeCRFAS9EKF53Jd6KpHxgL47uWLcpFArU1Fanq", +"noz3jAjPiHuBPqiSPkkugaJDkJscPuRhYnSpbi8UvC4", +"noz3str9KXfpKknefHji8L1mPgimezaiUyCHYMDv1GE", +"noz6uoYCDijhu1V7cutCpwxNiSovEwLdRHPwmgCGDNo", +"noz9EPNcT7WH6Sou3sr3GGjHQYVkN3DNirpbvDkv9YJ", +"nozc5yT15LazbLTFVZzoNZCwjh3yUtW86LoUyqsBu4L", +"nozFrhfnNGoyqwVuwPAW4aaGqempx4PU6g6D9CJMv7Z", +"nozievPk7HyK1Rqy1MPJwVQ7qQg2QoJGyP71oeDwbsu", +"noznbgwYnBLDHu8wcQVCEw6kDrXkPdKkydGJGNXGvL7", +"nozNVWs5N8mgzuD3qigrCG2UoKxZttxzZ85pvAQVrbP", +"nozpEGbwx4BcGp6pvEdAh1JoC2CQGZdU6HbNP1v2p6P", +"nozrhjhkCr3zXT3BiT4WCodYCUFeQvcdUkM7MqhKqge", +"nozrwQtWhEdrA6W8dkbt9gnUaMs52PdAv5byipnadq3", +"nozUacTVWub3cL4mJmGCYjKZTnE9RbdY5AP46iQgbPJ", +"nozWCyTPppJjRuw2fpzDhhWbW355fzosWSzrrMYB1Qk", +"nozWNju6dY353eMkMqURqwQEoM3SFgEKC6psLCSfUne", +"nozxNBgWohjR75vdspfxR5H9ceC7XXH99xpxhVGt3Bb" + +] +const nozomi_url = "http://ams1.nozomi.temporal.xyz/?c="; // i'm using ams Direct HTTP here, please change if needed +// Direct HTTP +// PITT: http://pit1.nozomi.temporal.xyz/?c= + +// EWR: http://ewr1.nozomi.temporal.xyz/?c= + +// AMS: http://ams1.nozomi.temporal.xyz/?c= + +// FRA: http://fra2.nozomi.temporal.xyz/?c= + +// Secure HTTPS: +// AMS: https://ams1.secure.nozomi.temporal.xyz/?c= + +// EWR: https://ewr1.secure.nozomi.temporal.xyz/?c= + +// PITT: https://pit1.secure.nozomi.temporal.xyz/?c= + +// FRA: https://fra2.secure.nozomi.temporal.xyz/?c= + +// put your nozomi low latency api keys here. +const low_latency_api_key = [ + "YOUR_NOZOMI_LOW_LATENCY_API_KEY" + +] +export async function getRamdomValidator() { + const randomIndex = Math.floor(Math.random() * listOfValidators.length); + return new PublicKey(listOfValidators[randomIndex]); +} +export async function getRandomNozomiAPIKey() { + const randomIndex = Math.floor(Math.random() * low_latency_api_key.length); + return low_latency_api_key[randomIndex]; +} +export async function sendNozomiTx( + ixs: any[], + signer: Keypair, + blockhash:any, + dex:string, + buyOrSell:string, +): Promise { + const validator = await getRamdomValidator(); + console.log("signer", signer.publicKey.toBase58()); + console.log("Sending tip to", validator.toBase58()); + // Create transfer instruction + let tips = parseFloat(jito_fee); + const tipIx = SystemProgram.transfer({ + fromPubkey: signer.publicKey, + toPubkey: validator, + lamports: tips*LAMPORTS_PER_SOL, + }); + ixs.push(tipIx); + + // Get the latest blockhash + + // Create transaction and sign it + const tx = new Transaction().add(...ixs); + if(typeof blockhash === "string") { + tx.recentBlockhash = blockhash; + }else{ + tx.recentBlockhash = blockhash.blockhash; + tx.lastValidBlockHeight = blockhash.lastValidBlockHeight + } + tx.feePayer = signer.publicKey; + tx.sign(signer); + console.log(tx); + const b64Tx = Buffer.from(tx.serialize()).toString('base64'); + const url_request = `${nozomi_url}${await getRandomNozomiAPIKey()}`; + let request; + try{ + request = await axios.post(url_request, { + jsonrpc: "2.0", + id: 1, + method: "sendTransaction", + params: [ + b64Tx, + { "encoding": "base64" } + ] + }); + + } catch (error) { + console.log(`error sending tx to Nozomi: ${error}`); + + } + + console.log("Transaction sent with signature:", request); + +} + From 38597d49449102f0cc9bbbb8f1642c07a44aab63 Mon Sep 17 00:00:00 2001 From: Tiger0202 Date: Thu, 20 Feb 2025 13:38:51 +0800 Subject: [PATCH 140/140] introduced Nozomi - optimized tx landing method --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0539e1a..048682e 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ **Solana Trading CLI** is a free, highly efficient library designed to facilitate rapid development of custom trading strategies across multiple Solana DEXs. It emphasizes low-latency performance, flexibility, and real-time data processing, utilizing cutting-edge infrastructure. These features ensure the following benefits: -* **Speed:** Leverages low-latency infrastructures like Jito and BloXroute to minimize trade execution times, giving your strategies a competitive edge. +* **Speed:** Leverages low-latency infrastructures like Jito, BloXroute, and Nozomi to minimize trade execution times, giving your strategies a competitive edge. * **Versatility:** Supports multiple DEXs like Raydium, Orca, Meteora, and Pump.fun, allowing for diverse trading opportunities. * **Real-time Insights:** Fetches current state of an account using RPC, streams the latest transactions of accounts using geyser gRPC @@ -44,6 +44,7 @@ Accelerate transaction finality using Jito and bloXroute for lightning-fast trad |----------|---------------| | Jito | Fast trascation and optimizes transaction ordering and execution specifically | | Bloxroute | Fast trascation and accelerates transaction propagation | +| Nozomi | Optimzed tx spamming and submission to current blockleader | ### Real-Time Market Data Fetch critical metrics for any liquidity pool in real-time with RPC calls: