The Solana SDK is the current live SDK path for Arcane private payments. It is a standalone TypeScript SDK for the Arcane privacy layer on Solana. It provides reusable protocol client code for private balances, UTXO scanning, proof generation, relayed transaction submission, private spend, and withdrawal to Solana.

Package status

The package name is @arcane-labs/privacy-layer-sdk, but the package is not publicly published yet. Do not use yarn add @arcane-labs/privacy-layer-sdk unless Arcane confirms private registry access or package publication.
Source access is available in the private GitHub repository: Polynom-Labs/privacy-layer-sdk. Arcane must grant repository access before partners can clone it. For private beta access, install the package artifact Arcane provides:
yarn add <path-or-registry-spec-for-arcane-solana-sdk>
If Arcane provides source access instead of a package artifact, build it locally:
yarn install --frozen-lockfile
yarn build

Program

The bundled IDL targets this deployed Arcane program:
2EyitVDBV38LSeGDKQuZWHMCmebMdGeVFgHC5LYxepLG
Confirm the target program id with Arcane before production deployment.

Runtime configuration

The SDK reads configuration from Node process.env or Vite-style import.meta.env.
VariablePurposeDefault
ARCANE_INDEXER_URL / INDEXER_API_URL / VITE_INDEXER_URLIndexer API used for Merkle roots, proofs, UTXO history, and compliance checkshttps://yona.cash/api
ARCANE_RELAYER_URL / RELAYER_URL / VITE_RELAYER_URLRelayer API used to submit signed private transactionsIndexer URL
ARCANE_LIGHT_RPC_URL / LIGHT_RPC_URL / VITE_LIGHT_RPC_URLLight Protocol RPC endpointEmpty
ARCANE_CIRCUIT_PATH / CIRCUIT_PATH / VITE_CIRCUIT_PATHGroth16 circuit path or URL used by the prover/transaction2
COMPLIANCE_REQUIRE_SENDER / VITE_COMPLIANCE_REQUIRE_SENDERRequires sender wallet message signatures for compliant withdrawalsfalse
Keep this configuration server-side for backend-managed integrations.

Main exports

The main entrypoint exports:
  • createProvider, createProgram, getProgram
  • PROGRAM_ID, INDEXER_API_URL, RELAYER_URL, LIGHT_RPC_URL
  • UtxoKeypair, Utxo
  • depositWithRelayer, transactTransfer, withdrawWithRelayer
  • consolidateUtxos, autoConsolidateAll
  • getMyUtxos, getBalanceFromUtxos, groupUtxosByMint, clearUtxoCache
  • EncryptionService, MerkleTree, prove, pollSignatureStatus
Package subpath exports are available for transaction modules and selected utilities:
import { transactTransfer } from "@arcane-labs/privacy-layer-sdk/transactions/transact";
import { getMyUtxos } from "@arcane-labs/privacy-layer-sdk/utils/getMyUtxos";

Create a program client

import { Connection } from "@solana/web3.js";
import { createProvider, createProgram } from "@arcane-labs/privacy-layer-sdk";

const connection = new Connection(process.env.SOLANA_RPC_URL!, "confirmed");
const provider = createProvider(connection, wallet);
const program = createProgram(provider);

Scan private UTXOs

import { getMyUtxos, getBalanceFromUtxos } from "@arcane-labs/privacy-layer-sdk";

const utxos = await getMyUtxos(signedWallet, connection, console.log, lightWasm);
const privateSol = getBalanceFromUtxos(utxos);
Backend-managed integrations should persist scan state, decoded UTXOs, and encrypted outputs on the server.

Deposit and shield

Use depositWithRelayer after your backend detects public funds at the stealth deposit address.
const result = await depositWithRelayer(
  amountInUiUnits,
  signedWallet,
  connection,
  lightRpc,
  program,
  mintAddress,
  signTransaction,
  setStatus,
  lightWasm
);
Record the returned signature and timing metadata in your operation history.

Private spend

Use transactTransfer for movement inside the privacy layer.
const result = await transactTransfer(
  amountInUiUnits,
  recipientUtxoPubkey,
  recipientX25519Pubkey,
  signedWallet,
  connection,
  lightRpc,
  program,
  mintAddress,
  signTransaction,
  setStatus,
  lightWasm
);

Withdraw to Solana

Use withdrawWithRelayer to move private balance to a public Solana address.
const result = await withdrawWithRelayer(
  recipientAddress,
  amountInLamports,
  signedWallet,
  connection,
  mintAddress,
  setStatus,
  lightWasm,
  referralCode,
  signMessage
);

Private payments integration guide

Implement the backend-managed wallet pattern around these SDK calls.