pool-filters.ts 2.0 KB

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