# Symmetry Liquidity SDK
Exchange functionality using symmetry funds liquidity

Documentation:
https://docs.symmetry.fi/sdks/liquidity-sdk

## Initialization
```typescript
import { TokenSwap } from "@symmetry-hq/liquidity-sdk";

let tokenSwap = await TokenSwap.init(
    // rpc connection
    connection: Connection,
    // wallet (optional | can be provided later, using tokenSwap.setWallet
    wallet: Wallet,
);
```
OR
```typescript
import { TokenSwap } from "@symmetry-hq/liquidity-sdk";

let accountInfos = await TokenSwap.getAccountInfosForTokenSwap(connection);
let tokenSwap = new TokenSwap(accountInfos); // Synchronous

```

## Update
```typescript
await tokenSwap.updateLiquiditySources();
```
OR
```typescript
let pubkeys: PublicKey[] = tokenSwap.getAccountsForUpdate(); // Synchronous
let accountInfos: AccountInfo<Buffer>[] =
    await connection.getMultipleAccountsInfo(pubkeys);
tokenSwap.update(accountInfos); // Synchronous
```

## Get output amount and Route data
```typescript
let routeData: RouteData = tokenSwap.getRouteData( // Synchronous
    tokenFrom: PublicKey, // mint address
    tokenTo: PublicKey, // mint address
    fromAmount: number,
);
type RouteData = {
    fromAmount: number,
    toAmount: number, // Expected output amount
    fromTokenId: number,
    toTokenId: number,
    swapAccounts: {...} // accounts used for swap
}
```

## Executing swap
```typescript
let tx: TransactionSignature = await tokenSwap.executeSwap(
    routeData,
    fromTokenAccount?: PublicKey, // default = user's ATA
    toTokenAccount?: PublicKey, // default = user's ATA
    slippage?: number, // slippage percentage 1 = 1%, default = 0.5%
);

```
## Helpers
```typescript
// set wallet before executing swap if it wasn't provided upon initialization
tokenSwap.setWallet(wallet: Wallet); // Synchronous

// generate swap instruction
let instruction: TransactionInstruction = await tokenSwap
    .generateSwapInstruction(
        routeData: RouteData,
        fromTokenAccount: PublicKey,
        toTokenAccount: PublicKey,
        user?: PublicKey, // no need to provide if wallet was provided,
        slippage?: number, // slippage percentage 1 = 1%, default = 0.5%
    );

// get available tokens for swap
let tokenList: {
    tokenId: number,
    coingeckoId: string,
    tokenMint: string,
}[] = tokenSwap.getTokenList(); // Synchronous

```
