{"version":3,"sources":["../generated/types.gen.ts","../generated/core/bodySerializer.gen.ts","../generated/core/serverSentEvents.gen.ts","../generated/core/pathSerializer.gen.ts","../generated/core/utils.gen.ts","../generated/core/auth.gen.ts","../generated/client/utils.gen.ts","../generated/client/client.gen.ts","../generated/client.gen.ts","../generated/sdk.gen.ts","../src/helpers.ts","../src/BluvoClient.ts","../src/WebsocketListener.ts","../src/WebSocketClient.ts","../src/WorkflowTypes.ts","../src/BluvoWebClient.ts","../src/machines/createMachine.ts","../src/machines/stateHelpers.ts","../src/machines/withdrawalMachine.ts","../src/machines/flowStateHandlers.ts","../src/machines/flowMachine.ts","../src/error-codes.ts","../src/utils/balanceTransform.ts","../src/machines/withdrawalErrorHandler.ts","../src/BluvoCache.ts","../src/machines/BluvoFlowClient.ts","../src/machines/BluvoPreviewManager.ts","../index.ts"],"names":["_a","_b","joinedValues","config","request","url","WorkflowTypes","initialState","initialContext","error","createClient"],"mappings":"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","file":"index.mjs","sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nexport type ClientOptions = {\n  baseUrl:\n    | \"https://api-bluvo.com\"\n    | \"https://test.api-bluvo.com\"\n    | (string & {});\n};\n\nexport const SchemaEnum = {\n  COINBASE: \"coinbase\",\n  KRAKEN: \"kraken\",\n  BINANCE: \"binance\",\n  LOCAL_CEX: \"local-cex\",\n  BINANCE_WEB: \"binance-web\",\n  BYBIT_WEB: \"bybit-web\",\n} as const;\n\nexport type SchemaEnum = (typeof SchemaEnum)[keyof typeof SchemaEnum];\n\nexport const StatusEnum = {\n  LIVE: \"live\",\n  OFFLINE: \"offline\",\n  MAINTENANCE: \"maintenance\",\n  COMING_SOON: \"coming_soon\",\n} as const;\n\nexport type StatusEnum = (typeof StatusEnum)[keyof typeof StatusEnum];\n\nexport const ExchangeEnum = {\n  ACE: \"ace\",\n  ASCENDEX: \"ascendex\",\n  BEQUANT: \"bequant\",\n  BIGONE: \"bigone\",\n  BINANCE: \"binance\",\n  BINANCE_WEB: \"binance-web\",\n  COINBASE: \"coinbase\",\n  BINANCEUS: \"binanceus\",\n  BINGX: \"bingx\",\n  BIT2C: \"bit2c\",\n  BITBANK: \"bitbank\",\n  BITBNS: \"bitbns\",\n  BITCOINCOM: \"bitcoincom\",\n  BITFINEX: \"bitfinex\",\n  BITFLYER: \"bitflyer\",\n  BITGET: \"bitget\",\n  BITHUMB: \"bithumb\",\n  BITMART: \"bitmart\",\n  BITMEX: \"bitmex\",\n  BITOPRO: \"bitopro\",\n  BITPANDA: \"bitpanda\",\n  BITRUE: \"bitrue\",\n  BITSO: \"bitso\",\n  BITSTAMP: \"bitstamp\",\n  BITTEAM: \"bitteam\",\n  BITVAVO: \"bitvavo\",\n  BYBIT: \"bybit\",\n  BYBIT_WEB: \"bybit-web\",\n  BL3P: \"bl3p\",\n  BLOCKCHAINCOM: \"blockchaincom\",\n  BLOFIN: \"blofin\",\n  BTCALPHA: \"btcalpha\",\n  BTCBOX: \"btcbox\",\n  BTCMARKETS: \"btcmarkets\",\n  BTCTURK: \"btcturk\",\n  CEX: \"cex\",\n  COINCHECK: \"coincheck\",\n  COINEX: \"coinex\",\n  COINLIST: \"coinlist\",\n  COINMATE: \"coinmate\",\n  COINMETRO: \"coinmetro\",\n  COINONE: \"coinone\",\n  COINSPH: \"coinsph\",\n  COINSPOT: \"coinspot\",\n  CRYPTOCOM: \"cryptocom\",\n  DELTA: \"delta\",\n  DERIBIT: \"deribit\",\n  DIGIFINEX: \"digifinex\",\n  EXMO: \"exmo\",\n  FMFWIO: \"fmfwio\",\n  GATE: \"gate\",\n  GATEIO: \"gateio\",\n  GEMINI: \"gemini\",\n  HASHKEY: \"hashkey\",\n  HITBTC: \"hitbtc\",\n  HOLLAEX: \"hollaex\",\n  HTX: \"htx\",\n  HUOBI: \"huobi\",\n  HUOBIJP: \"huobijp\",\n  HYPERLIQUID: \"hyperliquid\",\n  INDEPENDENTRESERVE: \"independentreserve\",\n  INDODAX: \"indodax\",\n  KRAKEN: \"kraken\",\n  KRAKENFUTURES: \"krakenfutures\",\n  KUCOIN: \"kucoin\",\n  KUCOINFUTURES: \"kucoinfutures\",\n  LATOKEN: \"latoken\",\n  LBANK: \"lbank\",\n  LUNO: \"luno\",\n  MERCADO: \"mercado\",\n  MEXC: \"mexc\",\n  NDAX: \"ndax\",\n  NOVADAX: \"novadax\",\n  OCEANEX: \"oceanex\",\n  OKCOIN: \"okcoin\",\n  OKX: \"okx\",\n  ONETRADING: \"onetrading\",\n  OXFUN: \"oxfun\",\n  P2B: \"p2b\",\n  PARADEX: \"paradex\",\n  PAYMIUM: \"paymium\",\n  PHEMEX: \"phemex\",\n  POLONIEX: \"poloniex\",\n  POLONIEXFUTURES: \"poloniexfutures\",\n  PROBIT: \"probit\",\n  TIMEX: \"timex\",\n  TRADEOGRE: \"tradeogre\",\n  UPBIT: \"upbit\",\n  VERTEX: \"vertex\",\n  WAVESEXCHANGE: \"wavesexchange\",\n  WHITEBIT: \"whitebit\",\n  WOO: \"woo\",\n  WOOFIPRO: \"woofipro\",\n  XT: \"xt\",\n  YOBIT: \"yobit\",\n  ZAIF: \"zaif\",\n  ZONDA: \"zonda\",\n  LOCAL_CEX: \"local-cex\",\n} as const;\n\nexport type ExchangeEnum = (typeof ExchangeEnum)[keyof typeof ExchangeEnum];\n\nexport const StatusEnum2 = {\n  SUCCESS: \"SUCCESS\",\n  INVALID_API_CREDENTIALS: \"INVALID_API_CREDENTIALS\",\n} as const;\n\nexport type StatusEnum2 = (typeof StatusEnum2)[keyof typeof StatusEnum2];\n\nexport const TypeEnum = {\n  WALLET_NOT_FOUND: \"WALLET_NOT_FOUND\",\n  WALLET_IDENTITY_NOT_FOUND: \"WALLET_IDENTITY_NOT_FOUND\",\n} as const;\n\nexport type TypeEnum = (typeof TypeEnum)[keyof typeof TypeEnum];\n\nexport const SchemaEnum2 = {\n  ACE: \"ace\",\n  ASCENDEX: \"ascendex\",\n  BEQUANT: \"bequant\",\n  BIGONE: \"bigone\",\n  BINANCE: \"binance\",\n  BINANCE_WEB: \"binance-web\",\n  COINBASE: \"coinbase\",\n  BINANCEUS: \"binanceus\",\n  BINGX: \"bingx\",\n  BIT2C: \"bit2c\",\n  BITBANK: \"bitbank\",\n  BITBNS: \"bitbns\",\n  BITCOINCOM: \"bitcoincom\",\n  BITFINEX: \"bitfinex\",\n  BITFLYER: \"bitflyer\",\n  BITGET: \"bitget\",\n  BITHUMB: \"bithumb\",\n  BITMART: \"bitmart\",\n  BITMEX: \"bitmex\",\n  BITOPRO: \"bitopro\",\n  BITPANDA: \"bitpanda\",\n  BITRUE: \"bitrue\",\n  BITSO: \"bitso\",\n  BITSTAMP: \"bitstamp\",\n  BITTEAM: \"bitteam\",\n  BITVAVO: \"bitvavo\",\n  BYBIT: \"bybit\",\n  BYBIT_WEB: \"bybit-web\",\n  BL3P: \"bl3p\",\n  BLOCKCHAINCOM: \"blockchaincom\",\n  BLOFIN: \"blofin\",\n  BTCALPHA: \"btcalpha\",\n  BTCBOX: \"btcbox\",\n  BTCMARKETS: \"btcmarkets\",\n  BTCTURK: \"btcturk\",\n  CEX: \"cex\",\n  COINCHECK: \"coincheck\",\n  COINEX: \"coinex\",\n  COINLIST: \"coinlist\",\n  COINMATE: \"coinmate\",\n  COINMETRO: \"coinmetro\",\n  COINONE: \"coinone\",\n  COINSPH: \"coinsph\",\n  COINSPOT: \"coinspot\",\n  CRYPTOCOM: \"cryptocom\",\n  DELTA: \"delta\",\n  DERIBIT: \"deribit\",\n  DIGIFINEX: \"digifinex\",\n  EXMO: \"exmo\",\n  FMFWIO: \"fmfwio\",\n  GATE: \"gate\",\n  GATEIO: \"gateio\",\n  GEMINI: \"gemini\",\n  HASHKEY: \"hashkey\",\n  HITBTC: \"hitbtc\",\n  HOLLAEX: \"hollaex\",\n  HTX: \"htx\",\n  HUOBI: \"huobi\",\n  HUOBIJP: \"huobijp\",\n  HYPERLIQUID: \"hyperliquid\",\n  INDEPENDENTRESERVE: \"independentreserve\",\n  INDODAX: \"indodax\",\n  KRAKEN: \"kraken\",\n  KRAKENFUTURES: \"krakenfutures\",\n  KUCOIN: \"kucoin\",\n  KUCOINFUTURES: \"kucoinfutures\",\n  LATOKEN: \"latoken\",\n  LBANK: \"lbank\",\n  LUNO: \"luno\",\n  MERCADO: \"mercado\",\n  MEXC: \"mexc\",\n  NDAX: \"ndax\",\n  NOVADAX: \"novadax\",\n  OCEANEX: \"oceanex\",\n  OKCOIN: \"okcoin\",\n  OKX: \"okx\",\n  ONETRADING: \"onetrading\",\n  OXFUN: \"oxfun\",\n  P2B: \"p2b\",\n  PARADEX: \"paradex\",\n  PAYMIUM: \"paymium\",\n  PHEMEX: \"phemex\",\n  POLONIEX: \"poloniex\",\n  POLONIEXFUTURES: \"poloniexfutures\",\n  PROBIT: \"probit\",\n  TIMEX: \"timex\",\n  TRADEOGRE: \"tradeogre\",\n  UPBIT: \"upbit\",\n  VERTEX: \"vertex\",\n  WAVESEXCHANGE: \"wavesexchange\",\n  WHITEBIT: \"whitebit\",\n  WOO: \"woo\",\n  WOOFIPRO: \"woofipro\",\n  XT: \"xt\",\n  YOBIT: \"yobit\",\n  ZAIF: \"zaif\",\n  ZONDA: \"zonda\",\n  LOCAL_CEX: \"local-cex\",\n  NULL: null,\n} as const;\n\nexport type SchemaEnum2 = (typeof SchemaEnum2)[keyof typeof SchemaEnum2];\n\nexport const SchemaEnum3 = {\n  TRUE: \"true\",\n  FALSE: \"false\",\n  NULL: null,\n} as const;\n\nexport type SchemaEnum3 = (typeof SchemaEnum3)[keyof typeof SchemaEnum3];\n\nexport const TypeEnum2 = {\n  DEPOSIT: \"deposit\",\n  WITHDRAWAL: \"withdrawal\",\n  TRANSACTION: \"transaction\",\n} as const;\n\nexport type TypeEnum2 = (typeof TypeEnum2)[keyof typeof TypeEnum2];\n\nexport const DirectionEnum = {\n  IN: \"in\",\n  OUT: \"out\",\n  NULL: null,\n} as const;\n\nexport type DirectionEnum = (typeof DirectionEnum)[keyof typeof DirectionEnum];\n\nexport const FiatCurrencyEnum = {\n  USD: \"USD\",\n  EUR: \"EUR\",\n  NULL: null,\n} as const;\n\nexport type FiatCurrencyEnum =\n  (typeof FiatCurrencyEnum)[keyof typeof FiatCurrencyEnum];\n\nexport const StatusEnum3 = {\n  PENDING: \"pending\",\n  OK: \"ok\",\n  FAILED: \"failed\",\n  CANCELED: \"canceled\",\n} as const;\n\nexport type StatusEnum3 = (typeof StatusEnum3)[keyof typeof StatusEnum3];\n\nexport const CategoryEnum = {\n  EXCHANGE_WITHDRAWAL_FEE: \"exchange_withdrawal_fee\",\n  NETWORK_FEE: \"network_fee\",\n  PROVIDER_FEE: \"provider_fee\",\n  OTHER: \"other\",\n} as const;\n\nexport type CategoryEnum = (typeof CategoryEnum)[keyof typeof CategoryEnum];\n\nexport const TypeEnum3 = {\n  GENERIC_NOT_FOUND: \"GENERIC_NOT_FOUND\",\n  GENERIC_UNAUTHORIZED: \"GENERIC_UNAUTHORIZED\",\n  GENERIC_INTERNAL_SERVER_ERROR: \"GENERIC_INTERNAL_SERVER_ERROR\",\n  GENERIC_VALIDATION_ERROR: \"GENERIC_VALIDATION_ERROR\",\n  GENERIC_INVALID_REQUEST: \"GENERIC_INVALID_REQUEST\",\n  GENERIC_RATE_LIMIT_EXCEEDED: \"GENERIC_RATE_LIMIT_EXCEEDED\",\n  APIKEY_INSUFFICIENT_PERMISSIONS: \"APIKEY_INSUFFICIENT_PERMISSIONS\",\n  WALLET_NOT_FOUND: \"WALLET_NOT_FOUND\",\n  WALLET_INVALID_CREDENTIALS: \"WALLET_INVALID_CREDENTIALS\",\n  WALLET_IDENTITY_NOT_FOUND: \"WALLET_IDENTITY_NOT_FOUND\",\n  QUOTE_NOT_FOUND: \"QUOTE_NOT_FOUND\",\n  QUOTE_EXPIRED: \"QUOTE_EXPIRED\",\n  WITHDRAWAL_INSUFFICIENT_BALANCE: \"WITHDRAWAL_INSUFFICIENT_BALANCE\",\n  WITHDRAWAL_INSUFFICIENT_BALANCE_FOR_FEE:\n    \"WITHDRAWAL_INSUFFICIENT_BALANCE_FOR_FEE\",\n  WITHDRAWAL_INVALID_ADDRESS: \"WITHDRAWAL_INVALID_ADDRESS\",\n  WITHDRAWAL_NETWORK_NOT_SUPPORTED: \"WITHDRAWAL_NETWORK_NOT_SUPPORTED\",\n  WITHDRAWAL_TOO_MANY_ADDRESSES: \"WITHDRAWAL_TOO_MANY_ADDRESSES\",\n  WITHDRAWAL_AMOUNT_BELOW_MINIMUM: \"WITHDRAWAL_AMOUNT_BELOW_MINIMUM\",\n  WITHDRAWAL_AMOUNT_ABOVE_MAXIMUM: \"WITHDRAWAL_AMOUNT_ABOVE_MAXIMUM\",\n  WITHDRAWAL_ASSET_NOT_SUPPORTED: \"WITHDRAWAL_ASSET_NOT_SUPPORTED\",\n  WITHDRAWAL_PROVIDER_ERROR: \"WITHDRAWAL_PROVIDER_ERROR\",\n  WITHDRAWAL_2FA_REQUIRED_TOTP: \"WITHDRAWAL_2FA_REQUIRED_TOTP\",\n  WITHDRAWAL_2FA_REQUIRED_SMS: \"WITHDRAWAL_2FA_REQUIRED_SMS\",\n  WITHDRAWAL_2FA_REQUIRED_FACE_RECOGNITION:\n    \"WITHDRAWAL_2FA_REQUIRED_FACE_RECOGNITION\",\n  WITHDRAWAL_2FA_REQUIRED_EMAIL: \"WITHDRAWAL_2FA_REQUIRED_EMAIL\",\n  WITHDRAWAL_2FA_REQUIRED_YUBIKEY: \"WITHDRAWAL_2FA_REQUIRED_YUBIKEY\",\n  WITHDRAWAL_2FA_REQUIRED_PASSPHRASE: \"WITHDRAWAL_2FA_REQUIRED_PASSPHRASE\",\n  WITHDRAWAL_2FA_REQUIRED_MULTI_STEPS: \"WITHDRAWAL_2FA_REQUIRED_MULTI_STEPS\",\n  WITHDRAWAL_2FA_INCOMPLETE: \"WITHDRAWAL_2FA_INCOMPLETE\",\n  WITHDRAWAL_2FA_INVALID: \"WITHDRAWAL_2FA_INVALID\",\n  WITHDRAWAL_2FA_METHOD_NOT_SUPPORTED: \"WITHDRAWAL_2FA_METHOD_NOT_SUPPORTED\",\n  WITHDRAWAL_KYC_REQUIRED: \"WITHDRAWAL_KYC_REQUIRED\",\n  WITHDRAWAL_EMAIL_UNVERIFIED: \"WITHDRAWAL_EMAIL_UNVERIFIED\",\n  WITHDRAWAL_RATE_LIMIT_EXCEEDED: \"WITHDRAWAL_RATE_LIMIT_EXCEEDED\",\n  OAUTH_AUTHORIZATION_FAILED: \"OAUTH_AUTHORIZATION_FAILED\",\n  OAUTH_TOKEN_EXCHANGE_FAILED: \"OAUTH_TOKEN_EXCHANGE_FAILED\",\n  OAUTH_INVALID_STATE: \"OAUTH_INVALID_STATE\",\n  OAUTH_INSUFFICIENT_SCOPE: \"OAUTH_INSUFFICIENT_SCOPE\",\n  OAUTH_QR_CODE_UNAVAILABLE: \"OAUTH_QR_CODE_UNAVAILABLE\",\n  OAUTH_COUNTRY_NOT_DETECTED: \"OAUTH_COUNTRY_NOT_DETECTED\",\n  OAUTH_COUNTRY_NOT_SUPPORTED: \"OAUTH_COUNTRY_NOT_SUPPORTED\",\n  OAUTH_COUNTRY_CODE_INVALID: \"OAUTH_COUNTRY_CODE_INVALID\",\n  WEBHOOK_SIGNATURE_INVALID: \"WEBHOOK_SIGNATURE_INVALID\",\n  WEBHOOK_MISSING_HEADERS: \"WEBHOOK_MISSING_HEADERS\",\n  WEBHOOK_INVALID_TIMESTAMP: \"WEBHOOK_INVALID_TIMESTAMP\",\n  CACHE_MISS: \"CACHE_MISS\",\n  CACHE_EXPIRED: \"CACHE_EXPIRED\",\n  CACHE_INVALID_PATH: \"CACHE_INVALID_PATH\",\n  WITHDRAWAL_DRY_RUN_COMPLETE: \"WITHDRAWAL_DRY_RUN_COMPLETE\",\n  ENRICHMENT_NETWORK_NOT_SUPPORTED: \"ENRICHMENT_NETWORK_NOT_SUPPORTED\",\n  ENRICHMENT_TIMEOUT: \"ENRICHMENT_TIMEOUT\",\n  ENRICHMENT_API_ERROR: \"ENRICHMENT_API_ERROR\",\n} as const;\n\nexport type TypeEnum3 = (typeof TypeEnum3)[keyof typeof TypeEnum3];\n\nexport const TypeEnum4 = {\n  GOOGLE: \"GOOGLE\",\n  EMAIL: \"EMAIL\",\n  FACE: \"FACE\",\n  SMS: \"SMS\",\n  ROAMING_FIDO: \"ROAMING_FIDO\",\n} as const;\n\nexport type TypeEnum4 = (typeof TypeEnum4)[keyof typeof TypeEnum4];\n\nexport const StatusEnum4 = {\n  PENDING: \"pending\",\n  SUCCESS: \"success\",\n  FAILED: \"failed\",\n} as const;\n\nexport type StatusEnum4 = (typeof StatusEnum4)[keyof typeof StatusEnum4];\n\nexport const RelationEnum = {\n  AND: \"AND\",\n  OR: \"OR\",\n} as const;\n\nexport type RelationEnum = (typeof RelationEnum)[keyof typeof RelationEnum];\n\nexport type Oauth2ExchangeurlgeturlData = {\n  body?: never;\n  path: {\n    /**\n     * Exchange identifier.\n     */\n    exchange: SchemaEnum;\n  };\n  query: {\n    /**\n     * Idempotency key.\n     */\n    idem: string;\n    /**\n     * Custom base domain for redirect URI i.e. 'example.com'.\n     */\n    customDomain?: string | null;\n  };\n  url: \"/v0/oauth2/{exchange}/url\";\n};\n\nexport type Oauth2ExchangeurlgeturlResponses = {\n  /**\n   * Successful response\n   */\n  200: {\n    url: string;\n    success: boolean;\n    isQRCode?: boolean;\n  };\n};\n\nexport type Oauth2ExchangeurlgeturlResponse =\n  Oauth2ExchangeurlgeturlResponses[keyof Oauth2ExchangeurlgeturlResponses];\n\nexport type Oauth2ExchangeslistexchangesData = {\n  body?: never;\n  path?: never;\n  query?: never;\n  url: \"/v0/oauth2/exchanges\";\n};\n\nexport type Oauth2ExchangeslistexchangesResponses = {\n  /**\n   * Successful response\n   */\n  200: {\n    success: boolean;\n    exchanges: Array<{\n      id: string;\n      name: string;\n      logoUrl: string;\n      status: StatusEnum;\n    }>;\n  };\n};\n\nexport type Oauth2ExchangeslistexchangesResponse =\n  Oauth2ExchangeslistexchangesResponses[keyof Oauth2ExchangeslistexchangesResponses];\n\nexport type WalletdeleteData = {\n  body?: never;\n  path?: never;\n  query?: never;\n  url: \"/v0/wallet\";\n};\n\nexport type WalletdeleteErrors = {\n  /**\n   * Forbidden - Insufficient API key permissions\n   */\n  403: {\n    error: string;\n    type: \"APIKEY_INSUFFICIENT_PERMISSIONS\";\n    missing: Array<string>;\n  };\n  /**\n   * Not Found\n   */\n  404: {\n    error: string;\n    type: \"WALLET_NOT_FOUND\";\n    result?: unknown;\n  };\n};\n\nexport type WalletdeleteError = WalletdeleteErrors[keyof WalletdeleteErrors];\n\nexport type WalletdeleteResponses = {\n  /**\n   * Successful response\n   */\n  200: {\n    success: boolean;\n    message: string;\n  };\n};\n\nexport type WalletdeleteResponse =\n  WalletdeleteResponses[keyof WalletdeleteResponses];\n\nexport type WalletgetData = {\n  body?: never;\n  path?: never;\n  query?: never;\n  url: \"/v0/wallet\";\n};\n\nexport type WalletgetErrors = {\n  /**\n   * Forbidden - Insufficient API key permissions\n   */\n  403: {\n    error: string;\n    type: \"APIKEY_INSUFFICIENT_PERMISSIONS\";\n    missing: Array<string>;\n  };\n  /**\n   * Not Found\n   */\n  404: {\n    error: string;\n    type: \"WALLET_NOT_FOUND\";\n    result?: unknown;\n  };\n};\n\nexport type WalletgetError = WalletgetErrors[keyof WalletgetErrors];\n\nexport type WalletgetResponses = {\n  /**\n   * Successful response\n   */\n  200: {\n    id: string;\n    exchange: ExchangeEnum;\n    balances: {\n      [key: string]: {\n        free?: number | null;\n        used?: number | null;\n        total?: number | null;\n        assetId?: string | null;\n        slug?: string | null;\n      } | null;\n    };\n    ipPool?: Array<string> | null;\n    invalidApi?: boolean | null;\n    createdAt?: string | number | null;\n    updatedAt?: string | number | null;\n    lastSyncAt?: string | number | null;\n    expiresAt?: string | number | null;\n  };\n};\n\nexport type WalletgetResponse = WalletgetResponses[keyof WalletgetResponses];\n\nexport type WalletpingpingData = {\n  body?: never;\n  path?: never;\n  query?: never;\n  url: \"/v0/wallet/ping\";\n};\n\nexport type WalletpingpingErrors = {\n  /**\n   * Forbidden - Insufficient API key permissions\n   */\n  403: {\n    error: string;\n    type: \"APIKEY_INSUFFICIENT_PERMISSIONS\";\n    missing: Array<string>;\n  };\n  /**\n   * Not Found\n   */\n  404: {\n    error: string;\n    type: \"WALLET_NOT_FOUND\";\n    result?: unknown;\n  };\n};\n\nexport type WalletpingpingError =\n  WalletpingpingErrors[keyof WalletpingpingErrors];\n\nexport type WalletpingpingResponses = {\n  /**\n   * Successful response\n   */\n  200: {\n    id: string;\n    exchange: ExchangeEnum;\n    status: StatusEnum2;\n    success: boolean;\n  };\n};\n\nexport type WalletpingpingResponse =\n  WalletpingpingResponses[keyof WalletpingpingResponses];\n\nexport type WalletkycgetkycidentityData = {\n  body?: never;\n  path?: never;\n  query?: never;\n  url: \"/v0/wallet/kyc\";\n};\n\nexport type WalletkycgetkycidentityErrors = {\n  /**\n   * Forbidden - Insufficient API key permissions\n   */\n  403: {\n    error: string;\n    type: \"APIKEY_INSUFFICIENT_PERMISSIONS\";\n    missing: Array<string>;\n  };\n  /**\n   * Not Found\n   */\n  404: {\n    error: string;\n    type: TypeEnum;\n  };\n};\n\nexport type WalletkycgetkycidentityError =\n  WalletkycgetkycidentityErrors[keyof WalletkycgetkycidentityErrors];\n\nexport type WalletkycgetkycidentityResponses = {\n  /**\n   * Successful response\n   */\n  200: {\n    fullName: string | null;\n    email: string | null;\n    iban: string | null;\n    country: string | null;\n  };\n};\n\nexport type WalletkycgetkycidentityResponse =\n  WalletkycgetkycidentityResponses[keyof WalletkycgetkycidentityResponses];\n\nexport type WalletlistlistwalletsData = {\n  body?: never;\n  path?: never;\n  query?: {\n    /**\n     * Page number (0-indexed).\n     */\n    page?: number | null;\n    /**\n     * Number of wallets per page (max 1000).\n     */\n    limit?: number | null;\n    /**\n     * Filter by exchange.\n     */\n    exchange?: SchemaEnum2;\n    /**\n     * Filter by creation date (from, ISO format).\n     */\n    createdSince?: string | null;\n    /**\n     * Filter by creation date (before, ISO format).\n     */\n    createdBefore?: string | null;\n    /**\n     * Filter by last sync date (from, ISO format).\n     */\n    lastSyncSince?: string | null;\n    /**\n     * Filter by last sync date (before, ISO format).\n     */\n    lastSyncBefore?: string | null;\n    /**\n     * Filter by API validity status.\n     */\n    invalidApi?: SchemaEnum3;\n    /**\n     * Comma-separated list of fields to include.\n     */\n    fields?: string | null;\n  };\n  url: \"/v0/wallet/list\";\n};\n\nexport type WalletlistlistwalletsErrors = {\n  /**\n   * Forbidden - Insufficient API key permissions\n   */\n  403: {\n    error: string;\n    type: \"APIKEY_INSUFFICIENT_PERMISSIONS\";\n    missing: Array<string>;\n  };\n};\n\nexport type WalletlistlistwalletsError =\n  WalletlistlistwalletsErrors[keyof WalletlistlistwalletsErrors];\n\nexport type WalletlistlistwalletsResponses = {\n  /**\n   * Successful response\n   */\n  200: {\n    wallets: Array<{\n      id: string;\n      projectId?: string | null;\n      createdAt?: string | number | null;\n      updatedAt?: string | number | null;\n      lastSyncAt?: string | number | null;\n      expiresAt?: string | number | null;\n      exchange: ExchangeEnum;\n      balances: {\n        [key: string]: {\n          free?: number | null;\n          used?: number | null;\n          total?: number | null;\n          assetId?: string | null;\n          slug?: string | null;\n        } | null;\n      };\n      ipPool?: Array<string> | null;\n      invalidApi?: boolean | number | null;\n    }>;\n    pagination: {\n      totalCount: number;\n      page: number;\n      limit: number;\n      pageCount: number;\n    };\n  };\n};\n\nexport type WalletlistlistwalletsResponse =\n  WalletlistlistwalletsResponses[keyof WalletlistlistwalletsResponses];\n\nexport type WallettransactionslisttransactionsData = {\n  body?: never;\n  path?: never;\n  query?: {\n    /**\n     * Page number (0-indexed).\n     */\n    page?: number | null;\n    /**\n     * Number of transactions per page (max 1000).\n     */\n    limit?: number | null;\n    /**\n     * Filter transactions after this date (ISO format).\n     */\n    sinceDate?: string | null;\n  };\n  url: \"/v0/wallet/transactions\";\n};\n\nexport type WallettransactionslisttransactionsErrors = {\n  /**\n   * Forbidden - Insufficient API key permissions\n   */\n  403: {\n    error: string;\n    type: \"APIKEY_INSUFFICIENT_PERMISSIONS\";\n    missing: Array<string>;\n  };\n};\n\nexport type WallettransactionslisttransactionsError =\n  WallettransactionslisttransactionsErrors[keyof WallettransactionslisttransactionsErrors];\n\nexport type WallettransactionslisttransactionsResponses = {\n  /**\n   * Successful response\n   */\n  200: {\n    transactions: Array<{\n      id: string;\n      walletId: string;\n      createdAt?: string | number | null;\n      updatedAt?: string | number | null;\n      timestamp?: string | number | null;\n      type: TypeEnum2;\n      amount: number;\n      currency: string;\n      direction?: DirectionEnum;\n      feeCost?: number | null;\n      feeCurrency?: string | null;\n      amountInFiat?: number | null;\n      feeInFiat?: number | null;\n      fiatCurrency?: FiatCurrencyEnum;\n      status: StatusEnum3;\n      addressTo?: string | null;\n      network?: string | null;\n      addressFrom?: string | null;\n      hash?: string | null;\n      contractAddress?: string | null;\n      tag?: string | null;\n      exchange?: string | null;\n      rawResponse?: unknown;\n    }>;\n    pagination: {\n      totalCount: number;\n      page: number;\n      limit: number;\n      pageCount: number;\n      offset: number;\n    };\n  };\n};\n\nexport type WallettransactionslisttransactionsResponse =\n  WallettransactionslisttransactionsResponses[keyof WallettransactionslisttransactionsResponses];\n\nexport type WallettransactiontransactionidgettransactionData = {\n  body?: never;\n  path: {\n    /**\n     * The transaction ID\n     */\n    transactionId: string;\n  };\n  query?: never;\n  url: \"/v0/wallet/transaction/{transactionId}\";\n};\n\nexport type WallettransactiontransactionidgettransactionErrors = {\n  /**\n   * Forbidden - Insufficient API key permissions\n   */\n  403: {\n    error: string;\n    type: \"APIKEY_INSUFFICIENT_PERMISSIONS\";\n    missing: Array<string>;\n  };\n  /**\n   * Not Found\n   */\n  404: {\n    error: string;\n    type: \"GENERIC_NOT_FOUND\";\n  };\n};\n\nexport type WallettransactiontransactionidgettransactionError =\n  WallettransactiontransactionidgettransactionErrors[keyof WallettransactiontransactionidgettransactionErrors];\n\nexport type WallettransactiontransactionidgettransactionResponses = {\n  /**\n   * Successful response\n   */\n  200: {\n    id: string;\n    walletId: string;\n    createdAt?: string | number | null;\n    updatedAt?: string | number | null;\n    timestamp?: string | number | null;\n    type: TypeEnum2;\n    amount: number;\n    currency: string;\n    direction?: DirectionEnum;\n    feeCost?: number | null;\n    feeCurrency?: string | null;\n    amountInFiat?: number | null;\n    feeInFiat?: number | null;\n    fiatCurrency?: FiatCurrencyEnum;\n    status: StatusEnum3;\n    addressTo?: string | null;\n    address?: string | null;\n    network?: string | null;\n    addressFrom?: string | null;\n    hash?: string | null;\n    contractAddress?: string | null;\n    tag?: string | null;\n    exchange?: string | null;\n    rawResponse?: unknown;\n  };\n};\n\nexport type WallettransactiontransactionidgettransactionResponse =\n  WallettransactiontransactionidgettransactionResponses[keyof WallettransactiontransactionidgettransactionResponses];\n\nexport type WalletwithdrawbalancebalanceData = {\n  body?: never;\n  path?: never;\n  query?: {\n    /**\n     * Override balance refresh threshold in minutes. Set to 0 to always refresh balances from the exchange. Defaults to 0.\n     */\n    refreshThresholdMinutes?: number;\n    /**\n     * Automatically delete the wallet if API credentials are found to be invalid during balance fetch. Defaults to true.\n     */\n    autoDeleteIfInvalid?: boolean;\n  };\n  url: \"/v0/wallet/withdraw/balance\";\n};\n\nexport type WalletwithdrawbalancebalanceErrors = {\n  /**\n   * Forbidden - Insufficient API key permissions\n   */\n  403: {\n    error: string;\n    type: \"APIKEY_INSUFFICIENT_PERMISSIONS\";\n    missing: Array<string>;\n  };\n  /**\n   * Not Found\n   */\n  404: {\n    error: string;\n    type: \"WALLET_NOT_FOUND\";\n    result?: unknown;\n  };\n};\n\nexport type WalletwithdrawbalancebalanceError =\n  WalletwithdrawbalancebalanceErrors[keyof WalletwithdrawbalancebalanceErrors];\n\nexport type WalletwithdrawbalancebalanceResponses = {\n  /**\n   * Successful response\n   */\n  200: {\n    lastSyncAt: string;\n    balances: Array<{\n      asset: string;\n      amount: number;\n      amountInFiat?: number | null;\n      networks: Array<{\n        chainId?:\n          | 1\n          | 10\n          | 14\n          | 19\n          | 50\n          | 56\n          | 61\n          | 130\n          | 137\n          | 146\n          | 246\n          | 295\n          | 314\n          | 324\n          | 480\n          | 592\n          | 686\n          | 747\n          | 1100\n          | 1116\n          | 1284\n          | 1285\n          | 1329\n          | 1514\n          | 1776\n          | 2020\n          | 2088\n          | 2222\n          | 3338\n          | 5464\n          | 5888\n          | 7000\n          | 8453\n          | 9745\n          | 10001\n          | 16600\n          | 42161\n          | 42170\n          | 42220\n          | 42262\n          | 43114\n          | 57073\n          | 59144\n          | 80094\n          | 81457\n          | 100009\n          | null;\n        tokenAddress?: string | null;\n        contractAddress?: string | null;\n        contractAddressVerified?: boolean | null;\n        id: string;\n        name: string;\n        displayName: string;\n        minWithdrawal: string;\n        maxWithdrawal?: string;\n        assetName: string;\n        addressRegex?: string | null;\n      }>;\n      extra?: {\n        slug?: string;\n        assetId?: string;\n      };\n    }>;\n  };\n};\n\nexport type WalletwithdrawbalancebalanceResponse =\n  WalletwithdrawbalancebalanceResponses[keyof WalletwithdrawbalancebalanceResponses];\n\nexport type WalletwithdrawquotequotationData = {\n  body: {\n    asset: string;\n    amount: string;\n    address: string;\n    network?: string;\n    tag?: string;\n    includeFee: boolean;\n  };\n  path?: never;\n  query?: never;\n  url: \"/v0/wallet/withdraw/quote\";\n};\n\nexport type WalletwithdrawquotequotationErrors = {\n  /**\n   * Bad Request\n   */\n  400: {\n    error: string;\n    type: TypeEnum3;\n    result?: unknown;\n  };\n  /**\n   * Forbidden - Insufficient API key permissions\n   */\n  403: {\n    error: string;\n    type: \"APIKEY_INSUFFICIENT_PERMISSIONS\";\n    missing: Array<string>;\n  };\n  /**\n   * Not Found\n   */\n  404: {\n    error: string;\n    type: \"WALLET_NOT_FOUND\";\n    result?: unknown;\n  };\n};\n\nexport type WalletwithdrawquotequotationError =\n  WalletwithdrawquotequotationErrors[keyof WalletwithdrawquotequotationErrors];\n\nexport type WalletwithdrawquotequotationResponses = {\n  /**\n   * Successful response\n   */\n  200: {\n    id: string;\n    asset: string;\n    amountWithFee?: number | null;\n    amountNoFee?: number | null;\n    estimatedFee?: number | null;\n    amountWithFeeInFiat?: number | null;\n    amountNoFeeInFiat?: number | null;\n    estimatedFeeInFiat?: number | null;\n    destinationAddress: string;\n    network?: string | null;\n    tag?: string | null;\n    estimatedTotal?: number;\n    feeDetails?: Array<{\n      category: CategoryEnum;\n      currency: string;\n      amount: number;\n      amountInFiat?: number | null;\n      fiatCurrency: string;\n    }>;\n    expiresAt: string;\n    additionalInfo: {\n      minWithdrawal: string | null;\n      maxWithdrawal?: string | null;\n    };\n  };\n};\n\nexport type WalletwithdrawquotequotationResponse =\n  WalletwithdrawquotequotationResponses[keyof WalletwithdrawquotequotationResponses];\n\nexport type WalletwithdrawquoteidexecutewithdrawData = {\n  body: {\n    twofa?: string | null;\n    emailCode?: string | null;\n    smsCode?: string | null;\n    bizNo?: string | null;\n    tag?: string | null;\n    params?: {\n      dryRun?: boolean;\n      [key: string]: unknown | boolean | undefined;\n    } | null;\n  };\n  path: {\n    quoteId: string;\n  };\n  query?: {\n    /**\n     * Automatically delete the wallet if API credentials are found to be invalid during balance fetch. Defaults to true.\n     */\n    autoDeleteIfInvalid?: boolean;\n  };\n  url: \"/v0/wallet/withdraw/{quoteId}/execute\";\n};\n\nexport type WalletwithdrawquoteidexecutewithdrawErrors = {\n  /**\n   * Bad Request\n   */\n  400: {\n    error: string;\n    type: TypeEnum3;\n    result?:\n      | {\n          bizNo: string;\n          steps: Array<{\n            type: TypeEnum4;\n            status: StatusEnum4;\n            required: boolean;\n            metadata?: {\n              email?: string;\n              emailSent?: boolean;\n              qrCodeUrl?: string;\n              qrCodeValidSeconds?: number;\n              roamingFlowId?: string;\n              [key: string]: unknown | string | boolean | number | undefined;\n            };\n            [key: string]:\n              | unknown\n              | TypeEnum4\n              | StatusEnum4\n              | boolean\n              | {\n                  email?: string;\n                  emailSent?: boolean;\n                  qrCodeUrl?: string;\n                  qrCodeValidSeconds?: number;\n                  roamingFlowId?: string;\n                  [key: string]:\n                    | unknown\n                    | string\n                    | boolean\n                    | number\n                    | undefined;\n                }\n              | undefined;\n          }>;\n          relation: RelationEnum;\n          mfa?: {\n            bizNo?: string;\n            verified: {\n              EMAIL?: boolean;\n              SMS?: boolean;\n              GOOGLE?: boolean;\n              FACE?: boolean;\n              ROAMING_FIDO?: boolean;\n            };\n            attempts?: Array<{\n              method: TypeEnum4;\n              status: StatusEnum4;\n              createdAt: number;\n              validatedAt?: number;\n              expiresAt?: number;\n              success: boolean;\n            }>;\n            methods?: Array<\n              | {\n                  method: \"EMAIL\";\n                  email: string;\n                }\n              | {\n                  method: \"SMS\";\n                  phoneNumber: string;\n                }\n              | {\n                  method: \"GOOGLE\";\n                }\n              | {\n                  method: \"FACE\";\n                  viaMobile: boolean;\n                }\n              | {\n                  method: \"ROAMING_FIDO\";\n                }\n            >;\n          };\n          [key: string]:\n            | unknown\n            | string\n            | Array<{\n                type: TypeEnum4;\n                status: StatusEnum4;\n                required: boolean;\n                metadata?: {\n                  email?: string;\n                  emailSent?: boolean;\n                  qrCodeUrl?: string;\n                  qrCodeValidSeconds?: number;\n                  roamingFlowId?: string;\n                  [key: string]:\n                    | unknown\n                    | string\n                    | boolean\n                    | number\n                    | undefined;\n                };\n                [key: string]:\n                  | unknown\n                  | TypeEnum4\n                  | StatusEnum4\n                  | boolean\n                  | {\n                      email?: string;\n                      emailSent?: boolean;\n                      qrCodeUrl?: string;\n                      qrCodeValidSeconds?: number;\n                      roamingFlowId?: string;\n                      [key: string]:\n                        | unknown\n                        | string\n                        | boolean\n                        | number\n                        | undefined;\n                    }\n                  | undefined;\n              }>\n            | RelationEnum\n            | {\n                bizNo?: string;\n                verified: {\n                  EMAIL?: boolean;\n                  SMS?: boolean;\n                  GOOGLE?: boolean;\n                  FACE?: boolean;\n                  ROAMING_FIDO?: boolean;\n                };\n                attempts?: Array<{\n                  method: TypeEnum4;\n                  status: StatusEnum4;\n                  createdAt: number;\n                  validatedAt?: number;\n                  expiresAt?: number;\n                  success: boolean;\n                }>;\n                methods?: Array<\n                  | {\n                      method: \"EMAIL\";\n                      email: string;\n                    }\n                  | {\n                      method: \"SMS\";\n                      phoneNumber: string;\n                    }\n                  | {\n                      method: \"GOOGLE\";\n                    }\n                  | {\n                      method: \"FACE\";\n                      viaMobile: boolean;\n                    }\n                  | {\n                      method: \"ROAMING_FIDO\";\n                    }\n                >;\n              }\n            | undefined;\n        }\n      | {\n          bizNo?: string;\n          steps?: Array<{\n            type: string;\n            status: StatusEnum4;\n            error?: string;\n            [key: string]: unknown | string | StatusEnum4 | undefined;\n          }>;\n          mfa?: {\n            bizNo?: string;\n            verified: {\n              EMAIL?: boolean;\n              SMS?: boolean;\n              GOOGLE?: boolean;\n              FACE?: boolean;\n              ROAMING_FIDO?: boolean;\n            };\n            attempts?: Array<{\n              method: TypeEnum4;\n              status: StatusEnum4;\n              createdAt: number;\n              validatedAt?: number;\n              expiresAt?: number;\n              success: boolean;\n            }>;\n            methods?: Array<\n              | {\n                  method: \"EMAIL\";\n                  email: string;\n                }\n              | {\n                  method: \"SMS\";\n                  phoneNumber: string;\n                }\n              | {\n                  method: \"GOOGLE\";\n                }\n              | {\n                  method: \"FACE\";\n                  viaMobile: boolean;\n                }\n              | {\n                  method: \"ROAMING_FIDO\";\n                }\n            >;\n          };\n          [key: string]:\n            | unknown\n            | string\n            | Array<{\n                type: string;\n                status: StatusEnum4;\n                error?: string;\n                [key: string]: unknown | string | StatusEnum4 | undefined;\n              }>\n            | {\n                bizNo?: string;\n                verified: {\n                  EMAIL?: boolean;\n                  SMS?: boolean;\n                  GOOGLE?: boolean;\n                  FACE?: boolean;\n                  ROAMING_FIDO?: boolean;\n                };\n                attempts?: Array<{\n                  method: TypeEnum4;\n                  status: StatusEnum4;\n                  createdAt: number;\n                  validatedAt?: number;\n                  expiresAt?: number;\n                  success: boolean;\n                }>;\n                methods?: Array<\n                  | {\n                      method: \"EMAIL\";\n                      email: string;\n                    }\n                  | {\n                      method: \"SMS\";\n                      phoneNumber: string;\n                    }\n                  | {\n                      method: \"GOOGLE\";\n                    }\n                  | {\n                      method: \"FACE\";\n                      viaMobile: boolean;\n                    }\n                  | {\n                      method: \"ROAMING_FIDO\";\n                    }\n                >;\n              }\n            | undefined;\n        }\n      | {\n          valid2FAMethods: Array<string>;\n          [key: string]: unknown | Array<string>;\n        }\n      | {\n          bizNo?: string;\n          steps?: Array<{\n            type: string;\n            status: \"success\";\n          }>;\n          accountId?: string;\n          dryRun: true;\n          readyToTransact: true;\n          mfa?: {\n            bizNo?: string;\n            verified: {\n              EMAIL?: boolean;\n              SMS?: boolean;\n              GOOGLE?: boolean;\n              FACE?: boolean;\n              ROAMING_FIDO?: boolean;\n            };\n            attempts?: Array<{\n              method: TypeEnum4;\n              status: StatusEnum4;\n              createdAt: number;\n              validatedAt?: number;\n              expiresAt?: number;\n              success: boolean;\n            }>;\n            methods?: Array<\n              | {\n                  method: \"EMAIL\";\n                  email: string;\n                }\n              | {\n                  method: \"SMS\";\n                  phoneNumber: string;\n                }\n              | {\n                  method: \"GOOGLE\";\n                }\n              | {\n                  method: \"FACE\";\n                  viaMobile: boolean;\n                }\n              | {\n                  method: \"ROAMING_FIDO\";\n                }\n            >;\n          };\n          [key: string]:\n            | unknown\n            | string\n            | Array<{\n                type: string;\n                status: \"success\";\n              }>\n            | true\n            | {\n                bizNo?: string;\n                verified: {\n                  EMAIL?: boolean;\n                  SMS?: boolean;\n                  GOOGLE?: boolean;\n                  FACE?: boolean;\n                  ROAMING_FIDO?: boolean;\n                };\n                attempts?: Array<{\n                  method: TypeEnum4;\n                  status: StatusEnum4;\n                  createdAt: number;\n                  validatedAt?: number;\n                  expiresAt?: number;\n                  success: boolean;\n                }>;\n                methods?: Array<\n                  | {\n                      method: \"EMAIL\";\n                      email: string;\n                    }\n                  | {\n                      method: \"SMS\";\n                      phoneNumber: string;\n                    }\n                  | {\n                      method: \"GOOGLE\";\n                    }\n                  | {\n                      method: \"FACE\";\n                      viaMobile: boolean;\n                    }\n                  | {\n                      method: \"ROAMING_FIDO\";\n                    }\n                >;\n              }\n            | undefined;\n        }\n      | {\n          [key: string]: unknown;\n        };\n  };\n  /**\n   * Forbidden - Insufficient API key permissions\n   */\n  403: {\n    error: string;\n    type: \"APIKEY_INSUFFICIENT_PERMISSIONS\";\n    missing: Array<string>;\n  };\n  /**\n   * Not Found\n   */\n  404: {\n    error: string;\n    type: TypeEnum3;\n    result?:\n      | {\n          bizNo: string;\n          steps: Array<{\n            type: TypeEnum4;\n            status: StatusEnum4;\n            required: boolean;\n            metadata?: {\n              email?: string;\n              emailSent?: boolean;\n              qrCodeUrl?: string;\n              qrCodeValidSeconds?: number;\n              roamingFlowId?: string;\n              [key: string]: unknown | string | boolean | number | undefined;\n            };\n            [key: string]:\n              | unknown\n              | TypeEnum4\n              | StatusEnum4\n              | boolean\n              | {\n                  email?: string;\n                  emailSent?: boolean;\n                  qrCodeUrl?: string;\n                  qrCodeValidSeconds?: number;\n                  roamingFlowId?: string;\n                  [key: string]:\n                    | unknown\n                    | string\n                    | boolean\n                    | number\n                    | undefined;\n                }\n              | undefined;\n          }>;\n          relation: RelationEnum;\n          mfa?: {\n            bizNo?: string;\n            verified: {\n              EMAIL?: boolean;\n              SMS?: boolean;\n              GOOGLE?: boolean;\n              FACE?: boolean;\n              ROAMING_FIDO?: boolean;\n            };\n            attempts?: Array<{\n              method: TypeEnum4;\n              status: StatusEnum4;\n              createdAt: number;\n              validatedAt?: number;\n              expiresAt?: number;\n              success: boolean;\n            }>;\n            methods?: Array<\n              | {\n                  method: \"EMAIL\";\n                  email: string;\n                }\n              | {\n                  method: \"SMS\";\n                  phoneNumber: string;\n                }\n              | {\n                  method: \"GOOGLE\";\n                }\n              | {\n                  method: \"FACE\";\n                  viaMobile: boolean;\n                }\n              | {\n                  method: \"ROAMING_FIDO\";\n                }\n            >;\n          };\n          [key: string]:\n            | unknown\n            | string\n            | Array<{\n                type: TypeEnum4;\n                status: StatusEnum4;\n                required: boolean;\n                metadata?: {\n                  email?: string;\n                  emailSent?: boolean;\n                  qrCodeUrl?: string;\n                  qrCodeValidSeconds?: number;\n                  roamingFlowId?: string;\n                  [key: string]:\n                    | unknown\n                    | string\n                    | boolean\n                    | number\n                    | undefined;\n                };\n                [key: string]:\n                  | unknown\n                  | TypeEnum4\n                  | StatusEnum4\n                  | boolean\n                  | {\n                      email?: string;\n                      emailSent?: boolean;\n                      qrCodeUrl?: string;\n                      qrCodeValidSeconds?: number;\n                      roamingFlowId?: string;\n                      [key: string]:\n                        | unknown\n                        | string\n                        | boolean\n                        | number\n                        | undefined;\n                    }\n                  | undefined;\n              }>\n            | RelationEnum\n            | {\n                bizNo?: string;\n                verified: {\n                  EMAIL?: boolean;\n                  SMS?: boolean;\n                  GOOGLE?: boolean;\n                  FACE?: boolean;\n                  ROAMING_FIDO?: boolean;\n                };\n                attempts?: Array<{\n                  method: TypeEnum4;\n                  status: StatusEnum4;\n                  createdAt: number;\n                  validatedAt?: number;\n                  expiresAt?: number;\n                  success: boolean;\n                }>;\n                methods?: Array<\n                  | {\n                      method: \"EMAIL\";\n                      email: string;\n                    }\n                  | {\n                      method: \"SMS\";\n                      phoneNumber: string;\n                    }\n                  | {\n                      method: \"GOOGLE\";\n                    }\n                  | {\n                      method: \"FACE\";\n                      viaMobile: boolean;\n                    }\n                  | {\n                      method: \"ROAMING_FIDO\";\n                    }\n                >;\n              }\n            | undefined;\n        }\n      | {\n          bizNo?: string;\n          steps?: Array<{\n            type: string;\n            status: StatusEnum4;\n            error?: string;\n            [key: string]: unknown | string | StatusEnum4 | undefined;\n          }>;\n          mfa?: {\n            bizNo?: string;\n            verified: {\n              EMAIL?: boolean;\n              SMS?: boolean;\n              GOOGLE?: boolean;\n              FACE?: boolean;\n              ROAMING_FIDO?: boolean;\n            };\n            attempts?: Array<{\n              method: TypeEnum4;\n              status: StatusEnum4;\n              createdAt: number;\n              validatedAt?: number;\n              expiresAt?: number;\n              success: boolean;\n            }>;\n            methods?: Array<\n              | {\n                  method: \"EMAIL\";\n                  email: string;\n                }\n              | {\n                  method: \"SMS\";\n                  phoneNumber: string;\n                }\n              | {\n                  method: \"GOOGLE\";\n                }\n              | {\n                  method: \"FACE\";\n                  viaMobile: boolean;\n                }\n              | {\n                  method: \"ROAMING_FIDO\";\n                }\n            >;\n          };\n          [key: string]:\n            | unknown\n            | string\n            | Array<{\n                type: string;\n                status: StatusEnum4;\n                error?: string;\n                [key: string]: unknown | string | StatusEnum4 | undefined;\n              }>\n            | {\n                bizNo?: string;\n                verified: {\n                  EMAIL?: boolean;\n                  SMS?: boolean;\n                  GOOGLE?: boolean;\n                  FACE?: boolean;\n                  ROAMING_FIDO?: boolean;\n                };\n                attempts?: Array<{\n                  method: TypeEnum4;\n                  status: StatusEnum4;\n                  createdAt: number;\n                  validatedAt?: number;\n                  expiresAt?: number;\n                  success: boolean;\n                }>;\n                methods?: Array<\n                  | {\n                      method: \"EMAIL\";\n                      email: string;\n                    }\n                  | {\n                      method: \"SMS\";\n                      phoneNumber: string;\n                    }\n                  | {\n                      method: \"GOOGLE\";\n                    }\n                  | {\n                      method: \"FACE\";\n                      viaMobile: boolean;\n                    }\n                  | {\n                      method: \"ROAMING_FIDO\";\n                    }\n                >;\n              }\n            | undefined;\n        }\n      | {\n          valid2FAMethods: Array<string>;\n          [key: string]: unknown | Array<string>;\n        }\n      | {\n          bizNo?: string;\n          steps?: Array<{\n            type: string;\n            status: \"success\";\n          }>;\n          accountId?: string;\n          dryRun: true;\n          readyToTransact: true;\n          mfa?: {\n            bizNo?: string;\n            verified: {\n              EMAIL?: boolean;\n              SMS?: boolean;\n              GOOGLE?: boolean;\n              FACE?: boolean;\n              ROAMING_FIDO?: boolean;\n            };\n            attempts?: Array<{\n              method: TypeEnum4;\n              status: StatusEnum4;\n              createdAt: number;\n              validatedAt?: number;\n              expiresAt?: number;\n              success: boolean;\n            }>;\n            methods?: Array<\n              | {\n                  method: \"EMAIL\";\n                  email: string;\n                }\n              | {\n                  method: \"SMS\";\n                  phoneNumber: string;\n                }\n              | {\n                  method: \"GOOGLE\";\n                }\n              | {\n                  method: \"FACE\";\n                  viaMobile: boolean;\n                }\n              | {\n                  method: \"ROAMING_FIDO\";\n                }\n            >;\n          };\n          [key: string]:\n            | unknown\n            | string\n            | Array<{\n                type: string;\n                status: \"success\";\n              }>\n            | true\n            | {\n                bizNo?: string;\n                verified: {\n                  EMAIL?: boolean;\n                  SMS?: boolean;\n                  GOOGLE?: boolean;\n                  FACE?: boolean;\n                  ROAMING_FIDO?: boolean;\n                };\n                attempts?: Array<{\n                  method: TypeEnum4;\n                  status: StatusEnum4;\n                  createdAt: number;\n                  validatedAt?: number;\n                  expiresAt?: number;\n                  success: boolean;\n                }>;\n                methods?: Array<\n                  | {\n                      method: \"EMAIL\";\n                      email: string;\n                    }\n                  | {\n                      method: \"SMS\";\n                      phoneNumber: string;\n                    }\n                  | {\n                      method: \"GOOGLE\";\n                    }\n                  | {\n                      method: \"FACE\";\n                      viaMobile: boolean;\n                    }\n                  | {\n                      method: \"ROAMING_FIDO\";\n                    }\n                >;\n              }\n            | undefined;\n        }\n      | {\n          [key: string]: unknown;\n        };\n  };\n};\n\nexport type WalletwithdrawquoteidexecutewithdrawError =\n  WalletwithdrawquoteidexecutewithdrawErrors[keyof WalletwithdrawquoteidexecutewithdrawErrors];\n\nexport type WalletwithdrawquoteidexecutewithdrawResponses = {\n  /**\n   * Successful response\n   */\n  200: {\n    success: boolean;\n    error?: string;\n    type?: TypeEnum3;\n    result?:\n      | {\n          transactionId: string;\n          [key: string]: unknown | string;\n        }\n      | {\n          bizNo: string;\n          steps: Array<{\n            type: TypeEnum4;\n            status: StatusEnum4;\n            required: boolean;\n            metadata?: {\n              email?: string;\n              emailSent?: boolean;\n              qrCodeUrl?: string;\n              qrCodeValidSeconds?: number;\n              roamingFlowId?: string;\n              [key: string]: unknown | string | boolean | number | undefined;\n            };\n            [key: string]:\n              | unknown\n              | TypeEnum4\n              | StatusEnum4\n              | boolean\n              | {\n                  email?: string;\n                  emailSent?: boolean;\n                  qrCodeUrl?: string;\n                  qrCodeValidSeconds?: number;\n                  roamingFlowId?: string;\n                  [key: string]:\n                    | unknown\n                    | string\n                    | boolean\n                    | number\n                    | undefined;\n                }\n              | undefined;\n          }>;\n          relation: RelationEnum;\n          mfa?: {\n            bizNo?: string;\n            verified: {\n              EMAIL?: boolean;\n              SMS?: boolean;\n              GOOGLE?: boolean;\n              FACE?: boolean;\n              ROAMING_FIDO?: boolean;\n            };\n            attempts?: Array<{\n              method: TypeEnum4;\n              status: StatusEnum4;\n              createdAt: number;\n              validatedAt?: number;\n              expiresAt?: number;\n              success: boolean;\n            }>;\n            methods?: Array<\n              | {\n                  method: \"EMAIL\";\n                  email: string;\n                }\n              | {\n                  method: \"SMS\";\n                  phoneNumber: string;\n                }\n              | {\n                  method: \"GOOGLE\";\n                }\n              | {\n                  method: \"FACE\";\n                  viaMobile: boolean;\n                }\n              | {\n                  method: \"ROAMING_FIDO\";\n                }\n            >;\n          };\n          [key: string]:\n            | unknown\n            | string\n            | Array<{\n                type: TypeEnum4;\n                status: StatusEnum4;\n                required: boolean;\n                metadata?: {\n                  email?: string;\n                  emailSent?: boolean;\n                  qrCodeUrl?: string;\n                  qrCodeValidSeconds?: number;\n                  roamingFlowId?: string;\n                  [key: string]:\n                    | unknown\n                    | string\n                    | boolean\n                    | number\n                    | undefined;\n                };\n                [key: string]:\n                  | unknown\n                  | TypeEnum4\n                  | StatusEnum4\n                  | boolean\n                  | {\n                      email?: string;\n                      emailSent?: boolean;\n                      qrCodeUrl?: string;\n                      qrCodeValidSeconds?: number;\n                      roamingFlowId?: string;\n                      [key: string]:\n                        | unknown\n                        | string\n                        | boolean\n                        | number\n                        | undefined;\n                    }\n                  | undefined;\n              }>\n            | RelationEnum\n            | {\n                bizNo?: string;\n                verified: {\n                  EMAIL?: boolean;\n                  SMS?: boolean;\n                  GOOGLE?: boolean;\n                  FACE?: boolean;\n                  ROAMING_FIDO?: boolean;\n                };\n                attempts?: Array<{\n                  method: TypeEnum4;\n                  status: StatusEnum4;\n                  createdAt: number;\n                  validatedAt?: number;\n                  expiresAt?: number;\n                  success: boolean;\n                }>;\n                methods?: Array<\n                  | {\n                      method: \"EMAIL\";\n                      email: string;\n                    }\n                  | {\n                      method: \"SMS\";\n                      phoneNumber: string;\n                    }\n                  | {\n                      method: \"GOOGLE\";\n                    }\n                  | {\n                      method: \"FACE\";\n                      viaMobile: boolean;\n                    }\n                  | {\n                      method: \"ROAMING_FIDO\";\n                    }\n                >;\n              }\n            | undefined;\n        }\n      | {\n          bizNo?: string;\n          steps?: Array<{\n            type: string;\n            status: StatusEnum4;\n            error?: string;\n            [key: string]: unknown | string | StatusEnum4 | undefined;\n          }>;\n          mfa?: {\n            bizNo?: string;\n            verified: {\n              EMAIL?: boolean;\n              SMS?: boolean;\n              GOOGLE?: boolean;\n              FACE?: boolean;\n              ROAMING_FIDO?: boolean;\n            };\n            attempts?: Array<{\n              method: TypeEnum4;\n              status: StatusEnum4;\n              createdAt: number;\n              validatedAt?: number;\n              expiresAt?: number;\n              success: boolean;\n            }>;\n            methods?: Array<\n              | {\n                  method: \"EMAIL\";\n                  email: string;\n                }\n              | {\n                  method: \"SMS\";\n                  phoneNumber: string;\n                }\n              | {\n                  method: \"GOOGLE\";\n                }\n              | {\n                  method: \"FACE\";\n                  viaMobile: boolean;\n                }\n              | {\n                  method: \"ROAMING_FIDO\";\n                }\n            >;\n          };\n          [key: string]:\n            | unknown\n            | string\n            | Array<{\n                type: string;\n                status: StatusEnum4;\n                error?: string;\n                [key: string]: unknown | string | StatusEnum4 | undefined;\n              }>\n            | {\n                bizNo?: string;\n                verified: {\n                  EMAIL?: boolean;\n                  SMS?: boolean;\n                  GOOGLE?: boolean;\n                  FACE?: boolean;\n                  ROAMING_FIDO?: boolean;\n                };\n                attempts?: Array<{\n                  method: TypeEnum4;\n                  status: StatusEnum4;\n                  createdAt: number;\n                  validatedAt?: number;\n                  expiresAt?: number;\n                  success: boolean;\n                }>;\n                methods?: Array<\n                  | {\n                      method: \"EMAIL\";\n                      email: string;\n                    }\n                  | {\n                      method: \"SMS\";\n                      phoneNumber: string;\n                    }\n                  | {\n                      method: \"GOOGLE\";\n                    }\n                  | {\n                      method: \"FACE\";\n                      viaMobile: boolean;\n                    }\n                  | {\n                      method: \"ROAMING_FIDO\";\n                    }\n                >;\n              }\n            | undefined;\n        }\n      | {\n          valid2FAMethods: Array<string>;\n          [key: string]: unknown | Array<string>;\n        }\n      | {\n          [key: string]: unknown;\n        };\n  };\n};\n\nexport type WalletwithdrawquoteidexecutewithdrawResponse =\n  WalletwithdrawquoteidexecutewithdrawResponses[keyof WalletwithdrawquoteidexecutewithdrawResponses];\n\nexport type OrganizationapikeyapikeyinfoData = {\n  body?: never;\n  path?: never;\n  query?: never;\n  url: \"/v0/organization/api-key\";\n};\n\nexport type OrganizationapikeyapikeyinfoErrors = {\n  /**\n   * Forbidden - Insufficient API key permissions\n   */\n  403: {\n    error: string;\n    type: \"APIKEY_INSUFFICIENT_PERMISSIONS\";\n    missing: Array<string>;\n  };\n};\n\nexport type OrganizationapikeyapikeyinfoError =\n  OrganizationapikeyapikeyinfoErrors[keyof OrganizationapikeyapikeyinfoErrors];\n\nexport type OrganizationapikeyapikeyinfoResponses = {\n  /**\n   * Successful response\n   */\n  200: {\n    permissions?: {\n      read?: boolean;\n      quote?: boolean;\n      withdrawal?: boolean;\n      trade?: boolean;\n      deposit?: boolean;\n      listen?: boolean;\n      delete?: boolean;\n    } | null;\n    rateLimit?: {\n      rateLimitEnabled: boolean | null;\n      rateLimitTimeWindow: number | null;\n      rateLimitMax: number | null;\n      requestCount: number | null;\n      lastRequest: string | null;\n    };\n  };\n};\n\nexport type OrganizationapikeyapikeyinfoResponse =\n  OrganizationapikeyapikeyinfoResponses[keyof OrganizationapikeyapikeyinfoResponses];\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n  ArrayStyle,\n  ObjectStyle,\n  SerializerOptions,\n} from \"./pathSerializer.gen\";\n\nexport type QuerySerializer = (query: Record<string, unknown>) => string;\n\nexport type BodySerializer = (body: any) => any;\n\ntype QuerySerializerOptionsObject = {\n  allowReserved?: boolean;\n  array?: Partial<SerializerOptions<ArrayStyle>>;\n  object?: Partial<SerializerOptions<ObjectStyle>>;\n};\n\nexport type QuerySerializerOptions = QuerySerializerOptionsObject & {\n  /**\n   * Per-parameter serialization overrides. When provided, these settings\n   * override the global array/object settings for specific parameter names.\n   */\n  parameters?: Record<string, QuerySerializerOptionsObject>;\n};\n\nconst serializeFormDataPair = (\n  data: FormData,\n  key: string,\n  value: unknown,\n): void => {\n  if (typeof value === \"string\" || value instanceof Blob) {\n    data.append(key, value);\n  } else if (value instanceof Date) {\n    data.append(key, value.toISOString());\n  } else {\n    data.append(key, JSON.stringify(value));\n  }\n};\n\nconst serializeUrlSearchParamsPair = (\n  data: URLSearchParams,\n  key: string,\n  value: unknown,\n): void => {\n  if (typeof value === \"string\") {\n    data.append(key, value);\n  } else {\n    data.append(key, JSON.stringify(value));\n  }\n};\n\nexport const formDataBodySerializer = {\n  bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(\n    body: T,\n  ): FormData => {\n    const data = new FormData();\n\n    Object.entries(body).forEach(([key, value]) => {\n      if (value === undefined || value === null) {\n        return;\n      }\n      if (Array.isArray(value)) {\n        value.forEach((v) => serializeFormDataPair(data, key, v));\n      } else {\n        serializeFormDataPair(data, key, value);\n      }\n    });\n\n    return data;\n  },\n};\n\nexport const jsonBodySerializer = {\n  bodySerializer: <T>(body: T): string =>\n    JSON.stringify(body, (_key, value) =>\n      typeof value === \"bigint\" ? value.toString() : value,\n    ),\n};\n\nexport const urlSearchParamsBodySerializer = {\n  bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(\n    body: T,\n  ): string => {\n    const data = new URLSearchParams();\n\n    Object.entries(body).forEach(([key, value]) => {\n      if (value === undefined || value === null) {\n        return;\n      }\n      if (Array.isArray(value)) {\n        value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));\n      } else {\n        serializeUrlSearchParamsPair(data, key, value);\n      }\n    });\n\n    return data.toString();\n  },\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Config } from \"./types.gen\";\n\nexport type ServerSentEventsOptions<TData = unknown> = Omit<\n  RequestInit,\n  \"method\"\n> &\n  Pick<Config, \"method\" | \"responseTransformer\" | \"responseValidator\"> & {\n    /**\n     * Fetch API implementation. You can use this option to provide a custom\n     * fetch instance.\n     *\n     * @default globalThis.fetch\n     */\n    fetch?: typeof fetch;\n    /**\n     * Implementing clients can call request interceptors inside this hook.\n     */\n    onRequest?: (url: string, init: RequestInit) => Promise<Request>;\n    /**\n     * Callback invoked when a network or parsing error occurs during streaming.\n     *\n     * This option applies only if the endpoint returns a stream of events.\n     *\n     * @param error The error that occurred.\n     */\n    onSseError?: (error: unknown) => void;\n    /**\n     * Callback invoked when an event is streamed from the server.\n     *\n     * This option applies only if the endpoint returns a stream of events.\n     *\n     * @param event Event streamed from the server.\n     * @returns Nothing (void).\n     */\n    onSseEvent?: (event: StreamEvent<TData>) => void;\n    serializedBody?: RequestInit[\"body\"];\n    /**\n     * Default retry delay in milliseconds.\n     *\n     * This option applies only if the endpoint returns a stream of events.\n     *\n     * @default 3000\n     */\n    sseDefaultRetryDelay?: number;\n    /**\n     * Maximum number of retry attempts before giving up.\n     */\n    sseMaxRetryAttempts?: number;\n    /**\n     * Maximum retry delay in milliseconds.\n     *\n     * Applies only when exponential backoff is used.\n     *\n     * This option applies only if the endpoint returns a stream of events.\n     *\n     * @default 30000\n     */\n    sseMaxRetryDelay?: number;\n    /**\n     * Optional sleep function for retry backoff.\n     *\n     * Defaults to using `setTimeout`.\n     */\n    sseSleepFn?: (ms: number) => Promise<void>;\n    url: string;\n  };\n\nexport interface StreamEvent<TData = unknown> {\n  data: TData;\n  event?: string;\n  id?: string;\n  retry?: number;\n}\n\nexport type ServerSentEventsResult<\n  TData = unknown,\n  TReturn = void,\n  TNext = unknown,\n> = {\n  stream: AsyncGenerator<\n    TData extends Record<string, unknown> ? TData[keyof TData] : TData,\n    TReturn,\n    TNext\n  >;\n};\n\nexport const createSseClient = <TData = unknown>({\n  onRequest,\n  onSseError,\n  onSseEvent,\n  responseTransformer,\n  responseValidator,\n  sseDefaultRetryDelay,\n  sseMaxRetryAttempts,\n  sseMaxRetryDelay,\n  sseSleepFn,\n  url,\n  ...options\n}: ServerSentEventsOptions): ServerSentEventsResult<TData> => {\n  let lastEventId: string | undefined;\n\n  const sleep =\n    sseSleepFn ??\n    ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));\n\n  const createStream = async function* () {\n    let retryDelay: number = sseDefaultRetryDelay ?? 3000;\n    let attempt = 0;\n    const signal = options.signal ?? new AbortController().signal;\n\n    while (true) {\n      if (signal.aborted) break;\n\n      attempt++;\n\n      const headers =\n        options.headers instanceof Headers\n          ? options.headers\n          : new Headers(options.headers as Record<string, string> | undefined);\n\n      if (lastEventId !== undefined) {\n        headers.set(\"Last-Event-ID\", lastEventId);\n      }\n\n      try {\n        const requestInit: RequestInit = {\n          redirect: \"follow\",\n          ...options,\n          body: options.serializedBody,\n          headers,\n          signal,\n        };\n        let request = new Request(url, requestInit);\n        if (onRequest) {\n          request = await onRequest(url, requestInit);\n        }\n        // fetch must be assigned here, otherwise it would throw the error:\n        // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n        const _fetch = options.fetch ?? globalThis.fetch;\n        const response = await _fetch(request);\n\n        if (!response.ok)\n          throw new Error(\n            `SSE failed: ${response.status} ${response.statusText}`,\n          );\n\n        if (!response.body) throw new Error(\"No body in SSE response\");\n\n        const reader = response.body\n          .pipeThrough(new TextDecoderStream())\n          .getReader();\n\n        let buffer = \"\";\n\n        const abortHandler = () => {\n          try {\n            reader.cancel();\n          } catch {\n            // noop\n          }\n        };\n\n        signal.addEventListener(\"abort\", abortHandler);\n\n        try {\n          while (true) {\n            const { done, value } = await reader.read();\n            if (done) break;\n            buffer += value;\n\n            const chunks = buffer.split(\"\\n\\n\");\n            buffer = chunks.pop() ?? \"\";\n\n            for (const chunk of chunks) {\n              const lines = chunk.split(\"\\n\");\n              const dataLines: Array<string> = [];\n              let eventName: string | undefined;\n\n              for (const line of lines) {\n                if (line.startsWith(\"data:\")) {\n                  dataLines.push(line.replace(/^data:\\s*/, \"\"));\n                } else if (line.startsWith(\"event:\")) {\n                  eventName = line.replace(/^event:\\s*/, \"\");\n                } else if (line.startsWith(\"id:\")) {\n                  lastEventId = line.replace(/^id:\\s*/, \"\");\n                } else if (line.startsWith(\"retry:\")) {\n                  const parsed = Number.parseInt(\n                    line.replace(/^retry:\\s*/, \"\"),\n                    10,\n                  );\n                  if (!Number.isNaN(parsed)) {\n                    retryDelay = parsed;\n                  }\n                }\n              }\n\n              let data: unknown;\n              let parsedJson = false;\n\n              if (dataLines.length) {\n                const rawData = dataLines.join(\"\\n\");\n                try {\n                  data = JSON.parse(rawData);\n                  parsedJson = true;\n                } catch {\n                  data = rawData;\n                }\n              }\n\n              if (parsedJson) {\n                if (responseValidator) {\n                  await responseValidator(data);\n                }\n\n                if (responseTransformer) {\n                  data = await responseTransformer(data);\n                }\n              }\n\n              onSseEvent?.({\n                data,\n                event: eventName,\n                id: lastEventId,\n                retry: retryDelay,\n              });\n\n              if (dataLines.length) {\n                yield data as any;\n              }\n            }\n          }\n        } finally {\n          signal.removeEventListener(\"abort\", abortHandler);\n          reader.releaseLock();\n        }\n\n        break; // exit loop on normal completion\n      } catch (error) {\n        // connection failed or aborted; retry after delay\n        onSseError?.(error);\n\n        if (\n          sseMaxRetryAttempts !== undefined &&\n          attempt >= sseMaxRetryAttempts\n        ) {\n          break; // stop after firing error\n        }\n\n        // exponential backoff: double retry each attempt, cap at 30s\n        const backoff = Math.min(\n          retryDelay * 2 ** (attempt - 1),\n          sseMaxRetryDelay ?? 30000,\n        );\n        await sleep(backoff);\n      }\n    }\n  };\n\n  const stream = createStream();\n\n  return { stream };\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\ninterface SerializeOptions<T>\n  extends SerializePrimitiveOptions,\n    SerializerOptions<T> {}\n\ninterface SerializePrimitiveOptions {\n  allowReserved?: boolean;\n  name: string;\n}\n\nexport interface SerializerOptions<T> {\n  /**\n   * @default true\n   */\n  explode: boolean;\n  style: T;\n}\n\nexport type ArrayStyle = \"form\" | \"spaceDelimited\" | \"pipeDelimited\";\nexport type ArraySeparatorStyle = ArrayStyle | MatrixStyle;\ntype MatrixStyle = \"label\" | \"matrix\" | \"simple\";\nexport type ObjectStyle = \"form\" | \"deepObject\";\ntype ObjectSeparatorStyle = ObjectStyle | MatrixStyle;\n\ninterface SerializePrimitiveParam extends SerializePrimitiveOptions {\n  value: string;\n}\n\nexport const separatorArrayExplode = (style: ArraySeparatorStyle) => {\n  switch (style) {\n    case \"label\":\n      return \".\";\n    case \"matrix\":\n      return \";\";\n    case \"simple\":\n      return \",\";\n    default:\n      return \"&\";\n  }\n};\n\nexport const separatorArrayNoExplode = (style: ArraySeparatorStyle) => {\n  switch (style) {\n    case \"form\":\n      return \",\";\n    case \"pipeDelimited\":\n      return \"|\";\n    case \"spaceDelimited\":\n      return \"%20\";\n    default:\n      return \",\";\n  }\n};\n\nexport const separatorObjectExplode = (style: ObjectSeparatorStyle) => {\n  switch (style) {\n    case \"label\":\n      return \".\";\n    case \"matrix\":\n      return \";\";\n    case \"simple\":\n      return \",\";\n    default:\n      return \"&\";\n  }\n};\n\nexport const serializeArrayParam = ({\n  allowReserved,\n  explode,\n  name,\n  style,\n  value,\n}: SerializeOptions<ArraySeparatorStyle> & {\n  value: unknown[];\n}) => {\n  if (!explode) {\n    const joinedValues = (\n      allowReserved ? value : value.map((v) => encodeURIComponent(v as string))\n    ).join(separatorArrayNoExplode(style));\n    switch (style) {\n      case \"label\":\n        return `.${joinedValues}`;\n      case \"matrix\":\n        return `;${name}=${joinedValues}`;\n      case \"simple\":\n        return joinedValues;\n      default:\n        return `${name}=${joinedValues}`;\n    }\n  }\n\n  const separator = separatorArrayExplode(style);\n  const joinedValues = value\n    .map((v) => {\n      if (style === \"label\" || style === \"simple\") {\n        return allowReserved ? v : encodeURIComponent(v as string);\n      }\n\n      return serializePrimitiveParam({\n        allowReserved,\n        name,\n        value: v as string,\n      });\n    })\n    .join(separator);\n  return style === \"label\" || style === \"matrix\"\n    ? separator + joinedValues\n    : joinedValues;\n};\n\nexport const serializePrimitiveParam = ({\n  allowReserved,\n  name,\n  value,\n}: SerializePrimitiveParam) => {\n  if (value === undefined || value === null) {\n    return \"\";\n  }\n\n  if (typeof value === \"object\") {\n    throw new Error(\n      \"Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.\",\n    );\n  }\n\n  return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;\n};\n\nexport const serializeObjectParam = ({\n  allowReserved,\n  explode,\n  name,\n  style,\n  value,\n  valueOnly,\n}: SerializeOptions<ObjectSeparatorStyle> & {\n  value: Record<string, unknown> | Date;\n  valueOnly?: boolean;\n}) => {\n  if (value instanceof Date) {\n    return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;\n  }\n\n  if (style !== \"deepObject\" && !explode) {\n    let values: string[] = [];\n    Object.entries(value).forEach(([key, v]) => {\n      values = [\n        ...values,\n        key,\n        allowReserved ? (v as string) : encodeURIComponent(v as string),\n      ];\n    });\n    const joinedValues = values.join(\",\");\n    switch (style) {\n      case \"form\":\n        return `${name}=${joinedValues}`;\n      case \"label\":\n        return `.${joinedValues}`;\n      case \"matrix\":\n        return `;${name}=${joinedValues}`;\n      default:\n        return joinedValues;\n    }\n  }\n\n  const separator = separatorObjectExplode(style);\n  const joinedValues = Object.entries(value)\n    .map(([key, v]) =>\n      serializePrimitiveParam({\n        allowReserved,\n        name: style === \"deepObject\" ? `${name}[${key}]` : key,\n        value: v as string,\n      }),\n    )\n    .join(separator);\n  return style === \"label\" || style === \"matrix\"\n    ? separator + joinedValues\n    : joinedValues;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { BodySerializer, QuerySerializer } from \"./bodySerializer.gen\";\nimport {\n  type ArraySeparatorStyle,\n  serializeArrayParam,\n  serializeObjectParam,\n  serializePrimitiveParam,\n} from \"./pathSerializer.gen\";\n\nexport interface PathSerializer {\n  path: Record<string, unknown>;\n  url: string;\n}\n\nexport const PATH_PARAM_RE = /\\{[^{}]+\\}/g;\n\nexport const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => {\n  let url = _url;\n  const matches = _url.match(PATH_PARAM_RE);\n  if (matches) {\n    for (const match of matches) {\n      let explode = false;\n      let name = match.substring(1, match.length - 1);\n      let style: ArraySeparatorStyle = \"simple\";\n\n      if (name.endsWith(\"*\")) {\n        explode = true;\n        name = name.substring(0, name.length - 1);\n      }\n\n      if (name.startsWith(\".\")) {\n        name = name.substring(1);\n        style = \"label\";\n      } else if (name.startsWith(\";\")) {\n        name = name.substring(1);\n        style = \"matrix\";\n      }\n\n      const value = path[name];\n\n      if (value === undefined || value === null) {\n        continue;\n      }\n\n      if (Array.isArray(value)) {\n        url = url.replace(\n          match,\n          serializeArrayParam({ explode, name, style, value }),\n        );\n        continue;\n      }\n\n      if (typeof value === \"object\") {\n        url = url.replace(\n          match,\n          serializeObjectParam({\n            explode,\n            name,\n            style,\n            value: value as Record<string, unknown>,\n            valueOnly: true,\n          }),\n        );\n        continue;\n      }\n\n      if (style === \"matrix\") {\n        url = url.replace(\n          match,\n          `;${serializePrimitiveParam({\n            name,\n            value: value as string,\n          })}`,\n        );\n        continue;\n      }\n\n      const replaceValue = encodeURIComponent(\n        style === \"label\" ? `.${value as string}` : (value as string),\n      );\n      url = url.replace(match, replaceValue);\n    }\n  }\n  return url;\n};\n\nexport const getUrl = ({\n  baseUrl,\n  path,\n  query,\n  querySerializer,\n  url: _url,\n}: {\n  baseUrl?: string;\n  path?: Record<string, unknown>;\n  query?: Record<string, unknown>;\n  querySerializer: QuerySerializer;\n  url: string;\n}) => {\n  const pathUrl = _url.startsWith(\"/\") ? _url : `/${_url}`;\n  let url = (baseUrl ?? \"\") + pathUrl;\n  if (path) {\n    url = defaultPathSerializer({ path, url });\n  }\n  let search = query ? querySerializer(query) : \"\";\n  if (search.startsWith(\"?\")) {\n    search = search.substring(1);\n  }\n  if (search) {\n    url += `?${search}`;\n  }\n  return url;\n};\n\nexport function getValidRequestBody(options: {\n  body?: unknown;\n  bodySerializer?: BodySerializer | null;\n  serializedBody?: unknown;\n}) {\n  const hasBody = options.body !== undefined;\n  const isSerializedBody = hasBody && options.bodySerializer;\n\n  if (isSerializedBody) {\n    if (\"serializedBody\" in options) {\n      const hasSerializedBody =\n        options.serializedBody !== undefined && options.serializedBody !== \"\";\n\n      return hasSerializedBody ? options.serializedBody : null;\n    }\n\n    // not all clients implement a serializedBody property (i.e. client-axios)\n    return options.body !== \"\" ? options.body : null;\n  }\n\n  // plain/text body\n  if (hasBody) {\n    return options.body;\n  }\n\n  // no body was provided\n  return undefined;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nexport type AuthToken = string | undefined;\n\nexport interface Auth {\n  /**\n   * Which part of the request do we use to send the auth?\n   *\n   * @default 'header'\n   */\n  in?: \"header\" | \"query\" | \"cookie\";\n  /**\n   * Header or query parameter name.\n   *\n   * @default 'Authorization'\n   */\n  name?: string;\n  scheme?: \"basic\" | \"bearer\";\n  type: \"apiKey\" | \"http\";\n}\n\nexport const getAuthToken = async (\n  auth: Auth,\n  callback: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken,\n): Promise<string | undefined> => {\n  const token =\n    typeof callback === \"function\" ? await callback(auth) : callback;\n\n  if (!token) {\n    return;\n  }\n\n  if (auth.scheme === \"bearer\") {\n    return `Bearer ${token}`;\n  }\n\n  if (auth.scheme === \"basic\") {\n    return `Basic ${btoa(token)}`;\n  }\n\n  return token;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { getAuthToken } from \"../core/auth.gen\";\nimport type { QuerySerializerOptions } from \"../core/bodySerializer.gen\";\nimport { jsonBodySerializer } from \"../core/bodySerializer.gen\";\nimport {\n  serializeArrayParam,\n  serializeObjectParam,\n  serializePrimitiveParam,\n} from \"../core/pathSerializer.gen\";\nimport { getUrl } from \"../core/utils.gen\";\nimport type {\n  Client,\n  ClientOptions,\n  Config,\n  RequestOptions,\n} from \"./types.gen\";\n\nexport const createQuerySerializer = <T = unknown>({\n  parameters = {},\n  ...args\n}: QuerySerializerOptions = {}) => {\n  const querySerializer = (queryParams: T) => {\n    const search: string[] = [];\n    if (queryParams && typeof queryParams === \"object\") {\n      for (const name in queryParams) {\n        const value = queryParams[name];\n\n        if (value === undefined || value === null) {\n          continue;\n        }\n\n        const options = parameters[name] || args;\n\n        if (Array.isArray(value)) {\n          const serializedArray = serializeArrayParam({\n            allowReserved: options.allowReserved,\n            explode: true,\n            name,\n            style: \"form\",\n            value,\n            ...options.array,\n          });\n          if (serializedArray) search.push(serializedArray);\n        } else if (typeof value === \"object\") {\n          const serializedObject = serializeObjectParam({\n            allowReserved: options.allowReserved,\n            explode: true,\n            name,\n            style: \"deepObject\",\n            value: value as Record<string, unknown>,\n            ...options.object,\n          });\n          if (serializedObject) search.push(serializedObject);\n        } else {\n          const serializedPrimitive = serializePrimitiveParam({\n            allowReserved: options.allowReserved,\n            name,\n            value: value as string,\n          });\n          if (serializedPrimitive) search.push(serializedPrimitive);\n        }\n      }\n    }\n    return search.join(\"&\");\n  };\n  return querySerializer;\n};\n\n/**\n * Infers parseAs value from provided Content-Type header.\n */\nexport const getParseAs = (\n  contentType: string | null,\n): Exclude<Config[\"parseAs\"], \"auto\"> => {\n  if (!contentType) {\n    // If no Content-Type header is provided, the best we can do is return the raw response body,\n    // which is effectively the same as the 'stream' option.\n    return \"stream\";\n  }\n\n  const cleanContent = contentType.split(\";\")[0]?.trim();\n\n  if (!cleanContent) {\n    return;\n  }\n\n  if (\n    cleanContent.startsWith(\"application/json\") ||\n    cleanContent.endsWith(\"+json\")\n  ) {\n    return \"json\";\n  }\n\n  if (cleanContent === \"multipart/form-data\") {\n    return \"formData\";\n  }\n\n  if (\n    [\"application/\", \"audio/\", \"image/\", \"video/\"].some((type) =>\n      cleanContent.startsWith(type),\n    )\n  ) {\n    return \"blob\";\n  }\n\n  if (cleanContent.startsWith(\"text/\")) {\n    return \"text\";\n  }\n\n  return;\n};\n\nconst checkForExistence = (\n  options: Pick<RequestOptions, \"auth\" | \"query\"> & {\n    headers: Headers;\n  },\n  name?: string,\n): boolean => {\n  if (!name) {\n    return false;\n  }\n  if (\n    options.headers.has(name) ||\n    options.query?.[name] ||\n    options.headers.get(\"Cookie\")?.includes(`${name}=`)\n  ) {\n    return true;\n  }\n  return false;\n};\n\nexport const setAuthParams = async ({\n  security,\n  ...options\n}: Pick<Required<RequestOptions>, \"security\"> &\n  Pick<RequestOptions, \"auth\" | \"query\"> & {\n    headers: Headers;\n  }) => {\n  for (const auth of security) {\n    if (checkForExistence(options, auth.name)) {\n      continue;\n    }\n\n    const token = await getAuthToken(auth, options.auth);\n\n    if (!token) {\n      continue;\n    }\n\n    const name = auth.name ?? \"Authorization\";\n\n    switch (auth.in) {\n      case \"query\":\n        if (!options.query) {\n          options.query = {};\n        }\n        options.query[name] = token;\n        break;\n      case \"cookie\":\n        options.headers.append(\"Cookie\", `${name}=${token}`);\n        break;\n      case \"header\":\n      default:\n        options.headers.set(name, token);\n        break;\n    }\n  }\n};\n\nexport const buildUrl: Client[\"buildUrl\"] = (options) =>\n  getUrl({\n    baseUrl: options.baseUrl as string,\n    path: options.path,\n    query: options.query,\n    querySerializer:\n      typeof options.querySerializer === \"function\"\n        ? options.querySerializer\n        : createQuerySerializer(options.querySerializer),\n    url: options.url,\n  });\n\nexport const mergeConfigs = (a: Config, b: Config): Config => {\n  const config = { ...a, ...b };\n  if (config.baseUrl?.endsWith(\"/\")) {\n    config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);\n  }\n  config.headers = mergeHeaders(a.headers, b.headers);\n  return config;\n};\n\nconst headersEntries = (headers: Headers): Array<[string, string]> => {\n  const entries: Array<[string, string]> = [];\n  headers.forEach((value, key) => {\n    entries.push([key, value]);\n  });\n  return entries;\n};\n\nexport const mergeHeaders = (\n  ...headers: Array<Required<Config>[\"headers\"] | undefined>\n): Headers => {\n  const mergedHeaders = new Headers();\n  for (const header of headers) {\n    if (!header) {\n      continue;\n    }\n\n    const iterator =\n      header instanceof Headers\n        ? headersEntries(header)\n        : Object.entries(header);\n\n    for (const [key, value] of iterator) {\n      if (value === null) {\n        mergedHeaders.delete(key);\n      } else if (Array.isArray(value)) {\n        for (const v of value) {\n          mergedHeaders.append(key, v as string);\n        }\n      } else if (value !== undefined) {\n        // assume object headers are meant to be JSON stringified, i.e. their\n        // content value in OpenAPI specification is 'application/json'\n        mergedHeaders.set(\n          key,\n          typeof value === \"object\" ? JSON.stringify(value) : (value as string),\n        );\n      }\n    }\n  }\n  return mergedHeaders;\n};\n\ntype ErrInterceptor<Err, Res, Req, Options> = (\n  error: Err,\n  response: Res,\n  request: Req,\n  options: Options,\n) => Err | Promise<Err>;\n\ntype ReqInterceptor<Req, Options> = (\n  request: Req,\n  options: Options,\n) => Req | Promise<Req>;\n\ntype ResInterceptor<Res, Req, Options> = (\n  response: Res,\n  request: Req,\n  options: Options,\n) => Res | Promise<Res>;\n\nclass Interceptors<Interceptor> {\n  fns: Array<Interceptor | null> = [];\n\n  clear(): void {\n    this.fns = [];\n  }\n\n  eject(id: number | Interceptor): void {\n    const index = this.getInterceptorIndex(id);\n    if (this.fns[index]) {\n      this.fns[index] = null;\n    }\n  }\n\n  exists(id: number | Interceptor): boolean {\n    const index = this.getInterceptorIndex(id);\n    return Boolean(this.fns[index]);\n  }\n\n  getInterceptorIndex(id: number | Interceptor): number {\n    if (typeof id === \"number\") {\n      return this.fns[id] ? id : -1;\n    }\n    return this.fns.indexOf(id);\n  }\n\n  update(\n    id: number | Interceptor,\n    fn: Interceptor,\n  ): number | Interceptor | false {\n    const index = this.getInterceptorIndex(id);\n    if (this.fns[index]) {\n      this.fns[index] = fn;\n      return id;\n    }\n    return false;\n  }\n\n  use(fn: Interceptor): number {\n    this.fns.push(fn);\n    return this.fns.length - 1;\n  }\n}\n\nexport interface Middleware<Req, Res, Err, Options> {\n  error: Interceptors<ErrInterceptor<Err, Res, Req, Options>>;\n  request: Interceptors<ReqInterceptor<Req, Options>>;\n  response: Interceptors<ResInterceptor<Res, Req, Options>>;\n}\n\nexport const createInterceptors = <Req, Res, Err, Options>(): Middleware<\n  Req,\n  Res,\n  Err,\n  Options\n> => ({\n  error: new Interceptors<ErrInterceptor<Err, Res, Req, Options>>(),\n  request: new Interceptors<ReqInterceptor<Req, Options>>(),\n  response: new Interceptors<ResInterceptor<Res, Req, Options>>(),\n});\n\nconst defaultQuerySerializer = createQuerySerializer({\n  allowReserved: false,\n  array: {\n    explode: true,\n    style: \"form\",\n  },\n  object: {\n    explode: true,\n    style: \"deepObject\",\n  },\n});\n\nconst defaultHeaders = {\n  \"Content-Type\": \"application/json\",\n};\n\nexport const createConfig = <T extends ClientOptions = ClientOptions>(\n  override: Config<Omit<ClientOptions, keyof T> & T> = {},\n): Config<Omit<ClientOptions, keyof T> & T> => ({\n  ...jsonBodySerializer,\n  headers: defaultHeaders,\n  parseAs: \"auto\",\n  querySerializer: defaultQuerySerializer,\n  ...override,\n});\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { createSseClient } from \"../core/serverSentEvents.gen\";\nimport type { HttpMethod } from \"../core/types.gen\";\nimport { getValidRequestBody } from \"../core/utils.gen\";\nimport type {\n  Client,\n  Config,\n  RequestOptions,\n  ResolvedRequestOptions,\n} from \"./types.gen\";\nimport {\n  buildUrl,\n  createConfig,\n  createInterceptors,\n  getParseAs,\n  mergeConfigs,\n  mergeHeaders,\n  setAuthParams,\n} from \"./utils.gen\";\n\ntype ReqInit = Omit<RequestInit, \"body\" | \"headers\"> & {\n  body?: any;\n  headers: ReturnType<typeof mergeHeaders>;\n};\n\nexport const createClient = (config: Config = {}): Client => {\n  let _config = mergeConfigs(createConfig(), config);\n\n  const getConfig = (): Config => ({ ..._config });\n\n  const setConfig = (config: Config): Config => {\n    _config = mergeConfigs(_config, config);\n    return getConfig();\n  };\n\n  const interceptors = createInterceptors<\n    Request,\n    Response,\n    unknown,\n    ResolvedRequestOptions\n  >();\n\n  const beforeRequest = async (options: RequestOptions) => {\n    const opts = {\n      ..._config,\n      ...options,\n      fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n      headers: mergeHeaders(_config.headers, options.headers),\n      serializedBody: undefined,\n    };\n\n    if (opts.security) {\n      await setAuthParams({\n        ...opts,\n        security: opts.security,\n      });\n    }\n\n    if (opts.requestValidator) {\n      await opts.requestValidator(opts);\n    }\n\n    if (opts.body !== undefined && opts.bodySerializer) {\n      opts.serializedBody = opts.bodySerializer(opts.body);\n    }\n\n    // remove Content-Type header if body is empty to avoid sending invalid requests\n    if (opts.body === undefined || opts.serializedBody === \"\") {\n      opts.headers.delete(\"Content-Type\");\n    }\n\n    const url = buildUrl(opts);\n\n    return { opts, url };\n  };\n\n  const request: Client[\"request\"] = async (options) => {\n    // @ts-expect-error\n    const { opts, url } = await beforeRequest(options);\n    const requestInit: ReqInit = {\n      redirect: \"follow\",\n      ...opts,\n      body: getValidRequestBody(opts),\n    };\n\n    let request = new Request(url, requestInit);\n\n    for (const fn of interceptors.request.fns) {\n      if (fn) {\n        request = await fn(request, opts);\n      }\n    }\n\n    // fetch must be assigned here, otherwise it would throw the error:\n    // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n    const _fetch = opts.fetch!;\n    let response = await _fetch(request);\n\n    for (const fn of interceptors.response.fns) {\n      if (fn) {\n        response = await fn(response, request, opts);\n      }\n    }\n\n    const result = {\n      request,\n      response,\n    };\n\n    if (response.ok) {\n      const parseAs =\n        (opts.parseAs === \"auto\"\n          ? getParseAs(response.headers.get(\"Content-Type\"))\n          : opts.parseAs) ?? \"json\";\n\n      if (\n        response.status === 204 ||\n        response.headers.get(\"Content-Length\") === \"0\"\n      ) {\n        let emptyData: any;\n        switch (parseAs) {\n          case \"arrayBuffer\":\n          case \"blob\":\n          case \"text\":\n            emptyData = await response[parseAs]();\n            break;\n          case \"formData\":\n            emptyData = new FormData();\n            break;\n          case \"stream\":\n            emptyData = response.body;\n            break;\n          case \"json\":\n          default:\n            emptyData = {};\n            break;\n        }\n        return opts.responseStyle === \"data\"\n          ? emptyData\n          : {\n              data: emptyData,\n              ...result,\n            };\n      }\n\n      let data: any;\n      switch (parseAs) {\n        case \"arrayBuffer\":\n        case \"blob\":\n        case \"formData\":\n        case \"json\":\n        case \"text\":\n          data = await response[parseAs]();\n          break;\n        case \"stream\":\n          return opts.responseStyle === \"data\"\n            ? response.body\n            : {\n                data: response.body,\n                ...result,\n              };\n      }\n\n      if (parseAs === \"json\") {\n        if (opts.responseValidator) {\n          await opts.responseValidator(data);\n        }\n\n        if (opts.responseTransformer) {\n          data = await opts.responseTransformer(data);\n        }\n      }\n\n      return opts.responseStyle === \"data\"\n        ? data\n        : {\n            data,\n            ...result,\n          };\n    }\n\n    const textError = await response.text();\n    let jsonError: unknown;\n\n    try {\n      jsonError = JSON.parse(textError);\n    } catch {\n      // noop\n    }\n\n    const error = jsonError ?? textError;\n    let finalError = error;\n\n    for (const fn of interceptors.error.fns) {\n      if (fn) {\n        finalError = (await fn(error, response, request, opts)) as string;\n      }\n    }\n\n    finalError = finalError || ({} as string);\n\n    if (opts.throwOnError) {\n      throw finalError;\n    }\n\n    // TODO: we probably want to return error and improve types\n    return opts.responseStyle === \"data\"\n      ? undefined\n      : {\n          error: finalError,\n          ...result,\n        };\n  };\n\n  const makeMethodFn =\n    (method: Uppercase<HttpMethod>) => (options: RequestOptions) =>\n      request({ ...options, method });\n\n  const makeSseFn =\n    (method: Uppercase<HttpMethod>) => async (options: RequestOptions) => {\n      const { opts, url } = await beforeRequest(options);\n      return createSseClient({\n        ...opts,\n        body: opts.body as BodyInit | null | undefined,\n        headers: opts.headers as unknown as Record<string, string>,\n        method,\n        onRequest: async (url, init) => {\n          let request = new Request(url, init);\n          for (const fn of interceptors.request.fns) {\n            if (fn) {\n              request = await fn(request, opts);\n            }\n          }\n          return request;\n        },\n        url,\n      });\n    };\n\n  return {\n    buildUrl,\n    connect: makeMethodFn(\"CONNECT\"),\n    delete: makeMethodFn(\"DELETE\"),\n    get: makeMethodFn(\"GET\"),\n    getConfig,\n    head: makeMethodFn(\"HEAD\"),\n    interceptors,\n    options: makeMethodFn(\"OPTIONS\"),\n    patch: makeMethodFn(\"PATCH\"),\n    post: makeMethodFn(\"POST\"),\n    put: makeMethodFn(\"PUT\"),\n    request,\n    setConfig,\n    sse: {\n      connect: makeSseFn(\"CONNECT\"),\n      delete: makeSseFn(\"DELETE\"),\n      get: makeSseFn(\"GET\"),\n      head: makeSseFn(\"HEAD\"),\n      options: makeSseFn(\"OPTIONS\"),\n      patch: makeSseFn(\"PATCH\"),\n      post: makeSseFn(\"POST\"),\n      put: makeSseFn(\"PUT\"),\n      trace: makeSseFn(\"TRACE\"),\n    },\n    trace: makeMethodFn(\"TRACE\"),\n  } as Client;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport {\n  type ClientOptions,\n  type Config,\n  createClient,\n  createConfig,\n} from \"./client\";\nimport type { ClientOptions as ClientOptions2 } from \"./types.gen\";\n\n/**\n * The `createClientConfig()` function will be called on client initialization\n * and the returned object will become the client's initial configuration.\n *\n * You may want to initialize your client this way instead of calling\n * `setConfig()`. This is useful for example if you're using Next.js\n * to ensure your client always has the correct values.\n */\nexport type CreateClientConfig<T extends ClientOptions = ClientOptions2> = (\n  override?: Config<ClientOptions & T>,\n) => Config<Required<ClientOptions> & T>;\n\nexport const client = createClient(\n  createConfig<ClientOptions2>({\n    baseUrl: \"https://api-bluvo.com\",\n  }),\n);\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Client, Options as Options2, TDataShape } from \"./client\";\nimport { client } from \"./client.gen\";\nimport type {\n  Oauth2ExchangeslistexchangesData,\n  Oauth2ExchangeslistexchangesResponses,\n  Oauth2ExchangeurlgeturlData,\n  Oauth2ExchangeurlgeturlResponses,\n  OrganizationapikeyapikeyinfoData,\n  OrganizationapikeyapikeyinfoErrors,\n  OrganizationapikeyapikeyinfoResponses,\n  WalletdeleteData,\n  WalletdeleteErrors,\n  WalletdeleteResponses,\n  WalletgetData,\n  WalletgetErrors,\n  WalletgetResponses,\n  WalletkycgetkycidentityData,\n  WalletkycgetkycidentityErrors,\n  WalletkycgetkycidentityResponses,\n  WalletlistlistwalletsData,\n  WalletlistlistwalletsErrors,\n  WalletlistlistwalletsResponses,\n  WalletpingpingData,\n  WalletpingpingErrors,\n  WalletpingpingResponses,\n  WallettransactionslisttransactionsData,\n  WallettransactionslisttransactionsErrors,\n  WallettransactionslisttransactionsResponses,\n  WallettransactiontransactionidgettransactionData,\n  WallettransactiontransactionidgettransactionErrors,\n  WallettransactiontransactionidgettransactionResponses,\n  WalletwithdrawbalancebalanceData,\n  WalletwithdrawbalancebalanceErrors,\n  WalletwithdrawbalancebalanceResponses,\n  WalletwithdrawquoteidexecutewithdrawData,\n  WalletwithdrawquoteidexecutewithdrawErrors,\n  WalletwithdrawquoteidexecutewithdrawResponses,\n  WalletwithdrawquotequotationData,\n  WalletwithdrawquotequotationErrors,\n  WalletwithdrawquotequotationResponses,\n} from \"./types.gen\";\n\nexport type Options<\n  TData extends TDataShape = TDataShape,\n  ThrowOnError extends boolean = boolean,\n> = Options2<TData, ThrowOnError> & {\n  /**\n   * You can provide a client instance returned by `createClient()` instead of\n   * individual options. This might be also useful if you want to implement a\n   * custom client.\n   */\n  client?: Client;\n  /**\n   * You can pass arbitrary values through the `meta` object. This can be\n   * used to access values that aren't defined as part of the SDK function.\n   */\n  meta?: Record<string, unknown>;\n};\n\n/**\n * Get URL\n *\n * Get OAuth2 authorization URL for exchange connection.\n */\nexport const oauth2Exchangeurlgeturl = <ThrowOnError extends boolean = false>(\n  options: Options<Oauth2ExchangeurlgeturlData, ThrowOnError>,\n) => {\n  return (options.client ?? client).get<\n    Oauth2ExchangeurlgeturlResponses,\n    unknown,\n    ThrowOnError\n  >({\n    security: [\n      {\n        name: \"x-bluvo-org-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-project-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-wallet-id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/v0/oauth2/{exchange}/url\",\n    ...options,\n  });\n};\n\n/**\n * List Exchanges\n *\n * List supported exchanges for OAuth2 connections.\n */\nexport const oauth2Exchangeslistexchanges = <\n  ThrowOnError extends boolean = false,\n>(\n  options?: Options<Oauth2ExchangeslistexchangesData, ThrowOnError>,\n) => {\n  return (options?.client ?? client).get<\n    Oauth2ExchangeslistexchangesResponses,\n    unknown,\n    ThrowOnError\n  >({\n    url: \"/v0/oauth2/exchanges\",\n    ...options,\n  });\n};\n\n/**\n * Delete\n *\n * Delete a connected exchange wallet.\n *\n * **Required API Key Scopes:** `read`, `delete`\n */\nexport const walletdelete = <ThrowOnError extends boolean = false>(\n  options?: Options<WalletdeleteData, ThrowOnError>,\n) => {\n  return (options?.client ?? client).delete<\n    WalletdeleteResponses,\n    WalletdeleteErrors,\n    ThrowOnError\n  >({\n    security: [\n      {\n        name: \"x-bluvo-api-key\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-org-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-project-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-wallet-id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/v0/wallet\",\n    ...options,\n  });\n};\n\n/**\n * Get\n *\n * Get wallet information and balances.\n *\n * **Required API Key Scopes:** `read`\n */\nexport const walletget = <ThrowOnError extends boolean = false>(\n  options?: Options<WalletgetData, ThrowOnError>,\n) => {\n  return (options?.client ?? client).get<\n    WalletgetResponses,\n    WalletgetErrors,\n    ThrowOnError\n  >({\n    security: [\n      {\n        name: \"x-bluvo-api-key\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-org-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-project-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-wallet-id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/v0/wallet\",\n    ...options,\n  });\n};\n\n/**\n * Ping\n *\n * Test wallet connectivity and validate exchange API credentials. This endpoint verifies that the stored credentials are valid by making a test API call to the exchange.\n *\n * **Required API Key Scopes:** `read`\n */\nexport const walletpingping = <ThrowOnError extends boolean = false>(\n  options?: Options<WalletpingpingData, ThrowOnError>,\n) => {\n  return (options?.client ?? client).get<\n    WalletpingpingResponses,\n    WalletpingpingErrors,\n    ThrowOnError\n  >({\n    security: [\n      {\n        name: \"x-bluvo-api-key\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-org-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-project-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-wallet-id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/v0/wallet/ping\",\n    ...options,\n  });\n};\n\n/**\n * Get KYC Identity\n *\n * Retrieve KYC identity information associated with a wallet. Returns the user's full name, email, IBAN, and country as provided by the exchange during the OAuth flow. Returns 404 if the wallet has no linked identity.\n *\n * **Required API Key Scopes:** `read`, `kyc`\n */\nexport const walletkycgetkycidentity = <ThrowOnError extends boolean = false>(\n  options?: Options<WalletkycgetkycidentityData, ThrowOnError>,\n) => {\n  return (options?.client ?? client).get<\n    WalletkycgetkycidentityResponses,\n    WalletkycgetkycidentityErrors,\n    ThrowOnError\n  >({\n    security: [\n      {\n        name: \"x-bluvo-api-key\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-org-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-project-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-wallet-id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/v0/wallet/kyc\",\n    ...options,\n  });\n};\n\n/**\n * List Wallets\n *\n * List all connected exchange wallets.\n *\n * **Required API Key Scopes:** `read`\n */\nexport const walletlistlistwallets = <ThrowOnError extends boolean = false>(\n  options?: Options<WalletlistlistwalletsData, ThrowOnError>,\n) => {\n  return (options?.client ?? client).get<\n    WalletlistlistwalletsResponses,\n    WalletlistlistwalletsErrors,\n    ThrowOnError\n  >({\n    security: [\n      {\n        name: \"x-bluvo-api-key\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-org-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-project-id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/v0/wallet/list\",\n    ...options,\n  });\n};\n\n/**\n * List Transactions\n *\n * List transactions for a specific wallet or all wallets with filtering options.\n *\n * **Required API Key Scopes:** `read`\n */\nexport const wallettransactionslisttransactions = <\n  ThrowOnError extends boolean = false,\n>(\n  options?: Options<WallettransactionslisttransactionsData, ThrowOnError>,\n) => {\n  return (options?.client ?? client).get<\n    WallettransactionslisttransactionsResponses,\n    WallettransactionslisttransactionsErrors,\n    ThrowOnError\n  >({\n    security: [\n      {\n        name: \"x-bluvo-api-key\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-org-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-project-id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/v0/wallet/transactions\",\n    ...options,\n  });\n};\n\n/**\n * Get Transaction\n *\n * Get a single transaction by its ID.\n *\n * **Required API Key Scopes:** `read`\n */\nexport const wallettransactiontransactionidgettransaction = <\n  ThrowOnError extends boolean = false,\n>(\n  options: Options<\n    WallettransactiontransactionidgettransactionData,\n    ThrowOnError\n  >,\n) => {\n  return (options.client ?? client).get<\n    WallettransactiontransactionidgettransactionResponses,\n    WallettransactiontransactionidgettransactionErrors,\n    ThrowOnError\n  >({\n    security: [\n      {\n        name: \"x-bluvo-api-key\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-org-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-project-id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/v0/wallet/transaction/{transactionId}\",\n    ...options,\n  });\n};\n\n/**\n * Balance\n *\n * Get withdrawable balances and supported networks.\n *\n * **Required API Key Scopes:** `read`\n */\nexport const walletwithdrawbalancebalance = <\n  ThrowOnError extends boolean = false,\n>(\n  options?: Options<WalletwithdrawbalancebalanceData, ThrowOnError>,\n) => {\n  return (options?.client ?? client).get<\n    WalletwithdrawbalancebalanceResponses,\n    WalletwithdrawbalancebalanceErrors,\n    ThrowOnError\n  >({\n    security: [\n      {\n        name: \"x-bluvo-api-key\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-org-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-project-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-wallet-id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/v0/wallet/withdraw/balance\",\n    ...options,\n  });\n};\n\n/**\n * Quotation\n *\n * Get withdrawal quote with fees and estimates.\n *\n * **Required API Key Scopes:** `read`, `quote`\n */\nexport const walletwithdrawquotequotation = <\n  ThrowOnError extends boolean = false,\n>(\n  options: Options<WalletwithdrawquotequotationData, ThrowOnError>,\n) => {\n  return (options.client ?? client).post<\n    WalletwithdrawquotequotationResponses,\n    WalletwithdrawquotequotationErrors,\n    ThrowOnError\n  >({\n    security: [\n      {\n        name: \"x-bluvo-api-key\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-org-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-project-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-wallet-id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/v0/wallet/withdraw/quote\",\n    ...options,\n    headers: {\n      \"Content-Type\": \"application/json\",\n      ...options.headers,\n    },\n  });\n};\n\n/**\n * Withdraw\n *\n * Execute a withdrawal using a quote ID.\n *\n * **Required API Key Scopes:** `read`, `quote`, `withdrawal`\n */\nexport const walletwithdrawquoteidexecutewithdraw = <\n  ThrowOnError extends boolean = false,\n>(\n  options: Options<WalletwithdrawquoteidexecutewithdrawData, ThrowOnError>,\n) => {\n  return (options.client ?? client).put<\n    WalletwithdrawquoteidexecutewithdrawResponses,\n    WalletwithdrawquoteidexecutewithdrawErrors,\n    ThrowOnError\n  >({\n    security: [\n      {\n        name: \"x-bluvo-api-key\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-org-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-project-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-wallet-id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/v0/wallet/withdraw/{quoteId}/execute\",\n    ...options,\n    headers: {\n      \"Content-Type\": \"application/json\",\n      ...options.headers,\n    },\n  });\n};\n\n/**\n * API key info\n *\n * Get information about the current API key, including its permissions and rate limit configuration.\n *\n * **🔒 Authentication:** This endpoint requires a valid API key.\n */\nexport const organizationapikeyapikeyinfo = <\n  ThrowOnError extends boolean = false,\n>(\n  options?: Options<OrganizationapikeyapikeyinfoData, ThrowOnError>,\n) => {\n  return (options?.client ?? client).get<\n    OrganizationapikeyapikeyinfoResponses,\n    OrganizationapikeyapikeyinfoErrors,\n    ThrowOnError\n  >({\n    security: [\n      {\n        name: \"x-bluvo-api-key\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-org-id\",\n        type: \"apiKey\",\n      },\n      {\n        name: \"x-bluvo-project-id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/v0/organization/api-key\",\n    ...options,\n  });\n};\n","import type { RequestResult } from \"../generated/client/types.gen\";\n\nexport const transformResponse = <T extends Awaited<RequestResult<unknown, unknown, false>>>(response: T) => {\n\treturn {\n        data: response.data as T[\"data\"],\n        error: response.error as T[\"error\"],\n        success: !response.error,\n    }\n};\n","import {\n    oauth2Exchangeslistexchanges,\n    type Oauth2ExchangeslistexchangesResponses,\n    oauth2Exchangeurlgeturl,\n    type Oauth2ExchangeurlgeturlData,\n    walletdelete,\n    walletget,\n    walletlistlistwallets,\n    type WalletlistlistwalletsData,\n    walletpingping,\n    wallettransactionslisttransactions,\n    type WallettransactionslisttransactionsData,\n    walletwithdrawbalancebalance,\n    type WalletwithdrawbalancebalanceData,\n    walletwithdrawquoteidexecutewithdraw,\n    type WalletwithdrawquoteidexecutewithdrawData,\n    walletwithdrawquotequotation,\n    type WalletwithdrawquotequotationData,\n} from \"../generated\";\nimport {createClient, createConfig} from \"../generated/client\";\nimport type {Client, ClientOptions as ClientOptions2,} from \"../generated/client/types.gen\";\nimport {transformResponse} from \"./helpers\";\n\n/**\n * The core client class for interacting with Bluvo's cryptocurrency exchange integration platform.\n *\n * BluvoClient provides a comprehensive, strongly-typed interface to Bluvo's API services,\n * enabling seamless integration with cryptocurrency exchanges, market data, and blockchain functionality.\n * It handles authentication, request formatting, and response parsing, allowing you to focus on\n * building your application logic rather than API integration details.\n *\n * This class is not typically instantiated directly; use the `createClient` function instead.\n */\nexport class BluvoClient {\n\tprivate readonly wsBase: string;\n\tprivate readonly apiBase?: string;\n\tprivate readonly client: Client;\n\n\t/**\n\t * Creates a new BluvoClient instance with the specified credentials.\n\t *\n\t * @param orgId Your Bluvo organization identifier.\n\t * @param projectId Your Bluvo project identifier.\n\t * @param apiKey Your Bluvo API access key.\n\t * @param sandbox\n\t * @param dev\n\t * @param customDomain Custom domain configuration to override default api-bluvo.com\n\t * @private Use the static `createClient` method or the global `createClient` function instead.\n\t */\n\tprivate constructor(\n\t\tprivate readonly orgId: string,\n\t\tprivate readonly projectId: string,\n\t\tprivate readonly apiKey: string,\n\t\treadonly sandbox: boolean = false,\n\t\treadonly dev: boolean = false,\n\t\treadonly customDomain?:\n\t\t\t| string\n\t\t\t| \"api-bluvo.com\"\n\t\t\t| { api: string; ws: string },\n\t) {\n\t\t// Configure WebSocket and API base URLs based on customDomain first, then environment\n\t\tif (customDomain && typeof customDomain === \"object\") {\n\t\t\t// Custom domain with separate API and WebSocket URLs\n\t\t\tthis.apiBase = `https://${customDomain.api}`;\n\t\t\tthis.wsBase = `wss://${customDomain.ws}`;\n\t\t} else if (\n\t\t\tcustomDomain &&\n\t\t\ttypeof customDomain === \"string\" &&\n\t\t\tcustomDomain !== \"api-bluvo.com\"\n\t\t) {\n\t\t\t// Custom domain for both API and WebSocket\n\t\t\tthis.apiBase = `https://${customDomain}`;\n\t\t\tthis.wsBase = `wss://${customDomain}`;\n\t\t} else if (dev) {\n            console.log(\"Using Bluvo Development environment\");\n\t\t\tthis.apiBase = \"http://localhost:8787\";\n\t\t\tthis.wsBase = \"ws://localhost:8787\";\n\t\t} else if (sandbox) {\n\t\t\tthis.apiBase = \"https://test.api-bluvo.com\";\n\t\t\tthis.wsBase = \"wss://test.api-bluvo.com\";\n\t\t} else {\n\t\t\t// Production default or explicit \"api-bluvo.com\"\n\t\t\tthis.apiBase = \"https://api-bluvo.com\";\n\t\t\tthis.wsBase = \"wss://api-bluvo.com\";\n\t\t}\n\n\t\tthis.client = createClient(\n\t\t\tcreateConfig<ClientOptions2>({\n\t\t\t\tbaseUrl: this.apiBase,\n\t\t\t\tauth: this.apiKey,\n\t\t\t\theaders: {\n\t\t\t\t\t\"x-bluvo-api-key\": this.apiKey,\n\t\t\t\t\t\"x-bluvo-org-id\": this.orgId,\n\t\t\t\t\t\"x-bluvo-project-id\": this.projectId,\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t}\n\n\t/**\n\t * Creates and initializes a new BluvoClient instance with the provided credentials.\n\t *\n\t * This factory method is the recommended way to create BluvoClient instances when not using\n\t * the global `createClient` function. It ensures proper initialization and configuration\n\t * of the client with your Bluvo API credentials.\n\t *\n\t * @param credentials An object containing your Bluvo API credentials:\n\t *   @param orgId Your unique organization identifier.\n\t *   @param projectId Your specific project identifier.\n\t *   @param apiKey Your secret API key for authentication.\n\t *   @param sandbox Optional flag to use sandbox environment.\n\t *   @param dev Optional flag to use local development environment.\n\t *   @param customDomain Optional custom domain configuration.\n\t *\n\t * @returns A fully configured BluvoClient instance ready for use.\n\t */\n\tstatic createClient({\n\t\torgId,\n\t\tprojectId,\n\t\tapiKey,\n\t\tsandbox,\n\t\tdev,\n\t\tcustomDomain,\n\t}: {\n\t\torgId: string;\n\t\tprojectId: string;\n\t\tapiKey: string;\n\t\tsandbox?: boolean;\n\t\tdev?: boolean;\n\t\tcustomDomain?: string | \"api-bluvo.com\" | { api: string; ws: string };\n\t}) {\n\t\treturn new BluvoClient(\n\t\t\torgId,\n\t\t\tprojectId,\n\t\t\tapiKey,\n\t\t\tsandbox,\n\t\t\tdev,\n\t\t\tcustomDomain,\n\t\t);\n\t}\n\n\twallet = {\n\t\t/**\n\t\t * Retrieve comprehensive details about a connected exchange wallet, including balances, permissions, and connection status.\n\t\t *\n\t\t * This method provides a complete snapshot of your connected exchange wallet, giving you real-time visibility into\n\t\t * available funds, account permissions, and the health of the API connection. The data returned is fetched directly\n\t\t * from the exchange API at the time of the request, ensuring you always have the most up-to-date information.\n\t\t *\n\t\t * Use this method to verify connections, check available balances across different assets, or determine\n\t\t * the permission scope of your connected API keys before executing transactions.\n\t\t *\n\t\t * @param walletId The unique identifier of the connected wallet to query. This ID was specified during the initial\n\t\t *                 wallet connection and uniquely identifies this particular exchange integration within your project.\n\t\t *\n\t\t * @returns A promise resolving to a detailed wallet information object containing:\n\t\t *          - Connection status and health\n\t\t *          - Exchange identifier and account details\n\t\t *          - Available balances for all assets\n\t\t *          - API key permissions and restrictions\n\t\t *          - Last synchronization timestamp\n\t\t *\n\t\t * @example\n\t\t * // Get details about a connected Binance wallet\n\t\t * const walletDetails = await client.wallet.get('primary-trading-account');\n\t\t * console.log(`Connection status: ${walletDetails.status}`);\n\t\t * console.log(`BTC Balance: ${walletDetails.balances.BTC?.available || 0}`);\n\t\t */\n\n\t\tget: async (walletId: string) => {\n\t\t\tconst response = await walletget({\n\t\t\t\tclient: this.client,\n\t\t\t\theaders: {\n\t\t\t\t\t\"x-bluvo-wallet-id\": walletId,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn transformResponse(response);\n\t\t},\n\n\t\t/**\n\t\t * Ping\n\t\t */\n\t\tping: async (walletId: string) => {\n\t\t\tconst response = await walletpingping({\n\t\t\t\tclient: this.client,\n\t\t\t\theaders: {\n\t\t\t\t\t\"x-bluvo-wallet-id\": walletId,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn transformResponse(response);\n\t\t},\n\n\t\t/**\n\t\t * Securely disconnect and remove a previously connected exchange wallet from your Bluvo project.\n\t\t *\n\t\t * This method completely removes the stored API credentials and terminates the connection between your Bluvo\n\t\t * project and the exchange account. This is useful when you need to rotate API keys, remove unused connections,\n\t\t * or comply with user requests to delete their account information.\n\t\t *\n\t\t * The deletion is immediate and permanent. After deletion, any operations that were using this wallet connection\n\t\t * will fail until a new connection is established with the `connect` method.\n\t\t *\n\t\t * @param walletId The unique identifier of the connected wallet to permanently delete from your project.\n\t\t *                 This is the same ID that was used when initially connecting the wallet.\n\t\t *\n\t\t * @returns A promise resolving to a confirmation object indicating successful deletion with a timestamp.\n\t\t *          All API keys and secrets associated with this connection are immediately and permanently deleted\n\t\t *          from Bluvo's secure storage.\n\t\t *\n\t\t * @example\n\t\t * // Remove a wallet connection that's no longer needed\n\t\t * await client.wallet.delete('old-trading-account');\n\t\t *\n\t\t * // You can also handle the confirmation response if needed\n\t\t * const result = await client.wallet.delete('temporary-connection');\n\t\t * console.log(`Wallet deleted at: ${new Date(result.timestamp).toLocaleString()}`);\n\t\t */\n\n\t\tdelete: async (walletId: string) => {\n\t\t\tconst response = await walletdelete({\n\t\t\t\tclient: this.client,\n\t\t\t\theaders: {\n\t\t\t\t\t\"x-bluvo-wallet-id\": walletId,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn transformResponse(response);\n\t\t},\n\n\t\t/**\n\t\t * Retrieve a comprehensive, paginated list of all exchange wallets connected to your Bluvo project with powerful filtering options.\n\t\t *\n\t\t * This method provides a complete overview of all your integrated exchange accounts, making it easy to manage multiple\n\t\t * connections across different exchanges or for different purposes. Results are paginated to handle large numbers of\n\t\t * connections efficiently, with flexible page size configuration.\n\t\t *\n\t\t * Each wallet entry includes essential information like connection status, exchange type, and last activity timestamp,\n\t\t * giving you a quick overview without needing to query each wallet individually. For detailed information about a specific\n\t\t * wallet, use the `get` method with the wallet's ID.\n\t\t *\n\t\t * @param page Optional pagination control parameter (0-indexed). Defaults to 0 (first page).\n\t\t *             Use this parameter in combination with the `limit` parameter to navigate through large result sets.\n\t\t *             For example, page=1 with limit=50 will return wallets 51-100.\n\t\t *\n\t\t * @param limit Optional maximum number of wallet records to return per page. Defaults to 10.\n\t\t *              Can be increased up to 1000 for retrieving larger batches in a single request.\n\t\t *              Larger values reduce the number of API calls needed but increase response size.\n\t\t *\n\t\t * @param exchange Optional filter to retrieve wallets from a specific exchange only.\n\t\t *                 Supports major exchanges including 'binance', 'coinbase', 'kraken', 'kucoin', and 'okx'.\n\t\t *                 When omitted, wallets from all exchanges are returned.\n\t\t *\n\t\t * @returns A promise resolving to a paginated list response containing:\n\t\t *          - Array of wallet objects with their connection details\n\t\t *          - Pagination metadata (total count, current page, total pages)\n\t\t *          - Navigation links for next/previous pages when applicable\n\t\t *\n\t\t * @example\n\t\t * // List all connected wallets with default pagination (10 per page)\n\t\t * const allWallets = await client.wallet.list();\n\t\t *\n\t\t * // Get the second page of results with 20 wallets per page\n\t\t * const page2 = await client.wallet.list(1, 20);\n\t\t *\n\t\t * // Get only Binance wallets\n\t\t * const binanceWallets = await client.wallet.list(0, 50, 'binance');\n\t\t * console.log(`Found ${binanceWallets.pagination.total} Binance connections`);\n\t\t */\n\n\t\tlist: async (\n\t\t\tpage?: Required<WalletlistlistwalletsData>[\"query\"][\"page\"],\n\t\t\tlimit?: Required<WalletlistlistwalletsData>[\"query\"][\"limit\"],\n\t\t\texchange?: Required<WalletlistlistwalletsData>[\"query\"][\"exchange\"],\n\t\t) => {\n\t\t\tconst response = await walletlistlistwallets({\n\t\t\t\tclient: this.client,\n\t\t\t\tquery: {\n\t\t\t\t\tpage,\n\t\t\t\t\tlimit,\n\t\t\t\t\texchange,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn transformResponse(response);\n\t\t},\n\n\t\ttransaction: {\n\t\t\t/**\n\t\t\t * Retrieve a comprehensive, paginated list of all transactions for a specific wallet with powerful filtering capabilities.\n\t\t\t *\n\t\t\t * This method provides detailed visibility into the complete transaction history of a connected exchange wallet,\n\t\t\t * including deposits, withdrawals, trades, and internal transfers. The flexible filtering system allows you to precisely\n\t\t\t * target specific transaction types, assets, date ranges, or statuses to streamline your analysis and reporting.\n\t\t\t *\n\t\t\t * Transaction data is normalized across different exchanges into a consistent format, making it easy to work with\n\t\t\t * multiple exchange integrations using the same code. Each transaction includes timestamps, amounts, fees, status\n\t\t\t * information, and exchange-specific details when available.\n\t\t\t *\n\t\t\t * @param walletId The unique identifier of the connected wallet whose transactions you want to retrieve.\n\t\t\t *                 This must be a valid wallet ID that was previously connected via the `connect` method.\n\t\t\t *\n\t\t\t * @param page Optional pagination control parameter (0-indexed). Defaults to 0 (first page).\n\t\t\t *             Use this parameter with the `limit` parameter to navigate through large transaction histories.\n\t\t\t *\n\t\t\t * @param limit Optional maximum number of transaction records to return per page. Defaults to a platform-specific value.\n\t\t\t *              Increasing this value reduces the number of API calls needed for large datasets but increases response size.\n\t\t\t *\n\t\t\t * @param asset Optional filter to retrieve transactions for a specific cryptocurrency only (e.g., 'BTC', 'ETH').\n\t\t\t *              When omitted, transactions for all assets are returned.\n\t\t\t *\n\t\t\t * @param type Optional filter for transaction type. Common values include:\n\t\t\t *            - 'deposit': Funds received into the exchange account\n\t\t\t *            - 'withdrawal': Funds sent out from the exchange account\n\t\t\t *            - 'trade': Exchange between different cryptocurrencies\n\t\t\t *            - 'transfer': Internal movement between sub-accounts or wallets\n\t\t\t *            - 'fee': Exchange fees charged\n\t\t\t *            - 'rebate': Fee rebates or rewards received\n\t\t\t *\n\t\t\t * @param since Optional filter for transactions after a specific timestamp (ISO 8601 format or UNIX timestamp).\n\t\t\t *              Use this to set the starting point of your transaction history query.\n\t\t\t *\n\t\t\t * @param before Optional filter for transactions before a specific timestamp (ISO 8601 format or UNIX timestamp).\n\t\t\t *               Use this to set the ending point of your transaction history query.\n\t\t\t *\n\t\t\t * @param status Optional filter for transaction status. Common values include:\n\t\t\t *               - 'completed': Fully processed and confirmed transactions\n\t\t\t *               - 'pending': Transactions that are still being processed\n\t\t\t *               - 'failed': Transactions that encountered errors\n\t\t\t *               - 'cancelled': Transactions that were cancelled\n\t\t\t *\n\t\t\t * @param fields Optional comma-separated list of specific fields to include in the response.\n\t\t\t *               This can optimize response size when you only need specific transaction attributes.\n\t\t\t *\n\t\t\t * @returns A promise resolving to a paginated transaction list containing:\n\t\t\t *          - Array of normalized transaction objects with detailed information\n\t\t\t *          - Pagination metadata (total count, current page, total pages)\n\t\t\t *          - Navigation links for next/previous pages when applicable\n\t\t\t *\n\t\t\t * @example\n\t\t\t * // Get all BTC transactions for a wallet\n\t\t\t * const btcTx = await client.wallet.transaction.list('my-exchange-wallet', 0, 100, 'BTC');\n\t\t\t *\n\t\t\t * // Get only completed withdrawals in a date range\n\t\t\t * const withdrawals = await client.wallet.transaction.list(\n\t\t\t *   'my-exchange-wallet',\n\t\t\t *   0,\n\t\t\t *   50,\n\t\t\t *   undefined,\n\t\t\t *   'withdrawal',\n\t\t\t *   '2023-01-01T00:00:00Z',\n\t\t\t *   '2023-12-31T23:59:59Z',\n\t\t\t *   'completed'\n\t\t\t * );\n\t\t\t */\n\n\t\t\tlist: async (\n\t\t\t\twalletId?: string,\n\t\t\t\tpage?: Required<WallettransactionslisttransactionsData>[\"query\"][\"page\"],\n\t\t\t\tlimit?: Required<WallettransactionslisttransactionsData>[\"query\"][\"limit\"],\n\t\t\t\tsinceDate?: Required<WallettransactionslisttransactionsData>[\"query\"][\"sinceDate\"],\n\t\t\t) => {\n\t\t\t\tconst response = await wallettransactionslisttransactions({\n\t\t\t\t\tclient: this.client,\n\t\t\t\t\tquery: {\n\t\t\t\t\t\tpage,\n\t\t\t\t\t\tlimit,\n\t\t\t\t\t\tsinceDate,\n\t\t\t\t\t},\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"x-bluvo-wallet-id\": walletId,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn transformResponse(response);\n\t\t\t},\n\t\t},\n\n\t\twithdrawals: {\n\t\t\tgetWithdrawableBalance: async (\n\t\t\t\twalletId: string,\n\t\t\t\tquery?: WalletwithdrawbalancebalanceData[\"query\"],\n\t\t\t) => {\n\t\t\t\tconst response = await walletwithdrawbalancebalance({\n\t\t\t\t\tclient: this.client,\n\t\t\t\t\tquery,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"x-bluvo-wallet-id\": walletId,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn transformResponse(response);\n\t\t\t},\n\n\t\t\t// request a quotation\n\t\t\trequestQuotation: async (\n\t\t\t\twalletId: string,\n\t\t\t\tbody: WalletwithdrawquotequotationData[\"body\"],\n\t\t\t) => {\n\t\t\t\tconst response = await walletwithdrawquotequotation({\n\t\t\t\t\tclient: this.client,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"x-bluvo-wallet-id\": walletId,\n\t\t\t\t\t},\n\t\t\t\t\tbody,\n\t\t\t\t});\n\t\t\t\treturn transformResponse(response);\n\t\t\t},\n\n\t\t\t// give a quotation ID, execute the withdrawal\n\t\t\texecuteWithdrawal: async (\n\t\t\t\twalletId: string,\n\t\t\t\tidem: string,\n\t\t\t\tquotationId: string,\n\t\t\t\targs: WalletwithdrawquoteidexecutewithdrawData[\"body\"],\n\t\t\t) => {\n\t\t\t\tconsole.log(`executeWithdrawal: ${walletId}, ${idem}, ${quotationId}, ${JSON.stringify(args)}`);\n\n\t\t\t\tconst response = await walletwithdrawquoteidexecutewithdraw({\n\t\t\t\t\tclient: this.client,\n\t\t\t\t\tpath: {\n\t\t\t\t\t\tquoteId: quotationId,\n\t\t\t\t\t},\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"x-bluvo-wallet-id\": walletId,\n\t\t\t\t\t},\n\t\t\t\t\tbody: args,\n\t\t\t\t}).then(transformResponse);\n\n\t\t\t\t// Return the standard format, enriching error object with type for extractErrorCode\n\t\t\t\tif (!response.success && response.error) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\terror: response.error.error || response.error,\n\t\t\t\t\t\t\ttype: response.error.type,\n\t\t\t\t\t\t\terrorCode: response.error.type,\n\t\t\t\t\t\t\tresult: response.data?.result\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsuccess: false\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn response;\n\t\t\t},\n\t\t},\n\t};\n\n\toauth2 = {\n\t\tgetLink: async (\n\t\t\texchange: Oauth2ExchangeurlgeturlData[\"path\"][\"exchange\"],\n\t\t\twalletId: string,\n\t\t\tidem: string,\n\t\t) => {\n\t\t\tconst response = await oauth2Exchangeurlgeturl({\n\t\t\t\tclient: this.client,\n\t\t\t\tpath: {\n\t\t\t\t\texchange,\n\t\t\t\t},\n\t\t\t\theaders: {\n\t\t\t\t\t\"x-bluvo-wallet-id\": walletId,\n\t\t\t\t},\n\t\t\t\tquery: {\n\t\t\t\t\tidem,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn transformResponse(response);\n\t\t},\n\n\t\tlistExchanges: async (\n\t\t\tstatus?: Oauth2ExchangeslistexchangesResponses[\"200\"][\"exchanges\"][number][\"status\"],\n\t\t) => {\n\t\t\tconst response = await oauth2Exchangeslistexchanges({\n                client: this.client,\n            });\n            return response\n                ?.data\n                ?.exchanges\n                ?.filter((r) => r.status === status) || [];\n\t\t},\n\t};\n}\n","export interface WebSocketListenerOptions {\n  onMessage: (data: any) => void;\n  onError?: (error: Error) => void;\n  onClose?: () => void;\n}\n\nexport class WebSocketListener {\n  private ws: WebSocket | null = null;\n  private messageHandler?: (data: any) => void;\n  private errorHandler?: (error: Error) => void;\n  private closeHandler?: () => void;\n\n  async connect(idem: string, orgId: string, wsBase: string, options?: WebSocketListenerOptions): Promise<void> {\n    return new Promise((resolve, reject) => {\n\n      const url = `${wsBase}/v0/ws/oauth2/listen?idem=${encodeURIComponent(idem)}&orgId=${encodeURIComponent(orgId)}`;\n\n      this.ws = new WebSocket(url);\n\n      // Store handlers if provided\n      if (options) {\n        this.messageHandler = options.onMessage;\n        this.errorHandler = options.onError;\n        this.closeHandler = options.onClose;\n      }\n\n      this.ws.onopen = () => {\n        console.log(`[WebSocket] Connected: idem=${idem}`);\n        resolve();\n      };\n\n      this.ws.onerror = (error) => {\n        console.error(`[WebSocket] Connection error:`, error);\n        const errorObj = new Error('WebSocket connection failed');\n        if (this.errorHandler) {\n          this.errorHandler(errorObj);\n        }\n        reject(errorObj);\n      };\n\n      this.ws.onmessage = (event) => {\n        let data;\n        try {\n          data = JSON.parse(event.data);\n        } catch (e) {\n          data = event.data;\n        }\n\n        console.log(`[WebSocket] Message received:`, data);\n\n        if (this.messageHandler) {\n          this.messageHandler(data);\n        }\n      };\n\n      this.ws.onclose = () => {\n        console.log(`[WebSocket] Connection closed`);\n        if (this.closeHandler) {\n          this.closeHandler();\n        }\n      };\n    });\n  }\n\n  async waitForMessage(): Promise<{ latency: number; data: any }> {\n    return new Promise((resolve, reject) => {\n      if (!this.ws) {\n        reject(new Error('WebSocket not connected'));\n        return;\n      }\n\n      const startTime = performance.now();\n\n      // Timeout after 30 seconds\n      const timeout = setTimeout(() => {\n        reject(new Error('WebSocket message timeout'));\n      }, 30000);\n\n      const messageHandler = (event: MessageEvent) => {\n        const latency = performance.now() - startTime;\n        clearTimeout(timeout);\n        this.ws?.removeEventListener('message', messageHandler);\n\n        let data;\n        try {\n          data = JSON.parse(event.data);\n        } catch (e) {\n          data = event.data;\n        }\n\n        console.log(`[WebSocket] Message received in ${latency.toFixed(2)}ms`);\n        resolve({ latency, data });\n      };\n\n      this.ws.addEventListener('message', messageHandler);\n    });\n  }\n\n  disconnect() {\n    if (this.ws) {\n      this.ws.close();\n      this.ws = null;\n      this.messageHandler = undefined;\n      this.errorHandler = undefined;\n      this.closeHandler = undefined;\n    }\n  }\n\n  isConnected(): boolean {\n    return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n  }\n}\n","import { WebSocketListener } from './WebsocketListener';\n\nexport interface SubscriptionOptions {\n    onMessage: (data: any) => void;\n    onError?: (error: Error) => void;\n    onFatal?: (error: Error) => void;\n}\n\nexport interface TopicInfo {\n    success: boolean;\n    name: string;\n    token: string;\n    expiresAt?: number;\n}\n\nexport interface Subscription {\n    topicName: string;\n    unsubscribe: () => void;\n}\n\n/**\n * WebSocketClient handles WebSocket subscriptions\n */\nexport class WebSocketClient {\n    private activeSubscriptions = new Map<string, { listener: WebSocketListener; subscription: Subscription }>();\n    \n    /**\n     * Subscribe to a WebSocket connection\n     * @param topicName The identifier for this subscription (typically idem or quoteId)\n     * @param orgId The organization ID\n     * @param wsBase The WebSocket base URL\n     * @param options Subscription options including callbacks\n     * @returns A subscription object that can be used to unsubscribe, or null if subscription fails\n     */\n    async subscribe(\n        topicName: string,\n        orgId: string,\n        wsBase: string,\n        options: SubscriptionOptions\n    ): Promise<Subscription | null> {\n        // Check if already subscribed to this topic\n        if (this.activeSubscriptions.has(topicName)) {\n            console.warn(`Already subscribed to topic: ${topicName}. Closing existing subscription.`);\n            await this.unsubscribe(topicName);\n        }\n\n        // Validate inputs\n        if (!topicName || topicName.trim().length === 0) {\n            const error = new Error(`Topic name cannot be empty`);\n            console.error(error.message);\n            options.onError?.(error);\n            return null;\n        }\n\n        if (!orgId || orgId.trim().length === 0) {\n            const error = new Error(`Organization ID cannot be empty`);\n            console.error(error.message);\n            options.onError?.(error);\n            return null;\n        }\n\n        if (!wsBase || wsBase.trim().length === 0) {\n            const error = new Error(`WebSocket base URL cannot be empty`);\n            console.error(error.message);\n            options.onError?.(error);\n            return null;\n        }\n\n        try {\n            // Create WebSocket listener\n            const listener = new WebSocketListener();\n\n            // Connect to WebSocket with message handlers\n            await listener.connect(topicName, orgId, wsBase, {\n                onMessage: (data) => {\n                    try {\n                        console.log(`Received message on topic ${topicName}:`, data);\n                        options.onMessage(data);\n                    } catch (error) {\n                        console.error(`Error processing message on topic ${topicName}:`, error);\n                        options.onError?.(error instanceof Error ? error : new Error(String(error)));\n                    }\n                },\n                onError: (error) => {\n                    console.error(`Subscription error on topic ${topicName}:`, error);\n                    options.onError?.(error);\n                    this.unsubscribe(topicName);\n                },\n                onClose: () => {\n                    console.log(`WebSocket closed for topic ${topicName}`);\n                    this.activeSubscriptions.delete(topicName);\n                }\n            });\n\n            // Create subscription object\n            const subscription: Subscription = {\n                topicName,\n                unsubscribe: () => {\n                    listener.disconnect();\n                    this.activeSubscriptions.delete(topicName);\n                }\n            };\n\n            // Store the subscription and listener\n            this.activeSubscriptions.set(topicName, { listener, subscription });\n            console.log(`Successfully subscribed to topic: ${topicName}`);\n\n            return subscription;\n        } catch (error) {\n            console.error(`Error subscribing to topic ${topicName}:`, error);\n            options.onError?.(error instanceof Error ? error : new Error(String(error)));\n            return null;\n        }\n    }\n    \n    /**\n     * Unsubscribe from a topic\n     * @param topicName The name of the topic to unsubscribe from\n     */\n    async unsubscribe(topicName: string): Promise<void> {\n        const entry = this.activeSubscriptions.get(topicName);\n        if (entry) {\n            try {\n                entry.subscription.unsubscribe();\n                console.log(`Successfully unsubscribed from topic: ${topicName}`);\n            } catch (error) {\n                console.error(`Error unsubscribing from topic ${topicName}:`, error);\n            }\n        }\n    }\n\n    /**\n     * Unsubscribe from all active topics\n     */\n    async unsubscribeAll(): Promise<void> {\n        const topics = Array.from(this.activeSubscriptions.keys());\n        await Promise.all(topics.map(topic => this.unsubscribe(topic)));\n    }\n\n\n    /**\n     * Check if subscribed to a topic\n     * @param topicName The topic name to check\n     * @returns True if subscribed, false otherwise\n     */\n    isSubscribed(topicName: string): boolean {\n        return this.activeSubscriptions.has(topicName);\n    }\n\n    /**\n     * Get the number of active subscriptions\n     * @returns Number of active subscriptions\n     */\n    getActiveSubscriptionCount(): number {\n        return this.activeSubscriptions.size;\n    }\n}","// THIS FILE IS ALSO COPY-PASTED IN @bluvo/sdk-ts PACKAGE\n\nexport type QRCodeStatus = 'available' | 'acquired' | 'scanned' | 'confirmed' | 'used' | 'expired';\n\nexport enum WorkflowTypes {\n\tWithdrawFunds = 'withdraw',\n\tOAuth2Flow = 'oauth2',\n\tConnectExchange = 'connect',\n\tQRCodeAuth = 'qr_code_auth',\n}\n\nexport interface BaseWorkflowMessageBody {\n\ttype: WorkflowTypes;\n\tsuccess: boolean | undefined;\n\terror?: any;\n}\n\nexport interface WithdrawFundsWorkflowMessageBody {\n\ttype: WorkflowTypes.WithdrawFunds;\n\twalletId: string;\n\ttransactionId?: string;\n\tquoteId?: string;\n\n\tstep: string; // stepName\n\tstepIndex: number;\n\ttotalSteps: number;\n}\n\nexport interface OAuth2WorkflowMessageBody {\n\ttype: WorkflowTypes.OAuth2Flow;\n\twalletId: string;\n\texchange: string;\n}\n\nexport interface ConnectExchangeWorkflowMessageBody {\n\ttype: WorkflowTypes.ConnectExchange;\n\twalletId: string;\n\n\tstep: string; // stepName\n\tstepIndex: number;\n\ttotalSteps: number;\n}\n\nexport interface QRCodeAuthWorkflowMessageBody {\n\ttype: WorkflowTypes.QRCodeAuth;\n\twalletId: string;\n\texchange: string;\n\tqrCodeUrl?: string;\n\texpiresAt?: number;\n\tqrCodeStatus?: QRCodeStatus;\n\tqrCodeExpiresAt?: number;\n}\n\nexport type WorkflowMessageBody = BaseWorkflowMessageBody & (\n\t| WithdrawFundsWorkflowMessageBody\n\t| OAuth2WorkflowMessageBody\n\t| ConnectExchangeWorkflowMessageBody\n\t| QRCodeAuthWorkflowMessageBody\n\t);\n","import { type ClientOptions, oauth2Exchangeurlgeturl } from \"../generated\";\nimport { type Client, createClient, createConfig } from \"../generated/client\";\nimport { transformResponse } from \"./helpers\";\nimport { type Subscription, WebSocketClient } from \"./WebSocketClient\";\nimport {\n\ttype OAuth2WorkflowMessageBody,\n\ttype QRCodeAuthWorkflowMessageBody,\n\ttype WithdrawFundsWorkflowMessageBody,\n\ttype WorkflowMessageBody,\n\tWorkflowTypes,\n} from \"./WorkflowTypes\";\n\nexport type BaseOptions = {\n\tonStep?: (message: WorkflowMessageBody) => void;\n\tonError?: (error: Error) => void;\n\tonFatal?: (error: Error) => void;\n};\n\nexport type OAuth2Options = BaseOptions & {\n\tonOAuth2Complete: (message: OAuth2WorkflowMessageBody) => any;\n\tonWithdrawComplete?: never;\n};\n\nexport type WithdrawOptions = BaseOptions & {\n\tonWithdrawComplete: (message: WithdrawFundsWorkflowMessageBody) => any;\n\tonOAuth2Complete?: never;\n};\n\nexport type QRCodeOptions = {\n\tonQRCodeReceived: (message: QRCodeAuthWorkflowMessageBody) => any;\n\tonQRCodeComplete: (message: QRCodeAuthWorkflowMessageBody) => any;\n\tonQRCodeError?: (error: Error) => void;\n};\n\n/**\n * A web-specific client for Bluvo SDK that provides browser-oriented functionality\n * for cryptocurrency exchange integrations and OAuth2 authentication flows.\n *\n * This client is designed for use in browser environments where direct API key usage\n * is not secure. It provides methods for OAuth2 authentication flows and other\n * browser-specific features that require user interaction.\n *\n * Unlike the main BluvoClient which requires API keys, BluvoWebClient uses only\n * organization and project identifiers, making it safe for client-side applications.\n */\nexport class BluvoWebClient {\n\tprivate wsClient: WebSocketClient;\n\tprivate readonly wsBase: string;\n\tprivate readonly apiBase?: string;\n\tprivate readonly client: Client;\n\n\t/**\n\t * Creates a new BluvoWebClient instance for browser environments.\n\t *\n\t * @param orgId Your Bluvo organization identifier.\n\t * @param projectId Your Bluvo project identifier.\n\t * @param sandbox Whether to use the sandbox environment.\n\t * @param dev Whether to use the local development environment (localhost:8787).\n\t * @param customDomain Custom domain configuration to override default api-bluvo.com\n\t */\n\tconstructor(\n\t\tprivate readonly orgId: string,\n\t\tprivate readonly projectId: string,\n\t\tprivate readonly sandbox: boolean = false,\n\t\tprivate readonly dev: boolean = false,\n\t\tprivate readonly customDomain?:\n\t\t\t| string\n\t\t\t| \"api-bluvo.com\"\n\t\t\t| { api: string; ws: string },\n\t) {\n\t\tthis.wsClient = new WebSocketClient();\n\n\t\t// Configure WebSocket and API base URLs based on customDomain first, then environment\n\t\tif (customDomain && typeof customDomain === \"object\") {\n\t\t\t// Custom domain with separate API and WebSocket URLs\n\t\t\tthis.apiBase = `https://${customDomain.api}`;\n\t\t\tthis.wsBase = `wss://${customDomain.ws}`;\n\t\t} else if (\n\t\t\tcustomDomain &&\n\t\t\ttypeof customDomain === \"string\" &&\n\t\t\tcustomDomain !== \"api-bluvo.com\"\n\t\t) {\n\t\t\t// Custom domain for both API and WebSocket\n\t\t\tthis.apiBase = `https://${customDomain}`;\n\t\t\tthis.wsBase = `wss://${customDomain}`;\n\t\t} else if (dev) {\n\t\t\tthis.apiBase = \"http://localhost:8787\";\n\t\t\tthis.wsBase = \"ws://localhost:8787\";\n\t\t} else if (sandbox) {\n\t\t\tthis.apiBase = \"https://test.api-bluvo.com\";\n\t\t\tthis.wsBase = \"wss://test.api-bluvo.com\";\n\t\t} else {\n\t\t\t// Production default or explicit \"api-bluvo.com\"\n\t\t\tthis.apiBase = \"https://api-bluvo.com\";\n\t\t\tthis.wsBase = \"wss://api-bluvo.com\";\n\t\t}\n\t\tthis.client = createClient(\n\t\t\tcreateConfig<ClientOptions>({\n\t\t\t\tbaseUrl: this.apiBase,\n\t\t\t\theaders: {\n\t\t\t\t\t\"x-bluvo-org-id\": this.orgId,\n\t\t\t\t\t\"x-bluvo-project-id\": this.projectId,\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t}\n\n\tstatic createClient({\n\t\torgId,\n\t\tprojectId,\n\t\tsandbox,\n\t\tdev,\n\t\tcustomDomain,\n\t}: {\n\t\torgId: string;\n\t\tprojectId: string;\n\t\tsandbox?: boolean;\n\t\tdev?: boolean;\n\t\tcustomDomain?: string | \"api-bluvo.com\" | { api: string; ws: string };\n\t}): BluvoWebClient {\n\t\treturn new BluvoWebClient(orgId, projectId, sandbox, dev, customDomain);\n\t}\n\n\toauth2 = {\n\t\t/**\n\t\t * Opens an OAuth2 authentication flow for connecting to a cryptocurrency exchange.\n\t\t *\n\t\t * This method initiates the OAuth2 authorization process by opening a new window\n\t\t * or redirecting the user to the exchange's authorization page. After the user\n\t\t * grants permission, they will be redirected back to your application with the\n\t\t * necessary credentials to complete the wallet connection.\n\t\t *\n\t\t * @param exchange The exchange to authenticate with (currently supports 'coinbase').\n\t\t * @param options OAuth2 flow configuration options:\n\t\t * @param hooks Optional callback hooks:\n\t\t * @param popupOptions Optional window customization:\n\t\t * @param windowRef Optional window reference (defaults to global window)\n\t\t *\n\t\t * @example\n\t\t * const webClient = new BluvoWebClient('org-123', 'project-456');\n\t\t * await webClient.oauth2.openWindow('coinbase', {\n\t\t *   walletId: 'user-coinbase-wallet',\n\t\t *   idem: 'oauth-flow-123'\n\t\t * }, {\n\t\t *   onWindowClose: () => console.log('Window closed')\n\t\t * }, {\n\t\t *   title: 'Connect to Coinbase',\n\t\t *   width: 600,\n\t\t *   height: 700\n\t\t * });\n\t\t */\n\t\tasync openWindow(\n\t\t\texchange: \"coinbase\",\n\t\t\toptions: {\n\t\t\t\twalletId: string;\n\t\t\t\tidem: string;\n\t\t\t},\n\t\t\thooks?: {\n\t\t\t\tonWindowClose?: () => void;\n\n\t\t\t\t// instead those two will be used on .listen\n\t\t\t\t// onComplete?: (walletId: string) => void;\n\t\t\t\t// onError?: (error: any) => void;\n\t\t\t},\n\t\t\tpopupOptions?: {\n\t\t\t\ttitle?: string;\n\t\t\t\twidth?: number;\n\t\t\t\theight?: number;\n\t\t\t\tleft?: number;\n\t\t\t\ttop?: number;\n\t\t\t},\n\t\t\twindowRef?: Window | undefined,\n\t\t) {\n\n\n\t\t\t// Now fetch the OAuth URL asynchronously\n\t\t\tconst {\n\t\t\t\turl,\n\t\t\t\tdata,\n\t\t\t\tsuccess,\n\t\t\t\terror\n\t\t\t} = await this.getURL(exchange, {\n\t\t\t\twalletId: options.walletId,\n\t\t\t\tidem: options.idem,\n\t\t\t});\n\n\t\t\tif(data?.isQRCode) {\n\t\t\t\t// WE DONT NEED TO OPEN A WINDOW, WE JUST NEED TO FETCH GET THE URL AND LISTEN FOR QRCODE flow via websocket\n\t\t\t\treturn () => {};\n\t\t\t}\n\n\n\t\t\tif (typeof windowRef === \"undefined\") {\n\t\t\t\tif (typeof window === \"undefined\") {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\"This method can only be called in a browser environment\",\n\t\t\t\t\t);\n\t\t\t\t\treturn () => {}; // Return empty cleanup function\n\t\t\t\t}\n\t\t\t\twindowRef = window;\n\t\t\t}\n\n\t\t\t// Set default window options\n\t\t\tconst windowTitle = popupOptions?.title || `${exchange} OAuth`;\n\t\t\tconst windowWidth = popupOptions?.width || 500;\n\t\t\tconst windowHeight = popupOptions?.height || 600;\n\n\t\t\t// Calculate position: use provided values or center the window\n\t\t\tlet left: number;\n\t\t\tlet top: number;\n\n\t\t\tif (popupOptions?.left !== undefined && popupOptions?.top !== undefined) {\n\t\t\t\t// Use provided position\n\t\t\t\tleft = popupOptions.left;\n\t\t\t\ttop = popupOptions.top;\n\t\t\t} else {\n\t\t\t\t// Center the window on the screen\n\t\t\t\tconst screenLeft = windowRef.screenLeft || windowRef.screenX || 0;\n\t\t\t\tconst screenTop = windowRef.screenTop || windowRef.screenY || 0;\n\t\t\t\tconst screenWidth = windowRef.screen.width;\n\t\t\t\tconst screenHeight = windowRef.screen.height;\n\n\t\t\t\tleft = screenLeft + (screenWidth - windowWidth) / 2;\n\t\t\t\ttop = screenTop + (screenHeight - windowHeight) / 2;\n\t\t\t}\n\n\t\t\t// Create loading HTML to show while fetching OAuth URL\n\t\t\tconst loadingHTML = `<!DOCTYPE html>\n<html>\n<head>\n    <title>${windowTitle}</title>\n    <style>\n        body {\n            margin: 0;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            height: 100vh;\n            background: #000;\n        }\n        .spinner {\n            border: 4px solid rgba(255, 255, 255, 0.3);\n            border-top: 4px solid #fff;\n            border-radius: 50%;\n            width: 48px;\n            height: 48px;\n            animation: spin 1s linear infinite;\n        }\n        @keyframes spin {\n            0% { transform: rotate(0deg); }\n            100% { transform: rotate(360deg); }\n        }\n    </style>\n</head>\n<body>\n    <div class=\"spinner\"></div>\n</body>\n</html>`;\n\n\t\t\t// Open window immediately with about:blank to prevent popup blocking\n\t\t\t// Using about:blank is more reliable than data URLs across different browsers\n\t\t\tconst windowFeatures = `width=${windowWidth},height=${windowHeight},left=${left},top=${top},status=yes,scrollbars=yes,resizable=yes`;\n\t\t\tconst newWindow = windowRef.open('about:blank', windowTitle, windowFeatures);\n\n\t\t\tif (!newWindow || newWindow.closed || typeof newWindow.closed === \"undefined\") {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Failed to open OAuth2 window. Please allow pop-ups for this site.\",\n\t\t\t\t);\n\t\t\t\treturn () => {}; // Return empty cleanup function\n\t\t\t}\n\n\t\t\t// Write loading HTML immediately\n\t\t\ttry {\n\t\t\t\tnewWindow.document.open();\n\t\t\t\tnewWindow.document.write(loadingHTML);\n\t\t\t\tnewWindow.document.close();\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(\"Failed to write loading HTML to popup:\", e);\n\t\t\t\ttry {\n\t\t\t\t\tnewWindow.close();\n\t\t\t\t} catch (closeError) {\n\t\t\t\t\t// Suppress close errors\n\t\t\t\t}\n\t\t\t\treturn () => {};\n\t\t\t}\n\n\t\t\tnewWindow.focus();\n\n\t\t\t// Check if window was closed during the async operation\n\t\t\tif (newWindow.closed) {\n\t\t\t\tconsole.warn(\"OAuth2 window was closed before URL could be loaded\");\n\t\t\t\treturn () => {}; // Return empty cleanup function\n\t\t\t}\n\n\t\t\tif (!success || !url) {\n\t\t\t\tconsole.error(\"Failed to generate OAuth2 URL:\", error);\n\n\t\t\t\t// Show error state in the popup window\n\t\t\t\tconst errorHTML = `<!DOCTYPE html>\n<html>\n<head>\n    <title>${windowTitle} - Error</title>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n        body {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            height: 100vh;\n            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n            background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n            color: #ffffff;\n            padding: 1rem;\n        }\n        .error-container {\n            text-align: center;\n            background: rgba(255, 255, 255, 0.1);\n            padding: 3rem 2rem;\n            border-radius: 1rem;\n            backdrop-filter: blur(10px);\n            box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);\n            max-width: 400px;\n        }\n        .error-icon {\n            font-size: 3rem;\n            margin-bottom: 1rem;\n        }\n        h2 {\n            font-size: 1.5rem;\n            font-weight: 600;\n            margin-bottom: 1rem;\n        }\n        p {\n            font-size: 0.875rem;\n            opacity: 0.9;\n            margin-bottom: 1.5rem;\n            line-height: 1.5;\n        }\n        button {\n            background: rgba(255, 255, 255, 0.9);\n            color: #f5576c;\n            border: none;\n            padding: 0.75rem 1.5rem;\n            border-radius: 0.5rem;\n            font-size: 0.875rem;\n            font-weight: 600;\n            cursor: pointer;\n            transition: all 0.2s;\n        }\n        button:hover {\n            background: #ffffff;\n            transform: translateY(-1px);\n            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n        }\n    </style>\n</head>\n<body>\n    <div class=\"error-container\">\n        <div class=\"error-icon\">⚠️</div>\n        <h2>Connection Failed</h2>\n        <p>We couldn't connect to ${exchange}. Please close this window and try again.</p>\n        <p style=\"font-size: 0.75rem; opacity: 0.7;\">${error || \"Unknown error occurred\"}</p>\n        <button onclick=\"window.close()\">Close Window</button>\n    </div>\n</body>\n</html>`;\n\n\t\t\t\ttry {\n\t\t\t\t\tnewWindow.document.open();\n\t\t\t\t\tnewWindow.document.write(errorHTML);\n\t\t\t\t\tnewWindow.document.close();\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// If we can't write to the document (cross-origin issues), just close it\n\t\t\t\t\tconsole.warn(\"Could not display error in popup window:\", e);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tnewWindow.close();\n\t\t\t\t\t} catch (closeError) {\n\t\t\t\t\t\t// Suppress close errors\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (!newWindow.closed) {\n\t\t\t\t\t\t\tnewWindow.close();\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t// Suppress errors\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Navigate to the OAuth URL\n\t\t\ttry {\n\t\t\t\tnewWindow.location.href = url;\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(\"Failed to navigate to OAuth URL:\", e);\n\t\t\t\ttry {\n\t\t\t\t\tnewWindow.close();\n\t\t\t\t} catch (closeError) {\n\t\t\t\t\t// Suppress close errors\n\t\t\t\t}\n\t\t\t\treturn () => {};\n\t\t\t}\n\n\t\t\t// Set up window close detection\n\t\t\t// FIXME: this is not working for all browsers for some we give false-positives\n\t\t\t// Set up window close detection\n\t\t\tif (hooks?.onWindowClose) {\n\t\t\t\tconst CHECK_INTERVAL = 500;\n\t\t\t\tlet hasCalledClose = false;\n\n\t\t\t\tconst checkWindowClosed = () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Check if window is explicitly closed\n\t\t\t\t\t\tif (newWindow.closed) {\n\t\t\t\t\t\t\tif (!hasCalledClose) {\n\t\t\t\t\t\t\t\thasCalledClose = true;\n\t\t\t\t\t\t\t\tclearInterval(intervalId);\n\t\t\t\t\t\t\t\thooks.onWindowClose!();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Attempt to access a property to confirm state\n\t\t\t\t\t\tvoid newWindow.location.href;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\t// SecurityError or DOMException code 18: window is open but cross-origin\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\te.name === \"SecurityError\" ||\n\t\t\t\t\t\t\t(e instanceof DOMException && e.code === 18)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Other errors (e.g., TypeError) indicate the window is closed\n\t\t\t\t\t\tif (!hasCalledClose) {\n\t\t\t\t\t\t\thasCalledClose = true;\n\t\t\t\t\t\t\tclearInterval(intervalId);\n\t\t\t\t\t\t\thooks.onWindowClose!();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst intervalId = setInterval(checkWindowClosed, CHECK_INTERVAL);\n\n\t\t\t\t// Return cleanup function\n\t\t\t\treturn () => {\n\t\t\t\t\tclearInterval(intervalId);\n\t\t\t\t\tif (!hasCalledClose) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (newWindow && !newWindow.closed) {\n\t\t\t\t\t\t\t\tnewWindow.close();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t// Suppress cross-origin errors on close attempt\n\t\t\t\t\t\t\tconsole.warn(\"Failed to close OAuth window:\", e);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Default cleanup if no hooks provided\n\t\t\treturn () => {\n\t\t\t\ttry {\n\t\t\t\t\tif (newWindow && !newWindow.closed) {\n\t\t\t\t\t\tnewWindow.close();\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// Suppress cross-origin errors\n\t\t\t\t\tconsole.warn(\"Failed to close OAuth window:\", e);\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Generates a URL for the OAuth2 authentication flow.\n\t\t *\n\t\t * This method constructs a URL that can be used to redirect the user to the\n\t\t * exchange's authorization page. The user will authenticate and authorize\n\t\t * your application to access their account.\n\t\t *\n\t\t * @param exchange The exchange to authenticate with (currently supports 'coinbase').\n\t\t * @param walletId A unique identifier for this wallet connection.\n\t\t * @param idem A unique identifier for this specific OAuth2 flow instance.\n\t\t *\n\t\t * @returns A URL string that can be used to initiate the OAuth2 flow.\n\t\t */\n\t\tgetURL: async (\n\t\t\texchange: \"coinbase\" | \"kraken\",\n\t\t\t{\n\t\t\t\twalletId,\n\t\t\t\tidem,\n\t\t\t}: {\n\t\t\t\twalletId: string;\n\t\t\t\tidem: string;\n\t\t\t},\n\t\t) => {\n\t\t\tconst response = await oauth2Exchangeurlgeturl({\n\t\t\t\tpath: {\n\t\t\t\t\texchange,\n\t\t\t\t},\n\t\t\t\theaders: {\n\t\t\t\t\t\"x-bluvo-wallet-id\": walletId,\n\t\t\t\t},\n\t\t\t\tclient: this.client,\n\t\t\t\tquery: {\n\t\t\t\t\tidem,\n                    // CEX always redirects to bluvo's base-url as callback post OAuth and we could only introduce CSRF check validation errors by swapping DNS in between of pages.\n                    // customDomain: typeof this.customDomain === \"string\" ? this.customDomain : this.customDomain?.api,\n\t\t\t\t},\n\t\t\t}).then(transformResponse);\n\n\t\t\treturn {\n\t\t\t\t...response,\n\t\t\t\turl: response.data?.url,\n\t\t\t};\n\t\t},\n\t};\n\n\t/**\n\t * Listen to a Momento topic for messages (generic version).\n\t *\n\t * This method provides a general-purpose subscription to Momento topics,\n\t * useful for any real-time messaging needs beyond OAuth2 flows.\n\t *\n\t * @param topicName The name of the topic to subscribe to\n\t * @param topicToken\n\t * @param options Subscription options including callbacks\n\t * @returns A subscription object that can be used to unsubscribe, or null if subscription fails\n\t *\n\t * @example\n\t * // Listen to a custom topic\n\t * const subscription = await webClient.listen(\n\t *   'my-topic-123',\n\t *   topicInfo,\n\t *   {\n\t *     onMessage: (data) => {\n\t *       console.log('Received message:', data);\n\t *     },\n\t *     onError: (error) => {\n\t *       console.error('Subscription error:', error);\n\t *     }\n\t *   }\n\t * );\n\t *\n\t * // Later: unsubscribe\n\t * await webClient.unsubscribe('my-topic-123');\n\t */\n\tasync listen(\n\t\ttopicName: string,\n\t\toptions: (OAuth2Options | WithdrawOptions) & Partial<QRCodeOptions>,\n\t): Promise<Subscription | null> {\n\t\tconst onMessage = (rawData: any) => {\n\n\t\t\tconsole.log(\"rawData from ws\", rawData);\n\n\n\t\t\t// Extract the body if the message has a wrapper structure\n\t\t\t// WebSocket messages come in format: { messageId, idem, timestamp, body }\n\t\t\t// We need to extract the body which contains the actual WorkflowMessageBody\n\t\t\tconst data: WorkflowMessageBody =\n\t\t\t\trawData && typeof rawData === \"object\" && \"body\" in rawData\n\t\t\t\t\t? rawData.body\n\t\t\t\t\t: rawData;\n\n\t\t\t// if success === true\n\t\t\tconst success = data?.success === true;\n\t\t\tconst failure = data?.success === false;\n\t\t\tconst pending =\n\t\t\t\ttypeof data?.success === \"undefined\" || (!success && !failure);\n\n\t\t\t// Handle QR code auth messages\n\t\t\tif (data.type === WorkflowTypes.QRCodeAuth) {\n\t\t\t\tconst qrData = data as QRCodeAuthWorkflowMessageBody;\n\t\t\t\tif (pending && (qrData.qrCodeUrl || qrData.qrCodeStatus)) {\n\t\t\t\t\t// QR code URL received or status update\n\t\t\t\t\treturn options.onQRCodeReceived?.(qrData);\n\t\t\t\t}\n\t\t\t\tif (success) {\n\t\t\t\t\treturn options.onQRCodeComplete?.(qrData);\n\t\t\t\t}\n\t\t\t\tif (failure) {\n\t\t\t\t\treturn options.onQRCodeError?.(\n\t\t\t\t\t\tnew Error(data.error || \"QR code authentication failed\"),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (pending) {\n\t\t\t\tif (options.onStep) {\n\t\t\t\t\treturn options.onStep(data);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (data.type === WorkflowTypes.OAuth2Flow && !options.onOAuth2Complete) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"received OAuth2 message but no onOAuth2Complete handler is defined\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tdata.type === WorkflowTypes.WithdrawFunds &&\n\t\t\t\t!options.onWithdrawComplete\n\t\t\t) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"received Withdraw message but no onWithdrawComplete handler is defined\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (data.type === WorkflowTypes.OAuth2Flow) {\n\t\t\t\tif (success && data.walletId) {\n\t\t\t\t\treturn options.onOAuth2Complete?.(data);\n\t\t\t\t}\n\t\t\t\tif (failure) {\n\t\t\t\t\treturn options.onError?.(\n\t\t\t\t\t\tnew Error(data.error || \"OAuth2 flow failed\"),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (data.type === WorkflowTypes.WithdrawFunds) {\n\t\t\t\tif (success && data.walletId) {\n\t\t\t\t\treturn options.onWithdrawComplete?.(data);\n\t\t\t\t}\n\t\t\t\tif (failure) {\n\t\t\t\t\t// handle better error\n\t\t\t\t\tif (data.error && typeof data.error === \"object\") {\n\t\t\t\t\t\t// Handle new SerializedError format from backend\n\t\t\t\t\t\tif (data.error.code && data.error.message) {\n\t\t\t\t\t\t\t// Create error with proper name based on error code\n\t\t\t\t\t\t\tconst error = new Error(data.error.message);\n\t\t\t\t\t\t\terror.name = data.error.code;\n\t\t\t\t\t\t\t// Preserve original error data for debugging\n\t\t\t\t\t\t\t(error as any).originalError = data.error;\n\t\t\t\t\t\t\t(error as any).code = data.error.code;\n\t\t\t\t\t\t\treturn options.onError?.(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Legacy error object format (backward compatibility)\n\t\t\t\t\t\telse if (data.error.name || data.error.message) {\n\t\t\t\t\t\t\tconst error = new Error(\n\t\t\t\t\t\t\t\tdata.error.message || \"Withdraw funds flow failed\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\terror.name = data.error.name || \"WithdrawError\";\n\t\t\t\t\t\t\t// Preserve original error data for debugging\n\t\t\t\t\t\t\t(error as any).originalError = data.error;\n\t\t\t\t\t\t\treturn options.onError?.(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn options.onError?.(\n\t\t\t\t\t\tnew Error(data.error || \"Withdraw funds flow failed\"),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\n\t\tconsole.log('ws listening on topic', topicName, 'with orgId', this.orgId);\n\n\t\treturn this.wsClient.subscribe(topicName, this.orgId, this.wsBase, {\n\t\t\tonError: options.onError,\n\t\t\tonMessage: onMessage,\n\t\t});\n\t}\n\n\t/**\n\t * Unsubscribe from a topic.\n\t *\n\t * @param topicName The name of the topic to unsubscribe from\n\t */\n\tasync unsubscribe(topicName: string) {\n\t\treturn this.wsClient.unsubscribe(topicName);\n\t}\n\n\t/**\n\t * Unsubscribe from all active topics.\n\t */\n\tasync unsubscribeAll() {\n\t\treturn this.wsClient.unsubscribeAll();\n\t}\n\n\t/**\n\t * Check if currently subscribed to a topic.\n\t *\n\t * @param topicName The topic name to check\n\t * @returns True if subscribed, false otherwise\n\t */\n\tisSubscribed(topicName: string): boolean {\n\t\treturn this.wsClient.isSubscribed(topicName);\n\t}\n\n\t/**\n\t * Get the number of active subscriptions.\n\t *\n\t * @returns Number of active subscriptions\n\t */\n\tgetActiveSubscriptionCount(): number {\n\t\treturn this.wsClient.getActiveSubscriptionCount();\n\t}\n}\n","import { Machine, Listener, StateTransition } from '../types/machine.types';\n\nexport function createMachine<TState, TAction>(\n  initialState: TState,\n  transition: StateTransition<TState, TAction>\n): Machine<TState, TAction> {\n  let state = initialState;\n  let listeners: Set<Listener<TState>> = new Set();\n  let isDisposed = false;\n\n  function assertNotDisposed() {\n    if (isDisposed) {\n      throw new Error('Machine has been disposed');\n    }\n  }\n\n  function notifyListeners() {\n    listeners.forEach(listener => {\n      try {\n        listener(state);\n      } catch (error) {\n        console.error('Error in state listener:', error);\n      }\n    });\n  }\n\n  return {\n    getState(): TState {\n      assertNotDisposed();\n      return state;\n    },\n\n    send(action: TAction): void {\n      assertNotDisposed();\n      const prevState = state;\n      state = transition(state, action);\n      \n      if (state !== prevState) {\n        notifyListeners();\n      }\n    },\n\n    subscribe(listener: Listener<TState>) {\n      assertNotDisposed();\n      listeners.add(listener);\n      \n      // Immediately notify with current state\n      listener(state);\n      \n      return () => {\n        listeners.delete(listener);\n      };\n    },\n\n    dispose(): void {\n      if (!isDisposed) {\n        listeners.clear();\n        isDisposed = true;\n      }\n    }\n  };\n}","import type { FlowState, FlowContext } from '../types/flow.types';\n\n/**\n * Helper functions for creating state transitions\n * These eliminate boilerplate and make state transitions more consistent\n */\n\n/**\n * Create a transition to a new state type with optional context updates\n */\nexport function createTransition<T extends FlowState['type']>(\n  type: T,\n  context: FlowContext,\n  contextUpdates?: Partial<FlowContext>,\n  error: Error | null = null\n): FlowState {\n  return {\n    type,\n    context: contextUpdates ? { ...context, ...contextUpdates } : context,\n    error\n  };\n}\n\n/**\n * Create an error transition with optional context updates\n */\nexport function createErrorTransition(\n  type: FlowState['type'],\n  context: FlowContext,\n  error: Error,\n  contextUpdates?: Partial<FlowContext>\n): FlowState {\n  return {\n    type,\n    context: contextUpdates ? { ...context, ...contextUpdates } : context,\n    error\n  };\n}\n\n/**\n * Update context with type-safe partial updates\n */\nexport function updateContext(\n  context: FlowContext,\n  updates: Partial<FlowContext>\n): FlowContext {\n  return { ...context, ...updates };\n}\n\n/**\n * Constants for default configuration values\n */\nexport const DEFAULT_MAX_RETRY_ATTEMPTS = 3;\nexport const DEFAULT_AUTO_REFRESH_QUOTATION = true;\n","import { createMachine } from './createMachine';\nimport {\n  WithdrawalState,\n  WithdrawalActionType,\n  WithdrawalContext,\n  WithdrawalStateType\n} from '../types/withdrawal.types';\n\nconst initialContext: WithdrawalContext = {\n  quoteId: '',\n  walletId: '',\n  idempotencyKey: '',\n  retryCount: 0,\n  maxRetries: 3,\n};\n\nconst initialState: WithdrawalState = {\n  type: 'idle',\n  context: initialContext,\n  error: null\n};\n\nfunction withdrawalTransition(\n  state: WithdrawalState,\n  action: WithdrawalActionType\n): WithdrawalState {\n\n  switch (state.type) {\n    case 'idle':\n      if (action.type === 'EXECUTE') {\n        return {\n          type: 'processing',\n          context: {\n            ...state.context,\n            quoteId: action.quoteId,\n            walletId: action.walletId,\n            idempotencyKey: crypto.randomUUID(),\n            retryCount: 0\n          },\n          error: null\n        };\n      }\n      break;\n\n    case 'processing':\n      switch (action.type) {\n        case 'REQUIRES_2FA':\n          return {\n            type: 'waitingFor2FA',\n            context: {\n              ...state.context,\n              requiredActions: ['2fa']\n            },\n            error: null\n          };\n        \n        case 'REQUIRES_SMS':\n          return {\n            type: 'waitingForSMS',\n            context: {\n              ...state.context,\n              requiredActions: ['sms']\n            },\n            error: null\n          };\n        \n        case 'REQUIRES_KYC':\n          return {\n            type: 'waitingForKYC',\n            context: {\n              ...state.context,\n              requiredActions: ['kyc']\n            },\n            error: null\n          };\n        \n        case 'SUCCESS':\n          return {\n            type: 'completed',\n            context: {\n              ...state.context,\n              transactionId: action.transactionId\n            },\n            error: null\n          };\n        \n        case 'FAIL':\n          if (state.context.retryCount < state.context.maxRetries) {\n            return {\n              type: 'retrying',\n              context: {\n                ...state.context,\n                retryCount: state.context.retryCount + 1,\n                lastError: action.error\n              },\n              error: action.error\n            };\n          }\n          return {\n            type: 'failed',\n            context: {\n              ...state.context,\n              lastError: action.error\n            },\n            error: action.error\n          };\n        \n        case 'BLOCKED':\n          return {\n            type: 'blocked',\n            context: state.context,\n            error: new Error(action.reason)\n          };\n      }\n      break;\n\n    case 'waitingFor2FA':\n      if (action.type === 'SUBMIT_2FA') {\n        return {\n          type: 'processing',\n          context: {\n            ...state.context,\n            twoFactorCode: action.code,\n            requiredActions: undefined\n          },\n          error: null\n        };\n      }\n      break;\n\n    case 'waitingForSMS':\n      if (action.type === 'SUBMIT_SMS') {\n        return {\n          type: 'processing',\n          context: {\n            ...state.context,\n            smsCode: action.code,\n            requiredActions: undefined\n          },\n          error: null\n        };\n      }\n      break;\n\n    case 'retrying':\n      if (action.type === 'RETRY') {\n        return {\n          type: 'processing',\n          context: {\n            ...state.context,\n            idempotencyKey: crypto.randomUUID() // New idempotency key for retry\n          },\n          error: null\n        };\n      }\n      break;\n  }\n\n  console.log(`No transition for action ${action.type} in state ${state.type}`);\n\n  return state;\n}\n\nexport function createWithdrawalMachine(\n  initialContext?: Partial<WithdrawalContext>\n) {\n  const state: WithdrawalState = {\n    ...initialState,\n    context: {\n      ...initialState.context,\n      ...initialContext\n    }\n  };\n\n  return createMachine(state, withdrawalTransition);\n}","import type { FlowState, FlowActionType } from '../types/flow.types';\nimport type { FlowMachineInstance } from './flowMachine.types';\nimport { createTransition, createErrorTransition } from './stateHelpers';\nimport { createWithdrawalMachine } from './withdrawalMachine';\n\n/**\n * State handlers for the flow machine\n * Each function handles transitions for a specific group of states\n */\n\n/**\n * Handle transitions for the idle state\n */\nexport function handleIdleState(\n  state: FlowState,\n  action: FlowActionType\n): FlowState | null {\n  if (state.type !== 'idle') return null;\n\n  switch (action.type) {\n    case 'LOAD_EXCHANGES':\n      return createTransition('exchanges:loading', state.context);\n\n    case 'START_OAUTH':\n      return createTransition('oauth:waiting', state.context, {\n        exchange: action.exchange,\n        walletId: action.walletId,\n        idempotencyKey: action.idem,\n        topicName: action.idem,\n        isQRCodeFlow: false\n      });\n\n    case 'START_QRCODE':\n      return createTransition('qrcode:waiting', state.context, {\n        exchange: action.exchange,\n        walletId: action.walletId,\n        idempotencyKey: action.idem,\n        topicName: action.idem,\n        isQRCodeFlow: true\n      });\n\n    default:\n      return null;\n  }\n}\n\n/**\n * Handle transitions for exchange-related states\n */\nexport function handleExchangeStates(\n  state: FlowState,\n  action: FlowActionType\n): FlowState | null {\n  switch (state.type) {\n    case 'exchanges:loading':\n      switch (action.type) {\n        case 'EXCHANGES_LOADED':\n          return createTransition('exchanges:ready', state.context, {\n            exchanges: action.exchanges\n          });\n\n        case 'EXCHANGES_FAILED':\n          return createErrorTransition('exchanges:error', state.context, action.error);\n\n        default:\n          return null;\n      }\n\n    case 'exchanges:ready':\n      if (action.type === 'START_OAUTH') {\n        return createTransition('oauth:waiting', state.context, {\n          exchange: action.exchange,\n          walletId: action.walletId,\n          idempotencyKey: action.idem,\n          topicName: action.idem,\n          isQRCodeFlow: false\n        });\n      }\n      if (action.type === 'START_QRCODE') {\n        return createTransition('qrcode:waiting', state.context, {\n          exchange: action.exchange,\n          walletId: action.walletId,\n          idempotencyKey: action.idem,\n          topicName: action.idem,\n          isQRCodeFlow: true\n        });\n      }\n      return null;\n\n    default:\n      return null;\n  }\n}\n\n/**\n * Handle transitions for OAuth-related states\n */\nexport function handleOAuthStates(\n  state: FlowState,\n  action: FlowActionType\n): FlowState | null {\n  switch (state.type) {\n    case 'oauth:waiting':\n      if (action.type === 'OAUTH_WINDOW_OPENED') {\n        return createTransition('oauth:processing', state.context);\n      }\n      return null;\n\n    case 'oauth:processing':\n      switch (action.type) {\n        case 'OAUTH_COMPLETED':\n          return createTransition('oauth:completed', state.context, {\n            walletId: action.walletId\n          });\n\n        case 'OAUTH_FAILED':\n          return createErrorTransition('oauth:error', state.context, action.error, {\n            oauthErrorType: 'recoverable'\n          });\n\n        case 'OAUTH_FATAL':\n          return createErrorTransition('oauth:fatal', state.context, action.error, {\n            oauthErrorType: 'fatal'\n          });\n\n        case 'OAUTH_WINDOW_CLOSED_BY_USER':\n          return createErrorTransition(\n            'oauth:window_closed_by_user',\n            state.context,\n            action.error\n          );\n\n        default:\n          return null;\n      }\n\n    case 'oauth:completed':\n      if (action.type === 'LOAD_WALLET') {\n        return createTransition('wallet:loading', state.context);\n      }\n      return null;\n\n    default:\n      return null;\n  }\n}\n\n/**\n * Handle transitions for QR code authentication states\n */\nexport function handleQRCodeStates(\n  state: FlowState,\n  action: FlowActionType\n): FlowState | null {\n  switch (state.type) {\n    case 'qrcode:waiting':\n      switch (action.type) {\n        case 'QRCODE_URL_RECEIVED':\n          return createTransition('qrcode:displaying', state.context, {\n            qrCodeUrl: action.qrCodeUrl,\n            qrCodeExpiresAt: action.expiresAt,\n            qrCodeStatus: 'available'\n          });\n\n        case 'QRCODE_FAILED':\n          return createErrorTransition('qrcode:error', state.context, action.error);\n\n        case 'QRCODE_FATAL':\n          return createErrorTransition('qrcode:fatal', state.context, action.error);\n\n        default:\n          return null;\n      }\n\n    case 'qrcode:displaying':\n      switch (action.type) {\n        case 'QRCODE_STATUS_UPDATED':\n          return createTransition('qrcode:displaying', state.context, {\n            qrCodeStatus: action.qrCodeStatus,\n            qrCodeExpiresAt: action.qrCodeExpiresAt ?? state.context.qrCodeExpiresAt\n          });\n\n        case 'QRCODE_SCANNED':\n          return createTransition('qrcode:scanning', state.context, {\n            qrCodeStatus: 'scanned'\n          });\n\n        case 'QRCODE_COMPLETED':\n          // Transition to oauth:completed to reuse existing wallet loading flow\n          return createTransition('oauth:completed', state.context, {\n            walletId: action.walletId,\n            exchange: action.exchange\n          });\n\n        case 'QRCODE_TIMEOUT':\n          return createErrorTransition(\n            'qrcode:timeout',\n            state.context,\n            new Error('QR code has expired')\n          );\n\n        case 'QRCODE_FAILED':\n          return createErrorTransition('qrcode:error', state.context, action.error);\n\n        case 'QRCODE_FATAL':\n          return createErrorTransition('qrcode:fatal', state.context, action.error);\n\n        default:\n          return null;\n      }\n\n    case 'qrcode:scanning':\n      switch (action.type) {\n        case 'QRCODE_STATUS_UPDATED':\n          return createTransition('qrcode:scanning', state.context, {\n            qrCodeStatus: action.qrCodeStatus,\n            qrCodeExpiresAt: action.qrCodeExpiresAt ?? state.context.qrCodeExpiresAt\n          });\n\n        case 'QRCODE_COMPLETED':\n          // Transition to oauth:completed to reuse existing wallet loading flow\n          return createTransition('oauth:completed', state.context, {\n            walletId: action.walletId,\n            exchange: action.exchange\n          });\n\n        case 'QRCODE_FAILED':\n          return createErrorTransition('qrcode:error', state.context, action.error);\n\n        case 'QRCODE_FATAL':\n          return createErrorTransition('qrcode:fatal', state.context, action.error);\n\n        default:\n          return null;\n      }\n\n    case 'qrcode:error':\n    case 'qrcode:timeout':\n      if (action.type === 'REFRESH_QRCODE') {\n        return createTransition('qrcode:waiting', state.context, {\n          qrCodeUrl: undefined,\n          qrCodeExpiresAt: undefined,\n          qrCodeStatus: undefined\n        });\n      }\n      return null;\n\n    default:\n      return null;\n  }\n}\n\n/**\n * Handle transitions for wallet-related states\n */\nexport function handleWalletStates(\n  state: FlowState,\n  action: FlowActionType\n): FlowState | null {\n  switch (state.type) {\n    case 'wallet:loading':\n      switch (action.type) {\n        case 'WALLET_LOADED':\n          return createTransition('wallet:ready', state.context, {\n            walletBalances: action.balances\n          });\n\n        case 'WALLET_FAILED':\n          return createErrorTransition('wallet:error', state.context, action.error);\n\n        default:\n          return null;\n      }\n\n    case 'wallet:ready':\n      if (action.type === 'REQUEST_QUOTE') {\n        return createTransition('quote:requesting', state.context, {\n          lastQuoteRequest: {\n            asset: action.asset,\n            amount: action.amount,\n            destinationAddress: action.destinationAddress,\n            network: action.network\n          }\n        });\n      }\n      return null;\n\n    default:\n      return null;\n  }\n}\n\n/**\n * Handle transitions for quote-related states\n */\nexport function handleQuoteStates(\n  state: FlowState,\n  action: FlowActionType,\n  instance: FlowMachineInstance\n): FlowState | null {\n  switch (state.type) {\n    case 'quote:requesting':\n      switch (action.type) {\n        case 'QUOTE_RECEIVED':\n          if (action.quote) {\n            console.log('[State Machine] quote:requesting received QUOTE_RECEIVED with ID:', action.quote.id,\n              'ExpiresAt:', new Date(action.quote.expiresAt).toLocaleTimeString());\n          }\n          return createTransition('quote:ready', state.context, {\n            quote: action.quote\n          });\n\n        case 'QUOTE_FAILED':\n          return createErrorTransition('quote:error', state.context, action.error);\n\n        default:\n          return null;\n      }\n\n    case 'quote:ready':\n      switch (action.type) {\n        case 'REQUEST_QUOTE':\n          // Allow refreshing quote while in quote:ready state (for auto-refresh)\n          console.log('[State Machine] quote:ready received REQUEST_QUOTE, transitioning to quote:requesting');\n          return createTransition('quote:requesting', state.context, {\n            quote: undefined,  // Clear old quote before requesting new one\n            lastQuoteRequest: {\n              asset: action.asset,\n              amount: action.amount,\n              destinationAddress: action.destinationAddress,\n              network: action.network\n            }\n          });\n\n        case 'QUOTE_EXPIRED':\n          return createErrorTransition(\n            'quote:expired',\n            state.context,\n            new Error('Quote has expired')\n          );\n\n        case 'START_WITHDRAWAL':\n          if (!instance.withdrawalMachine) {\n            instance.withdrawalMachine = createWithdrawalMachine({\n              quoteId: action.quoteId,\n              walletId: state.context.walletId!,\n              maxRetries: state.context.maxRetryAttempts\n            });\n          }\n\n          instance.withdrawalMachine.send({\n            type: 'EXECUTE',\n            quoteId: action.quoteId,\n            walletId: state.context.walletId!\n          });\n\n          return createTransition('withdraw:processing', state.context);\n\n        default:\n          return null;\n      }\n\n    case 'quote:expired':\n      if (action.type === 'REQUEST_QUOTE') {\n        return createTransition('quote:requesting', state.context, {\n          quote: undefined  // Clear expired quote to ensure fresh quote is requested\n        });\n      }\n      return null;\n\n    default:\n      return null;\n  }\n}\n\n/**\n * Handle 2FA submission\n */\nfunction handleSubmit2FA(\n  state: FlowState,\n  action: Extract<FlowActionType, { type: 'SUBMIT_2FA' }>,\n  instance: FlowMachineInstance\n): FlowState {\n  if (instance.withdrawalMachine) {\n    instance.withdrawalMachine.send({\n      type: 'SUBMIT_2FA',\n      code: action.code\n    });\n    return createTransition('withdraw:processing', state.context, {\n      invalid2FAAttempts: 0 // Reset invalid attempts when submitting new 2FA\n    });\n  }\n  return state;\n}\n\n/**\n * Handle SMS submission\n */\nfunction handleSubmitSMS(\n  state: FlowState,\n  action: Extract<FlowActionType, { type: 'SUBMIT_SMS' }>,\n  instance: FlowMachineInstance\n): FlowState {\n  if (instance.withdrawalMachine) {\n    instance.withdrawalMachine.send({\n      type: 'SUBMIT_SMS',\n      code: action.code\n    });\n    return createTransition('withdraw:processing', state.context);\n  }\n  return state;\n}\n\n/**\n * Handle withdrawal retry\n */\nfunction handleRetryWithdrawal(\n  state: FlowState,\n  instance: FlowMachineInstance\n): FlowState {\n  if (instance.withdrawalMachine) {\n    instance.withdrawalMachine.send({ type: 'RETRY' });\n    return createTransition('withdraw:processing', state.context);\n  }\n  return state;\n}\n\n/**\n * Handle synchronization with withdrawal machine state\n */\nfunction syncWithdrawalMachineState(\n  state: FlowState,\n  instance: FlowMachineInstance,\n  action: FlowActionType\n): FlowState | null {\n  if (!instance.withdrawalMachine) {\n    return null;\n  }\n\n  const withdrawalState = instance.withdrawalMachine.getState();\n\n  // Map withdrawal machine states to flow machine states\n  switch (withdrawalState.type) {\n    case 'waitingFor2FA':\n      if (state.type !== 'withdraw:error2FA') {\n        return createTransition('withdraw:error2FA', state.context);\n      }\n      break;\n\n    case 'waitingForSMS':\n      if (state.type !== 'withdraw:errorSMS') {\n        return createTransition('withdraw:errorSMS', state.context);\n      }\n      break;\n\n    case 'waitingForKYC':\n      if (state.type !== 'withdraw:errorKYC') {\n        return createTransition('withdraw:errorKYC', state.context);\n      }\n      break;\n\n    case 'completed':\n      if (action.type === 'WITHDRAWAL_COMPLETED') {\n        return createTransition('withdraw:completed', state.context, {\n          withdrawal: {\n            id: withdrawalState.context.idempotencyKey,\n            status: 'completed',\n            transactionId: action.transactionId\n          }\n        });\n      }\n      break;\n\n    case 'blocked':\n      if (action.type === 'WITHDRAWAL_BLOCKED') {\n        return createErrorTransition(\n          'withdraw:blocked',\n          state.context,\n          new Error(action.reason)\n        );\n      }\n      break;\n\n    case 'failed':\n      // Automatically transition to fatal state when withdrawal machine fails\n      return createErrorTransition(\n        'withdraw:fatal',\n        state.context,\n        withdrawalState.error || new Error('Withdrawal failed')\n      );\n\n    case 'retrying':\n      if (state.type !== 'withdraw:retrying') {\n        return createTransition('withdraw:retrying', state.context, {\n          retryAttempts: state.context.retryAttempts + 1\n        });\n      }\n      break;\n  }\n\n  return null;\n}\n\n/**\n * Handle direct withdrawal actions\n */\nfunction handleWithdrawalActions(\n  state: FlowState,\n  action: FlowActionType,\n  instance: FlowMachineInstance\n): FlowState | null {\n  switch (action.type) {\n    case 'SUBMIT_2FA':\n      if (state.type === 'withdraw:error2FA') {\n        return handleSubmit2FA(state, action, instance);\n      }\n      break;\n\n    case 'SUBMIT_SMS':\n      if (state.type === 'withdraw:errorSMS') {\n        return handleSubmitSMS(state, action, instance);\n      }\n      break;\n\n    case 'RETRY_WITHDRAWAL':\n      if (state.type === 'withdraw:retrying') {\n        return handleRetryWithdrawal(state, instance);\n      }\n      break;\n\n    case 'WITHDRAWAL_2FA_INVALID':\n      return createErrorTransition(\n        'withdraw:error2FA',\n        {\n          ...state.context,\n          invalid2FAAttempts: (state.context.invalid2FAAttempts || 0) + 1\n        },\n        new Error('Invalid 2FA code')\n      );\n\n    case 'WITHDRAWAL_INSUFFICIENT_BALANCE':\n      return createErrorTransition(\n        'withdraw:errorBalance',\n        state.context,\n        new Error('Insufficient balance')\n      );\n\n    case 'WITHDRAWAL_REQUIRES_2FA':\n      if (instance.withdrawalMachine) {\n        instance.withdrawalMachine.send({ type: 'REQUIRES_2FA' });\n        const withdrawalState = instance.withdrawalMachine.getState();\n        if (withdrawalState.type === 'waitingFor2FA') {\n          return createTransition('withdraw:error2FA', state.context);\n        }\n      }\n      break;\n\n    case 'WITHDRAWAL_REQUIRES_SMS':\n      if (instance.withdrawalMachine) {\n        instance.withdrawalMachine.send({ type: 'REQUIRES_SMS' });\n        const withdrawalState = instance.withdrawalMachine.getState();\n        if (withdrawalState.type === 'waitingForSMS') {\n          return createTransition('withdraw:errorSMS', state.context);\n        }\n      }\n      break;\n\n    case 'WITHDRAWAL_REQUIRES_KYC':\n      if (instance.withdrawalMachine) {\n        instance.withdrawalMachine.send({ type: 'REQUIRES_KYC' });\n        const withdrawalState = instance.withdrawalMachine.getState();\n        if (withdrawalState.type === 'waitingForKYC') {\n          return createTransition('withdraw:errorKYC', state.context);\n        }\n      }\n      break;\n\n    case 'WITHDRAWAL_REQUIRES_2FA_MULTI_STEPS':\n      // Handle multi-step 2FA requirement (Binance Web, etc.)\n      return createTransition('withdraw:error2FAMultiStep', state.context, {\n        multiStep2FA: {\n          bizNo: action.result.bizNo,\n          steps: action.result.steps,\n          relation: action.result.relation,\n          collectedCodes: {},\n          // Extract FACE step QR code if present\n          faceQrCodeUrl: action.result.steps.find(s => s.type === 'FACE')?.metadata?.qrCodeUrl,\n          faceQrCodeExpiresAt: action.result.steps.find(s => s.type === 'FACE')?.metadata?.qrCodeValidSeconds\n            ? Date.now() + (action.result.steps.find(s => s.type === 'FACE')!.metadata!.qrCodeValidSeconds! * 1000)\n            : undefined,\n          // MFA verified state (PRIMARY source of truth)\n          mfa: action.result.mfa,\n        },\n      });\n\n    case 'SUBMIT_2FA_MULTI_STEP':\n      // Store the submitted code for the step and transition to processing\n      if (state.type === 'withdraw:error2FAMultiStep' && state.context.multiStep2FA) {\n        const codeKey = action.stepType === 'GOOGLE' ? 'twofa'\n          : action.stepType === 'EMAIL' ? 'emailCode'\n          : 'smsCode';\n        return createTransition('withdraw:processing', {\n          ...state.context,\n          multiStep2FA: {\n            ...state.context.multiStep2FA,\n            collectedCodes: {\n              ...state.context.multiStep2FA.collectedCodes,\n              [codeKey]: action.code,\n            },\n          },\n        });\n      }\n      break;\n\n    case 'POLL_FACE_VERIFICATION':\n      // Transition to processing for re-invocation (server checks FACE completion)\n      if (state.type === 'withdraw:error2FAMultiStep') {\n        return createTransition('withdraw:processing', state.context);\n      }\n      break;\n\n    case 'POLL_ROAMING_FIDO_VERIFICATION':\n      // Transition to processing for re-invocation (server checks ROAMING_FIDO completion)\n      if (state.type === 'withdraw:error2FAMultiStep') {\n        return createTransition('withdraw:processing', state.context);\n      }\n      break;\n\n    case 'WITHDRAWAL_2FA_INCOMPLETE':\n      // Update step statuses and remain in multi-step 2FA state\n      if (state.context.multiStep2FA) {\n        return createTransition('withdraw:error2FAMultiStep', state.context, {\n          multiStep2FA: {\n            ...state.context.multiStep2FA,\n            bizNo: action.result.bizNo,\n            steps: action.result.steps,\n            relation: action.result.relation,\n            // Update FACE step QR code if present\n            faceQrCodeUrl: action.result.steps.find(s => s.type === 'FACE')?.metadata?.qrCodeUrl || state.context.multiStep2FA.faceQrCodeUrl,\n            faceQrCodeExpiresAt: action.result.steps.find(s => s.type === 'FACE')?.metadata?.qrCodeValidSeconds\n              ? Date.now() + (action.result.steps.find(s => s.type === 'FACE')!.metadata!.qrCodeValidSeconds! * 1000)\n              : state.context.multiStep2FA.faceQrCodeExpiresAt,\n            // Update MFA verified state (PRIMARY source of truth)\n            mfa: action.result.mfa || state.context.multiStep2FA.mfa,\n          },\n        });\n      }\n      break;\n\n    case 'WITHDRAWAL_DRY_RUN_COMPLETE':\n      // All steps verified, transition to ready to confirm state\n      if (state.context.multiStep2FA) {\n        return createTransition('withdraw:readyToConfirm', state.context, {\n          multiStep2FA: {\n            ...state.context.multiStep2FA,\n            bizNo: action.result.bizNo || state.context.multiStep2FA.bizNo,\n            steps: action.result.steps || state.context.multiStep2FA.steps,\n            relation: action.result.relation || state.context.multiStep2FA.relation,\n            // Update MFA verified state (should all be true at this point)\n            mfa: action.result.mfa || state.context.multiStep2FA.mfa,\n          },\n        });\n      }\n      // If no multiStep2FA context, still transition to ready to confirm\n      return createTransition('withdraw:readyToConfirm', state.context);\n\n    case 'CONFIRM_WITHDRAWAL':\n      // User confirmed the withdrawal, transition to processing\n      return createTransition('withdraw:processing', state.context);\n\n\n    case 'WITHDRAWAL_2FA_METHOD_NOT_SUPPORTED':\n      const valid2FAMethods = action.result?.valid2FAMethods;\n      const errorMessage = generate2FAMethodErrorMessage(valid2FAMethods);\n      return createErrorTransition(\n        'withdraw:fatal',\n        {\n          ...state.context,\n          errorDetails: {\n            valid2FAMethods\n          }\n        },\n        new Error(errorMessage)\n      );\n\n    case 'WITHDRAWAL_SUCCESS':\n      if (instance.withdrawalMachine) {\n        instance.withdrawalMachine.send({\n          type: 'SUCCESS',\n          transactionId: action.transactionId\n        });\n      }\n      break;\n\n    case 'WITHDRAWAL_FATAL':\n      return createErrorTransition('withdraw:fatal', state.context, action.error);\n  }\n\n  return null;\n}\n\n/**\n * Handle transitions for withdrawal-related states\n */\nexport function handleWithdrawalStates(\n  state: FlowState,\n  action: FlowActionType,\n  instance: FlowMachineInstance\n): FlowState | null {\n  // Check if we're in a withdrawal state\n  const isWithdrawalState = [\n    'withdraw:processing',\n    'withdraw:error2FA',\n    'withdraw:error2FAMultiStep',\n    'withdraw:errorSMS',\n    'withdraw:errorKYC',\n    'withdraw:errorBalance',\n    'withdraw:retrying',\n    'withdraw:readyToConfirm'\n  ].includes(state.type);\n\n  if (!isWithdrawalState) {\n    return null;\n  }\n\n  // First check for machine state synchronization\n  const syncResult = syncWithdrawalMachineState(state, instance, action);\n  if (syncResult) {\n    return syncResult;\n  }\n\n  // Then handle direct actions\n  return handleWithdrawalActions(state, action, instance);\n}\n\n/**\n * Handle flow cancellation from any state\n */\nexport function handleCancelFlow(\n  state: FlowState,\n  action: FlowActionType,\n  instance: FlowMachineInstance\n): FlowState | null {\n  if (action.type === 'CANCEL_FLOW') {\n    if (instance.withdrawalMachine) {\n      instance.withdrawalMachine.dispose();\n      instance.withdrawalMachine = undefined;\n    }\n    return createTransition('flow:cancelled', state.context);\n  }\n  return null;\n}\n\n/**\n * Helper function to generate 2FA method error message\n */\nfunction generate2FAMethodErrorMessage(valid2FAMethods?: string[]): string {\n  if (!valid2FAMethods || valid2FAMethods.length === 0) {\n    return 'Please make sure your Exchange account has 2FA enabled.';\n  }\n\n  if (valid2FAMethods.length === 1) {\n    return `${valid2FAMethods[0]} is the only supported two-factor authentication method.`;\n  }\n\n  if (valid2FAMethods.length === 2) {\n    return `${valid2FAMethods[0]} and ${valid2FAMethods[1]} are the only supported two-factor authentication methods.`;\n  }\n\n  // For 3 or more methods: \"X, Y, ..., and Z are the only supported methods\"\n  const lastMethod = valid2FAMethods[valid2FAMethods.length - 1];\n  const otherMethods = valid2FAMethods.slice(0, -1).join(', ');\n  return `${otherMethods}, and ${lastMethod} are the only supported two-factor authentication methods.`;\n}\n","import { createMachine } from './createMachine';\nimport type { FlowState, FlowActionType, FlowContext } from '../types/flow.types';\nimport type { FlowMachineOptions, FlowMachineInstance } from './flowMachine.types';\nimport { DEFAULT_MAX_RETRY_ATTEMPTS, DEFAULT_AUTO_REFRESH_QUOTATION } from './stateHelpers';\nimport {\n  handleIdleState,\n  handleExchangeStates,\n  handleOAuthStates,\n  handleQRCodeStates,\n  handleWalletStates,\n  handleQuoteStates,\n  handleWithdrawalStates,\n  handleCancelFlow\n} from './flowStateHandlers';\n\nconst createInitialContext = (options: FlowMachineOptions): FlowContext => ({\n  orgId: options.orgId,\n  projectId: options.projectId,\n  retryAttempts: 0,\n  maxRetryAttempts: options.maxRetryAttempts || DEFAULT_MAX_RETRY_ATTEMPTS,\n  autoRefreshQuotation: options.autoRefreshQuotation !== undefined ? options.autoRefreshQuotation : DEFAULT_AUTO_REFRESH_QUOTATION,\n});\n\nconst initialState = (options: FlowMachineOptions): FlowState => ({\n  type: 'idle',\n  context: createInitialContext(options),\n  error: null\n});\n\n/**\n * Main flow transition function\n * Delegates to specialized handlers for each state group\n */\nfunction flowTransition(\n  state: FlowState,\n  action: FlowActionType,\n  instance: FlowMachineInstance\n): FlowState {\n  // Handle CANCEL_FLOW from any state first (highest priority)\n  const cancelResult = handleCancelFlow(state, action, instance);\n  if (cancelResult) return cancelResult;\n\n  // Try each handler in order - they return null if not applicable\n  const handlers = [\n    () => handleIdleState(state, action),\n    () => handleExchangeStates(state, action),\n    () => handleOAuthStates(state, action),\n    () => handleQRCodeStates(state, action),\n    () => handleWalletStates(state, action),\n    () => handleQuoteStates(state, action, instance),\n    () => handleWithdrawalStates(state, action, instance)\n  ];\n\n  for (const handler of handlers) {\n    const result = handler();\n    if (result !== null) {\n      return result;\n    }\n  }\n\n  // No handler matched - return current state unchanged\n  return state;\n}\n\nexport function createFlowMachine(options: FlowMachineOptions) {\n  const instance: FlowMachineInstance = {\n    machine: null as any,\n    withdrawalMachine: undefined\n  };\n\n  const transition = (state: FlowState, action: FlowActionType) => \n    flowTransition(state, action, instance);\n\n  instance.machine = createMachine(initialState(options), transition);\n\n  // Dispose nested machines when parent is disposed\n  const originalDispose = instance.machine.dispose;\n  instance.machine.dispose = () => {\n    if (instance.withdrawalMachine) {\n      instance.withdrawalMachine.dispose();\n    }\n    originalDispose();\n  };\n\n  return instance.machine;\n}","/**\n * Centralized error codes for the entire system\n * This file contains all error codes used in both sync (API) and async (workflow) contexts\n * Copy this file to the SDK to maintain consistency\n */\n\n/**\n * Error codes for all system errors\n * Format: CATEGORY_SPECIFIC_ERROR\n */\nexport const ERROR_CODES = {\n    // Generic errors\n    GENERIC_NOT_FOUND: 'GENERIC_NOT_FOUND',\n    GENERIC_UNAUTHORIZED: 'GENERIC_UNAUTHORIZED',\n    GENERIC_INTERNAL_SERVER_ERROR: 'GENERIC_INTERNAL_SERVER_ERROR',\n    GENERIC_VALIDATION_ERROR: 'GENERIC_VALIDATION_ERROR',\n    GENERIC_INVALID_REQUEST: 'GENERIC_INVALID_REQUEST',\n\n    // API Key errors\n    APIKEY_INSUFFICIENT_PERMISSIONS: 'APIKEY_INSUFFICIENT_PERMISSIONS',\n\n    // Wallet errors\n    WALLET_NOT_FOUND: 'WALLET_NOT_FOUND',\n    WALLET_INVALID_CREDENTIALS: 'WALLET_INVALID_CREDENTIALS',\n\n    // Quote errors\n    QUOTE_NOT_FOUND: 'QUOTE_NOT_FOUND',\n    QUOTE_EXPIRED: 'QUOTE_EXPIRED',\n\n    // Withdrawal errors - Balance\n    WITHDRAWAL_INSUFFICIENT_BALANCE: 'WITHDRAWAL_INSUFFICIENT_BALANCE',\n    WITHDRAWAL_INSUFFICIENT_BALANCE_FOR_FEE: 'WITHDRAWAL_INSUFFICIENT_BALANCE_FOR_FEE',\n\n    // Withdrawal errors - Address\n    WITHDRAWAL_INVALID_ADDRESS: 'WITHDRAWAL_INVALID_ADDRESS',\n    WITHDRAWAL_NETWORK_NOT_SUPPORTED: 'WITHDRAWAL_NETWORK_NOT_SUPPORTED',\n    WITHDRAWAL_TOO_MANY_ADDRESSES: 'WITHDRAWAL_TOO_MANY_ADDRESSES',\n\n    // Withdrawal errors - Amount\n    WITHDRAWAL_AMOUNT_BELOW_MINIMUM: 'WITHDRAWAL_AMOUNT_BELOW_MINIMUM',\n    WITHDRAWAL_AMOUNT_ABOVE_MAXIMUM: 'WITHDRAWAL_AMOUNT_ABOVE_MAXIMUM',\n\n    // Withdrawal errors - Asset\n    WITHDRAWAL_ASSET_NOT_SUPPORTED: 'WITHDRAWAL_ASSET_NOT_SUPPORTED',\n\n    // Withdrawal errors - Provider\n    WITHDRAWAL_PROVIDER_ERROR: 'WITHDRAWAL_PROVIDER_ERROR',\n\n    // Withdrawal errors - 2FA\n    WITHDRAWAL_2FA_REQUIRED_TOTP: 'WITHDRAWAL_2FA_REQUIRED_TOTP',\n    WITHDRAWAL_2FA_REQUIRED_SMS: 'WITHDRAWAL_2FA_REQUIRED_SMS',\n    WITHDRAWAL_2FA_REQUIRED_FACE_RECOGNITION: 'WITHDRAWAL_2FA_REQUIRED_FACE_RECOGNITION',\n    WITHDRAWAL_2FA_REQUIRED_EMAIL: 'WITHDRAWAL_2FA_REQUIRED_EMAIL',\n    WITHDRAWAL_2FA_REQUIRED_YUBIKEY: 'WITHDRAWAL_2FA_REQUIRED_YUBIKEY',\n    WITHDRAWAL_2FA_REQUIRED_PASSPHRASE: 'WITHDRAWAL_2FA_REQUIRED_PASSPHRASE',\n    WITHDRAWAL_2FA_REQUIRED_MULTI_STEPS: 'WITHDRAWAL_2FA_REQUIRED_MULTI_STEPS',\n\n    WITHDRAWAL_2FA_INCOMPLETE: 'WITHDRAWAL_2FA_INCOMPLETE',\n\n    WITHDRAWAL_2FA_INVALID: 'WITHDRAWAL_2FA_INVALID',\n    WITHDRAWAL_2FA_METHOD_NOT_SUPPORTED: 'WITHDRAWAL_2FA_METHOD_NOT_SUPPORTED',\n\n    // Withdrawal errors - Verification\n    WITHDRAWAL_KYC_REQUIRED: 'WITHDRAWAL_KYC_REQUIRED',\n    WITHDRAWAL_EMAIL_UNVERIFIED: 'WITHDRAWAL_EMAIL_UNVERIFIED',\n\n    // Withdrawal errors - Rate Limiting\n    WITHDRAWAL_RATE_LIMIT_EXCEEDED: 'WITHDRAWAL_RATE_LIMIT_EXCEEDED',\n\n    // OAuth errors\n    OAUTH_AUTHORIZATION_FAILED: 'OAUTH_AUTHORIZATION_FAILED',\n    OAUTH_TOKEN_EXCHANGE_FAILED: 'OAUTH_TOKEN_EXCHANGE_FAILED',\n    OAUTH_INVALID_STATE: 'OAUTH_INVALID_STATE',\n    OAUTH_INSUFFICIENT_SCOPE: 'OAUTH_INSUFFICIENT_SCOPE',\n\n    // Webhook errors\n    WEBHOOK_SIGNATURE_INVALID: 'WEBHOOK_SIGNATURE_INVALID',\n    WEBHOOK_MISSING_HEADERS: 'WEBHOOK_MISSING_HEADERS',\n    WEBHOOK_INVALID_TIMESTAMP: 'WEBHOOK_INVALID_TIMESTAMP',\n\n    // Cache errors\n    CACHE_MISS: 'CACHE_MISS',\n    CACHE_EXPIRED: 'CACHE_EXPIRED',\n    CACHE_INVALID_PATH: 'CACHE_INVALID_PATH',\n\n    // Withdrawal - Dry Run (success signal, not a real error)\n    WITHDRAWAL_DRY_RUN_COMPLETE: 'WITHDRAWAL_DRY_RUN_COMPLETE',\n} as const;\n\nexport type ErrorCode = typeof ERROR_CODES[keyof typeof ERROR_CODES];\n\n/**\n * Serializable error format that can be passed through workflows\n * This preserves all error information without losing type safety\n */\nexport interface SerializedError {\n  code: ErrorCode;\n  message: string;\n  timestamp: string;\n  originalError?: unknown;\n}\n\n/**\n * API error response format\n */\nexport interface ApiErrorResponse {\n  error?: string | { error?: string; type?: ErrorCode; errorCode?: ErrorCode };\n  type?: ErrorCode;\n  errorCode?: ErrorCode;\n  code?: ErrorCode;\n  result?: unknown;\n  message?: string;\n}\n\n/**\n * Legacy Axios error format\n */\nexport interface LegacyAxiosError {\n  response?: {\n    data?: {\n      type?: ErrorCode;\n      result?: unknown;\n    };\n  };\n}\n\n/**\n * Union type representing all possible error formats\n */\nexport type BluvoError =\n  | SerializedError\n  | ApiErrorResponse\n  | LegacyAxiosError\n  | Error\n  | unknown;\n\n/**\n * Check if an error object is a serialized error\n */\nexport function isSerializedError(error: BluvoError): error is SerializedError {\n  return error != null &&\n    typeof error === 'object' &&\n    'code' in error &&\n    'message' in error &&\n    Object.values(ERROR_CODES).includes((error as SerializedError).code);\n}\n\n/**\n * Extract error code from various error formats\n */\nexport function extractErrorCode(error: BluvoError): ErrorCode | null {\n  if (error == null) {\n    return null;\n  }\n\n  if (typeof error !== 'object') {\n    return null;\n  }\n\n  const err = error as Record<string, unknown>;\n\n  // Check errorCode field (new format)\n  if (err.errorCode && Object.values(ERROR_CODES).includes(err.errorCode as ErrorCode)) {\n    return err.errorCode as ErrorCode;\n  }\n\n  // Check type field (new format)\n  if (err.type && Object.values(ERROR_CODES).includes(err.type as ErrorCode)) {\n    return err.type as ErrorCode;\n  }\n\n  // Check code field\n  if (err.code && Object.values(ERROR_CODES).includes(err.code as ErrorCode)) {\n    return err.code as ErrorCode;\n  }\n\n  // Check if it's a serialized error\n  if (isSerializedError(error)) {\n    return error.code;\n  }\n\n  // Check nested response.data.type (legacy axios format)\n  const legacyError = err as LegacyAxiosError;\n  if (legacyError.response?.data?.type && Object.values(ERROR_CODES).includes(legacyError.response.data.type)) {\n    return legacyError.response.data.type;\n  }\n\n  return null;\n}\n\n/**\n * Comprehensive error type information\n * Includes both validated error codes and raw type strings\n */\nexport interface ErrorTypeInfo {\n  /** Known error code from ERROR_CODES, null if not recognized */\n  knownCode: ErrorCode | null;\n  /** Raw type string from error object (even if unknown), null if not found */\n  rawType: string | null;\n}\n\n/**\n * Extract comprehensive error type information from an error object\n *\n * This function provides maximum flexibility by returning both:\n * - `knownCode`: Only set if the error code is in ERROR_CODES (validated)\n * - `rawType`: Any type/errorCode/code string found, even if unknown\n *\n * This allows callers to handle known errors specifically while still\n * preserving unknown error codes for logging/debugging.\n *\n * @param error The error object to extract type information from\n * @returns Object with knownCode and rawType properties\n *\n * @example\n * const info = extractErrorTypeInfo(error);\n * if (info.knownCode === ERROR_CODES.WITHDRAWAL_INSUFFICIENT_BALANCE) {\n *   // Handle known error\n * } else if (info.rawType) {\n *   // Log unknown error code\n *   console.log('Unknown error:', info.rawType);\n * }\n */\nexport function extractErrorTypeInfo(error: BluvoError): ErrorTypeInfo {\n  // First, try to get a known/validated error code\n  const knownCode = extractErrorCode(error);\n\n  // If we have a known code, use it as rawType too\n  if (knownCode) {\n    return { knownCode, rawType: knownCode };\n  }\n\n  // No known code found, but try to extract ANY type string\n  // This handles unknown/future error codes gracefully\n  if (error == null || typeof error !== 'object') {\n    return { knownCode: null, rawType: null };\n  }\n\n  const err = error as Record<string, unknown>;\n\n  // Check direct fields in priority order: type, errorCode, code\n  const rawType = err.type || err.errorCode || err.code;\n\n  if (rawType && typeof rawType === 'string' && rawType.length > 0) {\n    return { knownCode: null, rawType };\n  }\n\n  // Check legacy axios format: response.data.type\n  const legacyError = err as LegacyAxiosError;\n  if (legacyError.response?.data?.type) {\n    const legacyType = legacyError.response.data.type;\n    if (typeof legacyType === 'string' && legacyType.length > 0) {\n      return { knownCode: null, rawType: legacyType };\n    }\n  }\n\n  // No type information found at all\n  return { knownCode: null, rawType: null };\n}\n\n/**\n * Extract error result from various error formats\n */\nexport function extractErrorResult(error: BluvoError): unknown {\n  if (error == null || typeof error !== 'object') {\n    return null;\n  }\n\n  const err = error as Record<string, unknown>;\n\n  // Check if error has a result field directly\n  if ('result' in err) {\n    return err.result;\n  }\n\n  // Check if error has nested result in response data\n  const legacyError = err as LegacyAxiosError;\n  if (legacyError.response?.data?.result) {\n    return legacyError.response.data.result;\n  }\n\n  // Check in originalError if it's a serialized error\n  if ('originalError' in err && err.originalError != null && typeof err.originalError === 'object' && 'result' in err.originalError) {\n    return (err.originalError as Record<string, unknown>).result;\n  }\n\n  return null;\n}\n\n// Legacy compatibility - keep old constants but map to new error codes\n// These will be deprecated in future versions\nexport const WITHDRAWAL_QUOTATION_ERROR_TYPES = {\n  INSUFFICIENT_BALANCE: ERROR_CODES.WITHDRAWAL_INSUFFICIENT_BALANCE,\n  INSUFFICIENT_BALANCE_CANNOT_COVER_FEE: ERROR_CODES.WITHDRAWAL_INSUFFICIENT_BALANCE_FOR_FEE,\n  AMOUNT_BELOW_MINIMUM: ERROR_CODES.WITHDRAWAL_AMOUNT_BELOW_MINIMUM,\n  AMOUNT_ABOVE_MAXIMUM: ERROR_CODES.WITHDRAWAL_AMOUNT_ABOVE_MAXIMUM,\n  INVALID_ADDRESS: ERROR_CODES.WITHDRAWAL_INVALID_ADDRESS,\n  NETWORK_NOT_SUPPORTED: ERROR_CODES.WITHDRAWAL_NETWORK_NOT_SUPPORTED,\n} as const;\n\nexport const WITHDRAWAL_EXECUTION_ERROR_TYPES = {\n  TWO_FACTOR_REQUIRED: ERROR_CODES.WITHDRAWAL_2FA_REQUIRED_TOTP,\n  SMS_CODE_REQUIRED: ERROR_CODES.WITHDRAWAL_2FA_REQUIRED_SMS,\n  KYC_REQUIRED: ERROR_CODES.WITHDRAWAL_KYC_REQUIRED,\n  INSUFFICIENT_BALANCE: ERROR_CODES.WITHDRAWAL_INSUFFICIENT_BALANCE,\n  RESOURCE_EXHAUSTED: ERROR_CODES.QUOTE_EXPIRED,\n} as const;","import type { WalletwithdrawbalancebalanceResponse } from \"../../generated\";\n\n/**\n * Raw balance data from the API\n */\ntype RawBalance = WalletwithdrawbalancebalanceResponse[\"balances\"][number];\n\n/**\n * Raw network data from the API\n */\ntype RawNetwork = RawBalance[\"networks\"][number];\n\n/**\n * Transformed network for state machine\n */\nexport interface TransformedNetwork {\n\tid: string;\n\tname: string;\n\tdisplayName: string;\n\tminWithdrawal: string;\n\tmaxWithdrawal?: string;\n\tassetName: string;\n\taddressRegex?: string;\n\tchainId?: RawNetwork[\"chainId\"];\n\ttokenAddress?: RawNetwork[\"tokenAddress\"];\n\tcontractAddress?: string | null;\n\tcontractAddressVerified?: boolean | null;\n}\n\n/**\n * Transformed balance for state machine\n */\nexport interface TransformedBalance {\n\tasset: string;\n\tbalance: string;\n\tbalanceInFiat?: string;\n\tnetworks?: TransformedNetwork[];\n\textra?: {\n\t\tslug?: string;\n\t\tassetId?: string;\n\t};\n}\n\n/**\n * Transform a raw network from the API to the format expected by the state machine\n */\nfunction transformNetwork(network: RawNetwork): TransformedNetwork {\n\tconst transformed: TransformedNetwork = {\n\t\tid: network.id,\n\t\tname: network.name,\n\t\tdisplayName: network.displayName,\n\t\tminWithdrawal: network.minWithdrawal,\n\t\tmaxWithdrawal: network.maxWithdrawal,\n\t\tassetName: network.assetName,\n\t\t// contractAddressVerified defaults to true if null or undefined\n\t\tcontractAddressVerified: network.contractAddressVerified ?? true,\n\t};\n\n\t// Only include optional fields if they have meaningful values (not null or undefined)\n\tif (network.addressRegex !== null && network.addressRegex !== undefined) {\n\t\ttransformed.addressRegex = network.addressRegex;\n\t}\n\n\tif (network.chainId !== null && network.chainId !== undefined) {\n\t\ttransformed.chainId = network.chainId;\n\t}\n\n\tif (network.tokenAddress !== null && network.tokenAddress !== undefined) {\n\t\ttransformed.tokenAddress = network.tokenAddress;\n\t}\n\n\tif (network.contractAddress !== null && network.contractAddress !== undefined) {\n\t\ttransformed.contractAddress = network.contractAddress;\n\t}\n\n\treturn transformed;\n}\n\n/**\n * Transform a raw balance from the API to the format expected by the state machine\n */\nfunction transformBalance(balance: RawBalance): TransformedBalance {\n\tconst transformed: TransformedBalance = {\n\t\tasset: balance.asset,\n\t\tbalance: String(balance.amount),\n\t\tnetworks: balance.networks.map(transformNetwork),\n\t};\n\n\t// Include balanceInFiat if amountInFiat is present (including 0)\n\tif (balance.amountInFiat !== undefined) {\n\t\ttransformed.balanceInFiat = String(balance.amountInFiat);\n\t}\n\n\t// Include extra if present\n\tif (balance.extra !== undefined) {\n\t\ttransformed.extra = balance.extra;\n\t}\n\n\treturn transformed;\n}\n\n/**\n * Simplified balance for preview (without networks)\n */\nexport interface PreviewBalance {\n\tasset: string;\n\tbalance: string;\n\tbalanceInFiat?: string;\n\textra?: {\n\t\tslug?: string;\n\t\tassetId?: string;\n\t};\n}\n\n/**\n * Transform a raw balance to preview format (without networks)\n */\nfunction transformBalanceForPreview(balance: RawBalance): PreviewBalance {\n\tconst transformed: PreviewBalance = {\n\t\tasset: balance.asset,\n\t\tbalance: String(balance.amount),\n\t};\n\n\t// Include balanceInFiat if amountInFiat is present (including 0)\n\tif (balance.amountInFiat !== undefined) {\n\t\ttransformed.balanceInFiat = String(balance.amountInFiat);\n\t}\n\n\t// Include extra if present\n\tif (balance.extra !== undefined) {\n\t\ttransformed.extra = balance.extra;\n\t}\n\n\treturn transformed;\n}\n\n/**\n * Transform an array of raw balances from the API to the format expected by the state machine\n *\n * This utility consolidates all the repetitive balance transformation logic that was\n * scattered across BluvoFlowClient and BluvoPreviewManager.\n *\n * @param balances - Raw balance data from WalletwithdrawbalancebalanceResponse\n * @returns Transformed balances ready for state machine consumption\n *\n * @example\n * ```typescript\n * const { data: withdrawableBalanceInfo } = await fetchWithdrawableBalanceFn(walletId);\n * const balances = transformBalances(withdrawableBalanceInfo.balances);\n * ```\n */\nexport function transformBalances(balances: RawBalance[]): TransformedBalance[] {\n\treturn balances.map(transformBalance);\n}\n\n/**\n * Transform an array of raw balances for preview display (without network details)\n *\n * This is a lighter-weight transformation used by BluvoPreviewManager that only\n * includes basic balance information without network configuration.\n *\n * @param balances - Raw balance data from WalletwithdrawbalancebalanceResponse\n * @returns Preview balances without network details\n *\n * @example\n * ```typescript\n * const { data: balanceResponse } = await fetchWithdrawableBalanceFn(walletId);\n * const balances = transformBalancesForPreview(balanceResponse.balances);\n * ```\n */\nexport function transformBalancesForPreview(balances: RawBalance[]): PreviewBalance[] {\n\treturn balances.map(transformBalanceForPreview);\n}\n","import type { FlowActionType } from '../types/flow.types';\nimport type { Machine } from '../types/machine.types';\nimport type { FlowState } from '../types/flow.types';\nimport {\n  type BluvoError,\n  ERROR_CODES,\n  extractErrorCode,\n  extractErrorResult,\n  WITHDRAWAL_EXECUTION_ERROR_TYPES\n} from '../error-codes';\n\n/**\n * Maps error codes to flow machine actions\n * Centralized error handling logic to avoid duplication\n */\nexport class WithdrawalErrorHandler {\n  /**\n   * Handle withdrawal execution errors and send appropriate actions to the flow machine\n   * @param error The error to handle\n   * @param flowMachine The flow machine to send actions to\n   * @returns True if the error was handled, false otherwise\n   */\n  static handleWithdrawalError(\n    error: BluvoError,\n    flowMachine: Machine<FlowState, FlowActionType> | undefined\n  ): boolean {\n    if (!flowMachine) {\n      return false;\n    }\n\n    const errorCode = extractErrorCode(error);\n\n    // Map error codes to actions\n    const action = this.mapErrorCodeToAction(errorCode, error);\n    if (action) {\n      flowMachine.send(action);\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Map error code to flow machine action\n   */\n  private static mapErrorCodeToAction(\n    errorCode: string | null,\n    error: BluvoError\n  ): FlowActionType | null {\n    if (!errorCode) {\n      // If no error code, send generic fatal error\n      return {\n        type: 'WITHDRAWAL_FATAL',\n        error: error instanceof Error ? error : new Error(\n          (error as any)?.error || (error as any)?.message || 'Failed to execute withdrawal'\n        )\n      };\n    }\n\n    switch (errorCode) {\n      // 2FA Requirements\n      case ERROR_CODES.WITHDRAWAL_2FA_REQUIRED_TOTP:\n      case WITHDRAWAL_EXECUTION_ERROR_TYPES.TWO_FACTOR_REQUIRED:\n        return { type: 'WITHDRAWAL_REQUIRES_2FA' };\n\n      case ERROR_CODES.WITHDRAWAL_2FA_REQUIRED_SMS:\n      case WITHDRAWAL_EXECUTION_ERROR_TYPES.SMS_CODE_REQUIRED:\n        return { type: 'WITHDRAWAL_REQUIRES_SMS' };\n\n      // Multi-step 2FA Requirements\n      case ERROR_CODES.WITHDRAWAL_2FA_REQUIRED_MULTI_STEPS:\n        return {\n          type: 'WITHDRAWAL_REQUIRES_2FA_MULTI_STEPS',\n          result: extractErrorResult(error) as {\n            bizNo: string;\n            steps: Array<{\n              type: 'GOOGLE' | 'EMAIL' | 'FACE' | 'SMS' | 'ROAMING_FIDO';\n              status: 'pending' | 'success' | 'failed';\n              required: boolean;\n              metadata?: {\n                email?: string;\n                emailSent?: boolean;\n                qrCodeUrl?: string;\n                qrCodeValidSeconds?: number;\n                roamingFlowId?: string;\n              };\n            }>;\n            relation: 'AND' | 'OR';\n            mfa?: {\n              verified: {\n                GOOGLE?: boolean;\n                EMAIL?: boolean;\n                FACE?: boolean;\n                SMS?: boolean;\n                ROAMING_FIDO?: boolean;\n              };\n            };\n          }\n        };\n\n      case ERROR_CODES.WITHDRAWAL_2FA_INCOMPLETE:\n        return {\n          type: 'WITHDRAWAL_2FA_INCOMPLETE',\n          result: extractErrorResult(error) as {\n            bizNo: string;\n            steps: Array<{\n              type: 'GOOGLE' | 'EMAIL' | 'FACE' | 'SMS' | 'ROAMING_FIDO';\n              status: 'pending' | 'success' | 'failed';\n              required: boolean;\n              metadata?: {\n                email?: string;\n                emailSent?: boolean;\n                qrCodeUrl?: string;\n                qrCodeValidSeconds?: number;\n                roamingFlowId?: string;\n              };\n            }>;\n            relation: 'AND' | 'OR';\n            mfa?: {\n              verified: {\n                GOOGLE?: boolean;\n                EMAIL?: boolean;\n                FACE?: boolean;\n                SMS?: boolean;\n                ROAMING_FIDO?: boolean;\n              };\n            };\n          }\n        };\n\n      case ERROR_CODES.WITHDRAWAL_DRY_RUN_COMPLETE:\n        return {\n          type: 'WITHDRAWAL_DRY_RUN_COMPLETE',\n          result: extractErrorResult(error) as {\n            bizNo: string;\n            steps: Array<{\n              type: 'GOOGLE' | 'EMAIL' | 'FACE' | 'SMS' | 'ROAMING_FIDO';\n              status: 'pending' | 'success' | 'failed';\n              required: boolean;\n              metadata?: {\n                email?: string;\n                emailSent?: boolean;\n                qrCodeUrl?: string;\n                qrCodeValidSeconds?: number;\n                roamingFlowId?: string;\n              };\n            }>;\n            relation: 'AND' | 'OR';\n            mfa?: {\n              verified: {\n                GOOGLE?: boolean;\n                EMAIL?: boolean;\n                FACE?: boolean;\n                SMS?: boolean;\n                ROAMING_FIDO?: boolean;\n              };\n            };\n          }\n        };\n\n      // KYC Requirements\n      case ERROR_CODES.WITHDRAWAL_KYC_REQUIRED:\n      case WITHDRAWAL_EXECUTION_ERROR_TYPES.KYC_REQUIRED:\n        return { type: 'WITHDRAWAL_REQUIRES_KYC' };\n\n      // Balance Issues\n      case ERROR_CODES.WITHDRAWAL_INSUFFICIENT_BALANCE:\n      case WITHDRAWAL_EXECUTION_ERROR_TYPES.INSUFFICIENT_BALANCE:\n        return { type: 'WITHDRAWAL_INSUFFICIENT_BALANCE' };\n\n      // Quote Expiration\n      case ERROR_CODES.QUOTE_EXPIRED:\n      case WITHDRAWAL_EXECUTION_ERROR_TYPES.RESOURCE_EXHAUSTED:\n        return { type: 'QUOTE_EXPIRED' };\n\n      // 2FA Method Not Supported\n      case ERROR_CODES.WITHDRAWAL_2FA_METHOD_NOT_SUPPORTED:\n        return {\n          type: 'WITHDRAWAL_2FA_METHOD_NOT_SUPPORTED',\n          result: extractErrorResult(error) as { valid2FAMethods?: string[] } | undefined\n        };\n\n      // Fatal Errors (cannot retry or recover)\n      case ERROR_CODES.WITHDRAWAL_INVALID_ADDRESS:\n        return {\n          type: 'WITHDRAWAL_FATAL',\n          error: new Error('Invalid destination address')\n        };\n\n      case ERROR_CODES.WITHDRAWAL_AMOUNT_BELOW_MINIMUM:\n        return {\n          type: 'WITHDRAWAL_FATAL',\n          error: new Error('Amount below minimum')\n        };\n\n      case ERROR_CODES.WITHDRAWAL_AMOUNT_ABOVE_MAXIMUM:\n        return {\n          type: 'WITHDRAWAL_FATAL',\n          error: new Error('Amount above maximum')\n        };\n\n      // Default: treat as fatal error\n      default:\n        return {\n          type: 'WITHDRAWAL_FATAL',\n          error: error instanceof Error ? error : new Error(\n            (error as any)?.error || (error as any)?.message || 'Failed to execute withdrawal'\n          )\n        };\n    }\n  }\n\n  /**\n   * Check if an error is recoverable (can retry or provide additional info)\n   */\n  static isRecoverableError(error: BluvoError): boolean {\n    const errorCode = extractErrorCode(error);\n    if (!errorCode) {\n      return false;\n    }\n\n    const recoverableErrors = [\n      ERROR_CODES.WITHDRAWAL_2FA_REQUIRED_TOTP,\n      ERROR_CODES.WITHDRAWAL_2FA_REQUIRED_SMS,\n      ERROR_CODES.WITHDRAWAL_2FA_REQUIRED_MULTI_STEPS,\n      ERROR_CODES.WITHDRAWAL_2FA_INCOMPLETE,\n      ERROR_CODES.WITHDRAWAL_2FA_INVALID,\n      ERROR_CODES.WITHDRAWAL_KYC_REQUIRED,\n      ERROR_CODES.WITHDRAWAL_INSUFFICIENT_BALANCE,\n      ERROR_CODES.QUOTE_EXPIRED,\n      WITHDRAWAL_EXECUTION_ERROR_TYPES.TWO_FACTOR_REQUIRED,\n      WITHDRAWAL_EXECUTION_ERROR_TYPES.SMS_CODE_REQUIRED,\n      WITHDRAWAL_EXECUTION_ERROR_TYPES.KYC_REQUIRED,\n      WITHDRAWAL_EXECUTION_ERROR_TYPES.INSUFFICIENT_BALANCE,\n      WITHDRAWAL_EXECUTION_ERROR_TYPES.RESOURCE_EXHAUSTED\n    ];\n\n    return recoverableErrors.includes(errorCode as any);\n  }\n\n  /**\n   * Check if an error is fatal (cannot recover)\n   */\n  static isFatalError(error: BluvoError): boolean {\n    return !this.isRecoverableError(error);\n  }\n}\n","import type { QRCodeAuthWorkflowMessageBody } from \"./WorkflowTypes\";\n\n/**\n * Async cache adapter interface.\n * By default, Bluvo uses localStorage. Users can provide their own\n * async get/set implementation (e.g., IndexedDB, sessionStorage, etc.).\n */\nexport interface BluvoCacheAdapter {\n\tget: (key: string) => Promise<string | null> | string | null;\n\tset: (key: string, value: string) => Promise<void> | void;\n\tremove: (key: string) => Promise<void> | void;\n}\n\nexport interface BluvoCacheOptions {\n\t/**\n\t * Custom cache adapter. Defaults to localStorage.\n\t */\n\tadapter?: BluvoCacheAdapter;\n\n\t/**\n\t * Prefix for all cache keys. Defaults to \"bluvo:\".\n\t */\n\tprefix?: string;\n\n\t/**\n\t * Minimum remaining lifetime (in seconds) for a cached QR code to be considered valid.\n\t * If the QR code expires within this threshold, the cache is ignored.\n\t * Defaults to 15 seconds.\n\t */\n\tminRemainingLifetimeSec?: number;\n\n\t/**\n\t * Disable caching entirely. Defaults to false.\n\t */\n\tdisabled?: boolean;\n}\n\ninterface CachedQRCode {\n\tmessage: QRCodeAuthWorkflowMessageBody;\n\tcachedAt: number;\n}\n\nconst QRCODE_CACHE_KEY_SUFFIX = \"qrcode\";\n\n/**\n * Default localStorage adapter. Silently fails if localStorage is unavailable.\n */\nfunction createLocalStorageAdapter(): BluvoCacheAdapter {\n\treturn {\n\t\tget(key: string): string | null {\n\t\t\ttry {\n\t\t\t\tif (typeof localStorage !== \"undefined\") {\n\t\t\t\t\treturn localStorage.getItem(key);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// localStorage may throw in some environments (e.g., Safari private browsing)\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset(key: string, value: string): void {\n\t\t\ttry {\n\t\t\t\tif (typeof localStorage !== \"undefined\") {\n\t\t\t\t\tlocalStorage.setItem(key, value);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Silently fail - cache is best-effort\n\t\t\t}\n\t\t},\n\t\tremove(key: string): void {\n\t\t\ttry {\n\t\t\t\tif (typeof localStorage !== \"undefined\") {\n\t\t\t\t\tlocalStorage.removeItem(key);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Silently fail\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport class BluvoCache {\n\tprivate adapter: BluvoCacheAdapter;\n\tprivate prefix: string;\n\tprivate minRemainingLifetimeSec: number;\n\tprivate disabled: boolean;\n\n\tconstructor(options?: BluvoCacheOptions) {\n\t\tthis.adapter = options?.adapter || createLocalStorageAdapter();\n\t\tthis.prefix = options?.prefix ?? \"bluvo:\";\n\t\tthis.minRemainingLifetimeSec = options?.minRemainingLifetimeSec ?? 15;\n\t\tthis.disabled = options?.disabled ?? false;\n\t}\n\n\tprivate buildKey(exchange: string, suffix: string): string {\n\t\treturn `${this.prefix}${exchange}:${suffix}`;\n\t}\n\n\t/**\n\t * Retrieve a cached QR code for the given exchange, if still valid.\n\t * Returns null if cache is empty, expired, or within the safety threshold.\n\t */\n\tasync getCachedQRCode(\n\t\texchange: string,\n\t): Promise<QRCodeAuthWorkflowMessageBody | null> {\n\t\tif (this.disabled) return null;\n\n\t\ttry {\n\t\t\tconst key = this.buildKey(exchange, QRCODE_CACHE_KEY_SUFFIX);\n\t\t\tconst raw = await this.adapter.get(key);\n\t\t\tif (!raw) return null;\n\n\t\t\tconst cached: CachedQRCode = JSON.parse(raw);\n\t\t\tif (!cached?.message) return null;\n\n\t\t\tconst expiresAt = cached.message.qrCodeExpiresAt;\n\t\t\tif (!expiresAt) {\n\t\t\t\t// No expiration info - don't use cache (can't verify validity)\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst now = Date.now();\n\t\t\tconst remainingMs = expiresAt - now;\n\t\t\tconst thresholdMs = this.minRemainingLifetimeSec * 1000;\n\n\t\t\tif (remainingMs <= thresholdMs) {\n\t\t\t\t// QR code is expired or too close to expiring - remove and skip\n\t\t\t\tawait this.adapter.remove(key);\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn cached.message;\n\t\t} catch {\n\t\t\t// Parse error or adapter failure - silently ignore\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Cache a QR code message for the given exchange.\n\t * Only caches if the message has both a URL and expiration time.\n\t */\n\tasync cacheQRCode(\n\t\texchange: string,\n\t\tmessage: QRCodeAuthWorkflowMessageBody,\n\t): Promise<void> {\n\t\tif (this.disabled) return;\n\t\tif (!message.qrCodeUrl || !message.qrCodeExpiresAt) return;\n\n\t\ttry {\n\t\t\tconst key = this.buildKey(exchange, QRCODE_CACHE_KEY_SUFFIX);\n\t\t\tconst cached: CachedQRCode = {\n\t\t\t\tmessage,\n\t\t\t\tcachedAt: Date.now(),\n\t\t\t};\n\t\t\tawait this.adapter.set(key, JSON.stringify(cached));\n\t\t} catch {\n\t\t\t// Silently fail - cache is best-effort\n\t\t}\n\t}\n\n\t/**\n\t * Remove cached QR code for the given exchange.\n\t */\n\tasync removeCachedQRCode(\n\t\texchange: string,\n\t): Promise<void> {\n\t\tif (this.disabled) return;\n\n\t\ttry {\n\t\t\tconst key = this.buildKey(exchange, QRCODE_CACHE_KEY_SUFFIX);\n\t\t\tawait this.adapter.remove(key);\n\t\t} catch {\n\t\t\t// Silently fail\n\t\t}\n\t}\n}\n","import type {\n    Oauth2ExchangeslistexchangesResponses, TypeEnum2,\n} from \"../../generated\";\nimport type { BluvoClient } from \"../BluvoClient\";\nimport { BluvoWebClient } from \"../BluvoWebClient\";\nimport {\n\ttype BluvoError,\n\tERROR_CODES,\n\textractErrorCode,\n\textractErrorResult,\n\textractErrorTypeInfo,\n\tWITHDRAWAL_QUOTATION_ERROR_TYPES,\n} from \"../error-codes\";\nimport type { FlowActionType, FlowState } from \"../types/flow.types\";\nimport type { Machine } from \"../types/machine.types\";\nimport type { Subscription } from \"../WebSocketClient\";\nimport {\n\ttype WithdrawFundsWorkflowMessageBody,\n\ttype WorkflowMessageBody,\n\tWorkflowTypes,\n} from \"../WorkflowTypes\";\nimport { createFlowMachine } from \"./flowMachine\";\nimport { transformBalances } from \"../utils/balanceTransform\";\nimport { WithdrawalErrorHandler } from \"./withdrawalErrorHandler\";\nimport { BluvoCache, type BluvoCacheOptions } from \"../BluvoCache\";\nimport type { QRCodeAuthWorkflowMessageBody } from \"../WorkflowTypes\";\n\n// Exchanges that use QR code authentication instead of OAuth popup\nconst QR_CODE_EXCHANGES = ['binance-web', 'bybit-web'];\n\n// Default QR code timeout in milliseconds (5 minutes)\nconst DEFAULT_QRCODE_TIMEOUT_MS = 5 * 60 * 1000;\n\nexport interface BluvoFlowClientOptions {\n\torgId: string;\n\tprojectId: string;\n\tlistExchangesFn: BluvoClient[\"oauth2\"][\"listExchanges\"];\n\tfetchWithdrawableBalanceFn: BluvoClient[\"wallet\"][\"withdrawals\"][\"getWithdrawableBalance\"];\n\trequestQuotationFn: BluvoClient[\"wallet\"][\"withdrawals\"][\"requestQuotation\"];\n\texecuteWithdrawalFn: BluvoClient[\"wallet\"][\"withdrawals\"][\"executeWithdrawal\"];\n\tgetWalletByIdFn: BluvoClient[\"wallet\"][\"get\"];\n\tpingWalletByIdFn: BluvoClient[\"wallet\"][\"ping\"];\n\tmkUUIDFn?: () => string;\n\tonWalletConnectedFn?: (walletId: string, exchange: string) => any;\n\n\toptions?: {\n\t\tsandbox?: boolean;\n\t\tdev?: boolean;\n\t\tmaxRetryAttempts?: number;\n\t\tautoRefreshQuotation?: boolean;\n\t\tcustomDomain?:\n\t\t\t| string\n\t\t\t| \"api-bluvo.com\"\n\t\t\t| {\n\t\t\t\t\tapi: string;\n\t\t\t\t\tws: string;\n\t\t\t  };\n\t};\n\n\t/**\n\t * Cache configuration for persisting QR codes across page reloads.\n\t * By default uses localStorage with prefix \"bluvo:\" and 15-second safety threshold.\n\t * Pass `{ disabled: true }` to disable caching entirely, or provide a custom adapter.\n\t */\n\tcache?: BluvoCacheOptions;\n}\n\nexport interface WithdrawalFlowOptions {\n\texchange: string;\n\twalletId: string;\n\tpopupOptions?: {\n\t\ttitle?: string;\n\t\twidth?: number;\n\t\theight?: number;\n\t\tleft?: number;\n\t\ttop?: number;\n\t};\n}\n\nexport interface ResumeWithdrawalFlowOptions {\n\texchange: string;\n\twalletId: string;\n}\n\n/**\n * Options for silently resuming a withdrawal flow with preloaded balance data\n *\n * This interface allows you to resume a withdrawal flow for a wallet that\n * has already been previewed, jumping directly to the wallet:ready state\n * without requiring OAuth or re-fetching balance data.\n */\nexport interface SilentResumeWithdrawalFlowOptions {\n\t/** Wallet ID to resume */\n\twalletId: string;\n\n\t/** Exchange this wallet is connected to */\n\texchange: string;\n\n\t/** Pre-loaded balance data (if available from preview) */\n\tpreloadedBalances?: Array<{\n\t\tasset: string;\n\t\tbalance: string;\n\t\tbalanceInFiat?: string;\n\t\tnetworks?: Array<{\n\t\t\tid: string;\n\t\t\tname: string;\n\t\t\tdisplayName: string;\n\t\t\tminWithdrawal: string;\n\t\t\tmaxWithdrawal?: string;\n\t\t\tassetName: string;\n\t\t\taddressRegex?: string;\n\t\t}>;\n\t\textra?: {\n\t\t\tslug?: string;\n\t\t\tassetId?: string;\n\t\t};\n\t}>;\n\n\t/** Called when wallet is not found */\n\tonWalletNotFound?: (walletId: string) => void;\n\n\t/** Called when wallet has invalid API credentials */\n\tonWalletInvalidApiCredentials?: (walletId: string) => void;\n\n\t/** Called when wallet balance is loaded */\n\tonWalletBalance?: (walletId: string, balances: any[]) => void;\n}\n\nexport interface QuoteRequestOptions {\n\tasset: string;\n\tamount: string;\n\tdestinationAddress: string;\n\tnetwork?: string;\n\ttag?: string;\n\tincludeFee?: boolean;\n}\n\nexport interface LoadExchangesResult {\n\tsuccess: boolean;\n\terror?: string;\n\ttype?: TypeEnum2;\n\tresult?: Array<{\n\t\tid: string;\n\t\tname: string;\n\t\tlogoUrl: string;\n\t\tstatus: string;\n\t}>;\n}\n\nexport interface LoadWalletResult {\n\tsuccess: boolean;\n\terror?: string;\n\ttype?: TypeEnum2;\n\tresult?: {\n\t\tbalances: Array<{\n\t\t\tasset: string;\n\t\t\tbalance: string;\n\t\t\tbalanceInFiat?: string;\n\t\t\tnetworks?: Array<{\n\t\t\t\tid: string;\n\t\t\t\tname: string;\n\t\t\t\tdisplayName: string;\n\t\t\t\tminWithdrawal: string;\n\t\t\t\tmaxWithdrawal?: string;\n\t\t\t\tassetName: string;\n\t\t\t\taddressRegex?: string;\n\t\t\t}>;\n\t\t\textra?: {\n\t\t\t\tslug?: string;\n\t\t\t\tassetId?: string;\n\t\t\t};\n\t\t}>;\n\t};\n}\n\nexport interface ExecuteWithdrawalResult {\n\tsuccess: boolean;\n\terror?: string;\n\ttype?: TypeEnum2;\n\tresult?: any; // The data returned from executeWithdrawalFn (workflow/transaction info)\n}\n\nexport interface Submit2FAResult {\n\tsuccess: boolean;\n\terror?: string;\n\ttype?: TypeEnum2;\n\tresult?: any; // The data returned from executeWithdrawalFn after 2FA submission\n}\n\nexport class BluvoFlowClient {\n\tprivate webClient: BluvoWebClient;\n\tprivate flowMachine?: Machine<FlowState, FlowActionType>;\n\tprivate subscription?: Subscription | null;\n\tprivate generateId: () => string;\n\tprivate quoteRefreshTimer?: ReturnType<typeof setTimeout>;\n\tprivate qrCodeTimeoutTimer?: ReturnType<typeof setTimeout>;\n\tprivate cache: BluvoCache;\n\n\tconstructor(private options: BluvoFlowClientOptions) {\n\t\tthis.webClient = BluvoWebClient.createClient({\n\t\t\torgId: options.orgId,\n\t\t\tprojectId: options.projectId,\n\t\t\tsandbox: options.options?.sandbox,\n\t\t\tdev: options.options?.dev,\n\t\t\tcustomDomain: options.options?.customDomain,\n\t\t});\n\n\t\tthis.generateId = options.mkUUIDFn || (() => crypto.randomUUID());\n\t\tthis.cache = new BluvoCache(options.cache);\n\t}\n\n\tasync loadExchanges(\n\t\tstatus?: Oauth2ExchangeslistexchangesResponses[\"200\"][\"exchanges\"][number][\"status\"],\n\t) {\n\t\tif (!this.flowMachine) {\n\t\t\t// Create flow machine if it doesn't exist\n\t\t\tthis.flowMachine = createFlowMachine({\n\t\t\t\torgId: this.options.orgId,\n\t\t\t\tprojectId: this.options.projectId,\n\t\t\t\tmaxRetryAttempts: this.options.options?.maxRetryAttempts,\n\t\t\t\tautoRefreshQuotation: this.options.options?.autoRefreshQuotation,\n\t\t\t});\n\t\t}\n\n\t\tthis.flowMachine.send({ type: \"LOAD_EXCHANGES\" });\n\n\t\t// Wrap in try-catch since listExchangesFn returns directly (not {data, error, success})\n\t\tlet exchanges: any;\n\t\ttry {\n\t\t\texchanges = await this.options.listExchangesFn(status);\n\t\t} catch (err) {\n\t\t\t// Handle thrown exceptions\n\t\t\tconst errorInfo = extractErrorTypeInfo(err);\n\t\t\tconst errorMessage = err instanceof Error ? err.message : \"Failed to load exchanges\";\n\t\t\tconst error = new Error(errorMessage);\n\n\t\t\tthis.flowMachine.send({\n\t\t\t\ttype: \"EXCHANGES_FAILED\",\n\t\t\t\terror,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: errorMessage,\n\t\t\t\ttype: (errorInfo.rawType as TypeEnum2) || undefined,\n\t\t\t};\n\t\t}\n\n\t\t// Validate response structure\n\t\tif (!exchanges || !Array.isArray(exchanges)) {\n\t\t\tconst errorMsg = \"Failed to load exchanges: Invalid response\";\n\t\t\tconst error = new Error(errorMsg);\n\n\t\t\tthis.flowMachine.send({\n\t\t\t\ttype: \"EXCHANGES_FAILED\",\n\t\t\t\terror,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: errorMsg,\n\t\t\t};\n\t\t}\n\n\t\t// Success: send to state machine and return standardized response\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"EXCHANGES_LOADED\",\n\t\t\texchanges,\n\t\t});\n\n\t\treturn {\n\t\t\t// Legacy compatibility - flat array access\n\t\t\texchanges,\n\n\t\t\t// New standardized structure\n\t\t\tsuccess: true,\n\t\t\tresult: exchanges,\n\t\t};\n\t}\n\n\tasync startWithdrawalFlow(flowOptions: WithdrawalFlowOptions) {\n\t\t// Check if wallet already exists\n\t\tconst { data, error, success } = await this.options.getWalletByIdFn(flowOptions.walletId);\n\n\t\tif (success && data?.exchange) {\n\t\t\t// Wallet exists, redirect to resumeWithdrawalFlow\n\t\t\treturn this.resumeWithdrawalFlow({\n\t\t\t\texchange: data.exchange,\n\t\t\t\twalletId: flowOptions.walletId,\n\t\t\t});\n\t\t}\n\n\t\tif (!success) {\n\t\t\tconsole.warn(\"Error checking wallet existence:\", (error as any)?.error || (error as any)?.message || \"Unknown error\");\n\t\t}\n\n\t\t// Check if this exchange uses QR code authentication\n\t\tif (QR_CODE_EXCHANGES.includes(flowOptions.exchange.toLowerCase())) {\n\t\t\treturn this.startQRCodeFlow(flowOptions);\n\t\t}\n\n\t\t// Dispose any existing flow\n\t\tthis.dispose();\n\n\t\t// Create new flow machine\n\t\tthis.flowMachine = createFlowMachine({\n\t\t\torgId: this.options.orgId,\n\t\t\tprojectId: this.options.projectId,\n\t\t\tmaxRetryAttempts: this.options.options?.maxRetryAttempts,\n\t\t\tautoRefreshQuotation: this.options.options?.autoRefreshQuotation,\n\t\t});\n\n\t\t// Generate idempotency key for OAuth flow\n\t\tconst idem = this.generateId();\n\n\t\t// Start OAuth flow\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"START_OAUTH\",\n\t\t\texchange: flowOptions.exchange,\n\t\t\twalletId: flowOptions.walletId,\n\t\t\tidem,\n\t\t});\n\n\t\t// Subscribe to workflow messages\n\t\tthis.subscription = await this.webClient.listen(idem, {\n\t\t\tonOAuth2Complete: (message) => {\n\t\t\t\tthis.flowMachine?.send({\n\t\t\t\t\ttype: \"OAUTH_COMPLETED\",\n\t\t\t\t\twalletId: message.walletId,\n\t\t\t\t\texchange: message.exchange,\n\t\t\t\t});\n\n\t\t\t\t// Call the onWalletConnected hook if provided\n\t\t\t\tif (this.options.onWalletConnectedFn) {\n\t\t\t\t\tthis.options.onWalletConnectedFn(message.walletId, message.exchange);\n\t\t\t\t}\n\n\t\t\t\t// Auto-proceed to wallet loading\n\t\t\t\tthis.loadWallet(message.walletId);\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\t// Extract error code to check for specific OAuth errors\n\t\t\t\tconst errorCode = extractErrorCode(error);\n\n\t\t\t\t// Convert error to Error instance with appropriate message\n\t\t\t\tlet errorInstance: Error;\n\t\t\t\tif (error instanceof Error) {\n\t\t\t\t\terrorInstance = error;\n\t\t\t\t} else {\n\t\t\t\t\tconst errorMessage =\n\t\t\t\t\t\terror && typeof error === \"object\" && \"message\" in error\n\t\t\t\t\t\t\t? String((error as any).message)\n\t\t\t\t\t\t\t: \"OAuth authentication failed\";\n\t\t\t\t\terrorInstance = new Error(errorMessage);\n\t\t\t\t}\n\n\t\t\t\t// OAUTH_TOKEN_EXCHANGE_FAILED is a FATAL error - wallet connection is permanently broken\n\t\t\t\t// This means the OAuth tokens are invalid/revoked/expired and the wallet needs to be reconnected\n\t\t\t\tif (errorCode === ERROR_CODES.OAUTH_TOKEN_EXCHANGE_FAILED) {\n\t\t\t\t\tthis.flowMachine?.send({\n\t\t\t\t\t\ttype: \"OAUTH_FATAL\",\n\t\t\t\t\t\terror: errorInstance,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// Other OAuth errors are recoverable (user can retry)\n\t\t\t\telse if (\n\t\t\t\t\terrorCode === ERROR_CODES.OAUTH_AUTHORIZATION_FAILED ||\n\t\t\t\t\terrorCode === ERROR_CODES.OAUTH_INVALID_STATE\n\t\t\t\t) {\n\t\t\t\t\tthis.flowMachine?.send({\n\t\t\t\t\t\ttype: \"OAUTH_FAILED\",\n\t\t\t\t\t\terror: errorInstance,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// For any other error during OAuth, treat as recoverable\n\t\t\t\t\tthis.flowMachine?.send({\n\t\t\t\t\t\ttype: \"OAUTH_FAILED\",\n\t\t\t\t\t\terror: errorInstance,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\n        // TODO: if CEX is not OAuth (i.e. binance) ask for QR-Code instead of openWindow, still we listen the same way with the websocket tho.\n\t\t// Open OAuth window\n\t\tconst closeWindow = await this.webClient.oauth2.openWindow(\n\t\t\tflowOptions.exchange as any,\n\t\t\t{\n\t\t\t\twalletId: flowOptions.walletId,\n\t\t\t\tidem,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonWindowClose: () => {\n\t\t\t\t\t// const state = this.flowMachine?.getState();\n\t\t\t\t\t// if (state?.type === 'oauth:processing') {\n\t\t\t\t\t//     this.flowMachine?.send({\n\t\t\t\t\t//         type: 'OAUTH_WINDOW_CLOSED_BY_USER',\n\t\t\t\t\t//         error: new Error('OAuth window closed by user')\n\t\t\t\t\t//     });\n\t\t\t\t\t// }\n\t\t\t\t},\n\t\t\t},\n\t\t\tflowOptions.popupOptions,\n\t\t);\n\n\t\tthis.flowMachine.send({ type: \"OAUTH_WINDOW_OPENED\" });\n\n\t\treturn {\n\t\t\tmachine: this.flowMachine,\n\t\t\tcloseOAuthWindow: closeWindow,\n\t\t};\n\t}\n\n\t/**\n\t * Handle a QR code message (from WebSocket or cache replay).\n\t * Extracted to share logic between startQRCodeFlow, refreshQRCode, and cache replay.\n\t */\n\tprivate handleQRCodeReceived(message: QRCodeAuthWorkflowMessageBody, exchange: string, walletId: string) {\n\t\tconsole.log('qrcode received message:', message);\n\t\tconst status = message.qrCodeStatus;\n\n\t\t// Backend-driven expiration (authoritative, replaces client-side timeout)\n\t\tif (status === 'expired' || status === 'used') {\n\t\t\tif (this.qrCodeTimeoutTimer) {\n\t\t\t\tclearTimeout(this.qrCodeTimeoutTimer);\n\t\t\t\tthis.qrCodeTimeoutTimer = undefined;\n\t\t\t}\n\t\t\t// Clear cache for expired/used QR codes\n\t\t\tthis.cache.removeCachedQRCode(exchange);\n\t\t\tconst s = this.flowMachine?.getState();\n\t\t\tif (s?.type === 'qrcode:displaying' || s?.type === 'qrcode:scanning') {\n\t\t\t\tthis.flowMachine?.send({ type: \"QRCODE_TIMEOUT\" });\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Scanned → update status + trigger state transition\n\t\tif (status === 'scanned') {\n\t\t\t// QR code was scanned, no longer reusable — clear cache\n\t\t\tthis.cache.removeCachedQRCode(exchange);\n\t\t\tthis.flowMachine?.send({ type: \"QRCODE_STATUS_UPDATED\", qrCodeStatus: status, qrCodeExpiresAt: message.qrCodeExpiresAt || message.expiresAt });\n\t\t\tthis.flowMachine?.send({ type: \"QRCODE_SCANNED\" });\n\t\t\treturn;\n\t\t}\n\n\t\t// Confirmed → just update context (completion follows via onQRCodeComplete with success=true)\n\t\tif (status === 'confirmed') {\n\t\t\tthis.cache.removeCachedQRCode(exchange);\n\t\t\tthis.flowMachine?.send({ type: \"QRCODE_STATUS_UPDATED\", qrCodeStatus: status, qrCodeExpiresAt: message.qrCodeExpiresAt || message.expiresAt });\n\t\t\treturn;\n\t\t}\n\n\t\t// First URL receipt or status update (available/acquired)\n\t\tconst currentState = this.flowMachine?.getState();\n\t\tif (currentState?.type === 'qrcode:waiting' && message.qrCodeUrl) {\n\t\t\t// Clear any existing timeout\n\t\t\tif (this.qrCodeTimeoutTimer) {\n\t\t\t\tclearTimeout(this.qrCodeTimeoutTimer);\n\t\t\t}\n\n\t\t\t// Calculate timeout based on expiresAt or use default\n\t\t\tconst expiresAt = message.qrCodeExpiresAt || message.expiresAt;\n\t\t\tconst timeoutMs = expiresAt\n\t\t\t\t? Math.max(0, expiresAt - Date.now())\n\t\t\t\t: DEFAULT_QRCODE_TIMEOUT_MS;\n\n\t\t\tthis.flowMachine?.send({\n\t\t\t\ttype: \"QRCODE_URL_RECEIVED\",\n\t\t\t\tqrCodeUrl: message.qrCodeUrl,\n\t\t\t\texpiresAt: expiresAt || Date.now() + DEFAULT_QRCODE_TIMEOUT_MS,\n\t\t\t});\n\n\t\t\t// Cache the QR code for reuse on page reload\n\t\t\tthis.cache.cacheQRCode(exchange, message);\n\n\t\t\t// Set up timeout for QR code expiration\n\t\t\tthis.qrCodeTimeoutTimer = setTimeout(() => {\n\t\t\t\tconst state = this.flowMachine?.getState();\n\t\t\t\tif (state?.type === 'qrcode:displaying' || state?.type === 'qrcode:scanning') {\n\t\t\t\t\tthis.flowMachine?.send({ type: \"QRCODE_TIMEOUT\" });\n\t\t\t\t}\n\t\t\t}, timeoutMs);\n\t\t} else if (status && (currentState?.type === 'qrcode:displaying' || currentState?.type === 'qrcode:scanning')) {\n\t\t\tthis.flowMachine?.send({ type: \"QRCODE_STATUS_UPDATED\", qrCodeStatus: status, qrCodeExpiresAt: message.qrCodeExpiresAt || message.expiresAt });\n\t\t}\n\t}\n\n\t/**\n\t * Handle QR code completion. Clears cache and proceeds to wallet loading.\n\t */\n\tprivate handleQRCodeComplete(message: { walletId: string; exchange: string }, exchange: string, walletId: string) {\n\t\tthis.flowMachine?.send({\n\t\t\ttype: \"QRCODE_COMPLETED\",\n\t\t\twalletId: message.walletId,\n\t\t\texchange: message.exchange,\n\t\t});\n\n\t\t// Call the onWalletConnected hook if provided\n\t\tif (this.options.onWalletConnectedFn) {\n\t\t\tthis.options.onWalletConnectedFn(message.walletId, message.exchange);\n\t\t}\n\n\t\t// Clear QR code timeout\n\t\tif (this.qrCodeTimeoutTimer) {\n\t\t\tclearTimeout(this.qrCodeTimeoutTimer);\n\t\t\tthis.qrCodeTimeoutTimer = undefined;\n\t\t}\n\n\t\t// QR code flow completed — clear cache\n\t\tthis.cache.removeCachedQRCode(exchange);\n\n\t\t// Auto-proceed to wallet loading\n\t\tthis.loadWallet(message.walletId);\n\t}\n\n\t/**\n\t * Handle QR code error. Clears timeout and sends failure action.\n\t */\n\tprivate handleQRCodeError(error: Error, exchange: string, walletId: string) {\n\t\t// Clear QR code timeout\n\t\tif (this.qrCodeTimeoutTimer) {\n\t\t\tclearTimeout(this.qrCodeTimeoutTimer);\n\t\t\tthis.qrCodeTimeoutTimer = undefined;\n\t\t}\n\n\t\t// Clear cache on error\n\t\tthis.cache.removeCachedQRCode(exchange);\n\n\t\tthis.flowMachine?.send({\n\t\t\ttype: \"QRCODE_FAILED\",\n\t\t\terror,\n\t\t});\n\t}\n\n\t/**\n\t * Handle generic error during QR code flow.\n\t */\n\tprivate handleQRCodeFlowError(error: any, exchange: string, walletId: string) {\n\t\t// Extract error code to check for specific errors\n\t\tconst errorCode = extractErrorCode(error);\n\n\t\t// Convert error to Error instance with appropriate message\n\t\tlet errorInstance: Error;\n\t\tif (error instanceof Error) {\n\t\t\terrorInstance = error;\n\t\t} else {\n\t\t\tconst errorMessage =\n\t\t\t\terror && typeof error === \"object\" && \"message\" in error\n\t\t\t\t\t? String((error as any).message)\n\t\t\t\t\t: \"QR code authentication failed\";\n\t\t\terrorInstance = new Error(errorMessage);\n\t\t}\n\n\t\t// Clear QR code timeout\n\t\tif (this.qrCodeTimeoutTimer) {\n\t\t\tclearTimeout(this.qrCodeTimeoutTimer);\n\t\t\tthis.qrCodeTimeoutTimer = undefined;\n\t\t}\n\n\t\t// Clear cache on error\n\t\tthis.cache.removeCachedQRCode(exchange);\n\n\t\t// OAUTH_TOKEN_EXCHANGE_FAILED is a FATAL error\n\t\tif (errorCode === ERROR_CODES.OAUTH_TOKEN_EXCHANGE_FAILED) {\n\t\t\tthis.flowMachine?.send({\n\t\t\t\ttype: \"QRCODE_FATAL\",\n\t\t\t\terror: errorInstance,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.flowMachine?.send({\n\t\t\t\ttype: \"QRCODE_FAILED\",\n\t\t\t\terror: errorInstance,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Start a QR code authentication flow for exchanges that don't support OAuth popup\n\t * (e.g., Binance). The flow renders a QR code for mobile app scanning.\n\t *\n\t * If a valid cached QR code exists (from a previous page load), it will be replayed\n\t * immediately to avoid unnecessary API calls and rate-limiting.\n\t */\n\tprivate async startQRCodeFlow(flowOptions: WithdrawalFlowOptions) {\n\t\t// Dispose any existing flow\n\t\tthis.dispose();\n\n\t\tconst exchange = flowOptions.exchange;\n\n\t\t// Always use the caller's walletId — never substitute from cache\n\t\tconst walletId = flowOptions.walletId;\n\n\t\t// Check cache for a valid QR code before hitting the backend.\n\t\t// Only reuse cached QR display data when the walletId matches,\n\t\t// otherwise the backend pool entry belongs to a different wallet.\n\t\tconst rawCachedQRCode = await this.cache.getCachedQRCode(exchange);\n\t\tconst cachedQRCode = rawCachedQRCode?.walletId === walletId ? rawCachedQRCode : null;\n\n\t\t// Evict stale cache entry on walletId mismatch\n\t\tif (rawCachedQRCode && !cachedQRCode) {\n\t\t\tawait this.cache.removeCachedQRCode(exchange);\n\t\t}\n\n\t\t// Create new flow machine\n\t\tthis.flowMachine = createFlowMachine({\n\t\t\torgId: this.options.orgId,\n\t\t\tprojectId: this.options.projectId,\n\t\t\tmaxRetryAttempts: this.options.options?.maxRetryAttempts,\n\t\t\tautoRefreshQuotation: this.options.options?.autoRefreshQuotation,\n\t\t});\n\n\t\t// Generate idempotency key for QR code flow\n\t\tconst idem = this.generateId();\n\n\t\t// Start QR code flow\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"START_QRCODE\",\n\t\t\texchange,\n\t\t\twalletId,\n\t\t\tidem,\n\t\t});\n\n\t\t// Subscribe to workflow messages with QR code callbacks\n\t\t// We always subscribe even when using cache — the WebSocket will deliver\n\t\t// status updates (scanned, confirmed, completed) for the cached QR code\n\t\tthis.subscription = await this.webClient.listen(idem, {\n\t\t\tonOAuth2Complete: (message) => {\n\t\t\t\t// This shouldn't be called for QR code flows, but handle it just in case\n\t\t\t\tthis.handleQRCodeComplete(message, exchange, walletId);\n\t\t\t},\n\t\t\tonQRCodeReceived: (message) => {\n\t\t\t\tthis.handleQRCodeReceived(message, exchange, walletId);\n\t\t\t},\n\t\t\tonQRCodeComplete: (message) => {\n\t\t\t\tthis.handleQRCodeComplete(message, exchange, walletId);\n\t\t\t},\n\t\t\tonQRCodeError: (error) => {\n\t\t\t\tthis.handleQRCodeError(error, exchange, walletId);\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tthis.handleQRCodeFlowError(error, exchange, walletId);\n\t\t\t},\n\t\t});\n\n\t\t// If we have a valid cached QR code, replay it as if received from WebSocket\n\t\tif (cachedQRCode) {\n\t\t\tconsole.log('[BluvoCache] Replaying cached QR code for', exchange);\n\t\t\tthis.handleQRCodeReceived(cachedQRCode, exchange, walletId);\n\n\t\t\t// Still need to fetch the URL and trigger the backend so the WebSocket\n\t\t\t// topic is active for status updates, but we already have the QR code displayed\n\t\t}\n\n\t\t// Fetch the QR code URL from the backend\n\t\tconst { url, data, success, error } = await this.webClient.oauth2.getURL(\n\t\t\texchange as any,\n\t\t\t{\n\t\t\t\twalletId,\n\t\t\t\tidem,\n\t\t\t}\n\t\t);\n\n\t\tif (!success || !url) {\n\t\t\t// If we already have a cached QR code displayed, don't fail the flow\n\t\t\tif (!cachedQRCode) {\n\t\t\t\tconsole.error(\"Failed to get QR code URL:\", error);\n\t\t\t\tconst errorMessage = typeof error === 'string'\n\t\t\t\t\t? error\n\t\t\t\t\t: (error as any)?.message || (error as any)?.error || \"Failed to get QR code URL\";\n\t\t\t\tthis.flowMachine?.send({\n\t\t\t\t\ttype: \"QRCODE_FAILED\",\n\t\t\t\t\terror: new Error(errorMessage),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (data?.isQRCode === false) {\n\t\t\t// This means the exchange doesn't support QR code authentication, which is unexpected since we should only be in this flow for QR code exchanges\n\t\t\tconst errorMessage = \"Exchange does not support QR code authentication\";\n\t\t\tconsole.error(errorMessage, { exchange, data });\n\t\t\tthis.flowMachine?.send({\n\t\t\t\ttype: \"QRCODE_FAILED\",\n\t\t\t\terror: new Error(errorMessage),\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tmachine: this.flowMachine,\n\t\t\t\tcloseOAuthWindow: null,\n\t\t\t};\n\t\t}\n\n\t\t// Trigger the backend to generate the QR code by fetching the login URL\n\t\t// The backend will then push the QR code URL via WebSocket to the topic\n\t\t// We always trigger this even with cache — the backend needs the fetch to\n\t\t// activate the WebSocket topic for status updates on the existing QR code\n\t\tif (url) {\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(url, {\n\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\tcredentials: 'include',\n\t\t\t\t});\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tconsole.error(\"Failed to trigger QR code generation:\", response.status, response.statusText);\n\t\t\t\t}\n\t\t\t} catch (fetchError) {\n\t\t\t\tconsole.error(\"Error triggering QR code generation:\", fetchError);\n\t\t\t\t// Don't fail the flow - the WebSocket might still receive the QR code\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tmachine: this.flowMachine,\n\t\t\tcloseOAuthWindow: null, // No OAuth window for QR code flow\n\t\t};\n\t}\n\n\t/**\n\t * Refresh the QR code after it has expired or encountered an error.\n\t * This can be called when the user is in qrcode:timeout or qrcode:error state.\n\t */\n\tasync refreshQRCode() {\n\t\tif (!this.flowMachine) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Flow machine not initialized\",\n\t\t\t};\n\t\t}\n\n\t\tconst state = this.flowMachine.getState();\n\n\t\t// Guard: Only refresh from error or timeout states\n\t\tif (state.type !== 'qrcode:error' && state.type !== 'qrcode:timeout') {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `Cannot refresh QR code in state: ${state.type}`,\n\t\t\t};\n\t\t}\n\n\t\t// Guard: Need exchange and wallet ID from context\n\t\tif (!state.context.exchange || !state.context.walletId) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Exchange or wallet ID not found in state\",\n\t\t\t};\n\t\t}\n\n\t\tconst exchange = state.context.exchange!;\n\t\tconst walletId = state.context.walletId!;\n\n\t\t// Clear cached QR code since we're explicitly refreshing\n\t\tawait this.cache.removeCachedQRCode(exchange);\n\n\t\t// Send refresh action to transition back to waiting state\n\t\tthis.flowMachine.send({ type: \"REFRESH_QRCODE\" });\n\n\t\t// Generate new idempotency key\n\t\tconst idem = this.generateId();\n\n\t\t// Update topic name in context (we need to resubscribe)\n\t\tif (this.subscription) {\n\t\t\tawait this.webClient.unsubscribe(this.subscription.topicName);\n\t\t}\n\n\t\t// Re-subscribe with new idem using shared handlers\n\t\tthis.subscription = await this.webClient.listen(idem, {\n\t\t\tonOAuth2Complete: (message) => {\n\t\t\t\tthis.handleQRCodeComplete(message, exchange, walletId);\n\t\t\t},\n\t\t\tonQRCodeReceived: (message: any) => {\n\t\t\t\tthis.handleQRCodeReceived(message, exchange, walletId);\n\t\t\t},\n\t\t\tonQRCodeComplete: (message: any) => {\n\t\t\t\tthis.handleQRCodeComplete(message, exchange, walletId);\n\t\t\t},\n\t\t\tonQRCodeError: (error: any) => {\n\t\t\t\tthis.handleQRCodeError(error, exchange, walletId);\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tthis.handleQRCodeFlowError(error, exchange, walletId);\n\t\t\t},\n\t\t});\n\n\t\t// Fetch new QR code URL\n\t\tconst { url, success, error } = await this.webClient.oauth2.getURL(\n\t\t\tstate.context.exchange as any,\n\t\t\t{\n\t\t\t\twalletId: state.context.walletId,\n\t\t\t\tidem,\n\t\t\t}\n\t\t);\n\n\t\tif (!success || !url) {\n\t\t\tconsole.error(\"Failed to refresh QR code URL:\", error);\n\t\t\tconst errorMessage = typeof error === 'string'\n\t\t\t\t? error\n\t\t\t\t: (error as any)?.message || (error as any)?.error || \"Failed to refresh QR code URL\";\n\t\t\tthis.flowMachine?.send({\n\t\t\t\ttype: \"QRCODE_FAILED\",\n\t\t\t\terror: new Error(errorMessage),\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: errorMessage,\n\t\t\t};\n\t\t}\n\n\t\t// Trigger the backend to generate the new QR code by fetching the login URL\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\tcredentials: 'include',\n\t\t\t});\n\t\t\tif (!response.ok) {\n\t\t\t\tconsole.error(\"Failed to trigger QR code refresh:\", response.status, response.statusText);\n\t\t\t}\n\t\t} catch (fetchError) {\n\t\t\tconsole.error(\"Error triggering QR code refresh:\", fetchError);\n\t\t\t// Don't fail the flow - the WebSocket might still receive the QR code\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t};\n\t}\n\n\tasync resumeWithdrawalFlow(flowOptions: ResumeWithdrawalFlowOptions) {\n\t\t// Dispose any existing flow\n\t\tthis.dispose();\n\n\t\t// Create new flow machine\n\t\tthis.flowMachine = createFlowMachine({\n\t\t\torgId: this.options.orgId,\n\t\t\tprojectId: this.options.projectId,\n\t\t\tmaxRetryAttempts: this.options.options?.maxRetryAttempts,\n\t\t\tautoRefreshQuotation: this.options.options?.autoRefreshQuotation,\n\t\t});\n\n\t\t// We need to transition through the states properly\n\t\t// First, start OAuth flow to set up context\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"START_OAUTH\",\n\t\t\texchange: flowOptions.exchange,\n\t\t\twalletId: flowOptions.walletId,\n\t\t\tidem: this.generateId(),\n\t\t});\n\n\t\t// Then mark OAuth as completed\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"OAUTH_WINDOW_OPENED\",\n\t\t});\n\n\t\t// Complete OAuth\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"OAUTH_COMPLETED\",\n\t\t\twalletId: flowOptions.walletId,\n\t\t\texchange: flowOptions.exchange,\n\t\t});\n\n\t\t// Call the onWalletConnected hook if provided\n\t\tif (this.options.onWalletConnectedFn) {\n\t\t\tthis.options.onWalletConnectedFn(\n\t\t\t\tflowOptions.walletId,\n\t\t\t\tflowOptions.exchange,\n\t\t\t);\n\t\t}\n\n\t\t// Load wallet immediately\n\t\tthis.loadWallet(flowOptions.walletId);\n\n\t\treturn {\n\t\t\tmachine: this.flowMachine,\n            closeOAuthWindow: null\n\t\t};\n\t}\n\n\t/**\n\t * Silently resume a withdrawal flow with optional preloaded balance data\n\t *\n\t * This method allows you to resume a withdrawal flow for a wallet that has already\n\t * been previewed, jumping directly to the wallet:ready state. If balance data is\n\t * preloaded (from a preview), it will be used directly. Otherwise, the method will\n\t * ping the wallet and fetch the balance data.\n\t *\n\t * This is useful for scenarios where users select a wallet from a preview list and\n\t * want to continue directly to the withdrawal interface without re-authenticating.\n\t *\n\t * @param options Configuration for silent resume\n\t * @returns Object containing the flow machine instance\n\t */\n\tasync silentResumeWithdrawalFlow(options: SilentResumeWithdrawalFlowOptions) {\n\t\t// Dispose any existing flow\n\t\tthis.dispose();\n\n\t\t// Create new flow machine\n\t\tthis.flowMachine = createFlowMachine({\n\t\t\torgId: this.options.orgId,\n\t\t\tprojectId: this.options.projectId,\n\t\t\tmaxRetryAttempts: this.options.options?.maxRetryAttempts,\n\t\t\tautoRefreshQuotation: this.options.options?.autoRefreshQuotation,\n\t\t});\n\n\t\tlet balances = options.preloadedBalances;\n\n\t\t// If no preloaded balances, fetch them\n\t\tif (!balances) {\n\t\t\t// Step 1: Ping wallet to validate\n\t\t\tconst {\n\t\t\t\tdata: pingResult,\n\t\t\t\terror: pingError,\n\t\t\t\tsuccess: pingSuccess\n\t\t\t} = await this.options.pingWalletByIdFn(\n\t\t\t\toptions.walletId,\n\t\t\t);\n\n\t\t\t// Check for invalid credentials\n\t\t\tif (!pingSuccess) {\n\t\t\t\tconst errorCode = extractErrorCode(pingError);\n\t\t\t\tif (errorCode === ERROR_CODES.WALLET_NOT_FOUND) {\n\t\t\t\t\toptions.onWalletNotFound?.(options.walletId);\n\t\t\t\t}\n\t\t\t\t// Silent failure - just log and return\n\t\t\t\tconsole.warn(\"Failed to ping wallet:\", (pingError as any)?.error || (pingError as any)?.message || \"Failed to ping wallet\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (pingResult?.status === \"INVALID_API_CREDENTIALS\") {\n\t\t\t\toptions.onWalletInvalidApiCredentials?.(options.walletId);\n\t\t\t\t// Silent failure - just log and return\n\t\t\t\tconsole.warn(\"Invalid API credentials for wallet\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Step 2: Fetch withdrawable balance\n\t\t\tconst {\n\t\t\t\tdata: balanceResponse,\n\t\t\t\terror: balanceError,\n\t\t\t\tsuccess: balanceSuccess,\n\t\t\t} = await this.options.fetchWithdrawableBalanceFn(\n\t\t\t\toptions.walletId,\n\t\t\t);\n\n\t\t\tif (!balanceSuccess) {\n\t\t\t\tconst errorCode = extractErrorCode(balanceError);\n\t\t\t\tif (errorCode === ERROR_CODES.WALLET_NOT_FOUND) {\n\t\t\t\t\toptions.onWalletNotFound?.(options.walletId);\n\t\t\t\t}\n\t\t\t\t// Silent failure - just log and return\n\t\t\t\tconsole.warn(\"Failed to fetch withdrawable balance:\", (balanceError as any)?.error || (balanceError as any)?.message || \"Failed to fetch withdrawable balance\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Transform to expected format\n\t\t\tbalances = balanceResponse?.balances ? transformBalances(balanceResponse.balances) : [];\n\n\t\t\t// Call success callback\n\t\t\toptions.onWalletBalance?.(options.walletId, balances);\n\t\t}\n\n\t\t// Transition through states to reach wallet:ready\n\t\t// This ensures the state machine is in the correct state\n\n\t\t// 1. Start OAuth (to set up context)\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"START_OAUTH\",\n\t\t\texchange: options.exchange,\n\t\t\twalletId: options.walletId,\n\t\t\tidem: this.generateId(),\n\t\t});\n\n\t\t// 2. Mark OAuth window as opened\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"OAUTH_WINDOW_OPENED\",\n\t\t});\n\n\t\t// 3. Complete OAuth\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"OAUTH_COMPLETED\",\n\t\t\twalletId: options.walletId,\n\t\t\texchange: options.exchange,\n\t\t});\n\n\t\t// 4. Load wallet (transition to wallet:loading)\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"LOAD_WALLET\",\n\t\t});\n\n\t\t// 5. Set wallet as loaded with preloaded/fetched balances (transition to wallet:ready)\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"WALLET_LOADED\",\n\t\t\tbalances: balances as any, // Type assertion to satisfy TypeScript\n\t\t});\n\n\t\treturn {\n\t\t\tmachine: this.flowMachine,\n\t\t};\n\t}\n\n\tprivate async loadWallet(walletId: string) {\n\t\t// Guard: No flow machine\n\t\tif (!this.flowMachine) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Flow machine not initialized\",\n\t\t\t};\n\t\t}\n\n\t\tthis.flowMachine.send({ type: \"LOAD_WALLET\" });\n\n\t\tconst { data: withdrawableBalanceInfo, error, success } = await this.options\n\t\t\t.fetchWithdrawableBalanceFn(walletId);\n\n\t\tif (!success) {\n\t\t\t// Extract error type information\n\t\t\tconst errorInfo = extractErrorTypeInfo(error);\n\t\t\tconst errorMessage = error instanceof Error\n\t\t\t\t? error.message\n\t\t\t\t: (error as any)?.error || (error as any)?.message || \"Failed to load wallet\";\n\t\t\tconst flowError = new Error(errorMessage);\n\n\t\t\tthis.flowMachine.send({\n\t\t\t\ttype: \"WALLET_FAILED\",\n\t\t\t\terror: flowError,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: errorMessage,\n\t\t\t\ttype: (errorInfo.rawType as TypeEnum2) || undefined,\n\t\t\t};\n\t\t}\n\n\t\t// Validate response structure\n\t\tif (!withdrawableBalanceInfo?.balances) {\n\t\t\tconst errorMsg = \"No balance data returned\";\n\t\t\tconst flowError = new Error(errorMsg);\n\n\t\t\tthis.flowMachine.send({\n\t\t\t\ttype: \"WALLET_FAILED\",\n\t\t\t\terror: flowError,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: errorMsg,\n\t\t\t};\n\t\t}\n\n\t\t// Transform balances\n\t\tconst transformedBalances = transformBalances(withdrawableBalanceInfo.balances);\n\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"WALLET_LOADED\",\n\t\t\tbalances: transformedBalances,\n\t\t});\n\n\t\treturn {\n\t\t\t// Legacy compatibility - flat balances field\n\t\t\tbalances: transformedBalances,\n\n\t\t\t// New standardized structure\n\t\t\tsuccess: true,\n\t\t\tresult: {\n\t\t\t\tbalances: transformedBalances,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync requestQuote(options: QuoteRequestOptions) {\n\t\t// Guard: No flow machine\n\t\tif (!this.flowMachine) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Flow machine not initialized\",\n\t\t\t};\n\t\t}\n\n\t\tconst state = this.flowMachine.getState();\n\n\t\t// Guard: No wallet ID\n\t\tif (!state.context.walletId) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Wallet ID not found in state\",\n\t\t\t};\n\t\t}\n\n\t\tconsole.log(\n\t\t\t\"[SDK] requestQuote called, current state:\",\n\t\t\tstate.type,\n\t\t\t\"amount:\",\n\t\t\toptions.amount,\n\t\t);\n\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"REQUEST_QUOTE\",\n\t\t\tasset: options.asset,\n\t\t\tamount: options.amount,\n\t\t\tdestinationAddress: options.destinationAddress,\n\t\t\tnetwork: options.network,\n\t\t});\n\n\t\tconsole.log(\"[SDK] REQUEST_QUOTE action sent to state machine\");\n\n\t\tconst {\n\t\t\tdata: quote,\n\t\t\terror,\n\t\t\tsuccess\n\t\t} = await this.options.requestQuotationFn(\n\t\t\tstate.context.walletId,\n\t\t\t{\n\t\t\t\tasset: options.asset,\n\t\t\t\tamount: options.amount,\n\t\t\t\taddress: options.destinationAddress,\n\t\t\t\tnetwork: options.network,\n\t\t\t\ttag: options.tag,\n\t\t\t\tincludeFee: options.includeFee ?? true,\n\t\t\t},\n\t\t);\n\n\t\tif (!success) {\n\t\t\t// Extract comprehensive error type information\n\t\t\tconst errorInfo = extractErrorTypeInfo(error);\n\t\t\tlet flowError: Error;\n\n\t\t\t// Handle known error codes with specific messages\n\t\t\tif (errorInfo.knownCode) {\n\t\t\t\tswitch (errorInfo.knownCode) {\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_INSUFFICIENT_BALANCE:\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_INSUFFICIENT_BALANCE_FOR_FEE:\n\t\t\t\t\tcase WITHDRAWAL_QUOTATION_ERROR_TYPES.INSUFFICIENT_BALANCE: // Legacy compatibility\n\t\t\t\t\tcase WITHDRAWAL_QUOTATION_ERROR_TYPES.INSUFFICIENT_BALANCE_CANNOT_COVER_FEE: // Legacy compatibility\n\t\t\t\t\t\tflowError = new Error(\"Insufficient balance\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_AMOUNT_BELOW_MINIMUM:\n\t\t\t\t\tcase WITHDRAWAL_QUOTATION_ERROR_TYPES.AMOUNT_BELOW_MINIMUM: // Legacy compatibility\n\t\t\t\t\t\tflowError = new Error(\"Amount below minimum\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_AMOUNT_ABOVE_MAXIMUM:\n\t\t\t\t\tcase WITHDRAWAL_QUOTATION_ERROR_TYPES.AMOUNT_ABOVE_MAXIMUM: // Legacy compatibility\n\t\t\t\t\t\tflowError = new Error(\"Amount above maximum\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_INVALID_ADDRESS:\n\t\t\t\t\tcase WITHDRAWAL_QUOTATION_ERROR_TYPES.INVALID_ADDRESS: // Legacy compatibility\n\t\t\t\t\t\tflowError = new Error(\"Invalid destination address\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_NETWORK_NOT_SUPPORTED:\n\t\t\t\t\tcase WITHDRAWAL_QUOTATION_ERROR_TYPES.NETWORK_NOT_SUPPORTED: // Legacy compatibility\n\t\t\t\t\t\tflowError = new Error(\"Network not supported\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tflowError = error instanceof Error ? error : new Error((error as any)?.error || (error as any)?.message || \"Failed to get quote\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// No known error code, use generic error message\n\t\t\t\tflowError = error instanceof Error ? error : new Error((error as any)?.error || (error as any)?.message || \"Failed to get quote\");\n\t\t\t}\n\n\t\t\tthis.flowMachine.send({\n\t\t\t\ttype: \"QUOTE_FAILED\",\n\t\t\t\terror: flowError,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: flowError.message,\n\t\t\t\ttype: (errorInfo.rawType as TypeEnum2) || undefined,\n\t\t\t};\n\t\t}\n\n\t\tif (!quote) {\n\t\t\tconst errorMsg = \"No quote returned from backend\";\n\t\t\tthis.flowMachine.send({\n\t\t\t\ttype: \"QUOTE_FAILED\",\n\t\t\t\terror: new Error(errorMsg),\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: errorMsg,\n\t\t\t};\n\t\t}\n\n\t\tconsole.log(\n\t\t\t\"[SDK] Backend returned quote with ID:\",\n\t\t\tquote.id,\n\t\t\t\"ExpiresAt:\",\n\t\t\tquote.expiresAt,\n\t\t);\n\n\t\tconst quoteData = {\n\t\t\tid: quote.id,\n\t\t\tasset: quote.asset,\n\t\t\tamount: String(quote.amountNoFee),\n\t\t\testimatedFee: String(quote.estimatedFee),\n\t\t\testimatedTotal: String(quote.estimatedTotal),\n\n\t\t\tamountWithFeeInFiat: String(quote.amountWithFeeInFiat),\n\t\t\tamountNoFeeInFiat: String(quote.amountNoFeeInFiat),\n\t\t\testimatedFeeInFiat: String(quote.estimatedFeeInFiat),\n\n\t\t\tadditionalInfo: quote.additionalInfo,\n\n\t\t\texpiresAt: new Date(quote.expiresAt).getTime(),\n\t\t};\n\n\t\tconsole.log(\n\t\t\t\"[SDK] Sending QUOTE_RECEIVED action with new quote ID:\",\n\t\t\tquoteData.id,\n\t\t\t\"ExpiresAt:\",\n\t\t\tnew Date(quoteData.expiresAt).toLocaleTimeString(),\n\t\t);\n\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"QUOTE_RECEIVED\",\n\t\t\tquote: quoteData,\n\t\t});\n\n\t\t// Clear any existing quote refresh timer\n\t\tif (this.quoteRefreshTimer) {\n\t\t\tclearTimeout(this.quoteRefreshTimer);\n\t\t}\n\n\t\t// Set up quote expiration timer\n\t\tconst expiresIn = new Date(quote.expiresAt).getTime() - Date.now();\n\t\tif (expiresIn > 0) {\n\t\t\tthis.quoteRefreshTimer = setTimeout(() => {\n\t\t\t\tconst currentState = this.flowMachine?.getState();\n\t\t\t\tif (\n\t\t\t\t\tcurrentState?.type === \"quote:ready\" &&\n\t\t\t\t\tcurrentState.context.quote?.id === quote.id\n\t\t\t\t) {\n\t\t\t\t\t// Check if auto-refresh is enabled\n\t\t\t\t\tconst autoRefresh =\n\t\t\t\t\t\tcurrentState.context.autoRefreshQuotation !== undefined\n\t\t\t\t\t\t\t? currentState.context.autoRefreshQuotation\n\t\t\t\t\t\t\t: true; // Default to true\n\n\t\t\t\t\tif (autoRefresh && currentState.context.lastQuoteRequest) {\n\t\t\t\t\t\t// Auto-refresh the quote\n\t\t\t\t\t\tconsole.log(\"[SDK] Quote expired, auto-refreshing...\");\n\t\t\t\t\t\tthis.requestQuote(currentState.context.lastQuoteRequest);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No auto-refresh, transition to expired state\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\"[SDK] Quote expired, transitioning to expired state\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.flowMachine?.send({ type: \"QUOTE_EXPIRED\" });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, expiresIn);\n\t\t}\n\n\t\t// Return success with quote data\n\t\treturn {\n            // legacy compatibility:\n            // contract\n            rawQuote: quote,\n            quoteData,\n\n            // expand\n\t\t\tsuccess: true,\n\t\t\tresult: {\n\t\t\t\trawQuote: quote,\n\t\t\t\tquoteData,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync executeWithdrawal(quoteId: string) {\n\t\t// Guard: No flow machine\n\t\tif (!this.flowMachine) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Flow machine not initialized\",\n\t\t\t};\n\t\t}\n\n\t\tconst state = this.flowMachine.getState();\n\n\t\t// Guard: No wallet ID or wrong state\n\t\tif (!state.context.walletId) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Wallet ID not found in state\",\n\t\t\t};\n\t\t}\n\n\t\tif (state.type !== \"quote:ready\") {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `Cannot execute withdrawal in state: ${state.type}`,\n\t\t\t};\n\t\t}\n\n\t\t// Start withdrawal process\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"START_WITHDRAWAL\",\n\t\t\tquoteId,\n\t\t});\n\n\t\tif (this.subscription) {\n\t\t\tawait this.webClient.unsubscribe(this.subscription.topicName);\n\t\t}\n\n\t\tthis.subscription = await this.webClient.listen(quoteId, {\n\t\t\tonWithdrawComplete: (message: any) => {\n\t\t\t\tconsole.log(\"onWithdrawComplete received:\", message);\n\n\t\t\t\t// {\n\t\t\t\t//     \"type\": \"withdraw\",\n\t\t\t\t//     \"success\": true,\n\t\t\t\t//     \"walletId\": \"a57f3fd3-0660-438c-8e4d-e781b414acfa\",\n\t\t\t\t//     \"step\": \"complete\",\n\t\t\t\t//     \"stepIndex\": 4,\n\t\t\t\t//     \"totalSteps\": 4\n\t\t\t\t// }\n\n\t\t\t\tif (message.success && message.type === WorkflowTypes.WithdrawFunds) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\"Withdrawal completed successfully, transitioning state machine\",\n\t\t\t\t\t);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\"Current flow machine state before completion:\",\n\t\t\t\t\t\tthis.flowMachine?.getState()?.type,\n\t\t\t\t\t);\n\n\t\t\t\t\t// First, send success to update the withdrawal machine state\n\t\t\t\t\tthis.flowMachine?.send({\n\t\t\t\t\t\ttype: \"WITHDRAWAL_SUCCESS\",\n\t\t\t\t\t\ttransactionId:\n\t\t\t\t\t\t\tmessage.transactionId || message.walletId || \"completed\",\n\t\t\t\t\t});\n\n\t\t\t\t\t// Then send completion action\n\t\t\t\t\tthis.flowMachine?.send({\n\t\t\t\t\t\ttype: \"WITHDRAWAL_COMPLETED\",\n\t\t\t\t\t\ttransactionId:\n\t\t\t\t\t\t\tmessage.transactionId || message.walletId || \"completed\",\n\t\t\t\t\t});\n\n\t\t\t\t\t// Log current state after sending actions\n\t\t\t\t\tconst currentState = this.flowMachine?.getState();\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\"Flow machine state after completion actions:\",\n\t\t\t\t\t\tcurrentState?.type,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t\tonStep: (message: WorkflowMessageBody) => {\n\t\t\t\tif (message.type === WorkflowTypes.WithdrawFunds) {\n\t\t\t\t\tconst withdrawMessage = message as WithdrawFundsWorkflowMessageBody;\n\t\t\t\t\tthis.flowMachine?.send({\n\t\t\t\t\t\ttype: \"WITHDRAWAL_PROGRESS\",\n\t\t\t\t\t\tmessage: withdrawMessage.step,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconst errorCode = extractErrorCode(error);\n\n\t\t\t\t// Handle new error codes\n\t\t\t\tswitch (errorCode) {\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_2FA_REQUIRED_TOTP:\n\t\t\t\t\t\tthis.flowMachine?.send({ type: \"WITHDRAWAL_REQUIRES_2FA\" });\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_2FA_REQUIRED_SMS:\n\t\t\t\t\t\tthis.flowMachine?.send({ type: \"WITHDRAWAL_REQUIRES_SMS\" });\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_2FA_INVALID:\n\t\t\t\t\t\tthis.flowMachine?.send({ type: \"WITHDRAWAL_2FA_INVALID\" });\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_KYC_REQUIRED:\n\t\t\t\t\t\tthis.flowMachine?.send({ type: \"WITHDRAWAL_REQUIRES_KYC\" });\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_INSUFFICIENT_BALANCE:\n\t\t\t\t\t\tthis.flowMachine?.send({ type: \"WITHDRAWAL_INSUFFICIENT_BALANCE\" });\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_INVALID_ADDRESS:\n\t\t\t\t\t\tthis.flowMachine?.send({\n\t\t\t\t\t\t\ttype: \"WITHDRAWAL_FATAL\",\n\t\t\t\t\t\t\terror: new Error(\"Invalid destination address\"),\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_AMOUNT_BELOW_MINIMUM:\n\t\t\t\t\t\tthis.flowMachine?.send({\n\t\t\t\t\t\t\ttype: \"WITHDRAWAL_FATAL\",\n\t\t\t\t\t\t\terror: new Error(\"Amount below minimum\"),\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tcase ERROR_CODES.QUOTE_EXPIRED:\n\t\t\t\t\t\tthis.flowMachine?.send({ type: \"QUOTE_EXPIRED\" });\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_2FA_METHOD_NOT_SUPPORTED:\n\t\t\t\t\t\tthis.flowMachine?.send({\n\t\t\t\t\t\t\ttype: \"WITHDRAWAL_2FA_METHOD_NOT_SUPPORTED\",\n\t\t\t\t\t\t\tresult: extractErrorResult(error) as { valid2FAMethods?: string[] } | undefined,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_2FA_REQUIRED_MULTI_STEPS:\n\t\t\t\t\t\tthis.flowMachine?.send({\n\t\t\t\t\t\t\ttype: \"WITHDRAWAL_REQUIRES_2FA_MULTI_STEPS\",\n\t\t\t\t\t\t\tresult: extractErrorResult(error) as {\n\t\t\t\t\t\t\t\tbizNo: string;\n\t\t\t\t\t\t\t\tsteps: Array<{\n\t\t\t\t\t\t\t\t\ttype: 'GOOGLE' | 'EMAIL' | 'FACE' | 'SMS';\n\t\t\t\t\t\t\t\t\tstatus: 'pending' | 'success' | 'failed';\n\t\t\t\t\t\t\t\t\trequired: boolean;\n\t\t\t\t\t\t\t\t\tmetadata?: {\n\t\t\t\t\t\t\t\t\t\temail?: string;\n\t\t\t\t\t\t\t\t\t\temailSent?: boolean;\n\t\t\t\t\t\t\t\t\t\tqrCodeUrl?: string;\n\t\t\t\t\t\t\t\t\t\tqrCodeValidSeconds?: number;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}>;\n\t\t\t\t\t\t\t\trelation: 'AND' | 'OR';\n\t\t\t\t\t\t\t\tmfa?: {\n\t\t\t\t\t\t\t\t\tverified: {\n\t\t\t\t\t\t\t\t\t\tGOOGLE?: boolean;\n\t\t\t\t\t\t\t\t\t\tEMAIL?: boolean;\n\t\t\t\t\t\t\t\t\t\tFACE?: boolean;\n\t\t\t\t\t\t\t\t\t\tSMS?: boolean;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_2FA_INCOMPLETE:\n\t\t\t\t\t\tthis.flowMachine?.send({\n\t\t\t\t\t\t\ttype: \"WITHDRAWAL_2FA_INCOMPLETE\",\n\t\t\t\t\t\t\tresult: extractErrorResult(error) as {\n\t\t\t\t\t\t\t\tbizNo: string;\n\t\t\t\t\t\t\t\tsteps: Array<{\n\t\t\t\t\t\t\t\t\ttype: 'GOOGLE' | 'EMAIL' | 'FACE' | 'SMS';\n\t\t\t\t\t\t\t\t\tstatus: 'pending' | 'success' | 'failed';\n\t\t\t\t\t\t\t\t\trequired: boolean;\n\t\t\t\t\t\t\t\t\tmetadata?: {\n\t\t\t\t\t\t\t\t\t\temail?: string;\n\t\t\t\t\t\t\t\t\t\temailSent?: boolean;\n\t\t\t\t\t\t\t\t\t\tqrCodeUrl?: string;\n\t\t\t\t\t\t\t\t\t\tqrCodeValidSeconds?: number;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}>;\n\t\t\t\t\t\t\t\trelation: 'AND' | 'OR';\n\t\t\t\t\t\t\t\tmfa?: {\n\t\t\t\t\t\t\t\t\tverified: {\n\t\t\t\t\t\t\t\t\t\tGOOGLE?: boolean;\n\t\t\t\t\t\t\t\t\t\tEMAIL?: boolean;\n\t\t\t\t\t\t\t\t\t\tFACE?: boolean;\n\t\t\t\t\t\t\t\t\t\tSMS?: boolean;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tcase ERROR_CODES.WITHDRAWAL_DRY_RUN_COMPLETE:\n\t\t\t\t\t\tthis.flowMachine?.send({\n\t\t\t\t\t\t\ttype: \"WITHDRAWAL_DRY_RUN_COMPLETE\",\n\t\t\t\t\t\t\tresult: extractErrorResult(error) as {\n\t\t\t\t\t\t\t\tbizNo: string;\n\t\t\t\t\t\t\t\tsteps: Array<{\n\t\t\t\t\t\t\t\t\ttype: 'GOOGLE' | 'EMAIL' | 'FACE' | 'SMS';\n\t\t\t\t\t\t\t\t\tstatus: 'pending' | 'success' | 'failed';\n\t\t\t\t\t\t\t\t\trequired: boolean;\n\t\t\t\t\t\t\t\t\tmetadata?: {\n\t\t\t\t\t\t\t\t\t\temail?: string;\n\t\t\t\t\t\t\t\t\t\temailSent?: boolean;\n\t\t\t\t\t\t\t\t\t\tqrCodeUrl?: string;\n\t\t\t\t\t\t\t\t\t\tqrCodeValidSeconds?: number;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}>;\n\t\t\t\t\t\t\t\trelation: 'AND' | 'OR';\n\t\t\t\t\t\t\t\tmfa?: {\n\t\t\t\t\t\t\t\t\tverified: {\n\t\t\t\t\t\t\t\t\t\tGOOGLE?: boolean;\n\t\t\t\t\t\t\t\t\t\tEMAIL?: boolean;\n\t\t\t\t\t\t\t\t\t\tFACE?: boolean;\n\t\t\t\t\t\t\t\t\t\tSMS?: boolean;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconsole.error(\"Unhandled withdrawal error\", error);\n\n\t\t\t\t// Send WITHDRAWAL_FATAL to trigger the fatal state transition\n\t\t\t\tthis.flowMachine?.send({\n\t\t\t\t\ttype: \"WITHDRAWAL_FATAL\",\n\t\t\t\t\terror: error,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\t// Execute withdrawal\n\t\tconst { data: res, error, success } = await this.options.executeWithdrawalFn(\n\t\t\tstate.context.walletId,\n\t\t\tquoteId,\n\t\t\tquoteId,\n\t\t\t{},\n\t\t);\n\n\t\tif (!success) {\n\t\t\t// Extract error type information\n\t\t\tconst errorInfo = extractErrorTypeInfo(error);\n\t\t\tconst errorMessage = error instanceof Error\n\t\t\t\t? error.message\n\t\t\t\t: (error as any)?.error || (error as any)?.message || \"Failed to execute withdrawal\";\n\n\t\t\tconsole.error(\"executeWithdrawal error\", error);\n\t\t\tthis.handleWithdrawalError(error);\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: errorMessage,\n\t\t\t\ttype: (errorInfo.rawType as TypeEnum2) || undefined,\n\t\t\t};\n\t\t}\n\n\t\t// Withdrawal is in progress, will be handled by WebSocket callbacks\n\t\t// Return standardized success response\n\t\treturn {\n\t\t\t// Legacy compatibility - direct access to response data\n\t\t\t...(res??{}),\n\n\t\t\t// New standardized structure\n\t\t\tsuccess: true,\n\t\t\tresult: res,\n\t\t};\n\t}\n\n\tasync submit2FA(code: string) {\n\t\t// Guard: No flow machine\n\t\tif (!this.flowMachine) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Flow machine not initialized\",\n\t\t\t};\n\t\t}\n\n\t\tconst state = this.flowMachine.getState();\n\n\t\t// Guard: Wrong state\n\t\tif (state.type !== \"withdraw:error2FA\") {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `Cannot submit 2FA in state: ${state.type}`,\n\t\t\t};\n\t\t}\n\n\t\t// Guard: No quote or wallet ID\n\t\tif (!state.context.quote || !state.context.walletId) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Quote or wallet ID not found in state\",\n\t\t\t};\n\t\t}\n\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"SUBMIT_2FA\",\n\t\t\tcode,\n\t\t});\n\n\t\t// Re-execute withdrawal with 2FA code\n\t\tconst quote = state.context.quote;\n\t\tconst idem = this.generateId();\n\n\t\tconst { data: res, error, success } = await this.options.executeWithdrawalFn(\n\t\t\tstate.context.walletId,\n\t\t\tidem,\n\t\t\tquote.id,\n\t\t\t{ twofa: code },\n\t\t);\n\n\t\tif (!success) {\n\t\t\t// Extract error type information\n\t\t\tconst errorInfo = extractErrorTypeInfo(error);\n\t\t\tconst errorMessage = error instanceof Error\n\t\t\t\t? error.message\n\t\t\t\t: (error as any)?.error || (error as any)?.message || \"Failed to submit 2FA code\";\n\n\t\t\tthis.handleWithdrawalError(error);\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: errorMessage,\n\t\t\t\ttype: (errorInfo.rawType as TypeEnum2) || undefined,\n\t\t\t};\n\t\t}\n\n\t\t// Withdrawal is in progress, will be handled by WebSocket callbacks\n\t\t// Return standardized success response\n\t\treturn {\n\t\t\t// Legacy compatibility - direct access to response data\n\t\t\t...(res ?? {}),\n\n\t\t\t// New standardized structure\n\t\t\tsuccess: true,\n\t\t\tresult: res,\n\t\t};\n\t}\n\n\tasync submitSMS(code: string) {\n\t\tif (!this.flowMachine) return;\n\n\t\tconst state = this.flowMachine.getState();\n\t\tif (state.type !== \"withdraw:errorSMS\") return;\n\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"SUBMIT_SMS\",\n\t\t\tcode,\n\t\t});\n\n\t\t// Re-execute withdrawal with SMS code\n\t\tconst quote = state.context.quote;\n\t\tif (quote && state.context.walletId) {\n\t\t\tconst idem = this.generateId();\n\n\t\t\tconst { data: res, error, success } = await this.options.executeWithdrawalFn(\n\t\t\t\tstate.context.walletId,\n\t\t\t\tidem,\n\t\t\t\tquote.id,\n\t\t\t\t{},\n\t\t\t);\n\n\t\t\tif (!success) {\n\t\t\t\tthis.handleWithdrawalError(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Withdrawal is in progress, will be handled by WebSocket callbacks\n\t\t\treturn res;\n\t\t}\n\t}\n\n\tasync retryWithdrawal() {\n\t\tif (!this.flowMachine) return;\n\n\t\tconst state = this.flowMachine.getState();\n\t\tif (state.type !== \"withdraw:retrying\") return;\n\n\t\tthis.flowMachine.send({ type: \"RETRY_WITHDRAWAL\" });\n\n\t\t// Re-execute withdrawal with new idempotency key\n\t\tconst quote = state.context.quote;\n\t\tif (quote) {\n\t\t\treturn await this.executeWithdrawal(quote.id);\n\t\t}\n\t}\n\n\t/**\n\t * Submit a verification code for a specific step in multi-step 2FA flow.\n\t * This stores the code and re-invokes the withdrawal with all collected codes.\n\t *\n\t * @param stepType The type of step to submit code for (GOOGLE, EMAIL, or SMS)\n\t * @param code The verification code\n\t */\n\tasync submit2FAMultiStep(stepType: 'GOOGLE' | 'EMAIL' | 'SMS', code: string) {\n\t\t// Guard: No flow machine\n\t\tif (!this.flowMachine) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Flow machine not initialized\",\n\t\t\t};\n\t\t}\n\n\t\tconst state = this.flowMachine.getState();\n\n\t\t// Guard: Wrong state\n\t\tif (state.type !== \"withdraw:error2FAMultiStep\") {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `Cannot submit multi-step 2FA in state: ${state.type}`,\n\t\t\t};\n\t\t}\n\n\t\t// Guard: No quote, wallet ID, or multiStep2FA context\n\t\tif (!state.context.quote || !state.context.walletId || !state.context.multiStep2FA) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Quote, wallet ID, or multi-step 2FA context not found\",\n\t\t\t};\n\t\t}\n\n\t\t// Send action to store the code and transition to processing\n\t\tthis.flowMachine.send({\n\t\t\ttype: \"SUBMIT_2FA_MULTI_STEP\",\n\t\t\tstepType,\n\t\t\tcode,\n\t\t});\n\n\t\t// Build the params with all collected codes plus the new one\n\t\tconst multiStep2FA = state.context.multiStep2FA;\n\t\tconst collectedCodes = { ...multiStep2FA.collectedCodes };\n\n\t\t// Add the new code\n\t\tif (stepType === 'GOOGLE') collectedCodes.twofa = code;\n\t\telse if (stepType === 'EMAIL') collectedCodes.emailCode = code;\n\t\telse if (stepType === 'SMS') collectedCodes.smsCode = code;\n\n\t\t// Re-execute withdrawal with bizNo + all collected codes\n\t\tconst quote = state.context.quote;\n\t\tconst idem = this.generateId();\n\n\t\tconst { data: res, error, success } = await this.options.executeWithdrawalFn(\n\t\t\tstate.context.walletId,\n\t\t\tidem,\n\t\t\tquote.id,\n\t\t\t{\n\t\t\t\tbizNo: multiStep2FA.bizNo,\n\t\t\t\t...collectedCodes,\n\t\t\t},\n\t\t);\n\n\t\tif (!success) {\n\t\t\t// Extract error type information\n\t\t\tconst errorInfo = extractErrorTypeInfo(error);\n\t\t\tconst errorMessage = error instanceof Error\n\t\t\t\t? error.message\n\t\t\t\t: (error as any)?.error || (error as any)?.message || \"Failed to submit multi-step 2FA\";\n\n\t\t\tthis.handleWithdrawalError(error);\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: errorMessage,\n\t\t\t\ttype: (errorInfo.rawType as TypeEnum2) || undefined,\n\t\t\t};\n\t\t}\n\n\t\t// Withdrawal is in progress, will be handled by WebSocket callbacks\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresult: res,\n\t\t};\n\t}\n\n\t/**\n\t * Confirm the withdrawal after all multi-step 2FA steps are verified.\n\t * This executes the withdrawal without dryRun flag.\n\t */\n\tasync confirmWithdrawal() {\n\t\t// Guard: No flow machine\n\t\tif (!this.flowMachine) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Flow machine not initialized\",\n\t\t\t};\n\t\t}\n\n\t\tconst state = this.flowMachine.getState();\n\n\t\t// Guard: Wrong state\n\t\tif (state.type !== \"withdraw:readyToConfirm\") {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `Cannot confirm withdrawal in state: ${state.type}`,\n\t\t\t};\n\t\t}\n\n\t\t// Guard: No quote, wallet ID, or multiStep2FA context\n\t\tif (!state.context.quote || !state.context.walletId || !state.context.multiStep2FA) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Quote, wallet ID, or multi-step 2FA context not found\",\n\t\t\t};\n\t\t}\n\n\t\t// Send action to transition to processing\n\t\tthis.flowMachine.send({ type: \"CONFIRM_WITHDRAWAL\" });\n\n\t\t// Execute withdrawal with bizNo + all collected codes (WITHOUT dryRun)\n\t\tconst multiStep2FA = state.context.multiStep2FA;\n\t\tconst quote = state.context.quote;\n\t\tconst idem = this.generateId();\n\n\t\tconst { data: res, error, success } = await this.options.executeWithdrawalFn(\n\t\t\tstate.context.walletId,\n\t\t\tidem,\n\t\t\tquote.id,\n\t\t\t{\n\t\t\t\tbizNo: multiStep2FA.bizNo,\n\t\t\t\t...multiStep2FA.collectedCodes,\n\t\t\t\t// No dryRun flag - this is the real execution\n\t\t\t},\n\t\t);\n\n\t\tif (!success) {\n\t\t\t// Extract error type information\n\t\t\tconst errorInfo = extractErrorTypeInfo(error);\n\t\t\tconst errorMessage = error instanceof Error\n\t\t\t\t? error.message\n\t\t\t\t: (error as any)?.error || (error as any)?.message || \"Failed to confirm withdrawal\";\n\n\t\t\tthis.handleWithdrawalError(error);\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: errorMessage,\n\t\t\t\ttype: (errorInfo.rawType as TypeEnum2) || undefined,\n\t\t\t};\n\t\t}\n\n\t\t// Withdrawal is in progress, will be handled by WebSocket callbacks\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresult: res,\n\t\t};\n\t}\n\n\t/**\n\t * Poll for FACE verification completion in multi-step 2FA flow.\n\t * This re-invokes the withdrawal with just the bizNo to check if FACE has been verified.\n\t * NOTE: Does NOT transition state to processing — keeps the MFA UI visible during polling.\n\t */\n\tasync pollFaceVerification() {\n\t\t// Guard: No flow machine\n\t\tif (!this.flowMachine) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Flow machine not initialized\",\n\t\t\t};\n\t\t}\n\n\t\tconst state = this.flowMachine.getState();\n\n\t\t// Guard: Wrong state\n\t\tif (state.type !== \"withdraw:error2FAMultiStep\") {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `Cannot poll FACE verification in state: ${state.type}`,\n\t\t\t};\n\t\t}\n\n\t\t// Guard: No quote, wallet ID, or multiStep2FA context\n\t\tif (!state.context.quote || !state.context.walletId || !state.context.multiStep2FA) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Quote, wallet ID, or multi-step 2FA context not found\",\n\t\t\t};\n\t\t}\n\n\t\t// NOTE: We intentionally do NOT send POLL_FACE_VERIFICATION to the state machine here.\n\t\t// Transitioning to withdraw:processing would hide the MFA UI during polling.\n\t\t// The API response will be handled by the error handler which dispatches\n\t\t// WITHDRAWAL_2FA_INCOMPLETE or WITHDRAWAL_DRY_RUN_COMPLETE back to the state machine.\n\n\t\t// Re-execute withdrawal with bizNo only (no collectedCodes to avoid re-triggering other steps)\n\t\tconst multiStep2FA = state.context.multiStep2FA;\n\t\tconst quote = state.context.quote;\n\t\tconst idem = this.generateId();\n\n\t\tconst { data: res, error, success } = await this.options.executeWithdrawalFn(\n\t\t\tstate.context.walletId,\n\t\t\tidem,\n\t\t\tquote.id,\n\t\t\t{\n\t\t\t\tbizNo: multiStep2FA.bizNo,\n\t\t\t\tparams: {\n\t\t\t\t\tdryRun: true, // Indicate this is a polling attempt, not a new submission\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\tif (!success) {\n\t\t\t// Extract error type information\n\t\t\tconst errorInfo = extractErrorTypeInfo(error);\n\t\t\tconst errorMessage = error instanceof Error\n\t\t\t\t? error.message\n\t\t\t\t: (error as any)?.error || (error as any)?.message || \"Failed to poll FACE verification\";\n\n\t\t\tthis.handleWithdrawalError(error);\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: errorMessage,\n\t\t\t\ttype: (errorInfo.rawType as TypeEnum2) || undefined,\n\t\t\t};\n\t\t}\n\n\t\t// Withdrawal is in progress, will be handled by WebSocket callbacks\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresult: res,\n\t\t};\n\t}\n\n\t/**\n\t * Poll for ROAMING_FIDO verification completion in multi-step 2FA flow.\n\t * This re-invokes the withdrawal with just the bizNo to check if ROAMING_FIDO has been verified.\n\t * NOTE: Does NOT transition state to processing — keeps the MFA UI visible during polling.\n\t */\n\tasync pollRoamingFidoVerification() {\n\t\t// Guard: No flow machine\n\t\tif (!this.flowMachine) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Flow machine not initialized\",\n\t\t\t};\n\t\t}\n\n\t\tconst state = this.flowMachine.getState();\n\n\t\t// Guard: Wrong state\n\t\tif (state.type !== \"withdraw:error2FAMultiStep\") {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `Cannot poll ROAMING_FIDO verification in state: ${state.type}`,\n\t\t\t};\n\t\t}\n\n\t\t// Guard: No quote, wallet ID, or multiStep2FA context\n\t\tif (!state.context.quote || !state.context.walletId || !state.context.multiStep2FA) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Quote, wallet ID, or multi-step 2FA context not found\",\n\t\t\t};\n\t\t}\n\n\t\t// NOTE: We intentionally do NOT send a state transition action here.\n\t\t// Transitioning to withdraw:processing would hide the MFA UI during polling.\n\t\t// The API response will be handled by the error handler which dispatches\n\t\t// WITHDRAWAL_2FA_INCOMPLETE or WITHDRAWAL_DRY_RUN_COMPLETE back to the state machine.\n\n\t\t// Re-execute withdrawal with bizNo only (no collectedCodes to avoid re-triggering other steps)\n\t\tconst multiStep2FA = state.context.multiStep2FA;\n\t\tconst quote = state.context.quote;\n\t\tconst idem = this.generateId();\n\n\t\tconst { data: res, error, success } = await this.options.executeWithdrawalFn(\n\t\t\tstate.context.walletId,\n\t\t\tidem,\n\t\t\tquote.id,\n\t\t\t{\n\t\t\t\tbizNo: multiStep2FA.bizNo,\n\t\t\t\tparams: {\n\t\t\t\t\tdryRun: true, // Indicate this is a polling attempt, not a new submission\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\tif (!success) {\n\t\t\t// Extract error type information\n\t\t\tconst errorInfo = extractErrorTypeInfo(error);\n\t\t\tconst errorMessage = error instanceof Error\n\t\t\t\t? error.message\n\t\t\t\t: (error as any)?.error || (error as any)?.message || \"Failed to poll ROAMING_FIDO verification\";\n\n\t\t\tthis.handleWithdrawalError(error);\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: errorMessage,\n\t\t\t\ttype: (errorInfo.rawType as TypeEnum2) || undefined,\n\t\t\t};\n\t\t}\n\n\t\t// Withdrawal is in progress, will be handled by WebSocket callbacks\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresult: res,\n\t\t};\n\t}\n\n\tprivate handleWithdrawalError(error: BluvoError) {\n\t\t// Use centralized error handler\n\t\tWithdrawalErrorHandler.handleWithdrawalError(error, this.flowMachine);\n\t}\n\n\tgetState() {\n\t\treturn this.flowMachine?.getState();\n\t}\n\n\tsubscribe(listener: (state: FlowState) => void) {\n\t\treturn this.flowMachine?.subscribe(listener) || (() => {});\n\t}\n\n\tcancel() {\n\t\tthis.flowMachine?.send({ type: \"CANCEL_FLOW\" });\n\t\tthis.dispose();\n\t}\n\n\tdispose() {\n\t\tif (this.quoteRefreshTimer) {\n\t\t\tclearTimeout(this.quoteRefreshTimer);\n\t\t\tthis.quoteRefreshTimer = undefined;\n\t\t}\n\n\t\tif (this.qrCodeTimeoutTimer) {\n\t\t\tclearTimeout(this.qrCodeTimeoutTimer);\n\t\t\tthis.qrCodeTimeoutTimer = undefined;\n\t\t}\n\n\t\tif (this.subscription) {\n\t\t\tthis.webClient.unsubscribe(this.subscription.topicName);\n\t\t\tthis.subscription = undefined;\n\t\t}\n\n\t\tif (this.flowMachine) {\n\t\t\tthis.flowMachine.dispose();\n\t\t\tthis.flowMachine = undefined;\n\t\t}\n\t}\n\n\t// TEST METHOD - For testing withdrawal completion without real transactions\n\ttestWithdrawalComplete(transactionId?: string) {\n\t\tconsole.log(\"🧪 TEST: Simulating withdrawal completion\");\n\n\t\t// Simulate the same message that would come from onWithdrawComplete\n\t\tconst mockMessage = {\n\t\t\ttype: \"withdraw\",\n\t\t\tsuccess: true,\n\t\t\twalletId: \"test-wallet-id-\" + Date.now(),\n\t\t\tstep: \"complete\",\n\t\t\tstepIndex: 4,\n\t\t\ttotalSteps: 4,\n\t\t\ttransactionId: transactionId || \"test-transaction-\" + Date.now(),\n\t\t};\n\n\t\t// Execute the same logic as in onWithdrawComplete\n\t\tif (mockMessage.success && mockMessage.type === \"withdraw\") {\n\t\t\tconsole.log(\n\t\t\t\t\"🧪 TEST: Withdrawal completed successfully, transitioning state machine\",\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t\"🧪 TEST: Current flow machine state before completion:\",\n\t\t\t\tthis.flowMachine?.getState()?.type,\n\t\t\t);\n\n\t\t\t// First, send success to update the withdrawal machine state\n\t\t\tthis.flowMachine?.send({\n\t\t\t\ttype: \"WITHDRAWAL_SUCCESS\",\n\t\t\t\ttransactionId: mockMessage.transactionId,\n\t\t\t});\n\n\t\t\t// Then send completion action\n\t\t\tthis.flowMachine?.send({\n\t\t\t\ttype: \"WITHDRAWAL_COMPLETED\",\n\t\t\t\ttransactionId: mockMessage.transactionId,\n\t\t\t});\n\n\t\t\t// Log current state after sending actions\n\t\t\tconst currentState = this.flowMachine?.getState();\n\t\t\tconsole.log(\n\t\t\t\t\"🧪 TEST: Flow machine state after completion actions:\",\n\t\t\t\tcurrentState?.type,\n\t\t\t);\n\t\t}\n\t}\n}\n","import type { WalletwithdrawbalancebalanceResponse } from \"../../generated\";\nimport type {\n\tPreviewCallbacks,\n\tPreviewWalletBalance,\n\tPreviewWalletInput,\n\tWalletPreviewState,\n} from \"../types/preview.types\";\nimport {BluvoFlowClientOptions} from \"./BluvoFlowClient\";\nimport { ERROR_CODES, extractErrorCode } from \"../error-codes\";\nimport { transformBalancesForPreview } from \"../utils/balanceTransform\";\n\n/**\n * Options for creating a BluvoPreviewManager\n */\nexport type BluvoPreviewManagerOptions = Pick<BluvoFlowClientOptions, \"fetchWithdrawableBalanceFn\"|\"pingWalletByIdFn\">;\n\n\n/**\n * Manager for wallet preview states\n *\n * This class manages the preview states of multiple wallets independently,\n * allowing you to display balance information for multiple wallets without\n * requiring full OAuth flows for each one.\n *\n * @example\n * ```typescript\n * const previewManager = new BluvoPreviewManager({\n *   pingWalletByIdFn: pingWallet,\n *   fetchWithdrawableBalanceFn: getBalances\n * });\n *\n * // Load previews for multiple wallets\n * await previewManager.loadPreviewWallets([\n *   { id: 'wallet-1', exchange: 'coinbase' },\n *   { id: 'wallet-2', exchange: 'kraken' }\n * ]);\n *\n * // Subscribe to state changes\n * const unsubscribe = previewManager.subscribe((states) => {\n *   console.log('Preview states updated:', states);\n * });\n * ```\n */\nexport class BluvoPreviewManager {\n\tprivate states: Map<string, WalletPreviewState> = new Map();\n\tprivate listeners: Set<(states: Record<string, WalletPreviewState>) => void> =\n\t\tnew Set();\n\n\tconstructor(private options: BluvoPreviewManagerOptions) {}\n\n\t/**\n\t * Load preview data for multiple wallets\n\t */\n\tasync loadPreviewWallets(\n\t\twallets: Array<PreviewWalletInput>,\n\t\tcallbacks?: PreviewCallbacks,\n\t): Promise<void> {\n\t\t// Load all wallets in parallel\n\t\tawait Promise.allSettled(\n\t\t\twallets.map((wallet) =>\n\t\t\t\tthis.loadPreviewWallet(wallet.id, wallet.exchange, callbacks),\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * Load preview data for a single wallet\n\t *\n\t * This method:\n\t * 1. Calls pingWalletByIdFn to validate wallet exists and has valid credentials\n\t * 2. If valid, fetches withdrawable balance\n\t * 3. Updates state and notifies listeners\n\t */\n\tasync loadPreviewWallet(\n\t\twalletId: string,\n\t\texchange: string,\n\t\tcallbacks?: PreviewCallbacks,\n\t): Promise<void> {\n\t\t// Initialize state as loading\n\t\tthis.updateState(walletId, {\n\t\t\twalletId,\n\t\t\texchange,\n\t\t\tstatus: \"loading\",\n\t\t\tlastUpdated: Date.now(),\n\t\t});\n\n\t\t// Step 1: Ping wallet to validate\n\t\tconst {\n\t\t\tdata: pingResult,\n\t\t\terror: pingError,\n\t\t\tsuccess: pingSuccess\n\t\t} = await this.options.pingWalletByIdFn(walletId);\n\n\t\t// Check for ping errors\n\t\tif (!pingSuccess) {\n\t\t\tconst errorCode = extractErrorCode(pingError);\n\n\t\t\tif (errorCode === ERROR_CODES.WALLET_NOT_FOUND) {\n\t\t\t\tthis.updateState(walletId, {\n\t\t\t\t\twalletId,\n\t\t\t\t\texchange,\n\t\t\t\t\tstatus: \"error_not_found\",\n\t\t\t\t\terror: new Error(\"Wallet not found\"),\n\t\t\t\t\tlastUpdated: Date.now(),\n\t\t\t\t});\n\t\t\t\tcallbacks?.onWalletNotFound?.(walletId);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Unknown ping error\n\t\t\tthis.updateState(walletId, {\n\t\t\t\twalletId,\n\t\t\t\texchange,\n\t\t\t\tstatus: \"error_unknown\",\n\t\t\t\terror: pingError instanceof Error ? pingError : new Error((pingError as any)?.error || (pingError as any)?.message || \"Failed to ping wallet\"),\n\t\t\t\tlastUpdated: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Check ping result for specific error cases\n\t\t// The ping API returns {status: \"SUCCESS\" | \"INVALID_API_CREDENTIALS\"}\n\t\tif (pingResult?.status === \"INVALID_API_CREDENTIALS\") {\n\t\t\tthis.updateState(walletId, {\n\t\t\t\twalletId,\n\t\t\t\texchange,\n\t\t\t\tstatus: \"error_invalid_credentials\",\n\t\t\t\terror: new Error(\"Invalid API credentials\"),\n\t\t\t\tlastUpdated: Date.now(),\n\t\t\t});\n\t\t\tcallbacks?.onWalletInvalidApiCredentials?.(walletId);\n\t\t\treturn;\n\t\t}\n\n\t\t// Step 2: Fetch withdrawable balance\n\t\tconst {\n\t\t\tsuccess: balanceSuccess,\n\t\t\tdata: balanceResponse,\n\t\t\terror: balanceError\n\t\t} = await this.options.fetchWithdrawableBalanceFn(walletId);\n\n\t\tif (!balanceSuccess) {\n\t\t\tconst errorCode = extractErrorCode(balanceError);\n\n\t\t\tif (errorCode === ERROR_CODES.WALLET_NOT_FOUND) {\n\t\t\t\tthis.updateState(walletId, {\n\t\t\t\t\twalletId,\n\t\t\t\t\texchange,\n\t\t\t\t\tstatus: \"error_not_found\",\n\t\t\t\t\terror: new Error(\"Wallet not found\"),\n\t\t\t\t\tlastUpdated: Date.now(),\n\t\t\t\t});\n\t\t\t\tcallbacks?.onWalletNotFound?.(walletId);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Unknown balance error\n\t\t\tthis.updateState(walletId, {\n\t\t\t\twalletId,\n\t\t\t\texchange,\n\t\t\t\tstatus: \"error_unknown\",\n\t\t\t\terror: balanceError instanceof Error ? balanceError : new Error((balanceError as any)?.error || (balanceError as any)?.message || \"Failed to fetch balance\"),\n\t\t\t\tlastUpdated: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (!balanceResponse?.balances) {\n\t\t\tthis.updateState(walletId, {\n\t\t\t\twalletId,\n\t\t\t\texchange,\n\t\t\t\tstatus: \"error_unknown\",\n\t\t\t\terror: new Error(\"No balance data returned\"),\n\t\t\t\tlastUpdated: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Transform balance data to preview format\n\t\tconst balances: Array<PreviewWalletBalance> = transformBalancesForPreview(balanceResponse.balances);\n\n\t\t// Update state to ready\n\t\tthis.updateState(walletId, {\n\t\t\twalletId,\n\t\t\texchange,\n\t\t\tstatus: \"ready\",\n\t\t\tbalances,\n\t\t\tlastUpdated: Date.now(),\n\t\t});\n\n\t\tcallbacks?.onWalletBalance?.(walletId, balances);\n\t}\n\n\t/**\n\t * Get preview state for a specific wallet\n\t */\n\tgetPreviewState(walletId: string): WalletPreviewState | undefined {\n\t\treturn this.states.get(walletId);\n\t}\n\n\t/**\n\t * Get all preview states\n\t */\n\tgetAllPreviewStates(): Record<string, WalletPreviewState> {\n\t\tconst result: Record<string, WalletPreviewState> = {};\n\t\tthis.states.forEach((state, walletId) => {\n\t\t\tresult[walletId] = state;\n\t\t});\n\t\treturn result;\n\t}\n\n\t/**\n\t * Subscribe to preview state changes\n\t *\n\t * @param listener Function called when any preview state changes\n\t * @returns Unsubscribe function\n\t */\n\tsubscribe(\n\t\tlistener: (states: Record<string, WalletPreviewState>) => void,\n\t): () => void {\n\t\tthis.listeners.add(listener);\n\n\t\t// Immediately call with current state\n\t\tlistener(this.getAllPreviewStates());\n\n\t\t// Return unsubscribe function\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t}\n\n\t/**\n\t * Clear preview for a specific wallet\n\t */\n\tclearPreview(walletId: string): void {\n\t\tthis.states.delete(walletId);\n\t\tthis.notifyListeners();\n\t}\n\n\t/**\n\t * Clear all previews\n\t */\n\tclearAllPreviews(): void {\n\t\tthis.states.clear();\n\t\tthis.notifyListeners();\n\t}\n\n\t/**\n\t * Cleanup resources\n\t */\n\tdispose(): void {\n\t\tthis.states.clear();\n\t\tthis.listeners.clear();\n\t}\n\n\t/**\n\t * Update state for a specific wallet and notify listeners\n\t */\n\tprivate updateState(walletId: string, state: WalletPreviewState): void {\n\t\tthis.states.set(walletId, state);\n\t\tthis.notifyListeners();\n\t}\n\n\t/**\n\t * Notify all listeners of state changes\n\t */\n\tprivate notifyListeners(): void {\n\t\tconst allStates = this.getAllPreviewStates();\n\t\tthis.listeners.forEach((listener) => {\n\t\t\tlistener(allStates);\n\t\t});\n\t}\n}\n","import { BluvoClient } from \"./src/BluvoClient\";\nimport { BluvoWebClient } from \"./src/BluvoWebClient\";\n\nexport * from \"./generated\";\nexport { BluvoClient } from \"./src/BluvoClient\";\nexport { BluvoWebClient, type QRCodeOptions } from \"./src/BluvoWebClient\";\n// Workflow Types\nexport {\n\tWorkflowTypes,\n\ttype QRCodeStatus,\n\ttype QRCodeAuthWorkflowMessageBody,\n\ttype WorkflowMessageBody,\n} from \"./src/WorkflowTypes\";\n// State Machine exports\nexport * from \"./src/machines\";\nexport type { SilentResumeWithdrawalFlowOptions } from \"./src/machines/BluvoFlowClient\";\nexport type { BluvoPreviewManagerOptions } from \"./src/machines/BluvoPreviewManager\";\nexport { BluvoPreviewManager } from \"./src/machines/BluvoPreviewManager\";\nexport * from \"./src/types/flow.types\";\nexport * from \"./src/types/machine.types\";\n// Preview functionality (NEW - backwards compatible addition)\nexport * from \"./src/types/preview.types\";\nexport * from \"./src/types/withdrawal.types\";\nexport type { Subscription, TopicInfo } from \"./src/WebSocketClient\";\nexport { WebSocketClient } from \"./src/WebSocketClient\";\n// Error handling utilities\nexport {\n\tERROR_CODES,\n\textractErrorCode,\n\textractErrorTypeInfo,\n\textractErrorResult,\n\ttype ErrorCode,\n\ttype ErrorTypeInfo,\n\ttype BluvoError,\n} from \"./src/error-codes\";\n\n// Cache\nexport { BluvoCache, type BluvoCacheAdapter, type BluvoCacheOptions } from \"./src/BluvoCache\";\n\n// API Types - Clean, self-explanatory type exports\n// export * from './src/types/api.types';\n\n/**\n * Create a fully configured Bluvo SDK client instance with a single function call.\n *\n * This is the recommended entry point for integrating the Bluvo SDK into your application.\n * It creates and initializes a client with your organization credentials, handling all the\n * necessary setup and authentication configuration automatically.\n *\n * The client provides access to all Bluvo API functionality through an intuitive, hierarchical\n * interface organized by domain (prices, wallets, transactions, etc.), making it easy to discover\n * and use the capabilities you need.\n *\n * @param credentials An object containing your Bluvo API credentials:\n *   @param orgId Your unique organization identifier provided during Bluvo onboarding.\n *                This identifies your organization across all projects and API calls.\n *   @param projectId The specific project identifier within your organization.\n *                    Different projects can be used for different applications or environments.\n *   @param apiKey Your secret API key that authorizes requests to the Bluvo API.\n *                 Handle this credential securely and never expose it in client-side code.\n *   @param customDomain Optional custom domain configuration to override default api-bluvo.com.\n *\n * @returns A fully initialized BluvoClient instance ready to make API calls.\n *\n * @example\n * // Create a new client instance\n * const bluvo = createClient({\n *   orgId: 'your-org-id',\n *   projectId: 'your-project-id',\n *   apiKey: 'your-api-key'\n * });\n *\n * // The client is ready to use\n * const btcPrice = await bluvo.prices.candlesticks('BTC', 'USDT');\n */\nexport function createClient({\n\torgId,\n\tprojectId,\n\tapiKey,\n\tcustomDomain,\n}: {\n\torgId: string;\n\tprojectId: string;\n\tapiKey: string;\n\tcustomDomain?: string | \"api-bluvo.com\" | { api: string; ws: string };\n}) {\n\treturn BluvoClient.createClient({\n\t\torgId,\n\t\tprojectId,\n\t\tapiKey,\n\t\tcustomDomain,\n\t});\n}\n\nexport function createSandboxClient({\n\torgId,\n\tprojectId,\n\tapiKey,\n\tcustomDomain,\n}: {\n\torgId: string;\n\tprojectId: string;\n\tapiKey: string;\n\tcustomDomain?: string | \"api-bluvo.com\" | { api: string; ws: string };\n}) {\n\treturn BluvoClient.createClient({\n\t\torgId,\n\t\tprojectId,\n\t\tapiKey,\n\t\tsandbox: true,\n\t\tcustomDomain,\n\t});\n}\n\nexport function createDevClient({\n\torgId,\n\tprojectId,\n\tapiKey,\n\tcustomDomain,\n}: {\n\torgId: string;\n\tprojectId: string;\n\tapiKey: string;\n\tcustomDomain?: string | \"api-bluvo.com\" | { api: string; ws: string };\n}) {\n\treturn BluvoClient.createClient({\n\t\torgId,\n\t\tprojectId,\n\t\tapiKey,\n\t\tdev: true,\n\t\tcustomDomain,\n\t});\n}\n\n// createWebClient\n/**\n * Create a BluvoWebClient instance for browser-based applications.\n *\n * This client is designed for use in web environments where you want to interact with\n * the Bluvo API without exposing sensitive API keys directly in client-side code.\n * It provides methods for OAuth2 authentication flows and other browser-specific features.\n *\n * @param orgId Your Bluvo organization identifier.\n * @param projectId Your Bluvo project identifier.\n * @param customDomain Optional custom domain configuration to override default api-bluvo.com.\n *\n * @returns A new BluvoWebClient instance configured for your organization and project.\n */\nexport function createWebClient({\n\torgId,\n\tprojectId,\n\tcustomDomain,\n}: {\n\torgId: string;\n\tprojectId: string;\n\tcustomDomain?: string | \"api-bluvo.com\" | { api: string; ws: string };\n}): BluvoWebClient {\n\treturn BluvoWebClient.createClient({ orgId, projectId, customDomain });\n}\n\n/**\n * Create a BluvoWebClient instance for the sandbox environment.\n *\n * This client is configured to use the Bluvo sandbox/test environment,\n * which is useful for development and testing without affecting production data.\n *\n * @param orgId Your Bluvo organization identifier.\n * @param projectId Your Bluvo project identifier.\n * @param customDomain Optional custom domain configuration to override default api-bluvo.com.\n *\n * @returns A new BluvoWebClient instance configured for the sandbox environment.\n */\nexport function createSandboxWebClient({\n\torgId,\n\tprojectId,\n\tcustomDomain,\n}: {\n\torgId: string;\n\tprojectId: string;\n\tcustomDomain?: string | \"api-bluvo.com\" | { api: string; ws: string };\n}): BluvoWebClient {\n\treturn BluvoWebClient.createClient({\n\t\torgId,\n\t\tprojectId,\n\t\tsandbox: true,\n\t\tcustomDomain,\n\t});\n}\n\n/**\n * Create a BluvoWebClient instance for local development.\n *\n * This client is configured to use localhost:8787 as the API endpoint,\n * which is useful for local development and testing with a local Bluvo backend.\n *\n * @param orgId Your Bluvo organization identifier.\n * @param projectId Your Bluvo project identifier.\n * @param customDomain Optional custom domain configuration to override default api-bluvo.com.\n *\n * @returns A new BluvoWebClient instance configured for local development.\n */\nexport function createDevWebClient({\n\torgId,\n\tprojectId,\n\tcustomDomain,\n}: {\n\torgId: string;\n\tprojectId: string;\n\tcustomDomain?: string | \"api-bluvo.com\" | { api: string; ws: string };\n}): BluvoWebClient {\n\treturn BluvoWebClient.createClient({\n\t\torgId,\n\t\tprojectId,\n\t\tdev: true,\n\t\tcustomDomain,\n\t});\n}\n"]}