Skip to content

Error Code Catalog

This catalog documents all error messages returned by Hello World Co-Op DAO canisters, organized by service.

auth-service

Authentication Errors

Error MessageCauseResolution
Too many failed login attempts. Please try again in 10 minutesRate limiting triggeredWait 10 minutes before retrying
Access token expiredJWT access token has expiredUse refresh token to get new access token
Refresh token expiredJWT refresh token has expiredUser must re-authenticate
Invalid refresh token - possible reuse attackRefresh token reused (security)Re-authenticate from scratch
Device fingerprint mismatch - possible session hijackingDevice changed mid-sessionRe-authenticate from the new device

Password Errors

Error MessageCauseResolution
Password must contain at least one numberMissing numeric characterAdd at least one digit (0-9)
Password must contain at least one uppercase letterMissing uppercaseAdd at least one uppercase letter (A-Z)
Password must contain at least one lowercase letterMissing lowercaseAdd at least one lowercase letter (a-z)

Password Reset Errors

Error MessageCauseResolution
Too many password reset requests. Please try again in 1 hour.Rate limitingWait 1 hour before requesting again
Reset token has expired. Please request a new password reset.Token older than 24 hoursRequest new password reset
Reset token has already been used. Please request a new password reset.One-time token reusedRequest new password reset

Configuration Errors

Error MessageCauseResolution
Unauthorized: Only controllers can set user serviceNon-controller callerUse controller identity
Unauthorized: Only controllers can set oracle bridge configurationNon-controller callerUse controller identity
Unauthorized: Only controllers can set frontend URL configurationNon-controller callerUse controller identity
Oracle bridge not configured. Call set_oracle_bridge() first.Missing configurationController must configure oracle bridge
Frontend URL not configured. Call set_frontend_url() first.Missing configurationController must configure frontend URL

user-service

Account Errors

Error MessageCauseResolution
Current password is incorrectWrong password on changeVerify current password
Email/password authentication not configuredNo password credentialUse different auth method or set password
Session expiredSession no longer validRe-authenticate
Attestation has expiredOIDC attestation too oldRe-authenticate with provider

Password Errors

