mirror of
https://github.com/fdundjer/solana-sniper-bot.git
synced 2025-11-22 20:51:10 +10:00
tsc & prettier
This commit is contained in:
63
helpers/constants.js
Normal file
63
helpers/constants.js
Normal file
@ -0,0 +1,63 @@
|
||||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.SNIPE_LIST_REFRESH_INTERVAL = exports.USE_SNIPE_LIST = exports.MAX_POOL_SIZE = exports.MIN_POOL_SIZE = exports.CHECK_IF_BURNED = exports.CHECK_IF_FREEZABLE = exports.CHECK_IF_MINT_IS_RENOUNCED = exports.CHECK_IF_SOCIALS = exports.CHECK_IF_MUTABLE = exports.CONSECUTIVE_FILTER_MATCHES = exports.FILTER_CHECK_DURATION = exports.FILTER_CHECK_INTERVAL = exports.SKIP_SELLING_IF_LOST_MORE_THAN = exports.SELL_SLIPPAGE = exports.PRICE_CHECK_DURATION = exports.PRICE_CHECK_INTERVAL = exports.TRAILING_STOP_LOSS = exports.STOP_LOSS = exports.TAKE_PROFIT = exports.MAX_SELL_RETRIES = exports.AUTO_SELL_DELAY = exports.AUTO_SELL = exports.BUY_SLIPPAGE = exports.MAX_BUY_RETRIES = exports.QUOTE_AMOUNT = exports.QUOTE_MINT = exports.AUTO_BUY_DELAY = exports.CUSTOM_FEE = exports.TRANSACTION_EXECUTOR = exports.CACHE_NEW_MARKETS = exports.PRE_LOAD_EXISTING_MARKETS = exports.COMPUTE_UNIT_PRICE = exports.COMPUTE_UNIT_LIMIT = exports.MAX_TOKENS_AT_THE_TIME = exports.LOG_LEVEL = exports.RPC_WEBSOCKET_ENDPOINT = exports.RPC_ENDPOINT = exports.COMMITMENT_LEVEL = exports.NETWORK = exports.PRIVATE_KEY = void 0;
|
||||
const dotenv_1 = __importDefault(require("dotenv"));
|
||||
const logger_1 = require("./logger");
|
||||
dotenv_1.default.config();
|
||||
const retrieveEnvVariable = (variableName, logger) => {
|
||||
const variable = process.env[variableName] || "";
|
||||
if (!variable) {
|
||||
logger.error(`${variableName} is not set`);
|
||||
process.exit(1);
|
||||
}
|
||||
return variable;
|
||||
};
|
||||
// Wallet
|
||||
exports.PRIVATE_KEY = retrieveEnvVariable("PRIVATE_KEY", logger_1.logger);
|
||||
// Connection
|
||||
exports.NETWORK = "mainnet-beta";
|
||||
exports.COMMITMENT_LEVEL = retrieveEnvVariable("COMMITMENT_LEVEL", logger_1.logger);
|
||||
exports.RPC_ENDPOINT = retrieveEnvVariable("RPC_ENDPOINT", logger_1.logger);
|
||||
exports.RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable("RPC_WEBSOCKET_ENDPOINT", logger_1.logger);
|
||||
// Bot
|
||||
exports.LOG_LEVEL = retrieveEnvVariable("LOG_LEVEL", logger_1.logger);
|
||||
exports.MAX_TOKENS_AT_THE_TIME = Number(retrieveEnvVariable("MAX_TOKENS_AT_THE_TIME", logger_1.logger));
|
||||
exports.COMPUTE_UNIT_LIMIT = Number(retrieveEnvVariable("COMPUTE_UNIT_LIMIT", logger_1.logger));
|
||||
exports.COMPUTE_UNIT_PRICE = Number(retrieveEnvVariable("COMPUTE_UNIT_PRICE", logger_1.logger));
|
||||
exports.PRE_LOAD_EXISTING_MARKETS = retrieveEnvVariable("PRE_LOAD_EXISTING_MARKETS", logger_1.logger) === "true";
|
||||
exports.CACHE_NEW_MARKETS = retrieveEnvVariable("CACHE_NEW_MARKETS", logger_1.logger) === "true";
|
||||
exports.TRANSACTION_EXECUTOR = retrieveEnvVariable("TRANSACTION_EXECUTOR", logger_1.logger);
|
||||
exports.CUSTOM_FEE = retrieveEnvVariable("CUSTOM_FEE", logger_1.logger);
|
||||
// Buy
|
||||
exports.AUTO_BUY_DELAY = Number(retrieveEnvVariable("AUTO_BUY_DELAY", logger_1.logger));
|
||||
exports.QUOTE_MINT = retrieveEnvVariable("QUOTE_MINT", logger_1.logger);
|
||||
exports.QUOTE_AMOUNT = retrieveEnvVariable("QUOTE_AMOUNT", logger_1.logger);
|
||||
exports.MAX_BUY_RETRIES = Number(retrieveEnvVariable("MAX_BUY_RETRIES", logger_1.logger));
|
||||
exports.BUY_SLIPPAGE = Number(retrieveEnvVariable("BUY_SLIPPAGE", logger_1.logger));
|
||||
// Sell
|
||||
exports.AUTO_SELL = retrieveEnvVariable("AUTO_SELL", logger_1.logger) === "true";
|
||||
exports.AUTO_SELL_DELAY = Number(retrieveEnvVariable("AUTO_SELL_DELAY", logger_1.logger));
|
||||
exports.MAX_SELL_RETRIES = Number(retrieveEnvVariable("MAX_SELL_RETRIES", logger_1.logger));
|
||||
exports.TAKE_PROFIT = Number(retrieveEnvVariable("TAKE_PROFIT", logger_1.logger));
|
||||
exports.STOP_LOSS = Number(retrieveEnvVariable("STOP_LOSS", logger_1.logger));
|
||||
exports.TRAILING_STOP_LOSS = retrieveEnvVariable("TRAILING_STOP_LOSS", logger_1.logger) === "true";
|
||||
exports.PRICE_CHECK_INTERVAL = Number(retrieveEnvVariable("PRICE_CHECK_INTERVAL", logger_1.logger));
|
||||
exports.PRICE_CHECK_DURATION = Number(retrieveEnvVariable("PRICE_CHECK_DURATION", logger_1.logger));
|
||||
exports.SELL_SLIPPAGE = Number(retrieveEnvVariable("SELL_SLIPPAGE", logger_1.logger));
|
||||
exports.SKIP_SELLING_IF_LOST_MORE_THAN = Number(retrieveEnvVariable("SKIP_SELLING_IF_LOST_MORE_THAN", logger_1.logger));
|
||||
// Filters
|
||||
exports.FILTER_CHECK_INTERVAL = Number(retrieveEnvVariable("FILTER_CHECK_INTERVAL", logger_1.logger));
|
||||
exports.FILTER_CHECK_DURATION = Number(retrieveEnvVariable("FILTER_CHECK_DURATION", logger_1.logger));
|
||||
exports.CONSECUTIVE_FILTER_MATCHES = Number(retrieveEnvVariable("CONSECUTIVE_FILTER_MATCHES", logger_1.logger));
|
||||
exports.CHECK_IF_MUTABLE = retrieveEnvVariable("CHECK_IF_MUTABLE", logger_1.logger) === "true";
|
||||
exports.CHECK_IF_SOCIALS = retrieveEnvVariable("CHECK_IF_SOCIALS", logger_1.logger) === "true";
|
||||
exports.CHECK_IF_MINT_IS_RENOUNCED = retrieveEnvVariable("CHECK_IF_MINT_IS_RENOUNCED", logger_1.logger) === "true";
|
||||
exports.CHECK_IF_FREEZABLE = retrieveEnvVariable("CHECK_IF_FREEZABLE", logger_1.logger) === "true";
|
||||
exports.CHECK_IF_BURNED = retrieveEnvVariable("CHECK_IF_BURNED", logger_1.logger) === "true";
|
||||
exports.MIN_POOL_SIZE = retrieveEnvVariable("MIN_POOL_SIZE", logger_1.logger);
|
||||
exports.MAX_POOL_SIZE = retrieveEnvVariable("MAX_POOL_SIZE", logger_1.logger);
|
||||
exports.USE_SNIPE_LIST = retrieveEnvVariable("USE_SNIPE_LIST", logger_1.logger) === "true";
|
||||
exports.SNIPE_LIST_REFRESH_INTERVAL = Number(retrieveEnvVariable("SNIPE_LIST_REFRESH_INTERVAL", logger_1.logger));
|
||||
@ -1,67 +1,67 @@
|
||||
import { Logger } from 'pino';
|
||||
import dotenv from 'dotenv';
|
||||
import { Commitment } from '@solana/web3.js';
|
||||
import { logger } from './logger';
|
||||
import { Logger } from "pino";
|
||||
import dotenv from "dotenv";
|
||||
import { Commitment } from "@solana/web3.js";
|
||||
import { logger } from "./logger";
|
||||
|
||||
dotenv.config();
|
||||
|
||||
const retrieveEnvVariable = (variableName: string, logger: Logger) => {
|
||||
const variable = process.env[variableName] || '';
|
||||
if (!variable) {
|
||||
logger.error(`${variableName} is not set`);
|
||||
process.exit(1);
|
||||
}
|
||||
return variable;
|
||||
const variable = process.env[variableName] || "";
|
||||
if (!variable) {
|
||||
logger.error(`${variableName} is not set`);
|
||||
process.exit(1);
|
||||
}
|
||||
return variable;
|
||||
};
|
||||
|
||||
// Wallet
|
||||
export const PRIVATE_KEY = retrieveEnvVariable('PRIVATE_KEY', logger);
|
||||
export const PRIVATE_KEY = retrieveEnvVariable("PRIVATE_KEY", logger);
|
||||
|
||||
// Connection
|
||||
export const NETWORK = 'mainnet-beta';
|
||||
export const COMMITMENT_LEVEL: Commitment = retrieveEnvVariable('COMMITMENT_LEVEL', logger) as Commitment;
|
||||
export const RPC_ENDPOINT = retrieveEnvVariable('RPC_ENDPOINT', logger);
|
||||
export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable('RPC_WEBSOCKET_ENDPOINT', logger);
|
||||
export const NETWORK = "mainnet-beta";
|
||||
export const COMMITMENT_LEVEL: Commitment = retrieveEnvVariable("COMMITMENT_LEVEL", logger) as Commitment;
|
||||
export const RPC_ENDPOINT = retrieveEnvVariable("RPC_ENDPOINT", logger);
|
||||
export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable("RPC_WEBSOCKET_ENDPOINT", logger);
|
||||
|
||||
// Bot
|
||||
export const LOG_LEVEL = retrieveEnvVariable('LOG_LEVEL', logger);
|
||||
export const MAX_TOKENS_AT_THE_TIME = Number(retrieveEnvVariable('MAX_TOKENS_AT_THE_TIME', logger));
|
||||
export const COMPUTE_UNIT_LIMIT = Number(retrieveEnvVariable('COMPUTE_UNIT_LIMIT', logger));
|
||||
export const COMPUTE_UNIT_PRICE = Number(retrieveEnvVariable('COMPUTE_UNIT_PRICE', logger));
|
||||
export const PRE_LOAD_EXISTING_MARKETS = retrieveEnvVariable('PRE_LOAD_EXISTING_MARKETS', logger) === 'true';
|
||||
export const CACHE_NEW_MARKETS = retrieveEnvVariable('CACHE_NEW_MARKETS', logger) === 'true';
|
||||
export const TRANSACTION_EXECUTOR = retrieveEnvVariable('TRANSACTION_EXECUTOR', logger);
|
||||
export const CUSTOM_FEE = retrieveEnvVariable('CUSTOM_FEE', logger);
|
||||
export const LOG_LEVEL = retrieveEnvVariable("LOG_LEVEL", logger);
|
||||
export const MAX_TOKENS_AT_THE_TIME = Number(retrieveEnvVariable("MAX_TOKENS_AT_THE_TIME", logger));
|
||||
export const COMPUTE_UNIT_LIMIT = Number(retrieveEnvVariable("COMPUTE_UNIT_LIMIT", logger));
|
||||
export const COMPUTE_UNIT_PRICE = Number(retrieveEnvVariable("COMPUTE_UNIT_PRICE", logger));
|
||||
export const PRE_LOAD_EXISTING_MARKETS = retrieveEnvVariable("PRE_LOAD_EXISTING_MARKETS", logger) === "true";
|
||||
export const CACHE_NEW_MARKETS = retrieveEnvVariable("CACHE_NEW_MARKETS", logger) === "true";
|
||||
export const TRANSACTION_EXECUTOR = retrieveEnvVariable("TRANSACTION_EXECUTOR", logger);
|
||||
export const CUSTOM_FEE = retrieveEnvVariable("CUSTOM_FEE", logger);
|
||||
|
||||
// Buy
|
||||
export const AUTO_BUY_DELAY = Number(retrieveEnvVariable('AUTO_BUY_DELAY', logger));
|
||||
export const QUOTE_MINT = retrieveEnvVariable('QUOTE_MINT', logger);
|
||||
export const QUOTE_AMOUNT = retrieveEnvVariable('QUOTE_AMOUNT', logger);
|
||||
export const MAX_BUY_RETRIES = Number(retrieveEnvVariable('MAX_BUY_RETRIES', logger));
|
||||
export const BUY_SLIPPAGE = Number(retrieveEnvVariable('BUY_SLIPPAGE', logger));
|
||||
export const AUTO_BUY_DELAY = Number(retrieveEnvVariable("AUTO_BUY_DELAY", logger));
|
||||
export const QUOTE_MINT = retrieveEnvVariable("QUOTE_MINT", logger);
|
||||
export const QUOTE_AMOUNT = retrieveEnvVariable("QUOTE_AMOUNT", logger);
|
||||
export const MAX_BUY_RETRIES = Number(retrieveEnvVariable("MAX_BUY_RETRIES", logger));
|
||||
export const BUY_SLIPPAGE = Number(retrieveEnvVariable("BUY_SLIPPAGE", logger));
|
||||
|
||||
// Sell
|
||||
export const AUTO_SELL = retrieveEnvVariable('AUTO_SELL', logger) === 'true';
|
||||
export const AUTO_SELL_DELAY = Number(retrieveEnvVariable('AUTO_SELL_DELAY', logger));
|
||||
export const MAX_SELL_RETRIES = Number(retrieveEnvVariable('MAX_SELL_RETRIES', logger));
|
||||
export const TAKE_PROFIT = Number(retrieveEnvVariable('TAKE_PROFIT', logger));
|
||||
export const STOP_LOSS = Number(retrieveEnvVariable('STOP_LOSS', logger));
|
||||
export const TRAILING_STOP_LOSS = retrieveEnvVariable('TRAILING_STOP_LOSS', logger) === 'true';
|
||||
export const PRICE_CHECK_INTERVAL = Number(retrieveEnvVariable('PRICE_CHECK_INTERVAL', logger));
|
||||
export const PRICE_CHECK_DURATION = Number(retrieveEnvVariable('PRICE_CHECK_DURATION', logger));
|
||||
export const SELL_SLIPPAGE = Number(retrieveEnvVariable('SELL_SLIPPAGE', logger));
|
||||
export const SKIP_SELLING_IF_LOST_MORE_THAN = Number(retrieveEnvVariable('SKIP_SELLING_IF_LOST_MORE_THAN', logger));
|
||||
export const AUTO_SELL = retrieveEnvVariable("AUTO_SELL", logger) === "true";
|
||||
export const AUTO_SELL_DELAY = Number(retrieveEnvVariable("AUTO_SELL_DELAY", logger));
|
||||
export const MAX_SELL_RETRIES = Number(retrieveEnvVariable("MAX_SELL_RETRIES", logger));
|
||||
export const TAKE_PROFIT = Number(retrieveEnvVariable("TAKE_PROFIT", logger));
|
||||
export const STOP_LOSS = Number(retrieveEnvVariable("STOP_LOSS", logger));
|
||||
export const TRAILING_STOP_LOSS = retrieveEnvVariable("TRAILING_STOP_LOSS", logger) === "true";
|
||||
export const PRICE_CHECK_INTERVAL = Number(retrieveEnvVariable("PRICE_CHECK_INTERVAL", logger));
|
||||
export const PRICE_CHECK_DURATION = Number(retrieveEnvVariable("PRICE_CHECK_DURATION", logger));
|
||||
export const SELL_SLIPPAGE = Number(retrieveEnvVariable("SELL_SLIPPAGE", logger));
|
||||
export const SKIP_SELLING_IF_LOST_MORE_THAN = Number(retrieveEnvVariable("SKIP_SELLING_IF_LOST_MORE_THAN", logger));
|
||||
|
||||
// Filters
|
||||
export const FILTER_CHECK_INTERVAL = Number(retrieveEnvVariable('FILTER_CHECK_INTERVAL', logger));
|
||||
export const FILTER_CHECK_DURATION = Number(retrieveEnvVariable('FILTER_CHECK_DURATION', logger));
|
||||
export const CONSECUTIVE_FILTER_MATCHES = Number(retrieveEnvVariable('CONSECUTIVE_FILTER_MATCHES', logger));
|
||||
export const CHECK_IF_MUTABLE = retrieveEnvVariable('CHECK_IF_MUTABLE', logger) === 'true';
|
||||
export const CHECK_IF_SOCIALS = retrieveEnvVariable('CHECK_IF_SOCIALS', logger) === 'true';
|
||||
export const CHECK_IF_MINT_IS_RENOUNCED = retrieveEnvVariable('CHECK_IF_MINT_IS_RENOUNCED', logger) === 'true';
|
||||
export const CHECK_IF_FREEZABLE = retrieveEnvVariable('CHECK_IF_FREEZABLE', logger) === 'true';
|
||||
export const CHECK_IF_BURNED = retrieveEnvVariable('CHECK_IF_BURNED', logger) === 'true';
|
||||
export const MIN_POOL_SIZE = retrieveEnvVariable('MIN_POOL_SIZE', logger);
|
||||
export const MAX_POOL_SIZE = retrieveEnvVariable('MAX_POOL_SIZE', logger);
|
||||
export const USE_SNIPE_LIST = retrieveEnvVariable('USE_SNIPE_LIST', logger) === 'true';
|
||||
export const SNIPE_LIST_REFRESH_INTERVAL = Number(retrieveEnvVariable('SNIPE_LIST_REFRESH_INTERVAL', logger));
|
||||
export const FILTER_CHECK_INTERVAL = Number(retrieveEnvVariable("FILTER_CHECK_INTERVAL", logger));
|
||||
export const FILTER_CHECK_DURATION = Number(retrieveEnvVariable("FILTER_CHECK_DURATION", logger));
|
||||
export const CONSECUTIVE_FILTER_MATCHES = Number(retrieveEnvVariable("CONSECUTIVE_FILTER_MATCHES", logger));
|
||||
export const CHECK_IF_MUTABLE = retrieveEnvVariable("CHECK_IF_MUTABLE", logger) === "true";
|
||||
export const CHECK_IF_SOCIALS = retrieveEnvVariable("CHECK_IF_SOCIALS", logger) === "true";
|
||||
export const CHECK_IF_MINT_IS_RENOUNCED = retrieveEnvVariable("CHECK_IF_MINT_IS_RENOUNCED", logger) === "true";
|
||||
export const CHECK_IF_FREEZABLE = retrieveEnvVariable("CHECK_IF_FREEZABLE", logger) === "true";
|
||||
export const CHECK_IF_BURNED = retrieveEnvVariable("CHECK_IF_BURNED", logger) === "true";
|
||||
export const MIN_POOL_SIZE = retrieveEnvVariable("MIN_POOL_SIZE", logger);
|
||||
export const MAX_POOL_SIZE = retrieveEnvVariable("MAX_POOL_SIZE", logger);
|
||||
export const USE_SNIPE_LIST = retrieveEnvVariable("USE_SNIPE_LIST", logger) === "true";
|
||||
export const SNIPE_LIST_REFRESH_INTERVAL = Number(retrieveEnvVariable("SNIPE_LIST_REFRESH_INTERVAL", logger));
|
||||
|
||||
23
helpers/index.js
Normal file
23
helpers/index.js
Normal file
@ -0,0 +1,23 @@
|
||||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
||||
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
__exportStar(require("./market"), exports);
|
||||
__exportStar(require("./liquidity"), exports);
|
||||
__exportStar(require("./logger"), exports);
|
||||
__exportStar(require("./constants"), exports);
|
||||
__exportStar(require("./token"), exports);
|
||||
__exportStar(require("./wallet"), exports);
|
||||
__exportStar(require("./promises"), exports);
|
||||
@ -1,7 +1,7 @@
|
||||
export * from './market';
|
||||
export * from './liquidity';
|
||||
export * from './logger';
|
||||
export * from './constants';
|
||||
export * from './token';
|
||||
export * from './wallet';
|
||||
export * from './promises'
|
||||
export * from "./market";
|
||||
export * from "./liquidity";
|
||||
export * from "./logger";
|
||||
export * from "./constants";
|
||||
export * from "./token";
|
||||
export * from "./wallet";
|
||||
export * from "./promises";
|
||||
|
||||
41
helpers/liquidity.js
Normal file
41
helpers/liquidity.js
Normal file
@ -0,0 +1,41 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.createPoolKeys = void 0;
|
||||
const web3_js_1 = require("@solana/web3.js");
|
||||
const raydium_sdk_1 = require("@raydium-io/raydium-sdk");
|
||||
function createPoolKeys(id, accountData, minimalMarketLayoutV3) {
|
||||
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_sdk_1.MAINNET_PROGRAM_ID.AmmV4,
|
||||
authority: raydium_sdk_1.Liquidity.getAssociatedAuthority({
|
||||
programId: raydium_sdk_1.MAINNET_PROGRAM_ID.AmmV4,
|
||||
}).publicKey,
|
||||
openOrders: accountData.openOrders,
|
||||
targetOrders: accountData.targetOrders,
|
||||
baseVault: accountData.baseVault,
|
||||
quoteVault: accountData.quoteVault,
|
||||
marketVersion: 3,
|
||||
marketProgramId: accountData.marketProgramId,
|
||||
marketId: accountData.marketId,
|
||||
marketAuthority: raydium_sdk_1.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: web3_js_1.PublicKey.default,
|
||||
};
|
||||
}
|
||||
exports.createPoolKeys = createPoolKeys;
|
||||
@ -1,43 +1,43 @@
|
||||
import { PublicKey } from '@solana/web3.js';
|
||||
import { Liquidity, LiquidityPoolKeys, LiquidityStateV4, MAINNET_PROGRAM_ID, Market } from '@raydium-io/raydium-sdk';
|
||||
import { MinimalMarketLayoutV3 } from './market';
|
||||
import { PublicKey } from "@solana/web3.js";
|
||||
import { Liquidity, LiquidityPoolKeys, LiquidityStateV4, MAINNET_PROGRAM_ID, Market } from "@raydium-io/raydium-sdk";
|
||||
import { MinimalMarketLayoutV3 } from "./market";
|
||||
|
||||
export function createPoolKeys(
|
||||
id: PublicKey,
|
||||
accountData: LiquidityStateV4,
|
||||
minimalMarketLayoutV3: MinimalMarketLayoutV3,
|
||||
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: MAINNET_PROGRAM_ID.AmmV4,
|
||||
authority: Liquidity.getAssociatedAuthority({
|
||||
programId: MAINNET_PROGRAM_ID.AmmV4,
|
||||
}).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,
|
||||
};
|
||||
return {
|
||||
id,
|
||||
baseMint: accountData.baseMint,
|
||||
quoteMint: accountData.quoteMint,
|
||||
lpMint: accountData.lpMint,
|
||||
baseDecimals: accountData.baseDecimal.toNumber(),
|
||||
quoteDecimals: accountData.quoteDecimal.toNumber(),
|
||||
lpDecimals: 5,
|
||||
version: 4,
|
||||
programId: MAINNET_PROGRAM_ID.AmmV4,
|
||||
authority: Liquidity.getAssociatedAuthority({
|
||||
programId: MAINNET_PROGRAM_ID.AmmV4,
|
||||
}).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,
|
||||
};
|
||||
}
|
||||
|
||||
18
helpers/logger.js
Normal file
18
helpers/logger.js
Normal file
@ -0,0 +1,18 @@
|
||||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.logger = void 0;
|
||||
const pino_1 = __importDefault(require("pino"));
|
||||
const transport = pino_1.default.transport({
|
||||
target: "pino-pretty",
|
||||
});
|
||||
exports.logger = (0, pino_1.default)({
|
||||
level: "info",
|
||||
redact: ["poolKeys"],
|
||||
serializers: {
|
||||
error: pino_1.default.stdSerializers.err,
|
||||
},
|
||||
base: undefined,
|
||||
}, transport);
|
||||
@ -1,17 +1,17 @@
|
||||
import pino from 'pino';
|
||||
import pino from "pino";
|
||||
|
||||
const transport = pino.transport({
|
||||
target: 'pino-pretty',
|
||||
target: "pino-pretty",
|
||||
});
|
||||
|
||||
export const logger = pino(
|
||||
{
|
||||
level: 'info',
|
||||
redact: ['poolKeys'],
|
||||
serializers: {
|
||||
error: pino.stdSerializers.err,
|
||||
},
|
||||
base: undefined,
|
||||
},
|
||||
transport,
|
||||
{
|
||||
level: "info",
|
||||
redact: ["poolKeys"],
|
||||
serializers: {
|
||||
error: pino.stdSerializers.err,
|
||||
},
|
||||
base: undefined,
|
||||
},
|
||||
transport,
|
||||
);
|
||||
|
||||
27
helpers/market.js
Normal file
27
helpers/market.js
Normal file
@ -0,0 +1,27 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.getMinimalMarketV3 = exports.MINIMAL_MARKET_STATE_LAYOUT_V3 = void 0;
|
||||
const raydium_sdk_1 = require("@raydium-io/raydium-sdk");
|
||||
exports.MINIMAL_MARKET_STATE_LAYOUT_V3 = (0, raydium_sdk_1.struct)([(0, raydium_sdk_1.publicKey)("eventQueue"), (0, raydium_sdk_1.publicKey)("bids"), (0, raydium_sdk_1.publicKey)("asks")]);
|
||||
function getMinimalMarketV3(connection, marketId, commitment) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
const marketInfo = yield connection.getAccountInfo(marketId, {
|
||||
commitment,
|
||||
dataSlice: {
|
||||
offset: raydium_sdk_1.MARKET_STATE_LAYOUT_V3.offsetOf("eventQueue"),
|
||||
length: 32 * 3,
|
||||
},
|
||||
});
|
||||
return exports.MINIMAL_MARKET_STATE_LAYOUT_V3.decode(marketInfo.data);
|
||||
});
|
||||
}
|
||||
exports.getMinimalMarketV3 = getMinimalMarketV3;
|
||||
@ -1,22 +1,22 @@
|
||||
import { Commitment, Connection, PublicKey } from '@solana/web3.js';
|
||||
import { GetStructureSchema, MARKET_STATE_LAYOUT_V3, publicKey, struct } from '@raydium-io/raydium-sdk';
|
||||
import { Commitment, Connection, PublicKey } from "@solana/web3.js";
|
||||
import { GetStructureSchema, MARKET_STATE_LAYOUT_V3, publicKey, struct } from "@raydium-io/raydium-sdk";
|
||||
|
||||
export const MINIMAL_MARKET_STATE_LAYOUT_V3 = struct([publicKey('eventQueue'), publicKey('bids'), publicKey('asks')]);
|
||||
export const MINIMAL_MARKET_STATE_LAYOUT_V3 = struct([publicKey("eventQueue"), publicKey("bids"), publicKey("asks")]);
|
||||
export type MinimalMarketStateLayoutV3 = typeof MINIMAL_MARKET_STATE_LAYOUT_V3;
|
||||
export type MinimalMarketLayoutV3 = GetStructureSchema<MinimalMarketStateLayoutV3>;
|
||||
|
||||
export async function getMinimalMarketV3(
|
||||
connection: Connection,
|
||||
marketId: PublicKey,
|
||||
commitment?: Commitment,
|
||||
connection: Connection,
|
||||
marketId: PublicKey,
|
||||
commitment?: Commitment,
|
||||
): Promise<MinimalMarketLayoutV3> {
|
||||
const marketInfo = await connection.getAccountInfo(marketId, {
|
||||
commitment,
|
||||
dataSlice: {
|
||||
offset: MARKET_STATE_LAYOUT_V3.offsetOf('eventQueue'),
|
||||
length: 32 * 3,
|
||||
},
|
||||
});
|
||||
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);
|
||||
return MINIMAL_MARKET_STATE_LAYOUT_V3.decode(marketInfo!.data);
|
||||
}
|
||||
|
||||
5
helpers/promises.js
Normal file
5
helpers/promises.js
Normal file
@ -0,0 +1,5 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.sleep = void 0;
|
||||
const sleep = (ms = 0) => new Promise((resolve) => setTimeout(resolve, ms));
|
||||
exports.sleep = sleep;
|
||||
20
helpers/token.js
Normal file
20
helpers/token.js
Normal file
@ -0,0 +1,20 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.getToken = void 0;
|
||||
const raydium_sdk_1 = require("@raydium-io/raydium-sdk");
|
||||
const spl_token_1 = require("@solana/spl-token");
|
||||
const web3_js_1 = require("@solana/web3.js");
|
||||
function getToken(token) {
|
||||
switch (token) {
|
||||
case "WSOL": {
|
||||
return raydium_sdk_1.Token.WSOL;
|
||||
}
|
||||
case "USDC": {
|
||||
return new raydium_sdk_1.Token(spl_token_1.TOKEN_PROGRAM_ID, new web3_js_1.PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), 6, "USDC", "USDC");
|
||||
}
|
||||
default: {
|
||||
throw new Error(`Unsupported quote mint "${token}". Supported values are USDC and WSOL`);
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.getToken = getToken;
|
||||
@ -1,23 +1,23 @@
|
||||
import { Token } from '@raydium-io/raydium-sdk';
|
||||
import { TOKEN_PROGRAM_ID } from '@solana/spl-token';
|
||||
import { PublicKey } from '@solana/web3.js';
|
||||
import { Token } from "@raydium-io/raydium-sdk";
|
||||
import { TOKEN_PROGRAM_ID } from "@solana/spl-token";
|
||||
import { PublicKey } from "@solana/web3.js";
|
||||
|
||||
export function getToken(token: string) {
|
||||
switch (token) {
|
||||
case 'WSOL': {
|
||||
return Token.WSOL;
|
||||
}
|
||||
case 'USDC': {
|
||||
return new Token(
|
||||
TOKEN_PROGRAM_ID,
|
||||
new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'),
|
||||
6,
|
||||
'USDC',
|
||||
'USDC',
|
||||
);
|
||||
}
|
||||
default: {
|
||||
throw new Error(`Unsupported quote mint "${token}". Supported values are USDC and WSOL`);
|
||||
}
|
||||
}
|
||||
switch (token) {
|
||||
case "WSOL": {
|
||||
return Token.WSOL;
|
||||
}
|
||||
case "USDC": {
|
||||
return new Token(
|
||||
TOKEN_PROGRAM_ID,
|
||||
new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"),
|
||||
6,
|
||||
"USDC",
|
||||
"USDC",
|
||||
);
|
||||
}
|
||||
default: {
|
||||
throw new Error(`Unsupported quote mint "${token}". Supported values are USDC and WSOL`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
25
helpers/wallet.js
Normal file
25
helpers/wallet.js
Normal file
@ -0,0 +1,25 @@
|
||||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.getWallet = void 0;
|
||||
const web3_js_1 = require("@solana/web3.js");
|
||||
const bs58_1 = __importDefault(require("bs58"));
|
||||
const bip39_1 = require("bip39");
|
||||
const ed25519_hd_key_1 = require("ed25519-hd-key");
|
||||
function getWallet(wallet) {
|
||||
// most likely someone pasted the private key in binary format
|
||||
if (wallet.startsWith("[")) {
|
||||
return web3_js_1.Keypair.fromSecretKey(JSON.parse(wallet));
|
||||
}
|
||||
// most likely someone pasted mnemonic
|
||||
if (wallet.split(" ").length > 1) {
|
||||
const seed = (0, bip39_1.mnemonicToSeedSync)(wallet, "");
|
||||
const path = `m/44'/501'/0'/0'`; // we assume it's first path
|
||||
return web3_js_1.Keypair.fromSeed((0, ed25519_hd_key_1.derivePath)(path, seed.toString("hex")).key);
|
||||
}
|
||||
// most likely someone pasted base58 encoded private key
|
||||
return web3_js_1.Keypair.fromSecretKey(bs58_1.default.decode(wallet));
|
||||
}
|
||||
exports.getWallet = getWallet;
|
||||
@ -1,21 +1,21 @@
|
||||
import { Keypair } from '@solana/web3.js';
|
||||
import bs58 from 'bs58';
|
||||
import { mnemonicToSeedSync } from 'bip39';
|
||||
import { derivePath } from 'ed25519-hd-key';
|
||||
import { Keypair } from "@solana/web3.js";
|
||||
import bs58 from "bs58";
|
||||
import { mnemonicToSeedSync } from "bip39";
|
||||
import { derivePath } from "ed25519-hd-key";
|
||||
|
||||
export function getWallet(wallet: string): Keypair {
|
||||
// most likely someone pasted the private key in binary format
|
||||
if (wallet.startsWith('[')) {
|
||||
return Keypair.fromSecretKey(JSON.parse(wallet));
|
||||
}
|
||||
// most likely someone pasted the private key in binary format
|
||||
if (wallet.startsWith("[")) {
|
||||
return Keypair.fromSecretKey(JSON.parse(wallet));
|
||||
}
|
||||
|
||||
// most likely someone pasted mnemonic
|
||||
if (wallet.split(' ').length > 1) {
|
||||
const seed = mnemonicToSeedSync(wallet, '');
|
||||
const path = `m/44'/501'/0'/0'`; // we assume it's first path
|
||||
return Keypair.fromSeed(derivePath(path, seed.toString('hex')).key);
|
||||
}
|
||||
// most likely someone pasted mnemonic
|
||||
if (wallet.split(" ").length > 1) {
|
||||
const seed = mnemonicToSeedSync(wallet, "");
|
||||
const path = `m/44'/501'/0'/0'`; // we assume it's first path
|
||||
return Keypair.fromSeed(derivePath(path, seed.toString("hex")).key);
|
||||
}
|
||||
|
||||
// most likely someone pasted base58 encoded private key
|
||||
return Keypair.fromSecretKey(bs58.decode(wallet));
|
||||
// most likely someone pasted base58 encoded private key
|
||||
return Keypair.fromSecretKey(bs58.decode(wallet));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user