# SDK: Integration Clients

## Access Control

Access via `client.access`.

### grantDelegatePermissions

```typescript
await client.access.grantDelegatePermissions(vaultPda: PublicKey, {
  delegate: PublicKey;
  permissions: Permission[];
}, options?: TxOptions);
```

**Permission names** are protocol-scoped. Use them with `glam-cli delegate grant --protocol <PROTOCOL>`. The exact string must match the source (case-sensitive). See [concepts.md](../concepts.md) for the full permission bitmask table.

### revokeDelegate

```typescript
await client.access.revokeDelegate(vaultPda: PublicKey, delegate: PublicKey, options?: TxOptions);
```

### listDelegates

```typescript
const delegates = await client.access.listDelegates(vaultPda: PublicKey);
// Returns: { pubkey: PublicKey, permissions: Permission[] }[]
```

### emergencyAccessUpdate

```typescript
await client.access.emergencyAccessUpdate(vaultPda: PublicKey, {
  disabledIntegrations?: number;
  disabledDelegates?: PublicKey[];
  stateEnabled?: boolean;
}, options?: TxOptions);
```

### enableProtocols

```typescript
await client.access.enableProtocols(vaultPda: PublicKey, integrationProgram: PublicKey, protocolBitmask: number, options?: TxOptions);
```

### disableProtocols

```typescript
await client.access.disableProtocols(vaultPda: PublicKey, integrationProgram: PublicKey, protocolBitmask: number, options?: TxOptions);
```

### setProtocolPolicy

```typescript
await client.access.setProtocolPolicy(vaultPda: PublicKey, integrationProgram: PublicKey, protocolBitflag: number, data: Buffer, options?: TxOptions);
```

### getProgramAndBitflagByProtocolName

Map protocol names to their program address and bitflag for use with `enableProtocols`/`disableProtocols`.

```typescript
import { getProgramAndBitflagByProtocolName } from "@glamsystems/glam-sdk";

const permissionsMap = getProgramAndBitflagByProtocolName();
const [program, bitflag] = permissionsMap["JupiterSwap"];

// Enable Jupiter swap
await client.access.enableProtocols(vaultPda, program, parseInt(bitflag, 2));
```

---

## Policy Encoding

### TransferPolicy

Encode transfer destination allowlists.

```typescript
import { TransferPolicy } from "@glamsystems/glam-sdk";

const policy = new TransferPolicy([]);
policy.allowlist.push(new PublicKey("Destination111..."));
policy.allowlist.push(new PublicKey("Destination222..."));

await client.access.setProtocolPolicy(vaultPda, splProgram, transferBitflag, policy.encode());
```

### SwapPolicy

Encode swap token allowlists.

```typescript
import { SwapPolicy } from "@glamsystems/glam-sdk";

const policy = new SwapPolicy([]);
policy.allowlist.push(new PublicKey("TokenMint111..."));

await client.access.setProtocolPolicy(vaultPda, jupiterProgram, swapAllowlistedBitflag, policy.encode());
```

---

## Jupiter Swap

Access via `client.jupiterSwap`.

### swap

```typescript
const txId = await client.jupiterSwap.swap(vaultPda: PublicKey, {
  inputMint: PublicKey;
  outputMint: PublicKey;
  amount: BN;
  slippageBps?: number;      // default: 50
  onlyDirectRoutes?: boolean;
}, options?: TxOptions);
```

### getQuote

```typescript
const quote = await client.jupiterSwap.getQuote({
  inputMint: PublicKey;
  outputMint: PublicKey;
  amount: BN;
  slippageBps?: number;
});
// Returns: { inAmount, outAmount, priceImpactPct, ... }
```

### setMaxSlippage

```typescript
await client.jupiterSwap.setMaxSlippage(vaultPda: PublicKey, maxSlippageBps: number, options?: TxOptions);
```

### allowlistToken

```typescript
await client.jupiterSwap.allowlistToken(vaultPda: PublicKey, mint: PublicKey, options?: TxOptions);
```

---

## Kamino Lending

Access via `client.kaminoLending`.

### initUserMetadata

```typescript
await client.kaminoLending.initUserMetadata(vaultPda: PublicKey, options?: TxOptions);
```

### deposit

```typescript
await client.kaminoLending.deposit(vaultPda: PublicKey, {
  market: PublicKey;
  mint: PublicKey;
  amount: BN;
}, options?: TxOptions);
```

### withdraw

```typescript
await client.kaminoLending.withdraw(vaultPda: PublicKey, {
  market: PublicKey;
  mint: PublicKey;
  amount: BN;
}, options?: TxOptions);
```

### borrow

```typescript
await client.kaminoLending.borrow(vaultPda: PublicKey, {
  market: PublicKey;
  mint: PublicKey;
  amount: BN;
}, options?: TxOptions);
```

### repay

```typescript
await client.kaminoLending.repay(vaultPda: PublicKey, {
  market: PublicKey;
  mint: PublicKey;
  amount: BN;
}, options?: TxOptions);
```

### getPositions

```typescript
const positions = await client.kaminoLending.getPositions(vaultPda: PublicKey);
```

---

## Invest Operations

Access via `client.invest`.

### subscribe

```typescript
await client.invest.subscribe(vaultPda: PublicKey, {
  shareClassIndex: number;
  amount: BN;
}, options?: TxOptions);
```

### claimSubscription

```typescript
await client.invest.claimSubscription(vaultPda: PublicKey, shareClassIndex: number, options?: TxOptions);
```

