Documentation

Signet is a verifiable developer career record built on Stellar/Soroban. A handle is bound to a wallet on-chain; the contracts that wallet has deployed and invoked become a public, citable history.

The trust model

Bindings live in the Identity Registry Soroban contract (packages/contracts/identity-registry). To claim a handle, the wallet owner authorizes the claim(handle, wallet) call — Soroban requires a valid signature from that wallet's key, so a binding can only be created by the key holder. No trusted oracle, no off-chain admin minting identities.

If the registry is ever replaced

The registry contract is immutable — the same property that stops anyone rewriting the rule above also means a defect in it cannot be patched. Recovery is a new contract, and because a binding can only be created by the wallet that signs for it, bindings do not move across by decree: you would re-claim your handle on the new registry with one signature. Your handle is held for your wallet during a grace period, so the move is not a race, and your profile and history — both derived from the wallet, not the registry entry — come back unchanged. The procedure is public in docs/CONTRACT_MIGRATION.md.

Reading a profile

Every profile lives at /p/{handle}. The on-chain operations shown are fetched from the public Stellar Horizon API, and each row links to its transaction on Stellar Expert for independent verification.

Linking your deploy wallet

Claiming a handle binds it to the wallet that signs the claim — usually a browser wallet, which is rarely the keystore identity you run stellar contract deploy from. To make a profile a real career record you link that deploy wallet from a terminal:

npx @signet/cli link

The command proves control of the deploy key and associates it with your handle; the indexer then attributes every contract that wallet has deployed and invoked to your profile. This is the path from a claimed handle to an indexed profile — until a deploy wallet is linked, a claimed handle points at an address that has deployed nothing and the profile renders empty. Terminal linking is not live yet; the full sequence is specified in docs/CLI.md.

SDK

Integrators read profiles through @signet/sdk, which talks to the public API:

import { SignetClient } from '@signet/sdk';

const signet = new SignetClient({ baseUrl: 'https://your-deployment.example' });
const profile = await signet.getProfile('aquawolf');
// → { handle, profile, stats: { invocations, uniqueFunctions } }

Phases

Docs · Signet