Admin Login

Troubleshooting Guide

MPA error codes, HTTP statuses, and resolution steps for Institutional Vault.

This guide helps you diagnose and resolve errors encountered when using Institutional Vault. It catalogs MPA (MPC Policy Authority) error codes with their typical HTTP statuses, descriptions, and recommended resolutions.

Overview

Errors in Institutional Vault flow through two layers:

  1. MPA (MPC Policy Authority) layer — The policy/wallet engine returns M-prefixed error codes (e.g., M0001, M0080).
  2. Wallet API (Mothership) — The API maps MPA errors to standard HTTP status codes (e.g., 400, 401, 403, 404, 408, 409, 429, 500, 503).

API error responses may include a correlationId for support troubleshooting. When escalating an issue, always include the correlation ID and the error code from the response.


MPA Error Codes (M-codes)

MPA (MPC Policy Authority) error codes are defined in the policy/wallet engine and returned in API responses as errorCode (M-prefixed). The following table lists all M-codes with their typical HTTP status and resolution guidance.

Timeout and Connectivity

CodeHTTP StatusDescriptionResolution
M0001408 Request TimeoutA timeout waiting for a response from a target serviceRetry the operation. If it persists, check network connectivity and MPA node health.
M0002408Approval timeoutOperation was not approved within the required timeframe. Retry and ensure approvers complete approval in time.
M0003503 Service UnavailableNode not readyMPA node is not ready to serve requests. Wait and retry; check node startup and configuration.
M0004503Critical stateSystem is in a critical state. Check MPA node logs; contact support if it persists.

Cancellation

CodeHTTP StatusDescriptionResolution
M0005Operation cancelledThe operation was cancelled. No action required; retry if needed.

User and Onboarding

CodeHTTP StatusDescriptionResolution
M0010401 UnauthorizedUser not onboardedUser must complete onboarding (e.g., approver registration) before performing this action.

Policy and Approval

CodeHTTP StatusDescriptionResolution
M0020400 Bad RequestUser group has too few membersPolicy requires more active owners in the group. Add members or adjust policy.
M0021400Initiator required (legacy policy engine)Legacy policy engine requires an initiator. Set initiator or migrate to new policy engine.
M0022400Missing confirmationRequired confirmation was not provided. Ensure all confirmations are submitted.
M0023Confirmation rejectedA confirmation was rejected. Review and resubmit or cancel the operation.
M0024Approval rejectedAn approval was rejected. Review and resubmit or cancel the operation.
M0025Blocked by policyOperation was blocked by policy. Adjust the request or policy configuration.

Asset and Currency

CodeHTTP StatusDescriptionResolution
M0030400Unsupported currencyThe currency or asset is not supported. Use a supported asset.
M0040400Unknown engineThe engine type is not recognized. Check asset/chain configuration.

Token Conflicts (ERC20, SPL, Canton)

CodeHTTP StatusDescriptionResolution
M0050409ERC20 symbol already existsAn ERC20 token with this symbol is already registered. Use a different symbol or the existing token.
M0051409SPL token name existsSPL token name already exists.
M0052409SPL token symbol existsSPL token symbol already exists.
M0053409Blockchain network symbol existsBlockchain network symbol already exists.
M0054409Canton token symbol existsCanton token symbol already exists.
M0060409ERC20 address already existsERC20 contract address is already registered.
M0061409SPL token address existsSPL token address already exists.
M0070404 Not FoundERC20 address does not existThe ERC20 contract address is not registered. Add the token first.
M0071404SPL token address does not existSPL token address is not registered. Add the token first.

Transaction Validation

CodeHTTP StatusDescriptionResolution
M0080400Insufficient fundsAccount does not have enough funds for the transfer. Ensure sufficient balance.
M0081400FeeTransaction does not contain a valid fee. Set an appropriate fee.
M0082400Validator not active long enoughValidator is not active long enough to exit. Wait and retry.
M0083400Replacement transaction underpricedReplacement transaction must have a higher gas price. Increase fee.
M0084Inputs missing or spentTransaction inputs are missing or already spent. Refresh and retry.
M0090400Validate transactionTransaction did not match intent. Verify transaction parameters.
M0091400Validate max feeTransaction did not match intent max fee. Adjust max fee.
M0092400Validate destinationDestination did not match intent. Verify destination address or account.
M0093400Validate amountAmount did not match intent. Verify transfer amount.

