Privacy-preserving stealth transfers on Solana using Single-Key Stealth Addresses (SKSA).
Adelos enables private transactions on Solana by generating unique stealth addresses for each transfer. Only the intended recipient can detect and claim the funds, making transactions unlinkable to their main wallet.
- Stealth Addresses: Each transfer goes to a unique, one-time address
- Unlinkability: No on-chain connection between sender and receiver's main wallet
- Non-interactive: Sender only needs receiver's registered public key
- Full Withdrawal: Receiver can withdraw funds to any wallet
adelos/
βββ anchor/ # Solana smart contract (Anchor)
βββ sdk/ # TypeScript SDK (@adelos/sdk)
βββ demo-dapp/ # Next.js demo application
βββ README.md
npm install @adelos/sdkimport { AdelosSDK, AdelosIndexer, derivePublicKey } from "@adelos/sdk";
const sdk = new AdelosSDK({
rpcUrl: "https://api.devnet.solana.com",
debug: true
});// Unlock privacy (deterministic key from wallet signature)
const metaSk = await sdk.unlockPrivacy(signMessage);
const metaPk = derivePublicKey(metaSk);
// Register on-chain
// const tx = await sdk.createRegisterTransaction(publicKey, metaPk);
const signedTx = await signTransaction(tx);
await sdk.sendAndConfirm(signedTx);// Check if recipient is registered
const registry = await sdk.getRegistry(recipientPubkey);
if (registry.exists) {
// Create and send stealth transfer
const { transaction, stealthAddress, memo } = await sdk.createStealthTransfer(
senderPubkey,
recipientPubkey,
0.1, // SOL amount
"v0"
);
const signedTx = await signTransaction(transaction);
await sdk.sendAndConfirm(signedTx);
}import { AdelosIndexer } from "@adelos/sdk";
// Initialize indexer
const indexer = new AdelosIndexer(connection);
// Scan for incoming stealth transfers
const transfers = await indexer.scanForStealthTransfers(metaSk, metaPk, 50);
// Withdraw to any address
for (const tx of transfers) {
const withdrawable = indexer.prepareWithdraw(tx, metaSk, metaPk);
const { signature } = await sdk.createWithdrawTransaction(
withdrawable.stealthSecretKey,
tx.stealthAddress,
destinationPubkey
);
}- Program ID (Devnet):
7T1UxHJ6psKiQheKZXxANu6mhgsmgaX55eNKZZL5u4Rp - NPM Package: @adelos/sdk
- GitHub: github.com/pfrfrfr/adelos
Adelos uses industry-standard cryptographic primitives:
| Component | Algorithm |
|---|---|
| Elliptic Curve | Ed25519 |
| Key Exchange | ECDH (X25519) |
| Hash Function | SHA-256 |
| Signature | EdDSA |
- Receiver registers a meta public key derived from their wallet signature
- Sender generates an ephemeral keypair and computes ECDH shared secret
- Stealth address is derived:
P_stealth = P_meta + G Β· H(shared_secret) - Receiver scans memo program for ephemeral keys and trial-decrypts
- Receiver recovers stealth private key:
s_stealth = s_meta + H(S) mod n
For security issues, please email: albary6700@gmail.com
MIT