Self-Create a Participant
Create an ISSUER or VERIFIER participant for a credential schema when the schema is configured in OPEN management mode (MOD-PP-MSG-14, MsgSelfCreateParticipant). This is the fastest way to become authorized to issue or verify credentials for that schema — no onboarding process required.
Heads-up: You must still comply with the Ecosystem Governance Framework (EGF). Even in OPEN mode, your participant can be revoked and its deposit slashed if you violate the EGF.
This is a delegable transaction executed on behalf of a Corporation. Before running it you need:
- A Corporation (
policy_address) that owns the Verifiable Service — see Create a Corporation. - The policy funded with
uvnafor fees and trust deposit. - An operator granted authorization for
/verana.pp.v1.MsgSelfCreateParticipantvia Grant Operator Authorization. - A schema in OPEN management mode for the relevant role, with an active ECOSYSTEM (root) participant — see Create a Root Participant.
Sign with --from <operator> and pass the corporation with --corporation <policy_address>.
When can you self-create?
You can self-create when the schema's management mode for your role is OPEN:
- For ISSUER: the schema's issuer management mode is
OPEN. - For VERIFIER: the schema's verifier management mode is
OPEN.
Additionally, the schema must have an active ECOSYSTEM (root) participant (created by the Ecosystem controller). Check with:
# Inspect issuer/verifier modes
veranad query cs list-schemas --node $NODE_RPC --output json | jq
# Ensure a root (ECOSYSTEM) participant exists for the schema
veranad query pp list-participants --schema-id 8 --role ecosystem --node $NODE_RPC --output json
If the schema is not in OPEN mode, use Run an Onboarding Process instead.
Message Parameters
| Name | Description | Mandatory |
|---|---|---|
role | issuer or verifier. | yes |
validator-participant-id | ID of the root (ECOSYSTEM) participant for the schema. | yes |
did | DID of the Verifiable Service that will hold the participant. | yes |
--corporation | policy_address of the owning Corporation. | yes |
--validation-fees <uint> | Fee (trust units) charged by an ISSUER for a holder onboarding process. | no |
--verification-fees <uint> | Fee (trust units) an ISSUER charges a verifier. | no |
--effective-from / --effective-until | Optional RFC3339 validity window. | no |
Post the Message
- CLI
- Frontend
Usage
veranad tx pp self-create-participant [role] [validator-participant-id] [did] \
--corporation <policy_address> \
--from <operator> --chain-id <chain-id> --keyring-backend test --fees 750000uvna --gas auto --node $NODE_RPC
Example — ISSUER (OPEN mode)
CORPORATION=verana1n64en27u7qckklkk4twkkun5h6v5dsur7g6l4pfmfhydvfru9upq5w4nlu
OPERATOR=verana1aesnnc4fvar4wyaryvj9y4sty9vsw69hgymw7q
VALIDATOR_PARTICIPANT_ID=11 # ECOSYSTEM root participant for the schema
veranad tx pp self-create-participant issuer $VALIDATOR_PARTICIPANT_ID \
did:example:18c0df8c0e1f210891b43cfe1686375d \
--corporation $CORPORATION \
--validation-fees 25 --verification-fees 50 \
--from $OPERATOR --chain-id $CHAIN_ID --keyring-backend test --fees 750000uvna --gas auto --node $NODE_RPC --yes
Note: For a verifier participant, do not set
--validation-fees/--verification-fees(issuer-only).
TODO: When available in the UI, links and screenshots will be added here.
Verify on-chain
The example above self-creates participant 12. Query it:
veranad query pp get-participant 12 --node $NODE_RPC --output json
{
"participant": {
"id": "12",
"schema_id": "8",
"role": "ISSUER",
"did": "did:example:18c0df8c0e1f210891b43cfe1686375d",
"created": "2026-07-10T08:14:27.220107Z",
"effective_from": "2026-07-10T08:14:35.064065Z",
"effective_until": "2027-07-05T08:13:50.055379Z",
"modified": "2026-07-10T08:14:27.220107Z",
"validation_fees": "25",
"verification_fees": "50",
"validator_participant_id": "11",
"op_state": "VALIDATED",
"op_last_state_change": "2026-07-10T08:14:27.220107Z",
"corporation_id": "6"
}
}
Note that a self-created participant is immediately VALIDATED — no onboarding process runs.
Common errors & fixes
- Schema not in OPEN mode → run an onboarding process instead.
- No root participant → ask the Ecosystem controller to Create a Root Participant.
- Unauthorized operator → grant
/verana.pp.v1.MsgSelfCreateParticipantto the operator first.