Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.unlink.xyz/llms.txt

Use this file to discover all available pages before exploring further.

Unlink lets you add private blockchain wallets to your app. Your users can own accounts, send and receive tokens privately, and interact with smart contracts, all without exposing balances or transaction history.

What you can build

  • Neobank - On-chain banking where users’ financial activity stays private
  • Payroll - Salaries and contractor payments that stay confidential
  • Treasury - Organizational fund management without revealing strategic decisions
  • Stablecoin payments - Move dollars on-chain while keeping balances private
  • OTC trading - Settle peer-to-peer trades privately
  • Donations & grants - Let users support causes without linking their identity
  • AI agents - Autonomous agents that send confidential transactions
Unlink is a smart contract deployed on the blockchain itself. No bridging, no separate chain. The SDK handles all proof generation and signing. From a builder’s perspective you call deposit(), transfer(), and withdraw().

How to integrate

The SDK splits work between a process-wide Tenant (holds engine URL and API key) and a per-user Session (holds the user’s account identity). You construct one Tenant at app startup and call tenant.forUser({ account }) once per user.
const tenant = createTenant({ engineUrl, apiKey });        // process-wide
const session = tenant.forUser({ account });               // per user
await session.transfer({ ... });                           // per user op
The SDK works anywhere JavaScript runs. Three common patterns: Single-user app (CLI, single-account wallet UI): one Tenant + one Session for the lifetime of the process. Multi-user backend (neobanks, payroll, Euler-style integrations): Tenant at module scope, a fresh Session per request. The user’s spending key never lives in your backend — pair account.fromPublicIdentity({ address }) with a signSigningRequest callback that round-trips signing to the user’s browser. Browser dApp (the canonical non-custodial flow): the integrator backend hosts two thin routes (/api/unlink/register, /api/unlink/token) that the browser calls via the SDK’s createUnlinkSigner — your tenant API key never leaves the server, the user’s spending key never leaves the browser. See the SDK README’s Browser auth section for the full setup (route handlers, token rotation, CSRF callout). Frontend (single-process, trusted) (CLIs, hackathon demos, trusted single-user tooling): one Tenant + one Session in the browser, holding both the tenant API key and the user’s keys. This bypasses the SDK’s createTenant browser guard via dangerouslyAllowBrowser: true — use only when each user runs the app themselves and the API key sharing is intentional.
For production browser dApps, use the Browser dApp pattern (createUnlinkSigner): your API key stays on the server, the user’s spending key stays in the browser, and capability tokens bridge them. The single-process “frontend” pattern is simpler but ships your API key with every visitor’s bundle — only safe in trusted single-user environments.
What’s private, what’s public
DepositTransferWithdraw
AmountPublicPrivatePublic
SenderPublicPrivatePrivate
RecipientPrivatePrivatePublic
Token typePublicPrivatePublic

Quickstart

Install the SDK and make your first deposit, transfer, and withdrawal.

Faucet

Mint test tokens publicly or fund Unlink accounts privately for onboarding and QA.

Deposit

Move ERC-20 tokens from an EVM wallet into the unlink contract.

Transfer

Send tokens privately between Unlink addresses.

Withdraw

Move tokens from the unlink contract to any EVM address.