### redeem

```typescript
await client.invest.redeem(vaultPda: PublicKey, {
  shareClassIndex: number;
  shares: BN;
}, options?: TxOptions);
```

### claimRedemption

```typescript
await client.invest.claimRedemption(vaultPda: PublicKey, shareClassIndex: number, options?: TxOptions);
```

---

## Fee Management

Access via `client.fees`.

### setPrice

```typescript
await client.fees.setPrice(vaultPda: PublicKey, {
  shareClassIndex: number;
  price: BN;
}, options?: TxOptions);
```

### fulfill

```typescript
await client.fees.fulfill(vaultPda: PublicKey, shareClassIndex: number, options?: TxOptions);
```

### claimFees

```typescript
await client.fees.claimFees(vaultPda: PublicKey, options?: TxOptions);
```

### crystallizeFees

```typescript
await client.fees.crystallizeFees(vaultPda: PublicKey, options?: TxOptions);
```

### setProtocolFees

```typescript
await client.fees.setProtocolFees(vaultPda: PublicKey, {
  baseFeeBps: number;
  flowFeeBps: number;
}, options?: TxOptions);
```

---

## Timelock

Access via `client.timelock`.

### get

```typescript
const timelock = await client.timelock.get(vaultPda: PublicKey);
```

### set

```typescript
await client.timelock.set(vaultPda: PublicKey, delaySeconds: number, options?: TxOptions);
```

### apply

```typescript
await client.timelock.apply(vaultPda: PublicKey, options?: TxOptions);
```

### cancel

```typescript
await client.timelock.cancel(vaultPda: PublicKey, options?: TxOptions);
```

---

## Kamino Vaults

Access via `client.kaminoVaults`.

### deposit

```typescript
await client.kaminoVaults.deposit(kaminoVault: PublicKey, amount: BN, options?: TxOptions);
```

### withdraw

```typescript
await client.kaminoVaults.withdraw(kaminoVault: PublicKey, shares: BN, options?: TxOptions);
```

---

## Kamino Farms

Access via `client.kaminoFarm`.

### stake

```typescript
await client.kaminoFarm.stake(amount: BN, farmState: PublicKey, options?: TxOptions);
```

### unstake

```typescript
await client.kaminoFarm.unstake(amount: BN, farmState: PublicKey, options?: TxOptions);
```

### harvest

```typescript
await client.kaminoFarm.harvest(farmStates: PublicKey[], options?: TxOptions);
```

---

## Marinade Staking

Access via `client.marinade`. Protocol name: `Marinade` (staging).

### deposit (stake SOL for mSOL)

```typescript
await client.marinade.deposit(amount: BN, options?: TxOptions);
```

### depositNative (stake SOL to Marinade Native)

```typescript
await client.marinade.depositNative(amount: BN, options?: TxOptions);
```

### withdrawStakeAccount (withdraw mSOL into stake account)

```typescript
await client.marinade.withdrawStakeAccount(amount: BN, deactivate: boolean, options?: TxOptions);
```

---

## SPL Stake Pool

Access via `client.stakePool`.

### depositSol

```typescript
await client.stakePool.depositSol(stakePool: PublicKey, amount: BN, options?: TxOptions);
```

### unstake

```typescript
await client.stakePool.unstake(lstMint: PublicKey, amount: BN, deactivate: boolean, options?: TxOptions);
```

---

## Price

Access via `client.price`.

### priceVaultIxs

```typescript
const instructions = await client.price.priceVaultIxs();
// Returns instructions to price all vault assets
```

---

## Mint

Access via `client.mint`.

### update

```typescript
await client.mint.update({
  minSubscription?: BN;
  minRedemption?: BN;
}, options?: TxOptions);
```

### pauseSubscription / unpauseSubscription

```typescript
await client.mint.pauseSubscription(options?: TxOptions);
await client.mint.unpauseSubscription(options?: TxOptions);
```

### pauseRedemption / unpauseRedemption

```typescript
await client.mint.pauseRedemption(options?: TxOptions);
await client.mint.unpauseRedemption(options?: TxOptions);
```

### initializeWithStateParams

```typescript
const { mintPda, txId } = await client.mint.initializeWithStateParams(vaultPda: PublicKey, {
  name: string;
  symbol: string;
  decimals: number;
  // ... additional mint config
}, options?: TxOptions);
```

### setTokenAccountsStates

```typescript
await client.mint.setTokenAccountsStates(vaultPda: PublicKey, {
  accounts: PublicKey[];
  frozen: boolean;
}, options?: TxOptions);
```

### forceTransfer

```typescript
await client.mint.forceTransfer(vaultPda: PublicKey, {
  source: PublicKey;
  destination: PublicKey;
  amount: BN;
}, options?: TxOptions);
```

### fetchTokenHolders

```typescript
const holders = await client.mint.fetchTokenHolders(mintPda: PublicKey);
// Returns: { owner: PublicKey, amount: BN }[]
```

---

## Models

### StateModel

```typescript
interface StateModel {
  pubkey: PublicKey;
  name: number[];
  uri: string;
  owner: PublicKey;
  created: CreatedModel;
  integrations: Integration[];
  assets: PublicKey[];
  shareClasses: MintModel[];
  timelockDuration: number;
}
```

### MintModel

```typescript
interface MintModel {
  pubkey: PublicKey;
  name: number[];
  symbol: string;
  uri: string;
  decimals: number;
  supply: BN;
  price: BN;
}
```
