GitHub Repository

Dependencies

Helius

Implements the priority fee API.

Create Client

try (var httpClient = HttpClient.newHttpClient()) {
  var heliusClient = HeliusClient.createHttpClient(URI.create("https://mainnet.helius-rpc.com/?api-key="), httpClient);
}
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 and Token API.

Create Client

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.

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