pool-filters.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { Connection } from '@solana/web3.js';
  2. import { LiquidityPoolKeysV4, Token, TokenAmount } from '@raydium-io/raydium-sdk';
  3. import { BurnFilter } from './burn.filter';
  4. import { RenouncedFilter } from './renounced.filter';
  5. import { PoolSizeFilter } from './pool-size.filter';
  6. import { CHECK_IF_BURNED, CHECK_IF_MINT_IS_RENOUNCED, logger } from '../helpers';
  7. export interface Filter {
  8. execute(poolKeysV4: LiquidityPoolKeysV4): Promise<FilterResult>;
  9. }
  10. export interface FilterResult {
  11. ok: boolean;
  12. message?: string;
  13. }
  14. export interface PoolFilterArgs {
  15. minPoolSize: TokenAmount;
  16. maxPoolSize: TokenAmount;
  17. quoteToken: Token;
  18. }
  19. export class PoolFilters {
  20. private readonly filters: Filter[] = [];
  21. constructor(
  22. readonly connection: Connection,
  23. readonly args: PoolFilterArgs,
  24. ) {
  25. if (CHECK_IF_BURNED) {
  26. this.filters.push(new BurnFilter(connection));
  27. }
  28. if (CHECK_IF_MINT_IS_RENOUNCED) {
  29. this.filters.push(new RenouncedFilter(connection));
  30. }
  31. if (!args.minPoolSize.isZero() || !args.maxPoolSize.isZero()) {
  32. this.filters.push(new PoolSizeFilter(connection, args.quoteToken, args.minPoolSize, args.maxPoolSize));
  33. }
  34. }
  35. public async execute(poolKeys: LiquidityPoolKeysV4): Promise<boolean> {
  36. if (this.filters.length === 0) {
  37. return true;
  38. }
  39. const result = await Promise.all(this.filters.map((f) => f.execute(poolKeys)));
  40. const pass = result.every((r) => r.ok);
  41. if (pass) {
  42. return true;
  43. }
  44. for (const filterResult of result.filter((r) => !r.ok)) {
  45. logger.trace(filterResult.message);
  46. }
  47. return false;
  48. }
  49. }