In AttestProtocol, an authority is simply the wallet address that created a schema. When you deploy a schema, you become its authority — the permanent owner of that schema definition.
Schemas and attestations are permissionless by default. Anyone can create schemas, and anyone can issue attestations to any schema — unless a resolver restricts access.
┌─────────────────────────────────────────────────────────────┐│ PERMISSIONLESS BY DEFAULT │├─────────────────────────────────────────────────────────────┤│ ││ Schema Creation ││ └── Any wallet can deploy a schema ││ └── Creator becomes the "authority" (owner) ││ ││ Attestation Issuance ││ └── Any wallet can attest to any schema ││ └── Unless a resolver restricts access ││ ││ Access Control (Optional) ││ └── Attach a resolver to control who can attest ││ ├── Fee requirements ││ ├── Allowlists ││ └── Custom validation logic ││ │└─────────────────────────────────────────────────────────────┘
When you deploy a schema, your wallet address is recorded as its authority. This gives you:
Ownership record — Your address is permanently linked to the schema
Schema definition control — You defined the structure and resolver at creation
Being a schema authority does not mean only you can attest. By default, anyone can issue attestations to your schema. Use a resolver if you need access control.
import { StellarAttestationClient } from '@attestprotocol/stellar-sdk';const client = new StellarAttestationClient({ network: 'testnet', contractId: 'CBFE5YSUHCRYEYEOLNN2RJAWMQ2PW525KTJ6TPWPNS5XLIREZQ3NA4KP'});// Deploy a schema - you become its authorityconst schemaUid = await client.createSchema({ definition: 'string name, bool verified, uint64 timestamp', resolver: null, // No resolver = permissionless attestations revocable: true});// Anyone can now attest to this schema
If you want to control who can attest to your schema, attach a resolver:
Copy
// Deploy a schema with access controlconst schemaUid = await client.createSchema({ definition: 'string credential, uint64 issuedAt', resolver: 'CRESOLVER...', // Resolver controls who can attest revocable: true});// Now only addresses approved by the resolver can attest
See Resolvers for details on implementing access control.
// Check if an address is a verified authorityconst isVerified = await authority.isAuthority('GADDRESS...');// Fetch full authority detailsconst authorityData = await authority.fetchAuthority('GADDRESS...');console.log('Authority:', authorityData.data);
Without a resolver, attestations are permissionless. With a resolver, you can enforce any access control logic you need.See Resolvers for implementation details.
Keep your private keys secure. While attestations are permissionless, your verified authority status and any resolver admin rights are tied to your address.