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.
Reading a contract diagram
The Diagram tab on a contract page is a picture of a Soroban contract’s public interface, drawn from its compiled spec: which functions it exposes and which data types they take and return. Everything solid in it is declared by the contract. Anything dashed is observed: seen in transactions Signet indexed, never promised by the contract. The legend under each diagram lists exactly the shapes and lines it uses.
Nodes
- Function (rounded box,
fn): one exported function. It links to that function in the generated docs. - Struct, enum and union (square box; a union has a cut corner): a data type the spec defines and a function uses. Types sit in columns to the right of the functions, nested types further right.
- Stub (dashed box): a type the spec names but does not define, linked to the docs instead of drawn.
- Collapsed group (dashed box such as
pool_* (12)): a group of functions folded into one box. Select it to draw its functions; a Collapse link folds it again. - Contract (box ringed in the observed colour): another contract this one has been seen calling, named by its asset, its Signet profile, or its short address.
Errors and events are not nodes. They relate to many functions at once, so they are listed in the docs tabs instead of adding lines here.
Lines
- Argument (solid, filled arrow): the type is one of the function’s inputs.
- Return (solid, open arrow): the function gives the type back.
- Field (thin solid line): one type contains another.
- Call (dashed, dotted or dash-dot, with a count): this contract was seen calling another one. The pattern says how Signet knows: an authorisation tree, an event the other contract emitted, or only its presence in the transaction’s footprint. Thicker lines were seen more often.
An argument merely named token or pool is never drawn as a relationship: only the types are.
Groups
Soroban contracts conventionally prefix related functions, for exampleadmin_ or pool_. The diagram clusters functions that share a prefix into a group, with the well-known lifecycle entrypoints (init, upgrade and the like) in their own. A contract with more than 25 functions starts with every group collapsed. Grouping is a reading aid based on naming, not something the language enforces.
When there is no diagram
A diagram is only drawn when it adds something. A contract whose functions use no types of their own, such as the registry, gets no diagram, because its docs already say everything a picture could. A contract with more than 60 nodes after grouping gets the function list with a note that it is too large to diagram usefully. Text never renders smaller than 12px: a wide diagram scrolls inside its own box instead of shrinking.
What is observed, and how far it reaches
- Read/write marks: a
W,Ror?on a function says it was seen writing state, seen only reading, or never seen at all.Rmeans no write was observed, not that the function cannot write. - Activity: the line above the diagram and the count on each function come from indexed calls over the chosen range.
- Storage view: the storage keys the contract has been seen using, grouped as instance, persistent and temporary, with the functions that read and wrote them.
Each of these says under it what it was built from: how many transactions, between which ledgers. Signet only sees calls made since it began indexing a contract, within the RPC’s retention window (about 7 days on testnet), and keeps a limited number per contract, so a quiet or new contract shows little, and that absence is not evidence.
What the diagram cannot show
- Whether a function can write state: the spec does not say. A mark only reports what was seen.
- A storage schema: Soroban contracts do not declare one. The storage view lists keys seen in use, never the keys that could exist.
- Calls nobody made: call lines come from transactions, so a call path no one has used yet is not drawn.
- Which function emits which event: the spec declares events, not who raises them.
Saving a diagram
Download SVG saves the interface diagram with the contract’s address, network and WASM hash printed under it;Download PNG saves the same at twice the size; the storage view has its own SVG download. Every diagram state is also a link: the URL keeps the search, the expanded groups, the activity range and a focused node.
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.
Run a contract locally
signet dev runs a deployed contract on your machine. It forks the contract's ledger state from a Soroban RPC, builds your crate, and on every change replays saved and real calls against the deployed code and your build, then reports what differs. Nothing runs on Signet's servers.
# once: write signet.dev.toml for the contract you deployed signet dev init CASFJHI5PQSRWS7JV25CF7FOMRKIVBP3RXRP3E2GH2CV4BCAG7FUJRCN --path ./contract # the loop: rebuild, replay on both versions, diff, on every save signet dev CASFJHI5PQSRWS7JV25CF7FOMRKIVBP3RXRP3E2GH2CV4BCAG7FUJRCN --path ./contract
It needs the stellar CLI, Rust with the wasm32v1-none target, and the signet-simulator next to signet. The CLI is not on npm yet; docs/CLI.md covers building it, and docs/SANDBOX.md is the full guide, including --ci for pull requests.
API and SDK
The public, read-only API is documented in the API reference: every endpoint, its parameters and responses, with examples. Every endpoint is a plain GET; no key is needed:
curl -s https://your-deployment.example/api/v1/profiles/yourhandle/contracts?limit=10
# → { "data": [{ "address": "C…", "deployer": "G…", "deployedAt": "…", … }],
# "meta": { "nextCursor": null, "total": 3, "truncated": false, … } }Integrators can also read it through @signet/sdk:
import { SignetClient } from '@signet/sdk';
const signet = new SignetClient({ baseUrl: 'https://your-deployment.example' });
const profile = await signet.getProfile('yourhandle');
// → { handle, displayName, primaryWallet, wallets, counts, … }Phases
- Phase 1 (done): public profiles, real on-chain activity and the SDK. Its curated handle→wallet bindings have been retired — only handles bound on-chain are served.
- Phase 2 (live): self-sovereign claims via the on-chain Identity Registry, and the developer dashboard at
/app. - Phase 2 (in progress): terminal deploy-wallet linking (
npx @signet/cli link) and the indexer populating full deployment history.