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());
}
simulation.unitsConsumed().ifPresent(used -> {
final long limit = used + Math.max(1_000L, used / 10);
tx.setComputeUnitLimit(Math.clamp(limit, 0, 1_400_000));
});
final int loadedBytes = simulation.loadedAccountsDataSize();
if (loadedBytes > 0) {
final long limit = loadedBytes + Math.max(1_024L, loadedBytes / 10);
tx.setAccountDataSizeLimit(Math.clamp(limit, 0, 64 * 1024 * 1024));
}
tx.setRecentBlockHash(simulation.replacementBlockHash().blockhash());
tx.sign(signer);
final var signature = rpcClient.sendTransaction(Commitment.CONFIRMED, tx.base64EncodeToString()).join();