> ## Documentation Index
> Fetch the complete documentation index at: https://docs.magicblock.gg/llms.txt
> Use this file to discover all available pages before exploring further.

# Orca와의 DEX 통합

> SDK는 Orca를 네이티브로 지원하며, 스왑, 포지션 개설, 자금 관리, Whirlpools 상호작용에 필요한 트랜잭션을 쉽게 구성할 수 있는 유틸리티 메서드를 제공합니다.

## Orca

Orca는 Solana 블록체인에서 암호화폐를 가장 쉽게 거래할 수 있는 곳 중 하나입니다. 자세한 설명은 공식 [Orca 문서](https://docs.orca.so/orca-for-traders/master)와 [Orca Developer Portal](https://orca-so.gitbook.io/orca-developer-portal/orca/welcome)을 참고하세요.

## 스왑 수행하기

* 기본 계정과 RPC 클라이언트 인스턴스를 전달해 IDex 인스턴스를 생성합니다：

```csharp theme={null}
IDex dex = new OrcaDex(
    WalletH.Account,
    WalletH.Rpc
)
```

* token 정보를 가져옵니다：

```csharp theme={null}
TokenData tokenA = await dex.GetTokenBySymbol("USDC");
TokenData tokenB = await dex.GetTokenBySymbol("ORCA");
```

* whirlpool을 찾습니다：

```csharp theme={null}
Pool whirlpool = await dex.FindWhirlpoolAddress(tokenA.MintAddress, tokenB.MintAddress)
```

* 1 USDC에 대한 스왑 견적을 가져옵니다：

```csharp theme={null}
SwapQuote swapQuote = await dex.GetSwapQuoteFromWhirlpool(
    whirlpool.Address,
    DecimalUtil.ToUlong(1, tokenA.Decimals),
    tokenA.MintAddress,
    slippageTolerance: 0.1,
);
```

```csharp theme={null}
var quote = DecimalUtil.FromBigInteger(swapQuote.EstimatedAmountOut, tokenB.Decimals);
Debug.Log(quote); // 예상되는 Orca token 수량
```

* 스왑 트랜잭션을 생성합니다：

```csharp theme={null}
Transaction tx = await dex.SwapWithQuote(
    whirlpool,
    swapQuote
);
```

* 스왑 트랜잭션에 서명하고 전송합니다：

```csharp theme={null}
await WalletH.Base.SignAndSendTransaction(tx);
```

## ORCA/USDC whirlpool 포지션 열기 및 유동성 추가

아래 예시는 풀에 5 ORCA와 5 USDC의 유동성을 추가하고, 해당 포지션을 나타내는 metaplex NFT를 발행하는 방법입니다。

```csharp theme={null}
OrcaDex dex = new OrcaDex(
    WalletH.Account,
    WalletH.Rpc
);

var orcaToken = await dex.GetTokenBySymbol("ORCA");
var usdcToken = await dex.GetTokenBySymbol("USDC");

var whirlpool = await dex.FindWhirlpoolAddress(
  usdcToken.MintAddress,
  orcaToken.MintAddress
);

Account mint = new Account();

Transaction tx = await dex.OpenPositionWithLiquidity(
    whirlpool,
    mint,
    -1792,
    1152,
    DecimalUtil.ToUlong(5, tokenA.Decimals),
    DecimalUtil.ToUlong(5, tokenB.Decimals),
    commitment: Commitment.Confirmed
);

var txSer = tx.Build(new List<Account>() {
  WalletH.Account,
  mint
});

await WalletH.Base.SignAndSendTransaction(tx);
```