Error MessageCauseResolution
Password must contain at least one numberMissing numeric characterAdd at least one digit (0-9)
Password must contain at least one uppercase letterMissing uppercaseAdd at least one uppercase letter (A-Z)
Password must contain at least one lowercase letterMissing lowercaseAdd at least one lowercase letter (a-z)
Password must contain at least one special characterMissing special charAdd special character (!@#$%^&*)

Linking Errors

Error MessageCauseResolution
This Internet Identity is already linked to another accountII anchor in useUse different II or unlink from other account
This provider account is already linked to another userOAuth account in useUse different OAuth account
Session not found or expiredInvalid session tokenRe-authenticate
Session does not belong to this userSession/user mismatchRe-authenticate as correct user

membership

Membership Errors

Error MessageCauseResolution
Principal already has a membershipDuplicate minting attemptCheck existing membership first
Renewal window is closed. Renewals are only allowed December 1 - January 31Outside renewal periodWait for renewal window
Payment proof is required for renewalMissing attestationComplete payment first
Revoked membership cannot be renewed - must apply as new memberMembership was revokedApply for new membership

Controller Errors

Error MessageCauseResolution
Controllers already initialized. Use set_controllers to modify.Init called twiceUse set_controllers instead
Cannot set empty controllers list - this would lock the canisterRemoving all controllersKeep at least one controller
Cannot remove the last controller - this would lock the canisterRemoving final controllerAdd new controller first
Principal is not a controllerNon-controller in listVerify principal ID
Auth service not configuredMissing auth-service principalController must configure

governance

Proposal Errors

Error MessageCauseResolution
Title cannot be emptyEmpty proposal titleProvide a title
Title too long (max 200 characters)Title exceeds limitShorten title to 200 chars
Description cannot be emptyEmpty proposal descriptionProvide a description
Proposal not approvedTrying to execute unapprovedWait for approval vote
Proposal already executedDuplicate execution attemptProposal can only execute once

Voting Errors

Error MessageCauseResolution
Already voted on this proposalDuplicate vote attemptEach member can vote once
Voting has not started yetBefore voting windowWait for voting to begin
Voting period has endedAfter voting windowCannot vote after deadline
Proposal is not in active voting statusWrong proposal stateCheck proposal status
Not an active memberCaller not a memberComplete membership signup
Membership verification failedInter-canister call failedCheck membership canister

Configuration Errors

Error MessageCauseResolution
Unauthorized: controller access requiredNon-controller callerUse controller identity
Invalid percentage: must be 0-100Invalid threshold valueUse value between 0-100

dom-token

Authorization Errors

Error MessageCauseResolution
Only admin can enable burn policiesNon-admin callerUse admin identity
Only admin can disable burn policiesNon-admin callerUse admin identity
Unauthorized: Only admin/controller can mint tokensNon-admin callerUse admin identity
Unauthorized: Only admin/controller can batch distribute tokensNon-admin callerUse admin identity

Transfer Errors (ICRC-1)

Error MessageCauseResolution
InsufficientFundsBalance too lowCheck balance before transfer
BadFeeIncorrect fee specifiedUse icrc1_fee() to get correct fee
BadBurnBurn amount below minimumIncrease burn amount
TooOldTransaction timestamp too oldUse current timestamp
DuplicateTransaction already processedCheck transaction ID

treasury

Configuration Errors

Error MessageCauseResolution
Auth service not configuredMissing auth-service principalController must configure
Invalid sessionSession token invalidRe-authenticate

identity-gateway

Delegation Errors

Error MessageCauseResolution
Invalid delegation chain format: missing challengeMalformed delegationRe-authenticate with II
Invalid delegation chain format: missing principalMalformed delegationRe-authenticate with II
Invalid delegation chain: emptyNo delegation providedInclude delegation in request
Invalid delegation chain: malformed formatParse errorCheck delegation format
Challenge not found or already used (replay attack prevented)Challenge reusedStart new login flow
Challenge expired (must authenticate within 5 minutes)TimeoutComplete auth within 5 min

Linking Errors

Error MessageCauseResolution
This Internet Identity is already linked to another accountII anchor in useUse different II anchor
Unlinking Internet Identity requires email/password authentication. Please login with email/password first.Wrong auth methodLogin with email/password first

Device Errors

Error MessageCauseResolution
Device has been revokedDevice no longer authorizedRe-register device or use another

Self-Custody Errors

Error MessageCauseResolution
Custodial wallets not supported for governance. Please use self-custodial authentication (passkey/WebAuthn).Using custodial walletUse passkey/WebAuthn authentication

Configuration Errors

Error MessageCauseResolution
Unauthorized: only controllers can configure auth serviceNon-controller callerUse controller identity
Unauthorized: only controllers can configure user serviceNon-controller callerUse controller identity

Common Patterns

Controller Authorization

Most configuration methods require controller access:

rust
// Pattern used across canisters
if !is_controller(caller) {
    return Err("Unauthorized: Only controllers can...".to_string());
}

Resolution: Use dfx identity with a principal that is a canister controller.

Session Validation

Session-based methods validate tokens via auth-service:

Session expired
Session not found or expired
Invalid session

Resolution: Call refresh_tokens with valid refresh token, or re-authenticate.

Rate Limiting

Several operations have rate limits:

OperationLimitWindow
Login attempts5 failures10 minutes
Password reset3 requests1 hour
Temp key requests5-10024 hours

Resolution: Wait for the cooldown period to expire.

Frontend Error Handling

When displaying errors to users, map technical errors to user-friendly messages:

typescript
const USER_FRIENDLY_ERRORS: Record<string, string> = {
  'Session expired': 'Your session has expired. Please log in again.',
  'Not an active member': 'You must be a member to perform this action.',
  'Already voted on this proposal': 'You have already voted on this proposal.',
  'Voting has not started yet': 'Voting for this proposal has not opened yet.',
  'Voting period has ended': 'The voting period for this proposal has closed.',
};

function getDisplayError(error: string): string {
  return USER_FRIENDLY_ERRORS[error] || 'An unexpected error occurred. Please try again.';
}

Hello World Co-Op DAO