Cold Wallet Batch

CodeHTTP StatusDescriptionResolution
M0100409Batch in progressA batch is already in progress. Complete or cancel it before starting another.
M0101404Batch not foundThe requested batch was not found. Verify batch ID and cold wallet state.
M0102400Incorrect batchUploaded signed batch does not match the current batch. Re-sign the current batch.
M0103400No batch in progressNo batch is currently in progress. Create a batch first.
M0104Pre-signatures exhaustedNo more pre-signatures available for external key operations. Generate more pre-signatures.

External Keys

CodeHTTP StatusDescriptionResolution
M0110Operation not supported for external keysThis operation is not supported when using external keys. Use a different key type or operation.

Authentication (JWT)

Authentication errors usually result from invalid or expired credentials (e.g., JWT or API key). The approval service may return RFC 7807 ProblemDetails with type set to: invalid-issuer-or-audience, email-not-verified, app-signature-not-valid, token-expired, nonce-not-valid, jwt-signature-not-valid, or token-parse-error.

CodeHTTP StatusDescriptionResolution
M0120401JWT invalid issuer or audienceVerify IdP issuer and audience in app configuration. Ensure the token is for the correct environment.
M0121401JWT email not verifiedVerify the user's email in the IdP before allowing access.
M0122401JWT invalid app signatureCheck app credentials and signing configuration (e.g., client secret, key).
M0123401JWT expiredUser must sign in again to obtain a new token.
M0124401JWT nonce not validRetry sign-in; ensure nonce is not reused.
M0125401JWT invalid signatureToken may be corrupted or from the wrong issuer. Verify IdP and token source.
M0126401JWT token parseEnsure the request sends a valid JWT in the expected header or parameter.

General steps: (1) Confirm the user is onboarded (e.g., approver registration completed) if the error indicates user not onboarded (M0010). (2) For JWT errors, verify IdP configuration (issuer, audience, signing keys) and that tokens are not expired. (3) Check API key or certificate if using key-based auth; ensure it is valid and not revoked.

Approver

CodeHTTP StatusDescriptionResolution
M0130409Approver already onboardedAn attempt was made to change the public key for an already onboarded approver.
M0131400Operation not pending approvalsReject/Approve was called for an operation that is not pending approvals or confirmations.

Unknown

CodeHTTP StatusDescriptionResolution
M9999500 Internal Server ErrorUnknown errorFallback for unclassified errors. Retry; if it persists, contact support with correlation ID.

Data Collection for Support

When escalating an issue to support, providing the following information will help resolve it faster.

1. Log files

  • Provide logs with context (surrounding lines), not only the error line.
  • Include debug-level logs when possible. To enable debug logging:
    • Wallet: In wallet.yaml, set log_level: 0 (0 = debug, 1 = info, 2 = warn, 3 = error). Default is 1.
    • MPA nodes (policy nodes): Set the environment variable DEFAULT_LOG_LEVEL=debug. Valid values: debug, info, warn, error. Log level is read at process start from the environment only (not from the policy node config files).
  • Collect logs from all relevant components: Wallet API (Mothership), MPA nodes (policy nodes), and any approval or cold-wallet services.
  • For mobile or approval apps, include logs from those clients if available.

2. Error messages and correlation IDs

  • Share the full error message and any stack trace from the UI or SDK.
  • Include the correlation ID from the API response headers. This allows support to correlate with server-side logs.
  • Note the error code (M-code) and the HTTP status of the response.

3. Configuration

  • Include configuration details as recorded in logs at startup (sensitive values are typically masked).
  • Do not share secrets, API keys, or passwords.

4. Context

  • Frequency and pattern: Does the issue happen every time, at certain times, or randomly?
  • Affected platforms: Which environments or clients are affected? Which are working?
  • Reproduction steps: Minimal steps to reproduce the issue.
  • Customer code: If permitted, share the code or request shape used to call the API or SDK.

Providing this information upfront helps the support team diagnose and resolve issues more quickly.

🗣️We Are Here to Help!

Please contact us via email or support chat if you encounter an issue, bug, or need assistance. Don't forget to include any relevant details about the problem. To request a wallet form and Institutional Vault Approver form, please click here or contact our sales team.