> ## Documentation Index
> Fetch the complete documentation index at: https://docs.blink.cash/llms.txt
> Use this file to discover all available pages before exploring further.

# Error Handling

> Error codes, DepositError class, and user-friendly error messages.

Every error thrown by the Deposit SDK is a `DepositError` instance with a machine-readable `code` property. This lets you branch on failure mode without parsing message strings.

## DepositError

```typescript theme={null}
import { DepositError, getDisplayMessage } from '@swype-org/deposit';
```

```typescript theme={null}
class DepositError extends Error {
  readonly code: DepositErrorCode;
  constructor(code: DepositErrorCode, message: string);
}
```

## Error codes

| Code                      | Meaning                                                                                    | User-facing message                                                        |
| ------------------------- | ------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------- |
| `DEPOSIT_DISMISSED`       | User dismissed the transfer (tapped backdrop, pressed Escape, or closed the flow).         | "The transfer was dismissed before the transfer completed."                |
| `SIGNER_REQUEST_FAILED`   | Signer returned a non-2xx response.                                                        | "Unable to start the payment. Please try again."                           |
| `SIGNER_NETWORK_ERROR`    | Network failure reaching the signer.                                                       | "Unable to reach the payment server. Check your connection and try again." |
| `SIGNER_RESPONSE_INVALID` | Signer response missing required fields (`merchantId`, `payload`, `signature`, `preview`). | "The payment server returned an unexpected response."                      |
| `SIGNER_TIMEOUT`          | Signer did not respond within `signerTimeoutMs`.                                           | "The payment server took too long to respond. Please try again."           |
| `FLOW_TIMEOUT`            | Entire flow exceeded `flowTimeoutMs`.                                                      | "The deposit flow timed out. Please try again."                            |
| `INVALID_REQUEST`         | Bad input (missing amount, invalid address, destroyed instance, etc.).                     | "Invalid payment request. Please check your input."                        |

## getDisplayMessage

Returns a user-friendly display string for a `DepositError`. You can show this directly in your UI.

```typescript theme={null}
function getDisplayMessage(error: DepositError): string
```

### Usage

```typescript theme={null}
try {
  await deposit.requestDeposit({ /* ... */ });
} catch (err) {
  if (err instanceof DepositError) {
    // Show user-friendly message in your UI
    showToast(getDisplayMessage(err));

    // Log machine-readable code for debugging
    console.error(err.code, err.message);
  }
}
```

### React

The `useBlinkDeposit` hook provides `displayMessage` as a convenience:

```tsx theme={null}
const { error, displayMessage } = useBlinkDeposit({ signer: '/api/sign-payment' });

// displayMessage is null when there is no error,
// otherwise it's the result of getDisplayMessage(error)
{error && <p className="error">{displayMessage}</p>}
```

## Handling specific error codes

```typescript theme={null}
try {
  await deposit.requestDeposit({ /* ... */ });
} catch (err) {
  if (!(err instanceof DepositError)) throw err;

  switch (err.code) {
    case 'DEPOSIT_DISMISSED':
      // User intentionally closed, no action needed
      break;
    case 'SIGNER_REQUEST_FAILED':
    case 'SIGNER_NETWORK_ERROR':
    case 'SIGNER_TIMEOUT':
      // Signer issue, prompt retry
      showRetryDialog(getDisplayMessage(err));
      break;
    case 'SIGNER_RESPONSE_INVALID':
      // Integration bug, log for investigation
      reportError(err);
      break;
    case 'FLOW_TIMEOUT':
      // Flow took too long, prompt retry
      showRetryDialog(getDisplayMessage(err));
      break;
    case 'INVALID_REQUEST':
      // Bad input, show validation error
      showValidationError(getDisplayMessage(err));
      break;
  }
}
```

## DepositErrorCode

The union of all error code strings:

```typescript theme={null}
type DepositErrorCode =
  | 'DEPOSIT_DISMISSED'
  | 'SIGNER_REQUEST_FAILED'
  | 'SIGNER_NETWORK_ERROR'
  | 'SIGNER_RESPONSE_INVALID'
  | 'SIGNER_TIMEOUT'
  | 'FLOW_TIMEOUT'
  | 'INVALID_REQUEST';
```
