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

# Web 2.0

> Solana Ecosystem HTTP Clients.

<Card title="GitHub Repository" icon="github" horizontal={true} href="https://github.com/sava-software/solana-web2" />

## [Dependencies](https://github.com/sava-software/solana-web2/blob/main/solana-web2/src/main/java/module-info.java)

* java.net.http
* software.sava.json.iterator
* software.sava.core
* software.sava.rpc

## Helius

Implements the [priority fee API](https://docs.helius.dev/solana-apis/priority-fee-api).

### Create Client

```java theme={null}
try (var httpClient = HttpClient.newHttpClient()) {
  var heliusClient = HeliusClient.createHttpClient(URI.create("https://mainnet.helius-rpc.com/?api-key="), httpClient);
}
```

### Recommended Transaction Priority Fee

```java theme={null}
Transaction transaction = ...
var base64EncodedTx = transaction.base64EncodeToString();
var feeEstimate = heliusClient.getRecommendedTransactionPriorityFeeEstimate(base64EncodedTx).join();

System.out.format(
  "Mert recommends a %s micro lamport compute unit price.",
  feeEstimate.toPlainString()
);
```

## Jupiter

Implements the [Swap](https://dev.jup.ag/docs/api/swap-api) and [Token](https://dev.jup.ag/docs/api/token-api/v2) API.

### Create Client

```java theme={null}
try (var httpClient = HttpClient.newHttpClient()) {
    var jupiterClient = JupiterClient.createClient(httpClient);
}
```

### Quote & Swap

Fetches verified tokens, gets a quote for buying 1 USDC worth of SOL, requests a swap transaction and signs the transaction.

```java theme={null}
software.sava.core.accounts.Signer signer = ...

var tokens = jupiterClient.verifiedTokenMap().join();

var outputTokenContext = tokens.get(SolanaAccounts.MAIN_NET.wrappedSolTokenMint());

var inputTokenContext = tokens.values().stream()
    .filter(tokenContext -> tokenContext.symbol().equals("USDC"))
    .findFirst().orElseThrow();

var quoteRequest = JupiterQuoteRequest.buildRequest()
    .swapMode(SwapMode.ExactIn)
    .amount(inputTokenContext.fromDecimal(BigDecimal.ONE).toBigInteger())
    .inputTokenMint(inputTokenContext.address())
    .outputTokenMint(outputTokenContext.address())
    .slippageBps(2)
    .dexes(Set.of(
        "Meteora",
        "Meteora DLMM",
        "Orca V2",
        "OpenBook V2",
        "Phoenix",
        "Raydium",
        "Raydium CLMM",
        "Raydium CP",
        "Whirlpool"
    ))
    .restrictIntermediateTokens(true)
    .onlyDirectRoutes(false)
    .create();

var quote = jupiterClient.getQuote(quoteRequest).join();
System.out.println(quote);

var swapRequest = JupiterSwapRequest
    .buildRequest()
    .userPublicKey(signer.publicKey())
    .skipUserAccountsRpcCalls(true)
    .useSharedAccounts(true)
    .createRequest();

var swapTransaction = jupiterClient.swap(
    swapRequest.preSerialize(),
    quote.quoteResponseJson()
).join();
var txBytes = swapTransaction.swapTransaction();
Transaction.sign(signer, txBytes);
// send transaction
```
