final var tx = TxBuilder.createBuilder()
.feePayer(signer.publicKey())
.addInstruction(instruction)
.priorityFeeLamports(priorityFeeLamports)
.createTransaction();
final var simulation = rpcClient.simulateTransaction(Commitment.CONFIRMED, tx, true).join();
if (simulation.error() != null) {
throw new IllegalStateException("Simulation failed: " + simulation.error());
}
// If dealing with transactions that have dynamic onchain paths or accounts,
// increase the returned simulation values.
tx.setComputeUnitLimit(simulation.unitsConsumed().getAsInt());
tx.setAccountDataSizeLimit(simulation.loadedAccountsDataSize());
tx.setRecentBlockHash(simulation.replacementBlockHash().blockhash());
tx.sign(signer);
final var signature = rpcClient.sendTransaction(Commitment.CONFIRMED, tx.base64EncodeToString()).join();