# Paystream SDK

A TypeScript SDK for interacting with Meteora's CP-AMM and DLMM protocols on Solana via Paystream.

## Installation

```bash
npm install paystream-sdk
```

## Usage

### Basic Setup

```typescript
import PaystreamSDK from 'paystream-sdk';
import { PublicKey } from '@solana/web3.js';
import BN from 'bn.js';

// Create SDK instance
const sdk = PaystreamSDK.createMainnet();

// Or with custom RPC
const customSdk = PaystreamSDK.createWithRpc('https://your-rpc-endpoint.com');
```

### CP-AMM Operations

```typescript
// Get all pools
const pools = await sdk.cpAmm.getAllPools();

// Get quote for swap
const quote = await sdk.cpAmm.getQuote({
  inAmount: new BN(1000000), // 1 USDC (6 decimals)
  inputTokenMint: new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'),
  slippage: 0.01, // 1%
  poolAddress: new PublicKey('pool_address_here')
});

// Execute swap
const swapTx = await sdk.cpAmm.swap({
  payer: userPublicKey,
  pool: poolAddress,
  inputTokenMint: tokenAMint,
  outputTokenMint: tokenBMint,
  amountIn: new BN(1000000),
  minimumAmountOut: quote.minSwapOutAmount
});

// Add liquidity
const addLiquidityTx = await sdk.cpAmm.addLiquidity({
  owner: userPublicKey,
  position: positionAddress,
  pool: poolAddress,
  positionNftAccount: nftAccount,
  liquidityDelta: new BN(1000000),
  maxAmountTokenA: new BN(1000000),
  maxAmountTokenB: new BN(1000000),
  tokenAAmountThreshold: new BN(950000),
  tokenBAmountThreshold: new BN(950000)
});
```

### DLMM Operations

```typescript
// Get user positions
const positions = await sdk.dlmm.getPositionsByUserAndLbPair(
  poolAddress,
  userPublicKey
);

// Execute swap
const dlmmSwapTx = await sdk.dlmm.swap(poolAddress, {
  inToken: tokenAMint,
  outToken: tokenBMint,
  inAmount: new BN(1000000),
  minOutAmount: new BN(990000),
  lbPair: poolAddress,
  user: userPublicKey
});

// Claim swap fees
const claimTx = await sdk.dlmm.claimSwapFee(poolAddress, {
  owner: userPublicKey,
  position: userPosition
});

// Claim LM rewards
const rewardTx = await sdk.dlmm.claimLMReward(poolAddress, {
  owner: userPublicKey,
  position: userPosition
});
```

## API Reference

### PaystreamSDK

Main SDK class that provides access to CP-AMM and DLMM functionality.

#### Static Methods
- `createMainnet()`: Create SDK instance for Solana mainnet
- `createDevnet()`: Create SDK instance for Solana devnet  
- `createTestnet()`: Create SDK instance for Solana testnet
- `createWithRpc(rpcEndpoint)`: Create SDK instance with custom RPC endpoint

### MeteoraCP (CP-AMM)

Methods for interacting with Meteora's Constant Product AMM.

- `createCustomPool(params)`: Create a new liquidity pool
- `fetchPoolState(poolAddress)`: Get pool state information
- `addLiquidity(params)`: Add liquidity to a pool
- `removeLiquidity(params)`: Remove liquidity from a pool
- `getQuote(params)`: Get swap quote
- `swap(params)`: Execute token swap
- `fetchPositionState(positionAddress)`: Get position information
- `getAllPools()`: Get all available pools
- `getAllConfigs()`: Get all pool configurations

### MeteoraLD (DLMM)

Methods for interacting with Meteora's Dynamic Liquidity Market Maker.

- `createPool(poolAddress)`: Create DLMM pool instance
- `createMultiplePools(poolAddresses)`: Create multiple pool instances
- `closePosition(poolAddress, params)`: Close a liquidity position
- `getPositionsByUserAndLbPair(poolAddress, userAddress)`: Get user positions
- `claimSwapFee(poolAddress, params)`: Claim swap fees for a position
- `claimAllSwapFee(poolAddress, params)`: Claim swap fees for all positions
- `claimLMReward(poolAddress, params)`: Claim liquidity mining rewards
- `claimAllLMRewards(poolAddress, params)`: Claim all LM rewards
- `swap(poolAddress, params)`: Execute token swap
- `getPoolInfo(poolAddress)`: Get pool information

## Types

The SDK includes comprehensive TypeScript types for all parameters and return values. See the exported types for detailed interface definitions.

## License

MIT