Help us improve
Share bugs, ideas, or general feedback.
From java-stellar-sdk
Builds Stellar blockchain applications in Java using stellar-sdk. Handles transactions, Horizon queries, Soroban RPC, smart contract deployment, XDR/SCVal conversion, and SEP integrations.
npx claudepluginhub lightsail-network/java-stellar-sdk --plugin java-stellar-sdkHow this skill is triggered — by the user, by Claude, or both
Slash command
/java-stellar-sdk:java-stellar-sdkThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Write correct Java for the Stellar network using the `stellar-sdk` package. This file is
Builds Stellar blockchain apps in Python using stellar-sdk. Covers transaction building/signing, Horizon/Soroban RPC queries, smart contract deployment, XDR/SCVal conversion, async workflows, and SEP integrations.
Maps Stellar Ecosystem Proposals (SEPs) and Core Advancement Proposals (CAPs) to use cases like wallets, anchors, payments, deposits, federation, deep links, and KYC. Also bundles ecosystem references and official docs.
Sets up Stellar/Soroban smart contract projects with OpenZeppelin Contracts. Covers CLI/Rust toolchain install, project init, Cargo.toml dependencies, import conventions, and contract patterns.
Share bugs, ideas, or general feedback.
network.lightsail:stellar-sdk)Write correct Java for the Stellar network using the stellar-sdk package. This file is
self-contained; load a file from references/ only when the task needs that topic.
Maven:
<dependency>
<groupId>network.lightsail</groupId>
<artifactId>stellar-sdk</artifactId>
<version>3.0.0</version>
</dependency>
Gradle:
implementation 'network.lightsail:stellar-sdk:3.0.0'
Public APIs live under org.stellar.sdk; operations under org.stellar.sdk.operations;
the contract helpers under org.stellar.sdk.contract; SCVal helpers under
org.stellar.sdk.scval; exceptions under org.stellar.sdk.exception, with the high-level
contract-client exceptions under org.stellar.sdk.contract.exception.
import org.stellar.sdk.Asset;
import org.stellar.sdk.KeyPair;
import org.stellar.sdk.Network;
import org.stellar.sdk.Server;
import org.stellar.sdk.Transaction;
import org.stellar.sdk.TransactionBuilder;
import org.stellar.sdk.operations.PaymentOperation;
import org.stellar.sdk.scval.Scv;
Server — Horizon client. See references/horizon.md.SorobanServer — Soroban RPC client (Closeable). See references/soroban.md.ContractClient — high-level Soroban contract client (Closeable) that wraps the
simulate → prepare → sign → submit flow. See references/soroban.md.The SDK is synchronous (built on OkHttp); there is no separate async client.
These are the things that most often trip people up with this SDK:
XxxOperation.builder()... .build(), e.g. PaymentOperation.builder().destination(d).asset(a).amount(amt).build().
InvokeHostFunctionOperation instead exposes static factories (see references/operations.md).Asset (payments, offers, paths),
ChangeTrustAsset (the ChangeTrustOperation line, wraps an Asset or LiquidityPool), and
TrustLineAsset (balances/trustline entries). See references/assets.md.BigDecimal. new BigDecimal("10.5"), never double/float.G... and M... both work as a destination. Address strings accept plain ed25519
accounts and SEP-23 muxed accounts; use MuxedAccount to build/parse M... (see
references/sep.md).Closeable. Server.close(); wrap SorobanServer/ContractClient in
try-with-resources. SSEStream from .stream(...) must also be closed to stop it.RuntimeException
(org.stellar.sdk.exception.SdkException), so the compiler will not force you to catch them —
you still should. The common supertype for network/RPC errors is NetworkException.KeyPair.getSecretSeed() returns char[], not String, so it can be zeroed after use.List.of(...) →
Arrays.asList(...), Map.of(...) → a populated LinkedHashMap, "x".repeat(n) → a literal,
pattern-matching instanceof → a classic cast, and java.net.http → HttpURLConnection or
any HTTP client.BigDecimal amounts, never double/float. Use new BigDecimal("350.1234567"),
not 350.1234567. Lumens have 7 decimal places; binary floats lose precision.KeyPair.fromSecretSeed(System.getenv("STELLAR_SECRET_KEY"))..setTimeout(...) (or explicit time bounds). A
transaction without one can hang in the pending pool indefinitely.Network.TESTNET vs Network.PUBLIC. Signatures are
network-specific; a testnet-signed transaction is invalid on mainnet.TransactionBuilder.build() increments the source account's sequence number. If you
build but do not submit (or submission fails with tx_bad_seq), reload the account with
server.loadAccount(...) before building again.sorobanServer.prepareTransaction(tx) (or
ContractClient.invoke(...) which simulates by default) fills in footprint, auth, and
resource fees. Signing before this produces an invalid transaction.Scv.to* and read results with Scv.from*. Never pass
raw Java values to a contract.references/soroban.md).server.close() for Server; use try-with-resources for
SorobanServer and ContractClient (both implement Closeable).BadRequestException, BadResponseException,
PrepareTransactionException, …), not a broad Exception. They all extend
SdkException; network/HTTP errors additionally share the NetworkException supertype,
but PrepareTransactionException and the contract-lifecycle exceptions extend
SdkException directly. Network/RPC exceptions live in org.stellar.sdk.exception;
ContractClient/AssembledTransaction errors live in org.stellar.sdk.contract.exception.import org.stellar.sdk.KeyPair;
// New random account (fund it before use — see example 2).
KeyPair kp = KeyPair.random();
System.out.println(kp.getAccountId()); // G... (safe to share)
System.out.println(kp.getSecretSeed()); // S... (secret — never log or commit in real code)
// Load an existing account from the environment.
KeyPair signer = KeyPair.fromSecretSeed(System.getenv("STELLAR_SECRET_KEY"));
// Verify-only keypair (cannot sign).
KeyPair publicOnly = KeyPair.fromAccountId("GD2JXEFGEO53CNQ22KN2ICOQ2LOASCABQHAIOMLZV265C246PFKKHPYU");
import java.math.BigDecimal;
import org.stellar.sdk.*;
import org.stellar.sdk.operations.PaymentOperation;
import org.stellar.sdk.responses.TransactionResponse;
KeyPair source = KeyPair.fromSecretSeed(System.getenv("STELLAR_SECRET_KEY"));
String destination = "GD2JXEFGEO53CNQ22KN2ICOQ2LOASCABQHAIOMLZV265C246PFKKHPYU";
Server server = new Server("https://horizon-testnet.stellar.org");
// Reload right before building so the sequence number is current.
TransactionBuilderAccount account = server.loadAccount(source.getAccountId());
PaymentOperation payment =
PaymentOperation.builder()
.destination(destination)
.asset(Asset.createNativeAsset())
.amount(new BigDecimal("350.1234567")) // BigDecimal amount
.build();
Transaction transaction =
new TransactionBuilder(account, Network.TESTNET)
.setBaseFee(Transaction.MIN_BASE_FEE)
.addMemo(Memo.text("Hello, Stellar!"))
.addOperation(payment)
.setTimeout(30)
.build();
transaction.sign(source);
TransactionResponse response = server.submitTransaction(transaction);
System.out.println(response.getHash());
server.close();
New testnet accounts can be funded by Friendbot:
GET https://friendbot.stellar.org?addr=<G...>.
import org.stellar.sdk.Server;
import org.stellar.sdk.requests.RequestBuilder;
import org.stellar.sdk.responses.Page;
import org.stellar.sdk.responses.operations.OperationResponse;
Server server = new Server("https://horizon.stellar.org");
// Request builders are chainable; .execute() runs the HTTP request.
Page<OperationResponse> payments =
server.payments()
.forAccount("GB6NVEN5HSUBKMYCE5ZOWSK5K23TBWRUQLZY3KNMXUZ3AQ2ESC4MY4AQ")
.order(RequestBuilder.Order.DESC)
.limit(10)
.execute();
for (OperationResponse op : payments.getRecords()) {
System.out.println(op.getType());
}
For contracts you call repeatedly, prefer generated typed bindings (see
references/bindings.md). The hand-written form with ContractClient is:
import java.util.List;
import org.stellar.sdk.Network;
import org.stellar.sdk.contract.ContractClient;
import org.stellar.sdk.scval.Scv;
import org.stellar.sdk.xdr.SCVal;
// A read-only call needs no signer, but `source` is required and must be an account
// that already exists on the target network — simulate() loads its sequence via
// server.getAccount(), which throws AccountNotFoundException if the account is missing.
String source = "GD2JXEFGEO53CNQ22KN2ICOQ2LOASCABQHAIOMLZV265C246PFKKHPYU";
try (ContractClient client =
new ContractClient(
"CACZTW72246RA2MOCNKUBRRRRPT26UZ7LXE5ZHH44OGKIMCTQJ74O4D5",
"https://soroban-testnet.stellar.org:443",
Network.TESTNET)) {
SCVal result =
client
.invoke("hello", List.of(Scv.toSymbol("world")), source, null, null,
(int) org.stellar.sdk.Transaction.MIN_BASE_FEE)
.result(); // read-only: no signer needed
System.out.println(result);
}
For a state-changing call, pass source and signer, then signAndSubmit(...). See
references/soroban.md.
Load on demand:
references/quickstart.md — install → keypair → fund → payment → query → contract.references/transactions.md — transaction lifecycle, memos, preconditions, fee bump,
multisig, XDR round-trips, sequence-number pitfalls.references/assets.md — Asset vs ChangeTrustAsset vs TrustLineAsset, native vs
alphanum4/12, canonical form.references/operations.md — catalog of every operation and its builder.references/horizon.md — Horizon client, request builders, pagination, streaming, errors.references/soroban.md — Soroban RPC client + ContractClient/AssembledTransaction.references/bindings.md — generate typed contract clients with stellar-contract-bindings.references/xdr_scval.md — SCVal conversion, Address, XDR encode/decode.references/sep.md — SEP support matrix and common flows (SEP-02/05/10/23/35/45/...).references/troubleshooting.md — exception hierarchy and common failures.Full API docs (Javadoc): https://javadoc.io/doc/network.lightsail/stellar-sdk