Para Server SDK provides seamless integration with the Stellar blockchain. Once you’ve set up and authenticated your Para Server client, the Stellar integration works identically to the client-side implementation.
Before using these integrations, ensure you’ve completed the server setup by importing a client session or creating a pregenerated wallet. See the for details.
Installation
Install the required dependencies:
npm install @getpara/stellar-sdk-v14-integration @stellar/stellar-sdk --save-exact
Implementation
Functional API
The createParaStellarSigner function returns a signer compatible with Stellar SDK’s contract.SignTransaction and contract.SignAuthEntry interfaces:
import { Para as ParaServer } from "@getpara/server-sdk";
import { createParaStellarSigner } from "@getpara/stellar-sdk-v14-integration";
import { Horizon, Networks, TransactionBuilder, Operation, Asset, BASE_FEE } from "@stellar/stellar-sdk";
// Para server client (already authenticated)
const paraServer = new ParaServer("YOUR_API_KEY");
// Set up Horizon connection
const server = new Horizon.Server("https://horizon.stellar.org");
// Create the Stellar signer
const signer = createParaStellarSigner({
para: paraServer,
networkPassphrase: Networks.PUBLIC,
});
console.log(`Stellar address: ${signer.address}`);
// Load the source account
const sourceAccount = await server.loadAccount(signer.address);
// Build a payment transaction
const transaction = new TransactionBuilder(sourceAccount, {
fee: BASE_FEE,
networkPassphrase: Networks.PUBLIC,
})
.addOperation(
Operation.payment({
destination: "GRECIPI...",
asset: Asset.native(),
amount: "10",
})
)
.setTimeout(180)
.build();
// Sign and submit
const { signedTxXdr } = await signer.signTransaction(transaction.toXDR());
const signedTx = TransactionBuilder.fromXDR(signedTxXdr, Networks.PUBLIC);
const result = await server.submitTransaction(signedTx);
console.log(`Transaction hash: ${result.hash}`);
Class API
The ParaStellarSigner class can also be instantiated directly. Pass networkPassphrase to the constructor so signTransaction uses it as the default:
import { Para as ParaServer } from "@getpara/server-sdk";
import { ParaStellarSigner } from "@getpara/stellar-sdk-v14-integration";
import { Horizon, Networks, TransactionBuilder, Operation, Asset, BASE_FEE } from "@stellar/stellar-sdk";
const paraServer = new ParaServer("YOUR_API_KEY");
const server = new Horizon.Server("https://horizon.stellar.org");
// Create the signer
const signer = new ParaStellarSigner(paraServer, Networks.PUBLIC);
console.log(`Stellar address: ${signer.address}`);
// Load account and build transaction
const sourceAccount = await server.loadAccount(signer.address);
const transaction = new TransactionBuilder(sourceAccount, {
fee: BASE_FEE,
networkPassphrase: Networks.PUBLIC,
})
.addOperation(
Operation.payment({
destination: "GRECIPI...",
asset: Asset.native(),
amount: "10",
})
)
.setTimeout(180)
.build();
// Sign and submit
const { signedTxXdr } = await signer.signTransaction(transaction.toXDR());
const signedTx = TransactionBuilder.fromXDR(signedTxXdr, Networks.PUBLIC);
const result = await server.submitTransaction(signedTx);
console.log(`Transaction hash: ${result.hash}`);
Best Practices
- Always load the source account from Horizon before building transactions to get the correct sequence number
- Use
setTimeout() on transactions to prevent them from being valid indefinitely
- Consider fee bump transactions during network congestion
- Use higher fees during high-traffic periods to ensure transaction inclusion
Learn More
For detailed examples including multi-operation transactions, fee bumps, and Soroban auth, refer to our web documentation: