DumpsterDumpster Docs
SDK

AMM

Build swaps, LP actions, pool creation, and AMM-side creator-fee collection on DumpsterSwap.

SDK

AMM-side workflows

The AMM surface covers swaps, LP deposits and withdrawals, non-canonical pool creation, and AMM-side creator fee collection.

import { DumpsterClient } from '@dumpster-cash/dumpster-sdk';

const client = new DumpsterClient(connection);

Load the pool state once

const tradeState = await client.accounts.fetchSwapTradeState(pool, wallet.publicKey);

tradeState already contains:

  • the decoded pool
  • token program resolution for base and quote mints
  • protocol fee recipient
  • protocol fee ATA
  • the user's base and quote ATAs

Buy from a pool

This path fits exact-output buys where the quote-side spend needs a hard cap.

import BN from 'bn.js';

const ix = await client.swap.buildBuyExactOut({
  pool,
  poolData: tradeState.pool,
  userBaseAccount: tradeState.userBaseAccount!,
  userQuoteAccount: tradeState.userQuoteAccount!,
  protocolFeeRecipient: tradeState.protocolFeeRecipient!,
  protocolFeeAccount: tradeState.protocolFeeAccount!,
  user: wallet.publicKey,
  baseAmountOut: new BN(5_000_000_000),
  maxQuoteAmountIn: new BN(1_000_000_000),
  baseTokenProgram: tradeState.baseTokenProgram,
  quoteTokenProgram: tradeState.quoteTokenProgram,
});

Convenience path:

const ix = await client.swap.buildBuyExactOutAutoResolve({
  connection,
  pool,
  user: wallet.publicKey,
  baseAmountOut: new BN(5_000_000_000),
  maxQuoteAmountIn: new BN(1_000_000_000),
});

Sell into a pool

This path fits exact-input sells where the quote-side output needs a floor.

const ix = await client.swap.buildSellExactIn({
  pool,
  poolData: tradeState.pool,
  userBaseAccount: tradeState.userBaseAccount!,
  userQuoteAccount: tradeState.userQuoteAccount!,
  protocolFeeRecipient: tradeState.protocolFeeRecipient!,
  protocolFeeAccount: tradeState.protocolFeeAccount!,
  user: wallet.publicKey,
  baseAmountIn: new BN(5_000_000_000),
  minQuoteAmountOut: new BN(900_000_000),
  baseTokenProgram: tradeState.baseTokenProgram,
  quoteTokenProgram: tradeState.quoteTokenProgram,
});

Add liquidity

Load the liquidity-state bundle before deposits and withdrawals.

const liquidityState = await client.accounts.fetchPoolLiquidityState(
  pool,
  wallet.publicKey,
);

const ix = await client.swap.buildDeposit({
  pool,
  poolData: liquidityState.pool,
  userBaseAccount: liquidityState.userBaseAccount!,
  userQuoteAccount: liquidityState.userQuoteAccount!,
  userLpAccount: liquidityState.userLpAccount!,
  user: wallet.publicKey,
  lpTokenOut: new BN(1_000_000),
  maxBaseIn: new BN(25_000_000_000),
  maxQuoteIn: new BN(1_000_000_000),
  baseTokenProgram: liquidityState.baseTokenProgram,
  quoteTokenProgram: liquidityState.quoteTokenProgram,
});

Withdraw liquidity

const ix = await client.swap.buildWithdraw({
  pool,
  poolData: liquidityState.pool,
  userBaseAccount: liquidityState.userBaseAccount!,
  userQuoteAccount: liquidityState.userQuoteAccount!,
  userLpAccount: liquidityState.userLpAccount!,
  user: wallet.publicKey,
  lpTokenIn: new BN(1_000_000),
  minBaseOut: new BN(20_000_000_000),
  minQuoteOut: new BN(800_000_000),
  baseTokenProgram: liquidityState.baseTokenProgram,
  quoteTokenProgram: liquidityState.quoteTokenProgram,
});

Create a non-canonical pool

Migration creates the canonical pool automatically. This builder is for intentionally creating a separate pool.

const ix = await client.swap.buildCreatePool({
  index: 1,
  baseMint,
  quoteMint,
  creator: wallet.publicKey,
  creatorBaseAccount,
  creatorQuoteAccount,
  creatorLpAccount,
  baseIn: new BN(100_000_000_000),
  quoteIn: new BN(2_000_000_000),
  coinCreator: wallet.publicKey,
});

Collect AMM-side creator fees

const ix = await client.swap.buildClaimCreatorFees({
  coinCreator: wallet.publicKey,
  mint: tradeState.pool.quoteMint,
  creatorTokenAccount,
});

Before migration, creator-fee collection stays on the curve-side path.

On this page