> For the complete documentation index, see [llms.txt](https://docs.t-rex.network/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.t-rex.network/reference/identity-suite/errors-of-the-identity-suite.md).

# Errors of the identity suite

Every custom error of ONCHAINID, grouped by the contract that raises it. Most are declared in the library `Errors` (`contracts/libraries/Errors.sol`). The key registry declares seven of its own in `ERC734Validator`. The errors of the recovery module are OpenZeppelin's and are listed in [RecoveryModule](/reference/identity-suite/recoverymodule.md).

### Common

| Error                 | Raised when                                                          |
| --------------------- | -------------------------------------------------------------------- |
| `ZeroAddress()`       | A required address is zero                                           |
| `EmptyString()`       | A salt is empty                                                      |
| `InvalidSignature()`  | A signature does not verify                                          |
| `InvalidSignerData()` | Signer data is missing, too short, or does not hash to the key given |

### Keys

| Error                                                 | Raised when                                                                     |
| ----------------------------------------------------- | ------------------------------------------------------------------------------- |
| `SenderDoesNotHaveManagementKey()`                    | A function reserved to `MANAGEMENT` is called by another key                    |
| `SenderDoesNotHaveActionKey()`                        | An approval needs `ACTION` and the caller lacks it                              |
| `SenderDoesNotHaveClaimSignerKey()`                   | A claim is added or removed by a caller without a claim key                     |
| `KeyDoesNotHavePurpose(bytes32 key, uint256 purpose)` | A purpose is removed from a key that does not hold it                           |
| `KeyAlreadyRegistered(bytes32 keyHash)`               | A key receives a purpose it already holds                                       |
| `KeyNotRegistered(bytes32 keyHash)`                   | A key is unknown to the registry                                                |
| `KeyTypeMismatch(bytes32 keyHash)`                    | A registered key is given a purpose with another key type than the one recorded |
| `InvalidPurpose(uint256 purpose)`                     | A purpose outside 1 to 6                                                        |
| `InvalidSignerLength()`                               | Signer data shorter than an address                                             |
| `CannotRemoveLastManagementKey()`                     | The last `MANAGEMENT` key that can sign is removed                              |
| `ModuleCannotBeKey()`                                 | The key registry itself is given as a key                                       |
| `ClientDataTooLong()`                                 | The client data of a key exceeds its limit                                      |

### Claims

| Error                                                                                  | Raised when                                                               |
| -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| `InvalidClaim()`                                                                       | The issuer does not answer `Valid` for the claim                          |
| `InvalidClaimTopic()`                                                                  | The topic is 0                                                            |
| `ClaimMetadataMismatch(uint256 scheme, string uri)`                                    | The scheme and the URI do not match the `metadataHash` that was signed    |
| `ClaimSignatureTooLong()`, `ClaimPayloadTooLong()`, `ClaimUriTooLong()`                | A field of the claim exceeds 2,048 bytes                                  |
| `ClaimNotRegistered(bytes32 claimId)`                                                  | A claim to remove does not exist                                          |
| `ClaimAlreadyRevoked()`                                                                | A digest is revoked twice                                                 |
| `IdentityNotClaimIssuerType(address identity)`                                         | An issuer with no claim key on the identity is not of type `CLAIM_ISSUER` |
| `ReputationBelowClaimAddThreshold(address identity, uint256 score, uint256 threshold)` | That issuer's reputation is below the threshold                           |
| `EASNotSupported()`                                                                    | A function the EAS adapter does not serve is called on it                 |

### Execution

| Error                                          | Raised when                                                                            |
| ---------------------------------------------- | -------------------------------------------------------------------------------------- |
| `SenderCannotPropose(address sender)`          | `execute` is called by an address that holds no key allowed to propose                 |
| `InvalidRequestId()`                           | An approval names a request that does not exist                                        |
| `RequestAlreadyExecuted()`                     | The request is already closed                                                          |
| `RequestInvalidated()`                         | The request was queued before the module was last uninstalled                          |
| `ProposerNoLongerAuthorized(address proposer)` | The key that queued the request lost its authority                                     |
| `ReturnToAccountFailed()`                      | The value sent with `execute` cannot be returned to the identity                       |
| `UnsupportedExecutionMode(bytes32 mode)`       | The identity is asked to execute in a mode it does not accept, such as a delegate call |
| `OwnModuleTargetBlocked(address target)`       | A dispatched call targets one of the identity's own modules                            |
| `ExecutorPurposeNotAuthorized()`               | A module dispatches a call that the purpose registered for it does not cover           |
| `IdentityNoValidatorOrExecutor()`              | An identity is initialized with neither a validator nor an executor                    |

### Creating identities

| Error                                                                                     | Raised when                                                                                             |
| ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| `UnknownIdentityType(uint256 identityType)`                                               | The type has no policy                                                                                  |
| `ZeroIdentityType()`                                                                      | A policy is set for type 0                                                                              |
| `IdentityTypeNotSelfDeployable(uint256 identityType)`                                     | `createIdentity` for a type that is not self-deployable                                                 |
| `NotAuthorizedForIdentityType(address caller, uint256 identityType, uint64 requiredRole)` | `createIdentityFor` by a caller without the role of the type                                            |
| `DelayedRoleNotSupported(address caller, uint64 requiredRole, uint32 executionDelay)`     | The caller holds that role with an execution delay                                                      |
| `SingleBindingTypeCannotBePublic(uint256 identityType)`                                   | A type bound to one contract is opened to the public role                                               |
| `EmptyListOfKeys()`, `NoManagementKeyInKeys()`                                            | No key, or no `MANAGEMENT` key, is supplied                                                             |
| `KeyNotForAccount(bytes32 keyHash)`, `AccountNotSoleManagementKey(address account)`       | `createIdentityFor`: a key is not a key of the account, or the account is not the only `MANAGEMENT` key |
| `CallerKeyCannotBeModule(bytes32 keyHash)`                                                | A key of type `MODULE` is supplied at creation                                                          |

### Linking wallets

| Error                                                                                   | Raised when                                                                   |
| --------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| `NotFactoryIdentity(address caller)`                                                    | `linkAccount` is called by a contract the factory did not deploy              |
| `NonCanonicalAccount(bytes account)`                                                    | A wallet is not in the canonical ERC-7930 form                                |
| `NonEvmAccount(bytes account)`, `AccountNotOnLocalChain(bytes account)`                 | A signature link for a wallet that is not an EVM wallet of this chain         |
| `ExpiredSignature(uint256 expiry)`                                                      | The link signature is expired, or carries no expiry                           |
| `UntrustedVerifier(address verifier)`                                                   | The signer names a verifier the factory does not trust                        |
| `WalletAlreadyLinkedToIdentity(bytes wallet)`                                           | The wallet is already linked to the calling identity                          |
| `WalletBoundToAnotherIdentity(bytes wallet, address boundIdentity)`                     | The wallet is linked to another identity                                      |
| `WalletAlreadyRevoked(bytes wallet)`                                                    | The wallet was revoked: a revocation is final                                 |
| `WalletNotLinkedToIdentity(bytes wallet)`, `WalletNotActive(bytes wallet)`              | A revocation names a wallet that is not linked to the identity, or not active |
| `CannotLinkToAssetIdentity(address identity)`                                           | A wallet is linked to an `ASSET` identity                                     |
| `CannotLinkFactoryIdentity(address identity)`                                           | An identity is given as a wallet to link                                      |
| `CannotRevokeFromNonSigningIdentity(address identity)`                                  | A revocation on an identity bound to one contract                             |
| `CrossChainSenderWalletMismatch(bytes sender, bytes wallet)`                            | The sender of a link proposal is not the wallet it names                      |
| `CrossChainLinkForLocalWallet(bytes wallet)`                                            | A proposal names a wallet of this chain                                       |
| `WalletAlreadyHasEntry(bytes wallet)`                                                   | A proposal names a wallet that is already linked or revoked                   |
| `PendingCrossChainLinkExpired(uint256 expiry)`                                          | A proposal is delivered or settled after its expiry                           |
| `PendingCrossChainLinkIdentityMismatch(bytes wallet, address caller, address recorded)` | A proposal is settled by another identity than the one it names               |

### The beacon of the identities

| Error                                                              | Raised when                                                                      |
| ------------------------------------------------------------------ | -------------------------------------------------------------------------------- |
| `BeaconNotInitialized()`, `BeaconAlreadyInitialized()`             | An identity is created before the beacon exists. The beacon is initialized twice |
| `BeaconAddressMismatch(address expected, address actual)`          | The beacon is not deployed at the address the factory committed to               |
| `ImplementationNotAContract(address implementation)`               | The candidate implementation has no code                                         |
| `ImplementationFactoryMismatch(address implementation)`            | It does not name this factory                                                    |
| `ImplementationRegistryMismatch(address expected, address actual)` | It names another key registry than the one identities use                        |
| `ImplementationInitializersNotDisabled(address implementation)`    | Its initializers are not locked                                                  |
| `ImplementationVersionMismatch(string expected, string actual)`    | Its version is not the one the upgrade announced                                 |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.t-rex.network/reference/identity-suite/errors-of-the-identity-suite.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
