Skip to main content
The SDK provides two error class hierarchies: APIError for general SDK errors, and WithdrawError for withdrawal-specific failures. Type guard functions are exported for programmatic error handling.

Import

import {
  APIError,
  VaultNotFoundByAddressError,
  VaultNotFoundByNameError,
  UnauthorizedVaultAccessError,
  isVaultNotFoundByAddressError,
  isVaultNotFoundByNameError,
} from '@paxoslabs/amplify-sdk'

APIError Class

class APIError extends Error {
  /** Human-readable error description */
  message: string

  /** HTTP status code (if applicable) */
  statusCode?: number

  /** SDK function that threw the error (e.g., "prepareDepositAuthorization") */
  endpoint?: string

  /** Original error cause */
  cause?: unknown
}

WithdrawError Hierarchy

Withdrawal operations throw specialized error subclasses with a code property for programmatic handling.
class WithdrawError extends Error {
  code: string
  context?: Record<string, unknown>
}

Exported Error Classes

ClassCodeWhen Thrown
VaultNotFoundByAddressErrorVAULT_NOT_FOUND_BY_ADDRESSVault address doesn’t match any known vault
VaultNotFoundByNameErrorVAULT_NOT_FOUND_BY_NAMEVault name doesn’t match any known vault
UnauthorizedVaultAccessErrorUNAUTHORIZED_VAULT_ACCESSAPI key lacks access to the requested vault

Internal Error Subclasses

These are thrown internally but can be caught as WithdrawError:
CodeDescription
VAULT_NOT_FOUNDGeneral vault lookup failure
MULTIPLE_VAULTS_FOUNDAmbiguous vault filter matched multiple vaults
INVALID_ADDRESSMalformed address parameter
INVALID_SHARE_AMOUNTShare amount is zero or negative
INVALID_SLIPPAGESlippage outside valid range
INVALID_YIELD_TYPEUnrecognized yield type value
INVALID_CHAIN_IDUnsupported chain ID
TRANSACTION_DATA_ERRORFailed to encode transaction data
VAULT_CACHE_EMPTYVault cache not populated yet

Error Type Guards

import {
  isVaultNotFoundByAddressError,
  isVaultNotFoundByNameError,
} from '@paxoslabs/amplify-sdk'

try {
  const txData = await prepareWithdrawOrderTxData(params)
} catch (error) {
  if (isVaultNotFoundByNameError(error)) {
    console.log(error.code) // "VAULT_NOT_FOUND_BY_NAME"
    console.log(error.context) // { vaultName: "..." }
  }

  if (isVaultNotFoundByAddressError(error)) {
    console.log(error.code) // "VAULT_NOT_FOUND_BY_ADDRESS"
    console.log(error.context) // { vaultAddress: "0x..." }
  }
}

Usage

import { APIError, prepareDepositAuthorization } from '@paxoslabs/amplify-sdk'

try {
  const auth = await prepareDepositAuthorization(params)
} catch (error) {
  if (error instanceof APIError) {
    console.log(error.message) // "No vault found for token 0x... with yield type 'CORE' on chain 1"
    console.log(error.endpoint) // "prepareDepositAuthorization"
    console.log(error.statusCode) // 404 (if from an HTTP response)
  }
}

Common Error Scenarios

Initialization

Error Message PatternDescriptionResolution
"API key cannot be empty"Empty or missing API keyProvide a valid pxl_... key
"Invalid API key format"Key doesn’t meet minimum lengthCheck key format
"SDK not initialized"SDK function called before initAmplifySDK()Call initAmplifySDK() at app startup

Deposits

Error Message PatternDescriptionResolution
"No vault found for token..."No vault matches yieldType, token, and chainIdVerify parameters with getSupportedAssets()
"Token does not support EIP-2612 permit"Token lacks permit supportUse approval flow or forceMethod: "approval"
"Invalid slippage value"Slippage outside 0–10000 bpsProvide value between 0 and 10000

Withdrawals

Error Message PatternDescriptionResolution
"No vault found for asset..."No vault matches parametersVerify yieldType, wantAsset, and chainId
"WithdrawQueue contract address not configured"Vault missing queue addressContact support — vault may not support withdrawals yet
"Failed to check withdrawal approval"On-chain multicall failedCheck RPC connectivity and retry

Error Handling Patterns

Basic Error Handling

try {
  const auth = await prepareDepositAuthorization(params)
} catch (error) {
  if (error instanceof APIError) {
    if (error.message.includes('No vault found')) {
      showError('This token is not supported for the selected yield type')
    } else if (error.message.includes('not initialized')) {
      await initAmplifySDK(apiKey)
    } else {
      showError(error.message)
    }
  }
}

Logging Errors

try {
  const prepared = await prepareDeposit(params)
} catch (error) {
  if (error instanceof APIError) {
    console.error({
      endpoint: error.endpoint,
      statusCode: error.statusCode,
      message: error.message,
    })

    errorTracker.capture(error, {
      extra: {
        endpoint: error.endpoint,
        statusCode: error.statusCode,
      },
    })
  }
}

User-Friendly Messages

function getUserMessage(error: APIError): string {
  if (error.message.includes('not initialized')) {
    return 'Please wait while we connect...'
  }
  if (error.message.includes('No vault found')) {
    return 'This token is not available for the selected strategy.'
  }
  if (error.message.includes('not support EIP-2612')) {
    return 'Please approve the transaction in your wallet.'
  }
  return 'An unexpected error occurred. Please try again.'
}