Skip to main content
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: