@beeperbot/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors/codes.ts","../src/errors/BeeperError.ts","../src/constants.ts","../src/client/http.ts","../src/client/filters.schema.ts","../src/client/AgentClient.ts","../src/client/auth.ts","../src/client/BeeperClient.ts","../src/schemas/filters.schema.ts","../src/schemas/draft.schema.ts","../src/send/draft.ts","../src/send/quotes.ts","../src/send/deposits.ts","../src/send/execute.ts","../src/send/receipts.ts","../src/client/FilterBuilder.ts","../src/schemas/quote.schema.ts","../src/schemas/receipt.schema.ts"],"names":["ENDPOINTS","z","validateDraftInput","randomUUID","validateQuoteId","QuoteSchema","ConfirmResultSchema","ExecuteResultSchema","ReceiptSchema"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * All error codes for the Beeper SDK\r\n */\r\nexport const ErrorCodes = {\r\n // Quote-related errors\r\n QUOTE_EXPIRED: 'QUOTE_EXPIRED',\r\n QUOTE_NOT_FOUND: 'QUOTE_NOT_FOUND',\r\n QUOTE_INVALID: 'QUOTE_INVALID',\r\n\r\n // Recipient-related errors\r\n INVALID_RECIPIENT: 'INVALID_RECIPIENT',\r\n RECIPIENT_NOT_FOUND: 'RECIPIENT_NOT_FOUND',\r\n\r\n // Filter-related errors\r\n INVALID_FILTER: 'INVALID_FILTER',\r\n FILTER_SYNTAX_ERROR: 'FILTER_SYNTAX_ERROR',\r\n\r\n // Budget-related errors\r\n BUDGET_TOO_LOW: 'BUDGET_TOO_LOW',\r\n BUDGET_EXCEEDED: 'BUDGET_EXCEEDED',\r\n\r\n // Payment-related errors\r\n PAYMENT_NOT_FOUND: 'PAYMENT_NOT_FOUND',\r\n PAYMENT_INSUFFICIENT: 'PAYMENT_INSUFFICIENT',\r\n PAYMENT_FAILED: 'PAYMENT_FAILED',\r\n\r\n // Execution-related errors\r\n EXECUTION_ALREADY_TRIGGERED: 'EXECUTION_ALREADY_TRIGGERED',\r\n EXECUTION_FAILED: 'EXECUTION_FAILED',\r\n EXECUTION_PENDING: 'EXECUTION_PENDING',\r\n\r\n // Rate limiting\r\n RATE_LIMITED: 'RATE_LIMITED',\r\n\r\n // Authentication/Authorization\r\n UNAUTHORIZED: 'UNAUTHORIZED',\r\n FORBIDDEN: 'FORBIDDEN',\r\n API_KEY_INVALID: 'API_KEY_INVALID',\r\n\r\n // Network errors\r\n NETWORK_ERROR: 'NETWORK_ERROR',\r\n TIMEOUT: 'TIMEOUT',\r\n CONNECTION_REFUSED: 'CONNECTION_REFUSED',\r\n\r\n // Validation errors\r\n VALIDATION_ERROR: 'VALIDATION_ERROR',\r\n SCHEMA_VALIDATION_FAILED: 'SCHEMA_VALIDATION_FAILED',\r\n\r\n // Server errors\r\n INTERNAL_ERROR: 'INTERNAL_ERROR',\r\n SERVICE_UNAVAILABLE: 'SERVICE_UNAVAILABLE',\r\n\r\n // Draft errors\r\n DRAFT_NOT_FOUND: 'DRAFT_NOT_FOUND',\r\n DRAFT_INVALID: 'DRAFT_INVALID',\r\n\r\n // Generic\r\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\r\n} as const;\r\n\r\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\r\n\r\n/**\r\n * Error codes that indicate the operation can be retried\r\n */\r\nexport const RETRYABLE_ERROR_CODES: readonly ErrorCode[] = [\r\n ErrorCodes.RATE_LIMITED,\r\n ErrorCodes.NETWORK_ERROR,\r\n ErrorCodes.TIMEOUT,\r\n ErrorCodes.CONNECTION_REFUSED,\r\n ErrorCodes.SERVICE_UNAVAILABLE,\r\n ErrorCodes.INTERNAL_ERROR,\r\n] as const;\r\n\r\n/**\r\n * Check if an error code is retryable\r\n */\r\nexport function isRetryableCode(code: ErrorCode): boolean {\r\n return RETRYABLE_ERROR_CODES.includes(code);\r\n}\r\n\r\n/**\r\n * HTTP status code to error code mapping\r\n */\r\nexport const HTTP_STATUS_TO_ERROR_CODE: Record<number, ErrorCode> = {\r\n 400: ErrorCodes.VALIDATION_ERROR,\r\n 401: ErrorCodes.UNAUTHORIZED,\r\n 403: ErrorCodes.FORBIDDEN,\r\n 404: ErrorCodes.UNKNOWN_ERROR, // Specific 404s are mapped differently\r\n 408: ErrorCodes.TIMEOUT,\r\n 429: ErrorCodes.RATE_LIMITED,\r\n 500: ErrorCodes.INTERNAL_ERROR,\r\n 502: ErrorCodes.SERVICE_UNAVAILABLE,\r\n 503: ErrorCodes.SERVICE_UNAVAILABLE,\r\n 504: ErrorCodes.TIMEOUT,\r\n};\r\n","import { type ErrorCode, ErrorCodes, isRetryableCode } from './codes.js';\r\n\r\n/**\r\n * Additional context that may be included with errors\r\n */\r\nexport interface ErrorContext {\r\n /** The request ID from the server */\r\n requestId?: string | undefined;\r\n /** HTTP status code if from an HTTP response */\r\n statusCode?: number | undefined;\r\n /** The endpoint that was called */\r\n endpoint?: string | undefined;\r\n /** Additional details from the API */\r\n details?: Record<string, unknown> | undefined;\r\n /** Retry-After header value in seconds */\r\n retryAfter?: number | undefined;\r\n}\r\n\r\n/**\r\n * Options for creating a BeeperError\r\n */\r\nexport interface BeeperErrorOptions {\r\n code: ErrorCode;\r\n message: string;\r\n cause?: Error | undefined;\r\n context?: ErrorContext | undefined;\r\n retryable?: boolean | undefined;\r\n}\r\n\r\n/**\r\n * Base error class for all Beeper SDK errors\r\n */\r\nexport class BeeperError extends Error {\r\n /** Error code identifying the type of error */\r\n public readonly code: ErrorCode;\r\n\r\n /** Whether this error can be retried */\r\n public readonly retryable: boolean;\r\n\r\n /** Additional context about the error */\r\n public readonly context: ErrorContext;\r\n\r\n /** The original error that caused this error */\r\n public override readonly cause?: Error | undefined;\r\n\r\n constructor(options: BeeperErrorOptions) {\r\n super(options.message);\r\n this.name = 'BeeperError';\r\n this.code = options.code;\r\n this.cause = options.cause;\r\n this.context = options.context ?? {};\r\n\r\n // Determine if retryable based on code if not explicitly set\r\n this.retryable = options.retryable ?? isRetryableCode(options.code);\r\n\r\n // Maintain proper stack trace\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, BeeperError);\r\n }\r\n }\r\n\r\n /**\r\n * Create a string representation of the error\r\n */\r\n override toString(): string {\r\n let str = `BeeperError [${this.code}]: ${this.message}`;\r\n if (this.context.requestId) {\r\n str += ` (Request ID: ${this.context.requestId})`;\r\n }\r\n return str;\r\n }\r\n\r\n /**\r\n * Convert to a plain object for logging/serialization\r\n */\r\n toJSON(): Record<string, unknown> {\r\n return {\r\n name: this.name,\r\n code: this.code,\r\n message: this.message,\r\n retryable: this.retryable,\r\n context: this.context,\r\n stack: this.stack,\r\n };\r\n }\r\n\r\n /**\r\n * Create a network error\r\n */\r\n static networkError(message: string, cause?: Error | undefined): BeeperError {\r\n const options: BeeperErrorOptions = {\r\n code: ErrorCodes.NETWORK_ERROR,\r\n message,\r\n retryable: true,\r\n };\r\n if (cause !== undefined) {\r\n options.cause = cause;\r\n }\r\n return new BeeperError(options);\r\n }\r\n\r\n /**\r\n * Create a timeout error\r\n */\r\n static timeout(endpoint: string, timeoutMs: number): BeeperError {\r\n return new BeeperError({\r\n code: ErrorCodes.TIMEOUT,\r\n message: `Request to ${endpoint} timed out after ${timeoutMs}ms`,\r\n context: { endpoint },\r\n retryable: true,\r\n });\r\n }\r\n\r\n /**\r\n * Create an unauthorized error\r\n */\r\n static unauthorized(message = 'Invalid or missing API key'): BeeperError {\r\n return new BeeperError({\r\n code: ErrorCodes.UNAUTHORIZED,\r\n message,\r\n retryable: false,\r\n });\r\n }\r\n\r\n /**\r\n * Create a rate limited error\r\n */\r\n static rateLimited(retryAfter?: number | undefined): BeeperError {\r\n const context: ErrorContext = {};\r\n if (retryAfter !== undefined) {\r\n context.retryAfter = retryAfter;\r\n }\r\n return new BeeperError({\r\n code: ErrorCodes.RATE_LIMITED,\r\n message: retryAfter\r\n ? `Rate limited. Retry after ${retryAfter} seconds`\r\n : 'Rate limited. Please try again later',\r\n context,\r\n retryable: true,\r\n });\r\n }\r\n\r\n /**\r\n * Create a validation error\r\n */\r\n static validation(\r\n message: string,\r\n details?: Record<string, unknown> | undefined\r\n ): BeeperError {\r\n const context: ErrorContext = {};\r\n if (details !== undefined) {\r\n context.details = details;\r\n }\r\n return new BeeperError({\r\n code: ErrorCodes.VALIDATION_ERROR,\r\n message,\r\n context,\r\n retryable: false,\r\n });\r\n }\r\n\r\n /**\r\n * Create a quote expired error\r\n */\r\n static quoteExpired(quoteId: string): BeeperError {\r\n return new BeeperError({\r\n code: ErrorCodes.QUOTE_EXPIRED,\r\n message: `Quote ${quoteId} has expired`,\r\n context: { details: { quoteId } },\r\n retryable: false,\r\n });\r\n }\r\n\r\n /**\r\n * Create from an HTTP response\r\n */\r\n static fromHttpResponse(\r\n statusCode: number,\r\n body: unknown,\r\n requestId?: string | undefined\r\n ): BeeperError {\r\n // Handle both formats:\r\n // 1. { code, message, details } (legacy)\r\n // 2. { error: { code, message, details } } (server format)\r\n const rawBody = body as {\r\n code?: ErrorCode;\r\n message?: string;\r\n details?: Record<string, unknown>;\r\n error?: {\r\n code?: ErrorCode;\r\n message?: string;\r\n details?: Record<string, unknown>;\r\n };\r\n } | null;\r\n\r\n // Extract error data from either format\r\n const errorData = rawBody?.error ?? rawBody;\r\n const code = errorData?.code ?? ErrorCodes.UNKNOWN_ERROR;\r\n const message = errorData?.message ?? `HTTP ${statusCode} error`;\r\n\r\n const context: ErrorContext = { statusCode };\r\n if (requestId !== undefined) {\r\n context.requestId = requestId;\r\n }\r\n if (errorData?.details !== undefined) {\r\n context.details = errorData.details;\r\n }\r\n\r\n return new BeeperError({\r\n code,\r\n message,\r\n context,\r\n });\r\n }\r\n}\r\n","/**\r\n * API Base URLs for different environments\r\n */\r\nexport const API_BASE_URLS = {\r\n production: 'https://beep.works/api/v1/sdk',\r\n staging: 'https://staging.beep.works/api/v1/sdk',\r\n development: 'http://localhost:3000/api/v1/sdk',\r\n} as const;\r\n\r\nexport type Environment = keyof typeof API_BASE_URLS;\r\n\r\n/**\r\n * Default timeout values in milliseconds\r\n */\r\nexport const TIMEOUTS = {\r\n /** Default request timeout */\r\n DEFAULT: 30_000,\r\n /** Timeout for quote requests */\r\n QUOTE: 10_000,\r\n /** Timeout for execute requests (longer due to blockchain) */\r\n EXECUTE: 60_000,\r\n /** Timeout for health checks */\r\n HEALTH: 5_000,\r\n} as const;\r\n\r\n/**\r\n * API Endpoints\r\n */\r\nexport const ENDPOINTS = {\r\n HEALTH: '/send/health',\r\n QUOTES: '/send/quotes',\r\n KEYS: '/keys',\r\n} as const;\r\n\r\n/**\r\n * HTTP Headers\r\n */\r\nexport const HEADERS = {\r\n IDEMPOTENCY_KEY: 'Idempotency-Key',\r\n AUTHORIZATION: 'Authorization',\r\n REQUEST_ID: 'X-Request-Id',\r\n CONTENT_TYPE: 'Content-Type',\r\n} as const;\r\n\r\n/**\r\n * Retry configuration\r\n */\r\nexport const RETRY_CONFIG = {\r\n /** Maximum number of retry attempts */\r\n MAX_RETRIES: 3,\r\n /** Initial delay before first retry (1 second) */\r\n INITIAL_DELAY_MS: 1000,\r\n /** Maximum delay between retries (30 seconds) */\r\n MAX_DELAY_MS: 30_000,\r\n /** Multiplier for exponential backoff */\r\n BACKOFF_MULTIPLIER: 2,\r\n /** Jitter factor to add randomness (0-1) */\r\n JITTER_FACTOR: 0.1,\r\n} as const;\r\n\r\n/**\r\n * Quote expiration time in seconds\r\n */\r\nexport const QUOTE_EXPIRATION_SECONDS = 300; // 5 minutes\r\n\r\n/**\r\n * SDK Version\r\n */\r\nexport const SDK_VERSION = '0.1.0';\r\n","import { z } from 'zod';\r\nimport { BeeperError, ErrorCodes } from '../errors/index.js';\r\nimport {\r\n API_BASE_URLS,\r\n HEADERS,\r\n TIMEOUTS,\r\n SDK_VERSION,\r\n RETRY_CONFIG,\r\n type Environment,\r\n} from '../constants.js';\r\n\r\n/**\r\n * Retry options for HTTP requests\r\n */\r\nexport interface RetryOptions {\r\n /** Maximum number of retry attempts (default: 3) */\r\n maxRetries?: number;\r\n /** Initial delay in milliseconds before first retry (default: 1000) */\r\n initialDelayMs?: number;\r\n /** Maximum delay in milliseconds between retries (default: 30000) */\r\n maxDelayMs?: number;\r\n /** Multiplier for exponential backoff (default: 2) */\r\n backoffMultiplier?: number;\r\n /** Jitter factor to add randomness (0-1, default: 0.1) */\r\n jitterFactor?: number;\r\n}\r\n\r\n/**\r\n * HTTP request options\r\n */\r\nexport interface HttpRequestOptions {\r\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\r\n endpoint: string;\r\n body?: unknown;\r\n headers?: Record<string, string>;\r\n timeout?: number;\r\n idempotencyKey?: string;\r\n signal?: AbortSignal;\r\n /** Retry configuration (set to false to disable retries) */\r\n retry?: RetryOptions | false;\r\n /** Query parameters to append to URL */\r\n params?: Record<string, string | number | boolean | undefined>;\r\n}\r\n\r\n/**\r\n * HTTP response wrapper\r\n */\r\nexport interface HttpResponse<T> {\r\n data: T;\r\n status: number;\r\n headers: Headers;\r\n requestId?: string | undefined;\r\n /** Number of retry attempts made */\r\n retryCount: number;\r\n /** Total time taken including retries (ms) */\r\n totalTimeMs: number;\r\n}\r\n\r\n/**\r\n * HTTP client configuration\r\n */\r\nexport interface HttpClientConfig {\r\n apiKey: string;\r\n baseUrl: string;\r\n timeout: number;\r\n fetch: typeof fetch;\r\n debug: boolean;\r\n}\r\n\r\n/**\r\n * Create HTTP client configuration from SDK config\r\n */\r\nexport function createHttpConfig(options: {\r\n apiKey: string;\r\n environment?: Environment;\r\n baseUrl?: string;\r\n timeout?: number;\r\n fetch?: typeof fetch;\r\n debug?: boolean;\r\n}): HttpClientConfig {\r\n const baseUrl =\r\n options.baseUrl ??\r\n API_BASE_URLS[options.environment ?? 'production'];\r\n\r\n return {\r\n apiKey: options.apiKey,\r\n baseUrl,\r\n timeout: options.timeout ?? TIMEOUTS.DEFAULT,\r\n fetch: options.fetch ?? globalThis.fetch.bind(globalThis),\r\n debug: options.debug ?? false,\r\n };\r\n}\r\n\r\n/**\r\n * HTTP client for making API requests\r\n */\r\nexport class HttpClient {\r\n private readonly config: HttpClientConfig;\r\n\r\n constructor(config: HttpClientConfig) {\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Check if an HTTP status code is retryable\r\n * - 5xx server errors\r\n * - 429 rate limit errors\r\n * Does NOT retry 4xx errors (except 429)\r\n */\r\n private isRetryableStatus(status: number): boolean {\r\n // 429 Too Many Requests\r\n if (status === 429) {\r\n return true;\r\n }\r\n\r\n // 5xx Server Errors\r\n if (status >= 500 && status < 600) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Check if an error is retryable (network errors, timeouts)\r\n */\r\n private isRetryableError(error: Error): boolean {\r\n // Timeout errors\r\n if (error.name === 'AbortError') {\r\n return true;\r\n }\r\n\r\n // Network errors\r\n if (error instanceof TypeError) {\r\n return true;\r\n }\r\n\r\n // Check for common network error messages\r\n if (\r\n error.message.includes('fetch failed') ||\r\n error.message.includes('network') ||\r\n error.message.includes('ECONNREFUSED') ||\r\n error.message.includes('ENOTFOUND') ||\r\n error.message.includes('ETIMEDOUT')\r\n ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Calculate delay with exponential backoff and jitter\r\n */\r\n private calculateDelay(\r\n attempt: number,\r\n retryConfig: Required<RetryOptions>\r\n ): number {\r\n const exponentialDelay =\r\n retryConfig.initialDelayMs *\r\n Math.pow(retryConfig.backoffMultiplier, attempt);\r\n const cappedDelay = Math.min(exponentialDelay, retryConfig.maxDelayMs);\r\n\r\n // Add jitter to prevent thundering herd\r\n const jitter = cappedDelay * retryConfig.jitterFactor * Math.random();\r\n return Math.floor(cappedDelay + jitter);\r\n }\r\n\r\n /**\r\n * Sleep for a given number of milliseconds\r\n */\r\n private sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * Get default retry configuration\r\n */\r\n private getRetryConfig(\r\n options?: RetryOptions | false\r\n ): Required<RetryOptions> | null {\r\n if (options === false) {\r\n return null;\r\n }\r\n\r\n return {\r\n maxRetries: options?.maxRetries ?? RETRY_CONFIG.MAX_RETRIES,\r\n initialDelayMs: options?.initialDelayMs ?? RETRY_CONFIG.INITIAL_DELAY_MS,\r\n maxDelayMs: options?.maxDelayMs ?? RETRY_CONFIG.MAX_DELAY_MS,\r\n backoffMultiplier:\r\n options?.backoffMultiplier ?? RETRY_CONFIG.BACKOFF_MULTIPLIER,\r\n jitterFactor: options?.jitterFactor ?? RETRY_CONFIG.JITTER_FACTOR,\r\n };\r\n }\r\n\r\n /**\r\n * Make an HTTP request with validation and automatic retry\r\n */\r\n async request<T>(\r\n options: HttpRequestOptions,\r\n responseSchema?: z.ZodType<T>\r\n ): Promise<HttpResponse<T>> {\r\n let url = `${this.config.baseUrl}${options.endpoint}`;\r\n \r\n // Append query params if provided\r\n if (options.params) {\r\n const searchParams = new URLSearchParams();\r\n for (const [key, value] of Object.entries(options.params)) {\r\n if (value !== undefined) {\r\n searchParams.append(key, String(value));\r\n }\r\n }\r\n const queryString = searchParams.toString();\r\n if (queryString) {\r\n url += `?${queryString}`;\r\n }\r\n }\r\n const timeout = options.timeout ?? this.config.timeout;\r\n const retryConfig = this.getRetryConfig(options.retry);\r\n const startTime = Date.now();\r\n\r\n let attempt = 0;\r\n const maxAttempts = retryConfig ? retryConfig.maxRetries + 1 : 1;\r\n\r\n while (attempt < maxAttempts) {\r\n // Create abort controller for timeout\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n // Merge signals if one was provided\r\n const signal = options.signal\r\n ? this.mergeSignals(options.signal, controller.signal)\r\n : controller.signal;\r\n\r\n try {\r\n const headers = this.buildHeaders(options);\r\n const body = options.body ? JSON.stringify(options.body) : null;\r\n\r\n if (this.config.debug) {\r\n console.log(`[Beeper SDK] Request:`, {\r\n method: options.method,\r\n url,\r\n headers: this.sanitizeHeaders(headers),\r\n body: options.body,\r\n attempt: attempt + 1,\r\n maxAttempts,\r\n });\r\n }\r\n\r\n const requestInit: RequestInit = {\r\n method: options.method,\r\n headers,\r\n signal,\r\n };\r\n if (body !== null) {\r\n requestInit.body = body;\r\n }\r\n\r\n const response = await this.config.fetch(url, requestInit);\r\n\r\n clearTimeout(timeoutId);\r\n\r\n const requestId =\r\n response.headers.get(HEADERS.REQUEST_ID) ?? undefined;\r\n\r\n if (this.config.debug) {\r\n console.log(`[Beeper SDK] Response:`, {\r\n url,\r\n status: response.status,\r\n statusText: response.statusText,\r\n requestId,\r\n attempt: attempt + 1,\r\n timeMs: Date.now() - startTime,\r\n });\r\n }\r\n\r\n // Handle error responses\r\n if (!response.ok) {\r\n const errorBody = await this.safeParseJson(response);\r\n\r\n // Check if we should retry\r\n if (\r\n retryConfig &&\r\n this.isRetryableStatus(response.status) &&\r\n attempt < retryConfig.maxRetries\r\n ) {\r\n const delay = this.calculateDelay(attempt, retryConfig);\r\n\r\n if (this.config.debug) {\r\n console.log(`[Beeper SDK] Retrying:`, {\r\n url,\r\n status: response.status,\r\n attempt: attempt + 1,\r\n maxRetries: retryConfig.maxRetries,\r\n delayMs: delay,\r\n });\r\n }\r\n\r\n await this.sleep(delay);\r\n attempt++;\r\n continue;\r\n }\r\n\r\n throw BeeperError.fromHttpResponse(\r\n response.status,\r\n errorBody,\r\n requestId\r\n );\r\n }\r\n\r\n // Parse response\r\n const data = await this.safeParseJson(response);\r\n\r\n // Validate response if schema provided\r\n if (responseSchema) {\r\n const result = responseSchema.safeParse(data);\r\n if (!result.success) {\r\n throw BeeperError.validation('Invalid response from server', {\r\n zodErrors: result.error.errors,\r\n });\r\n }\r\n return {\r\n data: result.data,\r\n status: response.status,\r\n headers: response.headers,\r\n requestId,\r\n retryCount: attempt,\r\n totalTimeMs: Date.now() - startTime,\r\n };\r\n }\r\n\r\n return {\r\n data: data as T,\r\n status: response.status,\r\n headers: response.headers,\r\n requestId,\r\n retryCount: attempt,\r\n totalTimeMs: Date.now() - startTime,\r\n };\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n const isErrorInstance = error instanceof Error;\r\n const shouldRetry =\r\n retryConfig &&\r\n isErrorInstance &&\r\n this.isRetryableError(error) &&\r\n attempt < retryConfig.maxRetries;\r\n\r\n if (shouldRetry) {\r\n const delay = this.calculateDelay(attempt, retryConfig);\r\n\r\n if (this.config.debug) {\r\n console.log(`[Beeper SDK] Retrying after error:`, {\r\n url,\r\n error: isErrorInstance ? error.message : 'Unknown error',\r\n attempt: attempt + 1,\r\n maxRetries: retryConfig.maxRetries,\r\n delayMs: delay,\r\n });\r\n }\r\n\r\n await this.sleep(delay);\r\n attempt++;\r\n continue;\r\n }\r\n\r\n // Handle abort/timeout\r\n if (isErrorInstance && error.name === 'AbortError') {\r\n throw BeeperError.timeout(options.endpoint, timeout);\r\n }\r\n\r\n // Handle network errors\r\n if (error instanceof TypeError) {\r\n throw BeeperError.networkError(\r\n `Network error: ${error.message}`,\r\n error\r\n );\r\n }\r\n\r\n // Re-throw BeeperErrors\r\n if (error instanceof BeeperError) {\r\n throw error;\r\n }\r\n\r\n // Wrap unknown errors\r\n const errorOptions: import('../errors/index.js').BeeperErrorOptions = {\r\n code: ErrorCodes.UNKNOWN_ERROR,\r\n message: isErrorInstance ? error.message : 'Unknown error',\r\n };\r\n if (isErrorInstance) {\r\n errorOptions.cause = error;\r\n }\r\n throw new BeeperError(errorOptions);\r\n }\r\n }\r\n\r\n // Should not reach here, but handle just in case\r\n throw BeeperError.networkError(\r\n `Max retries (${retryConfig?.maxRetries ?? 0}) exceeded for ${options.endpoint}`\r\n );\r\n }\r\n\r\n /**\r\n * GET request helper\r\n */\r\n async get<T>(\r\n endpoint: string,\r\n options?: Partial<HttpRequestOptions>,\r\n schema?: z.ZodType<T>\r\n ): Promise<HttpResponse<T>> {\r\n return this.request({ ...options, method: 'GET', endpoint }, schema);\r\n }\r\n\r\n /**\r\n * POST request helper\r\n */\r\n async post<T>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: Partial<HttpRequestOptions>,\r\n schema?: z.ZodType<T>\r\n ): Promise<HttpResponse<T>> {\r\n return this.request(\r\n { ...options, method: 'POST', endpoint, body },\r\n schema\r\n );\r\n }\r\n\r\n /**\r\n * PUT request helper\r\n */\r\n async put<T>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: Partial<HttpRequestOptions>,\r\n schema?: z.ZodType<T>\r\n ): Promise<HttpResponse<T>> {\r\n return this.request(\r\n { ...options, method: 'PUT', endpoint, body },\r\n schema\r\n );\r\n }\r\n\r\n /**\r\n * PATCH request helper\r\n */\r\n async patch<T>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: Partial<HttpRequestOptions>,\r\n schema?: z.ZodType<T>\r\n ): Promise<HttpResponse<T>> {\r\n return this.request(\r\n { ...options, method: 'PATCH', endpoint, body },\r\n schema\r\n );\r\n }\r\n\r\n /**\r\n * DELETE request helper\r\n */\r\n async delete<T>(\r\n endpoint: string,\r\n options?: Partial<HttpRequestOptions>,\r\n schema?: z.ZodType<T>\r\n ): Promise<HttpResponse<T>> {\r\n return this.request({ ...options, method: 'DELETE', endpoint }, schema);\r\n }\r\n\r\n /**\r\n * Build request headers\r\n */\r\n private buildHeaders(options: HttpRequestOptions): Record<string, string> {\r\n const headers: Record<string, string> = {\r\n [HEADERS.CONTENT_TYPE]: 'application/json',\r\n [HEADERS.AUTHORIZATION]: `Bearer ${this.config.apiKey}`,\r\n 'User-Agent': `beeper-sdk/${SDK_VERSION}`,\r\n ...options.headers,\r\n };\r\n\r\n if (options.idempotencyKey) {\r\n headers[HEADERS.IDEMPOTENCY_KEY] = options.idempotencyKey;\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n /**\r\n * Sanitize headers for logging (redact sensitive values)\r\n */\r\n private sanitizeHeaders(\r\n headers: Record<string, string>\r\n ): Record<string, string> {\r\n const sensitiveKeys = [\r\n 'authorization',\r\n 'x-api-key',\r\n 'cookie',\r\n 'set-cookie',\r\n 'x-auth-token',\r\n ];\r\n\r\n const sanitized: Record<string, string> = {};\r\n\r\n for (const [key, value] of Object.entries(headers)) {\r\n if (sensitiveKeys.includes(key.toLowerCase())) {\r\n sanitized[key] = '[REDACTED]';\r\n } else {\r\n sanitized[key] = value;\r\n }\r\n }\r\n\r\n return sanitized;\r\n }\r\n\r\n /**\r\n * Safely parse JSON response\r\n */\r\n private async safeParseJson(response: Response): Promise<unknown> {\r\n const text = await response.text();\r\n if (!text) {\r\n return null;\r\n }\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n }\r\n\r\n /**\r\n * Merge two abort signals\r\n */\r\n private mergeSignals(\r\n signal1: AbortSignal,\r\n signal2: AbortSignal\r\n ): AbortSignal {\r\n const controller = new AbortController();\r\n\r\n const abort = () => controller.abort();\r\n\r\n signal1.addEventListener('abort', abort);\r\n signal2.addEventListener('abort', abort);\r\n\r\n if (signal1.aborted || signal2.aborted) {\r\n controller.abort();\r\n }\r\n\r\n return controller.signal;\r\n }\r\n}\r\n\r\n/**\r\n * Generate a unique idempotency key\r\n */\r\nexport function generateIdempotencyKey(): string {\r\n const timestamp = Date.now().toString(36);\r\n const random = Math.random().toString(36).substring(2, 15);\r\n return `${timestamp}-${random}`;\r\n}\r\n","/**\n * Filter Schema for LLM/Agent consumption\n *\n * Provides structured descriptions of all available filters\n * that can be used by LLMs to understand and construct filter queries.\n */\n\nexport interface FilterFieldSchema {\n /** Field name */\n name: string;\n /** Human-readable description */\n description: string;\n /** Data type */\n type: 'number' | 'string' | 'boolean' | 'array' | 'object';\n /** Example value */\n example: unknown;\n /** Whether this field is required */\n required?: boolean;\n /** Minimum value (for numbers) */\n min?: number;\n /** Maximum value (for numbers) */\n max?: number;\n /** Allowed values (for enums) */\n enum?: string[];\n /** Item type (for arrays) */\n items?: FilterFieldSchema;\n /** Nested schema (for objects) */\n properties?: Record<string, FilterFieldSchema>;\n}\n\nexport interface FilterCategory {\n /** Category name */\n name: string;\n /** Category description */\n description: string;\n /** Filters in this category */\n filters: FilterFieldSchema[];\n}\n\n/**\n * Complete filter schema organized by category\n */\nexport const FILTER_SCHEMA: FilterCategory[] = [\n {\n name: 'Platform & Activity',\n description: 'Filter by platform and user activity',\n filters: [\n {\n name: 'platform',\n description: 'Target users on a specific platform',\n type: 'string',\n enum: ['all', 'farcaster', 'twitter'],\n example: 'farcaster',\n },\n {\n name: 'activeInLastDays',\n description: 'Users who have been active within the last N days',\n type: 'number',\n min: 1,\n max: 365,\n example: 30,\n },\n {\n name: 'minCastCount',\n description: 'Users with at least N posts/casts',\n type: 'number',\n min: 0,\n example: 10,\n },\n ],\n },\n {\n name: 'Reputation & Quality',\n description: 'Filter by user reputation scores',\n filters: [\n {\n name: 'neynarScoreMin',\n description: 'Minimum Neynar reputation score (0-1, higher = more reputable)',\n type: 'number',\n min: 0,\n max: 1,\n example: 0.5,\n },\n {\n name: 'neynarScoreMax',\n description: 'Maximum Neynar reputation score',\n type: 'number',\n min: 0,\n max: 1,\n example: 0.9,\n },\n {\n name: 'quotientScoreMin',\n description: 'Minimum Quotient score (0-1, engagement quality)',\n type: 'number',\n min: 0,\n max: 1,\n example: 0.5,\n },\n {\n name: 'spamLabel',\n description: 'Filter by spam classification',\n type: 'string',\n enum: ['not_spam_only', 'spam_only', 'all'],\n example: 'not_spam_only',\n },\n {\n name: 'verifiedOnly',\n description: 'Only include verified users',\n type: 'boolean',\n example: true,\n },\n ],\n },\n {\n name: 'Social Graph',\n description: 'Filter by follower counts and relationships',\n filters: [\n {\n name: 'minFollowers',\n description: 'Minimum follower count',\n type: 'number',\n min: 0,\n example: 1000,\n },\n {\n name: 'maxFollowers',\n description: 'Maximum follower count',\n type: 'number',\n min: 0,\n example: 100000,\n },\n {\n name: 'followersOf',\n description: 'Users who follow a specific FID (Farcaster ID)',\n type: 'number',\n example: 3,\n },\n {\n name: 'mutualsWith',\n description: 'Users who have mutual follows with a specific FID',\n type: 'number',\n example: 3,\n },\n ],\n },\n {\n name: 'Token Filters',\n description: 'Filter by token preferences or holdings. IMPORTANT: Signal tokens and token holders are different concepts.',\n filters: [\n {\n name: 'signalTokens',\n description: 'Users who have SET specific tokens on their profile as interests/preferences. Does NOT require actually holding the token - it is a social signal like \"I am interested in this community\". Use this to find community members by affinity.',\n type: 'array',\n items: { name: 'tokenAddress', type: 'string', description: 'Token contract address', example: '0x...' },\n example: ['0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed'],\n },\n {\n name: 'tokenHolders',\n description: 'Users who actually HOLD specific tokens in their wallet (verified onchain). Use this to find real token holders with actual balances. Requires wallet verification.',\n type: 'array',\n items: {\n name: 'tokenConfig',\n type: 'object',\n description: 'Token holder filter config',\n example: { tokenAddress: '0x...', chainId: 8453 },\n properties: {\n tokenAddress: { name: 'tokenAddress', type: 'string', description: 'Token contract address', example: '0x...' },\n chainId: { name: 'chainId', type: 'number', description: 'Chain ID (1=Ethereum, 8453=Base)', example: 8453 },\n minBalance: { name: 'minBalance', type: 'string', description: 'Minimum balance in wei (e.g., 1000000000000000000 = 1 token with 18 decimals)', example: '1000000000000000000' },\n },\n },\n example: [{ tokenAddress: '0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed', chainId: 8453 }],\n },\n {\n name: 'hasBaseWallet',\n description: 'Users with a wallet on Base chain',\n type: 'boolean',\n example: true,\n },\n {\n name: 'hasVerifiedWallet',\n description: 'Users with a verified wallet address',\n type: 'boolean',\n example: true,\n },\n ],\n },\n {\n name: 'Economics',\n description: 'Filter by attention price and battery',\n filters: [\n {\n name: 'maxAttentionPriceUsd',\n description: 'Maximum attention price in USD',\n type: 'number',\n min: 0,\n example: 0.5,\n },\n {\n name: 'minBatteryPercentage',\n description: 'Minimum battery percentage (0-100)',\n type: 'number',\n min: 0,\n max: 100,\n example: 50,\n },\n {\n name: 'hasRechargedInLastDays',\n description: 'Users who recharged battery within N days',\n type: 'number',\n min: 1,\n example: 7,\n },\n {\n name: 'excludePingedToday',\n description: 'Exclude users who were already pinged today',\n type: 'boolean',\n example: true,\n },\n ],\n },\n {\n name: 'Geography',\n description: 'Filter by location and timezone',\n filters: [\n {\n name: 'countries',\n description: 'ISO 3166-1 alpha-2 country codes',\n type: 'array',\n items: { name: 'countryCode', type: 'string', description: 'Country code', example: 'US' },\n example: ['US', 'CA', 'GB'],\n },\n {\n name: 'timezones',\n description: 'Filter by UTC timezone offset',\n type: 'array',\n items: {\n name: 'timezone',\n type: 'object',\n description: 'Timezone configuration',\n example: { offset: -5, range: 2 },\n properties: {\n offset: { name: 'offset', type: 'number', description: 'UTC offset in hours', example: -5 },\n range: { name: 'range', type: 'number', description: 'Range in hours for fuzzy matching', example: 2 },\n },\n },\n example: [{ offset: -5, range: 2 }],\n },\n ],\n },\n {\n name: 'User Selection',\n description: 'Target specific users',\n filters: [\n {\n name: 'fids',\n description: 'Specific Farcaster IDs to target',\n type: 'array',\n items: { name: 'fid', type: 'number', description: 'Farcaster ID', example: 3 },\n example: [3, 1234, 5678],\n },\n {\n name: 'userIds',\n description: 'Specific user IDs to target',\n type: 'array',\n items: { name: 'userId', type: 'string', description: 'User ID', example: 'abc123' },\n example: ['abc123', 'def456'],\n },\n ],\n },\n {\n name: 'Sorting',\n description: 'Order results',\n filters: [\n {\n name: 'orderBy',\n description: 'Sort order for results',\n type: 'string',\n enum: [\n 'attention_price_asc',\n 'attention_price_desc',\n 'neynar_score_desc',\n 'followers_desc',\n 'followers_asc',\n 'recent_activity',\n 'battery_desc',\n 'random',\n ],\n example: 'attention_price_asc',\n },\n ],\n },\n];\n\n/**\n * Get a flat list of all filter names\n */\nexport function getAllFilterNames(): string[] {\n return FILTER_SCHEMA.flatMap((cat) => cat.filters.map((f) => f.name));\n}\n\n/**\n * Get schema for a specific filter\n */\nexport function getFilterSchema(name: string): FilterFieldSchema | undefined {\n for (const category of FILTER_SCHEMA) {\n const filter = category.filters.find((f) => f.name === name);\n if (filter) return filter;\n }\n return undefined;\n}\n\n/**\n * Generate a markdown description of all filters (for LLM prompts)\n */\nexport function generateFilterDocumentation(): string {\n let doc = '# Available Filters\\n\\n';\n\n for (const category of FILTER_SCHEMA) {\n doc += `## ${category.name}\\n`;\n doc += `${category.description}\\n\\n`;\n\n for (const filter of category.filters) {\n doc += `### \\`${filter.name}\\`\\n`;\n doc += `${filter.description}\\n`;\n doc += `- Type: \\`${filter.type}\\`\\n`;\n if (filter.enum) {\n doc += `- Values: ${filter.enum.map((v) => `\\`${v}\\``).join(', ')}\\n`;\n }\n if (filter.min !== undefined) doc += `- Min: ${filter.min}\\n`;\n if (filter.max !== undefined) doc += `- Max: ${filter.max}\\n`;\n doc += `- Example: \\`${JSON.stringify(filter.example)}\\`\\n\\n`;\n }\n }\n\n return doc;\n}\n\nexport default FILTER_SCHEMA;\n","/**\n * AgentClient - Simplified SDK for AI agents\n *\n * Provides a minimal API surface for agents to:\n * 1. Look up users (username/fid → address)\n * 2. Get attention prices\n * 3. Create payment intents\n *\n * Agents create intents, users execute payments from any wallet.\n *\n * @example\n * ```typescript\n * import { AgentClient } from '@beeper/sdk';\n *\n * const agent = new AgentClient({\n * apiKey: process.env.BEEPER_API_KEY,\n * });\n *\n * // Look up a user\n * const user = await agent.lookup('dwr.eth');\n *\n * // Create a payment intent\n * const intent = await agent.createIntent({\n * to: 'dwr.eth',\n * amount: '$5',\n * message: 'Thanks for the help!',\n * });\n *\n * // Agent tells user:\n * // \"Send 5 USDC to 0x1234... on Base\"\n * ```\n */\n\nimport { HttpClient, createHttpConfig } from './http.js';\nimport { BeeperError } from '../errors/index.js';\nimport type { Environment } from '../constants.js';\nimport { FILTER_SCHEMA, generateFilterDocumentation, type FilterCategory } from './filters.schema.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Agent client configuration */\nexport interface AgentClientConfig {\n /** API key for authentication */\n apiKey: string;\n /** Environment (production, staging, development) */\n environment?: Environment;\n /** Custom base URL (overrides environment) */\n baseUrl?: string;\n /** Request timeout in milliseconds */\n timeoutMs?: number;\n /** Custom fetch implementation */\n fetch?: typeof fetch;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/** User lookup result */\nexport interface User {\n /** Internal user ID */\n id: string;\n /** Farcaster ID (if applicable) */\n fid?: number;\n /** Username */\n username: string;\n /** Display name */\n displayName?: string;\n /** Profile picture URL */\n pfpUrl?: string;\n /** Platform (farcaster, twitter, etc.) */\n platform: string;\n /** Verified wallet address for receiving payments */\n walletAddress?: string;\n /** Current attention price in USD */\n attentionPriceUsd: string;\n /** User's follower count */\n followerCount?: number;\n /** User's Neynar score (0-1) */\n neynarScore?: number;\n}\n\n/** Payment intent - the instruction for the user to execute */\nexport interface PaymentIntent {\n /** Unique intent ID for tracking */\n intentId: string;\n /** Recipient wallet address */\n recipient: string;\n /** Amount in token's smallest unit (e.g., USDC has 6 decimals) */\n amount: string;\n /** Amount formatted for display (e.g., \"5.00 USDC\") */\n amountFormatted: string;\n /** Token contract address */\n tokenAddress: string;\n /** Token symbol (e.g., \"USDC\") */\n tokenSymbol: string;\n /** Token decimals */\n tokenDecimals: number;\n /** Chain ID (e.g., 8453 for Base) */\n chainId: number;\n /** Chain name for display */\n chainName: string;\n /** Optional message/memo */\n message?: string;\n /** Resolved recipient info */\n recipientInfo: {\n username: string;\n displayName?: string;\n fid?: number;\n };\n /** Human-readable instruction */\n instruction: string;\n /** Deep link to beep.works (optional, for convenience) */\n deepLink?: string;\n /** Expiration timestamp */\n expiresAt: string;\n}\n\n/** Input for creating a payment intent */\nexport interface CreateIntentInput {\n /** Recipient identifier (username, fid, or address) */\n to: string | number;\n /** Amount in USD (e.g., \"$5\", \"5\", or \"5.00\") */\n amount: string;\n /** Optional message to include */\n message?: string;\n /** Preferred chain (defaults to Base) */\n chainId?: number;\n /** Preferred token (defaults to USDC) */\n tokenSymbol?: string;\n}\n\n/** Attention price info */\nexport interface AttentionPrice {\n /** User identifier */\n userId: string;\n /** Username */\n username: string;\n /** Current attention price in USD */\n priceUsd: string;\n /** Price in USDC smallest unit */\n priceUsdc: string;\n /** Minimum price for guaranteed delivery */\n minimumPriceUsd: string;\n}\n\n/** Simple JSON-based filter input (agent-friendly) */\nexport interface SimpleFilters {\n // Platform & Activity\n platform?: 'all' | 'farcaster' | 'twitter';\n activeInLastDays?: number;\n minCastCount?: number;\n\n // Reputation\n neynarScoreMin?: number;\n neynarScoreMax?: number;\n quotientScoreMin?: number;\n quotientScoreMax?: number;\n spamLabel?: 'not_spam_only' | 'spam_only' | 'all';\n verifiedOnly?: boolean;\n\n // Social Graph\n minFollowers?: number;\n maxFollowers?: number;\n followersOf?: number;\n mutualsWith?: number;\n\n // Token Holdings\n signalTokens?: string[];\n tokenHolders?: Array<{\n tokenAddress: string;\n chainId: number;\n minBalance?: string;\n }>;\n hasBaseWallet?: boolean;\n hasVerifiedWallet?: boolean;\n\n // Economics\n maxAttentionPriceUsd?: number;\n minBatteryPercentage?: number;\n hasRechargedInLastDays?: number;\n excludePingedToday?: boolean;\n\n // Geography\n countries?: string[];\n timezones?: Array<{ offset: number; range?: number }>;\n\n // User Selection\n fids?: number[];\n userIds?: string[];\n\n // Sorting\n orderBy?:\n | 'attention_price_asc'\n | 'attention_price_desc'\n | 'neynar_score_desc'\n | 'followers_desc'\n | 'followers_asc'\n | 'recent_activity'\n | 'battery_desc'\n | 'random';\n}\n\n/** Estimate request input */\nexport interface EstimateInput {\n /** Filter criteria */\n filters: SimpleFilters;\n /** Budget in USD (e.g., \"$100\" or \"100\") */\n budget: string;\n /** Optional message to include (affects cost) */\n message?: string;\n}\n\n/** Estimate result */\nexport interface EstimateResult {\n /** Number of recipients matching filters within budget */\n recipientCount: number;\n /** Total cost in USD */\n totalCostUsd: string;\n /** Average price per recipient */\n avgPriceUsd: string;\n /** Minimum price in result set */\n minPriceUsd: string;\n /** Maximum price in result set */\n maxPriceUsd: string;\n /** Budget remaining after all recipients */\n remainingBudgetUsd: string;\n /** Whether budget is sufficient for at least one recipient */\n budgetSufficient: boolean;\n}\n\n/** Preview request input */\nexport interface PreviewInput {\n /** Filter criteria */\n filters: SimpleFilters;\n /** Number of users to preview (max 20) */\n limit?: number;\n}\n\n/** Preview user */\nexport interface PreviewUser {\n /** Username */\n username: string;\n /** Display name */\n displayName?: string;\n /** Farcaster ID */\n fid?: number;\n /** Attention price in USD */\n priceUsd: string;\n /** Follower count */\n followerCount?: number;\n /** Neynar score */\n neynarScore?: number;\n /** Profile picture URL */\n pfpUrl?: string;\n}\n\n/** Preview result */\nexport interface PreviewResult {\n /** Sample users matching filters */\n users: PreviewUser[];\n /** Total count of matching users (not just preview) */\n totalCount: number;\n /** Whether there are more users beyond the preview */\n hasMore: boolean;\n}\n\n/** Bulk intent input */\nexport interface BulkIntentInput {\n /** Filter criteria (will create intents for all matching users) */\n filters: SimpleFilters;\n /** Budget in USD */\n budget: string;\n /** Message to include */\n message?: string;\n /** Chain ID (default: Base = 8453) */\n chainId?: number;\n}\n\n/** Bulk intent result */\nexport interface BulkIntentResult {\n /** Unique bulk intent ID */\n bulkIntentId: string;\n /** Total number of recipients */\n recipientCount: number;\n /** Total amount in USDC smallest unit */\n totalAmount: string;\n /** Total amount formatted */\n totalAmountFormatted: string;\n /** Individual payment instructions */\n payments: Array<{\n recipient: string;\n amount: string;\n username: string;\n }>;\n /** Human-readable summary */\n summary: string;\n /** Chain info */\n chainId: number;\n chainName: string;\n tokenAddress: string;\n tokenSymbol: string;\n /** Expiration */\n expiresAt: string;\n}\n\n// =============================================================================\n// AgentClient Implementation\n// =============================================================================\n\nconst ENDPOINTS = {\n LOOKUP: '/agent/lookup',\n INTENT: '/agent/intent',\n PRICE: '/agent/price',\n ESTIMATE: '/agent/estimate',\n PREVIEW: '/agent/preview',\n BULK_INTENT: '/agent/bulk-intent',\n} as const;\n\n/**\n * AgentClient - Simplified client for AI agents\n *\n * Focuses on the core agent workflow:\n * 1. Look up users\n * 2. Check prices\n * 3. Create payment intents\n */\nexport class AgentClient {\n private readonly http: HttpClient;\n // @ts-expect-error Reserved for future use\n private readonly _debug: boolean;\n\n constructor(config: AgentClientConfig) {\n if (!config.apiKey) {\n throw BeeperError.validation('API key is required');\n }\n\n const httpConfig = createHttpConfig({\n apiKey: config.apiKey,\n ...(config.environment && { environment: config.environment }),\n ...(config.baseUrl && { baseUrl: config.baseUrl }),\n ...(config.timeoutMs && { timeout: config.timeoutMs }),\n ...(config.fetch && { fetch: config.fetch }),\n ...(config.debug && { debug: config.debug }),\n });\n\n this.http = new HttpClient(httpConfig);\n this._debug = config.debug ?? false;\n }\n\n /**\n * Look up a user by username, FID, or wallet address\n *\n * @param identifier - Username (e.g., \"dwr.eth\"), FID (e.g., 3), or address\n * @returns User information including wallet address and attention price\n *\n * @example\n * ```typescript\n * const user = await agent.lookup('dwr.eth');\n * console.log(user.walletAddress); // \"0x1234...\"\n * console.log(user.attentionPriceUsd); // \"0.05\"\n * ```\n */\n async lookup(identifier: string | number): Promise<User> {\n const params = typeof identifier === 'number'\n ? { fid: identifier }\n : { q: identifier };\n\n const response = await this.http.get<{ data: User }>(\n ENDPOINTS.LOOKUP,\n { params }\n );\n\n return response.data.data;\n }\n\n /**\n * Get the attention price for a user\n *\n * @param identifier - Username, FID, or address\n * @returns Current attention price information\n *\n * @example\n * ```typescript\n * const price = await agent.getPrice('dwr.eth');\n * console.log(`Attention price: ${price.priceUsd}`);\n * ```\n */\n async getPrice(identifier: string | number): Promise<AttentionPrice> {\n const params = typeof identifier === 'number'\n ? { fid: identifier }\n : { q: identifier };\n\n const response = await this.http.get<{ data: AttentionPrice }>(\n ENDPOINTS.PRICE,\n { params }\n );\n\n return response.data.data;\n }\n\n /**\n * Create a payment intent\n *\n * This does NOT execute the payment. It returns the information\n * needed for the user to execute the payment from any wallet.\n *\n * @param input - Payment intent parameters\n * @returns Payment intent with recipient address and amount\n *\n * @example\n * ```typescript\n * const intent = await agent.createIntent({\n * to: 'dwr.eth',\n * amount: '$5',\n * message: 'Thanks!',\n * });\n *\n * // Tell the user:\n * console.log(intent.instruction);\n * // \"Send 5 USDC to 0x1234... on Base\"\n * ```\n */\n async createIntent(input: CreateIntentInput): Promise<PaymentIntent> {\n // Normalize amount (remove $ sign if present)\n const amountStr = input.amount.replace(/^\\$/, '').trim();\n const amountNum = parseFloat(amountStr);\n\n if (isNaN(amountNum) || amountNum <= 0) {\n throw BeeperError.validation('Amount must be a positive number');\n }\n\n const response = await this.http.post<{ data: PaymentIntent }>(\n ENDPOINTS.INTENT,\n {\n to: input.to,\n amountUsd: amountStr,\n message: input.message,\n chainId: input.chainId ?? 8453, // Default to Base\n tokenSymbol: input.tokenSymbol ?? 'USDC',\n }\n );\n\n return response.data.data;\n }\n\n /**\n * Convenience method to create a human-readable payment instruction\n *\n * @param input - Payment intent parameters\n * @returns Human-readable instruction string\n *\n * @example\n * ```typescript\n * const instruction = await agent.getPaymentInstruction({\n * to: 'dwr.eth',\n * amount: '$5',\n * });\n * // \"Send 5 USDC to 0x1a2b3c... on Base (to @dwr)\"\n * ```\n */\n async getPaymentInstruction(input: CreateIntentInput): Promise<string> {\n const intent = await this.createIntent(input);\n return intent.instruction;\n }\n\n /**\n * Estimate how many recipients match filters within a budget\n *\n * @param input - Filters and budget\n * @returns Estimate with recipient count, costs, and budget analysis\n *\n * @example\n * ```typescript\n * const estimate = await agent.estimate({\n * filters: {\n * platform: 'farcaster',\n * minFollowers: 1000,\n * signalTokens: ['0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed'],\n * },\n * budget: '$100',\n * });\n * console.log(`Can reach ${estimate.recipientCount} people`);\n * console.log(`Total cost: ${estimate.totalCostUsd}`);\n * ```\n */\n async estimate(input: EstimateInput): Promise<EstimateResult> {\n const budgetStr = input.budget.replace(/^\\$/, '').trim();\n const budgetNum = parseFloat(budgetStr);\n\n if (isNaN(budgetNum) || budgetNum <= 0) {\n throw BeeperError.validation('Budget must be a positive number');\n }\n\n const response = await this.http.post<{ data: EstimateResult }>(\n ENDPOINTS.ESTIMATE,\n {\n filters: input.filters,\n budgetUsd: budgetStr,\n message: input.message,\n }\n );\n\n return response.data.data;\n }\n\n /**\n * Preview sample users matching filters\n *\n * @param input - Filters and limit\n * @returns Sample users and total count\n *\n * @example\n * ```typescript\n * const preview = await agent.preview({\n * filters: { minFollowers: 1000 },\n * limit: 5,\n * });\n * console.log(`Found ${preview.totalCount} users`);\n * preview.users.forEach(u => {\n * console.log(`@${u.username} - ${u.priceUsd}`);\n * });\n * ```\n */\n async preview(input: PreviewInput): Promise<PreviewResult> {\n const limit = Math.min(input.limit ?? 10, 20);\n\n const response = await this.http.post<{ data: PreviewResult }>(\n ENDPOINTS.PREVIEW,\n {\n filters: input.filters,\n limit,\n }\n );\n\n return response.data.data;\n }\n\n /**\n * Create bulk payment intents for multiple recipients\n *\n * @param input - Filters, budget, and message\n * @returns Bulk intent with all payment instructions\n *\n * @example\n * ```typescript\n * const bulk = await agent.createBulkIntent({\n * filters: { signalTokens: ['0x...'] },\n * budget: '$100',\n * message: 'GM holders!',\n * });\n * console.log(bulk.summary);\n * // \"Send to 50 recipients for total 45.00 USDC on Base\"\n * ```\n */\n async createBulkIntent(input: BulkIntentInput): Promise<BulkIntentResult> {\n const budgetStr = input.budget.replace(/^\\$/, '').trim();\n const budgetNum = parseFloat(budgetStr);\n\n if (isNaN(budgetNum) || budgetNum <= 0) {\n throw BeeperError.validation('Budget must be a positive number');\n }\n\n const response = await this.http.post<{ data: BulkIntentResult }>(\n ENDPOINTS.BULK_INTENT,\n {\n filters: input.filters,\n budgetUsd: budgetStr,\n message: input.message,\n chainId: input.chainId ?? 8453,\n }\n );\n\n return response.data.data;\n }\n\n /**\n * Get filter schema documentation for LLMs\n *\n * Returns structured information about all available filters\n * that can be used in system prompts or tool descriptions.\n *\n * @returns Filter schema categories\n *\n * @example\n * ```typescript\n * const schema = agent.describeFilters();\n * // Use in LLM prompt:\n * // \"Available filters: \" + JSON.stringify(schema)\n * ```\n */\n describeFilters(): FilterCategory[] {\n return FILTER_SCHEMA;\n }\n\n /**\n * Get filter documentation as markdown\n *\n * Useful for including in LLM system prompts.\n *\n * @returns Markdown documentation of all filters\n *\n * @example\n * ```typescript\n * const docs = agent.getFilterDocumentation();\n * // Include in system prompt for LLM\n * ```\n */\n getFilterDocumentation(): string {\n return generateFilterDocumentation();\n }\n}\n\nexport default AgentClient;\n","/**\r\n * Authentication utilities for the Beeper SDK\r\n */\r\n\r\n/**\r\n * API key prefix patterns\r\n */\r\nexport const API_KEY_PREFIXES = {\r\n LIVE: 'bpk_live_',\r\n TEST: 'bpk_test_',\r\n} as const;\r\n\r\n/**\r\n * Validates that an API key has the correct format\r\n * @param apiKey - The API key to validate\r\n * @returns true if the key format is valid\r\n */\r\nexport function isValidApiKeyFormat(apiKey: string): boolean {\r\n if (!apiKey || typeof apiKey !== 'string') {\r\n return false;\r\n }\r\n\r\n const hasValidPrefix =\r\n apiKey.startsWith(API_KEY_PREFIXES.LIVE) ||\r\n apiKey.startsWith(API_KEY_PREFIXES.TEST);\r\n\r\n if (!hasValidPrefix) {\r\n return false;\r\n }\r\n\r\n // Check minimum length (prefix + at least 20 chars)\r\n const minLength = API_KEY_PREFIXES.LIVE.length + 20;\r\n return apiKey.length >= minLength;\r\n}\r\n\r\n/**\r\n * Determines if an API key is for production or test environment\r\n * @param apiKey - The API key to check\r\n * @returns 'production' | 'test' | null if invalid\r\n */\r\nexport function getApiKeyEnvironment(\r\n apiKey: string\r\n): 'production' | 'test' | null {\r\n if (!apiKey || typeof apiKey !== 'string') {\r\n return null;\r\n }\r\n\r\n if (apiKey.startsWith(API_KEY_PREFIXES.LIVE)) {\r\n return 'production';\r\n }\r\n\r\n if (apiKey.startsWith(API_KEY_PREFIXES.TEST)) {\r\n return 'test';\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Creates the Authorization header value\r\n * @param apiKey - The API key\r\n * @returns The Bearer token string\r\n */\r\nexport function createAuthorizationHeader(apiKey: string): string {\r\n return `Bearer ${apiKey}`;\r\n}\r\n\r\n/**\r\n * Masks an API key for safe logging\r\n * @param apiKey - The API key to mask\r\n * @returns Masked key showing only prefix and last 4 characters\r\n */\r\nexport function maskApiKey(apiKey: string): string {\r\n if (!apiKey || apiKey.length < 12) {\r\n return '***';\r\n }\r\n\r\n // Show the prefix and last 4 characters\r\n const prefix = apiKey.startsWith(API_KEY_PREFIXES.LIVE)\r\n ? API_KEY_PREFIXES.LIVE\r\n : apiKey.startsWith(API_KEY_PREFIXES.TEST)\r\n ? API_KEY_PREFIXES.TEST\r\n : '';\r\n\r\n const suffix = apiKey.slice(-4);\r\n return `${prefix}***${suffix}`;\r\n}\r\n","/**\r\n * BeeperClient - Main SDK client for the Beeper API\r\n *\r\n * Handles quote creation, deposit confirmation, execution triggering,\r\n * and receipt polling while keeping all pricing/fee logic server-side.\r\n */\r\n\r\nimport { z } from 'zod';\r\nimport {\r\n HttpClient,\r\n createHttpConfig,\r\n generateIdempotencyKey,\r\n} from './http.js';\r\nimport { isValidApiKeyFormat } from './auth.js';\r\nimport { BeeperError, ErrorCodes } from '../errors/index.js';\r\nimport type { Environment } from '../constants.js';\r\n\r\n// =============================================================================\r\n// Types that match the HTTP Contract\r\n// =============================================================================\r\n\r\n/** Filter expression for recipient selection */\r\nexport type FilterExpression = Record<string, unknown>;\r\n\r\n/** Draft input for creating a send */\r\nexport interface DraftInput {\r\n filter: FilterExpression;\r\n tokenAddress: string;\r\n chainId: number;\r\n amountPerRecipient: string;\r\n budgetCap: string;\r\n memo?: string | undefined;\r\n metadata?: Record<string, unknown> | undefined;\r\n}\r\n\r\n/** Local draft object (not yet quoted) */\r\nexport interface Draft {\r\n id: string;\r\n input: DraftInput;\r\n createdAt: string;\r\n}\r\n\r\n/** Quote status values */\r\nexport type QuoteStatus =\r\n | 'pending'\r\n | 'deposit_confirmed'\r\n | 'executing'\r\n | 'completed'\r\n | 'expired'\r\n | 'failed';\r\n\r\n/** Server-generated quote with pricing */\r\nexport interface Quote {\r\n id: string;\r\n status: QuoteStatus;\r\n recipientCount: number;\r\n totalAmount: string;\r\n protocolFee: string;\r\n depositAmount: string;\r\n depositAddress: string;\r\n depositChainId: number;\r\n depositTokenAddress: string;\r\n expiresAt: string;\r\n input: DraftInput;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\n/** Options for creating a quote */\r\nexport interface QuoteOptions {\r\n ttlSeconds?: number;\r\n}\r\n\r\n// =============================================================================\r\n// Attention Marketplace Types (Message-based sends)\r\n// =============================================================================\r\n\r\n/** Reward type for attention marketplace */\r\nexport type RewardType = 'guaranteed' | 'lottery' | 'fcfs';\r\n\r\n/** Input for creating an attention marketplace quote */\r\nexport interface AttentionQuoteInput {\r\n /** The message to send (1-1000 chars) */\r\n message: string;\r\n /** Target specific FIDs (optional, max 1000) */\r\n recipientFids?: number[];\r\n /** Filter expression for targeting (optional, used if recipientFids not provided) */\r\n filter?: FilterExpression;\r\n /** Budget in USD (e.g., \"10.00\") */\r\n budgetUSD: string;\r\n /** Reward type: guaranteed (default), lottery, or fcfs */\r\n rewardType?: RewardType;\r\n /** Optional memo (max 256 chars) */\r\n memo?: string;\r\n /** Optional metadata (max 4KB JSON) */\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n/** Attention marketplace quote response */\r\nexport interface AttentionQuote {\r\n id: string;\r\n status: QuoteStatus;\r\n recipientCount: number;\r\n /** Total amount in USD (may be undefined for token-based quotes) */\r\n totalAmountUSD?: string;\r\n /** Protocol fee in USD */\r\n protocolFeeUSD?: string;\r\n /** Deposit amount in USD */\r\n depositAmountUSD?: string;\r\n /** Total amount in wei (for token-based quotes) */\r\n totalAmount?: string;\r\n /** Protocol fee in wei */\r\n protocolFee?: string;\r\n /** Deposit amount in wei */\r\n depositAmount?: string;\r\n /** Deposit address */\r\n depositAddress?: string;\r\n /** Deposit chain ID */\r\n depositChainId?: number;\r\n /** Deposit token address */\r\n depositTokenAddress?: string;\r\n expiresAt: string;\r\n input: Record<string, unknown>;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\n/** Result of deposit confirmation */\r\nexport interface ConfirmResult {\r\n quoteId: string;\r\n status: 'confirmed' | 'pending_verification';\r\n detectedAmount: string;\r\n sufficient: boolean;\r\n blockNumber: number;\r\n confirmedAt: string;\r\n}\r\n\r\n/** Result of execution trigger */\r\nexport interface ExecuteResult {\r\n quoteId: string;\r\n status: 'executing' | 'queued';\r\n estimatedCompletionAt: string;\r\n batchId: string;\r\n}\r\n\r\n/** Individual transaction in a receipt */\r\nexport interface ReceiptTransaction {\r\n recipient: string;\r\n amount: string;\r\n txHash: string | null;\r\n status: 'success' | 'failed';\r\n error?: string | undefined;\r\n}\r\n\r\n/** Final receipt after execution */\r\nexport interface Receipt {\r\n quoteId: string;\r\n status: 'completed' | 'partial' | 'failed';\r\n successCount: number;\r\n failureCount: number;\r\n totalSent: string;\r\n refundAmount: string;\r\n refundTxHash?: string | undefined;\r\n transactions: ReceiptTransaction[];\r\n completedAt: string;\r\n}\r\n\r\n/** API health status */\r\nexport interface Health {\r\n status: 'healthy' | 'degraded' | 'unhealthy';\r\n version: string;\r\n timestamp: string;\r\n services: {\r\n database: 'up' | 'down';\r\n queue: 'up' | 'down';\r\n oracle: 'up' | 'down';\r\n };\r\n}\r\n\r\n/** Client configuration */\r\nexport interface BeeperClientConfig {\r\n apiKey: string;\r\n baseUrl?: string;\r\n environment?: Environment;\r\n timeoutMs?: number;\r\n fetch?: typeof fetch;\r\n debug?: boolean;\r\n}\r\n\r\n/** Poll options */\r\nexport interface PollOptions {\r\n maxAttempts?: number;\r\n intervalMs?: number;\r\n onPoll?: (quote: Quote) => void;\r\n}\r\n\r\n// =============================================================================\r\n// Zod Schemas for Response Validation\r\n// =============================================================================\r\n\r\nconst QuoteSchema = z.object({\r\n id: z.string(),\r\n status: z.enum([\r\n 'pending',\r\n 'deposit_confirmed',\r\n 'executing',\r\n 'completed',\r\n 'expired',\r\n 'failed',\r\n ]),\r\n recipientCount: z.number(),\r\n totalAmount: z.string(),\r\n protocolFee: z.string(),\r\n depositAmount: z.string(),\r\n depositAddress: z.string(),\r\n depositChainId: z.number(),\r\n depositTokenAddress: z.string(),\r\n expiresAt: z.string(),\r\n input: z.object({\r\n filter: z.record(z.unknown()),\r\n tokenAddress: z.string(),\r\n chainId: z.number(),\r\n amountPerRecipient: z.string(),\r\n budgetCap: z.string(),\r\n memo: z.string().optional(),\r\n metadata: z.record(z.unknown()).optional(),\r\n }),\r\n createdAt: z.string(),\r\n updatedAt: z.string(),\r\n});\r\n\r\n// AttentionQuote schema - loose validation since response format may vary\r\nconst AttentionQuoteSchema = z.object({\r\n id: z.string(),\r\n status: z.enum([\r\n 'pending',\r\n 'deposit_confirmed',\r\n 'executing',\r\n 'completed',\r\n 'expired',\r\n 'failed',\r\n ]),\r\n recipientCount: z.number(),\r\n expiresAt: z.string(),\r\n input: z.record(z.unknown()),\r\n createdAt: z.string(),\r\n updatedAt: z.string(),\r\n}).passthrough() as unknown as z.ZodType<AttentionQuote>;\r\n\r\nconst ConfirmResultSchema = z.object({\r\n quoteId: z.string(),\r\n status: z.enum(['confirmed', 'pending_verification']),\r\n detectedAmount: z.string(),\r\n sufficient: z.boolean(),\r\n blockNumber: z.number(),\r\n confirmedAt: z.string(),\r\n});\r\n\r\nconst ExecuteResultSchema = z.object({\r\n quoteId: z.string(),\r\n status: z.enum(['executing', 'queued']),\r\n estimatedCompletionAt: z.string(),\r\n batchId: z.string(),\r\n});\r\n\r\nconst ReceiptSchema = z.object({\r\n quoteId: z.string(),\r\n status: z.enum(['completed', 'partial', 'failed']),\r\n successCount: z.number(),\r\n failureCount: z.number(),\r\n totalSent: z.string(),\r\n refundAmount: z.string(),\r\n refundTxHash: z.string().optional(),\r\n transactions: z.array(\r\n z.object({\r\n recipient: z.string(),\r\n amount: z.string(),\r\n txHash: z.string().nullable(),\r\n status: z.enum(['success', 'failed']),\r\n error: z.string().optional(),\r\n })\r\n ),\r\n completedAt: z.string(),\r\n});\r\n\r\nconst HealthSchema = z.object({\r\n status: z.enum(['healthy', 'degraded', 'unhealthy']),\r\n version: z.string(),\r\n timestamp: z.string(),\r\n services: z.object({\r\n database: z.enum(['up', 'down']),\r\n queue: z.enum(['up', 'down']),\r\n oracle: z.enum(['up', 'down']),\r\n }),\r\n});\r\n\r\n// =============================================================================\r\n// BeeperClient Implementation\r\n// =============================================================================\r\n\r\nconst ENDPOINTS = {\r\n QUOTES: '/api/v1/sdk/send/quotes',\r\n HEALTH: '/api/v1/sdk/send/health',\r\n} as const;\r\n\r\n/**\r\n * BeeperClient - Main SDK client for the Beeper protocol\r\n *\r\n * @example\r\n * ```typescript\r\n * const client = new BeeperClient({\r\n * apiKey: process.env.BEEPER_API_KEY,\r\n * });\r\n *\r\n * // Create a draft\r\n * const draft = client.createDraft({\r\n * filter: { hasTag: 'vip' },\r\n * tokenAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\r\n * chainId: 8453,\r\n * amountPerRecipient: '1000000',\r\n * budgetCap: '100000000',\r\n * });\r\n *\r\n * // Get a quote\r\n * const quote = await client.createQuote(draft);\r\n * ```\r\n */\r\nexport class BeeperClient {\r\n private readonly http: HttpClient;\r\n\r\n constructor(config: BeeperClientConfig) {\r\n this.validateConfig(config);\r\n\r\n const httpConfig = createHttpConfig({\r\n apiKey: config.apiKey,\r\n ...(config.environment !== undefined && { environment: config.environment }),\r\n ...(config.baseUrl !== undefined && { baseUrl: config.baseUrl }),\r\n ...(config.timeoutMs !== undefined && { timeout: config.timeoutMs }),\r\n ...(config.fetch !== undefined && { fetch: config.fetch }),\r\n ...(config.debug !== undefined && { debug: config.debug }),\r\n });\r\n\r\n this.http = new HttpClient(httpConfig);\r\n }\r\n\r\n /**\r\n * Validates client configuration\r\n */\r\n private validateConfig(config: BeeperClientConfig): void {\r\n if (!config.apiKey) {\r\n throw BeeperError.validation('API key is required');\r\n }\r\n\r\n if (!isValidApiKeyFormat(config.apiKey)) {\r\n throw BeeperError.validation(\r\n 'Invalid API key format. Key must start with bpk_live_ or bpk_test_'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Creates a local draft. Does NOT make a network request.\r\n * @param input - The draft input parameters\r\n * @returns A draft object with a generated ID\r\n */\r\n createDraft(input: DraftInput): Draft {\r\n this.validateDraftInput(input);\r\n\r\n return {\r\n id: `draft_${generateIdempotencyKey()}`,\r\n input,\r\n createdAt: new Date().toISOString(),\r\n };\r\n }\r\n\r\n /**\r\n * Validates draft input parameters\r\n */\r\n private validateDraftInput(input: DraftInput): void {\r\n if (!input.filter || typeof input.filter !== 'object') {\r\n throw BeeperError.validation('Filter is required and must be an object');\r\n }\r\n\r\n if (!input.tokenAddress || !/^0x[a-fA-F0-9]{40}$/.test(input.tokenAddress)) {\r\n throw BeeperError.validation('Invalid token address format');\r\n }\r\n\r\n if (!input.chainId || typeof input.chainId !== 'number') {\r\n throw BeeperError.validation('Chain ID is required and must be a number');\r\n }\r\n\r\n if (!input.amountPerRecipient || !/^[0-9]+$/.test(input.amountPerRecipient)) {\r\n throw BeeperError.validation(\r\n 'Amount per recipient must be a positive integer string'\r\n );\r\n }\r\n\r\n if (!input.budgetCap || !/^[0-9]+$/.test(input.budgetCap)) {\r\n throw BeeperError.validation('Budget cap must be a positive integer string');\r\n }\r\n\r\n if (input.memo !== undefined && input.memo.length > 256) {\r\n throw BeeperError.validation('Memo must be 256 characters or less');\r\n }\r\n }\r\n\r\n /**\r\n * Submits draft to server and receives a priced quote\r\n * @param draft - The draft to quote\r\n * @param opts - Optional quote options\r\n * @returns A quote with server-computed pricing\r\n */\r\n async createQuote(draft: Draft, opts?: QuoteOptions): Promise<Quote> {\r\n const body = {\r\n ...draft.input,\r\n ttlSeconds: opts?.ttlSeconds ?? 300,\r\n };\r\n\r\n const response = await this.http.post<Quote>(\r\n ENDPOINTS.QUOTES,\r\n body,\r\n {},\r\n QuoteSchema\r\n );\r\n\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Creates an attention marketplace quote (message-based send)\r\n * @param input - Attention quote input with message, recipients, and budget\r\n * @param opts - Optional quote options\r\n * @returns An attention quote with server-computed pricing\r\n *\r\n * @example\r\n * ```typescript\r\n * const quote = await client.createAttentionQuote({\r\n * message: \"Check out our new feature!\",\r\n * filter: FilterBuilder.and([\r\n * FilterBuilder.platform('farcaster'),\r\n * FilterBuilder.activeInLastDays(7),\r\n * ]).toJSON(),\r\n * budgetUSD: \"50.00\",\r\n * rewardType: 'guaranteed',\r\n * });\r\n * ```\r\n */\r\n async createAttentionQuote(\r\n input: AttentionQuoteInput,\r\n opts?: QuoteOptions\r\n ): Promise<AttentionQuote> {\r\n // Validate input\r\n if (!input.message || input.message.length === 0) {\r\n throw BeeperError.validation('Message is required');\r\n }\r\n if (input.message.length > 1000) {\r\n throw BeeperError.validation('Message must be 1000 characters or less');\r\n }\r\n if (!input.recipientFids?.length && !input.filter) {\r\n throw BeeperError.validation('Must provide either recipientFids or filter');\r\n }\r\n if (input.recipientFids && input.recipientFids.length > 1000) {\r\n throw BeeperError.validation('recipientFids cannot exceed 1000');\r\n }\r\n if (!input.budgetUSD || !/^[0-9]+\\.?[0-9]*$/.test(input.budgetUSD)) {\r\n throw BeeperError.validation('budgetUSD must be a valid USD amount');\r\n }\r\n if (parseFloat(input.budgetUSD) <= 0) {\r\n throw BeeperError.validation('budgetUSD must be positive');\r\n }\r\n\r\n const body = {\r\n message: input.message,\r\n recipientFids: input.recipientFids,\r\n filter: input.filter,\r\n budgetUSD: input.budgetUSD,\r\n rewardType: input.rewardType ?? 'guaranteed',\r\n memo: input.memo,\r\n metadata: input.metadata,\r\n ttlSeconds: opts?.ttlSeconds ?? 300,\r\n };\r\n\r\n const response = await this.http.post<AttentionQuote>(\r\n ENDPOINTS.QUOTES,\r\n body,\r\n {},\r\n AttentionQuoteSchema\r\n );\r\n\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Retrieves an existing quote by ID\r\n * @param quoteId - The quote ID\r\n * @returns The quote\r\n */\r\n async getQuote(quoteId: string): Promise<Quote> {\r\n const response = await this.http.get<Quote>(\r\n `${ENDPOINTS.QUOTES}/${quoteId}`,\r\n {},\r\n QuoteSchema\r\n );\r\n\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Confirms that deposit has been made\r\n * @param quoteId - The quote ID\r\n * @param params - Confirmation parameters including txHash and idempotencyKey\r\n * @returns Confirmation result\r\n */\r\n async confirmDeposit(\r\n quoteId: string,\r\n params: { txHash: string; idempotencyKey: string }\r\n ): Promise<ConfirmResult> {\r\n if (!params.idempotencyKey) {\r\n throw BeeperError.validation('Idempotency key is required for confirmDeposit');\r\n }\r\n\r\n if (!params.txHash || !/^0x[a-fA-F0-9]{64}$/.test(params.txHash)) {\r\n throw BeeperError.validation('Invalid transaction hash format');\r\n }\r\n\r\n const response = await this.http.post<ConfirmResult>(\r\n `${ENDPOINTS.QUOTES}/${quoteId}/confirm`,\r\n { txHash: params.txHash },\r\n { idempotencyKey: params.idempotencyKey },\r\n ConfirmResultSchema\r\n );\r\n\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Triggers execution of the send\r\n * @param quoteId - The quote ID\r\n * @param params - Execution parameters including idempotencyKey\r\n * @returns Execution result\r\n */\r\n async executeSend(\r\n quoteId: string,\r\n params: { idempotencyKey: string }\r\n ): Promise<ExecuteResult> {\r\n if (!params.idempotencyKey) {\r\n throw BeeperError.validation('Idempotency key is required for executeSend');\r\n }\r\n\r\n const response = await this.http.post<ExecuteResult>(\r\n `${ENDPOINTS.QUOTES}/${quoteId}/execute`,\r\n {},\r\n { idempotencyKey: params.idempotencyKey },\r\n ExecuteResultSchema\r\n );\r\n\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Gets the receipt for a completed (or failed) execution\r\n * @param quoteId - The quote ID\r\n * @returns The receipt\r\n */\r\n async getReceiptByQuoteId(quoteId: string): Promise<Receipt> {\r\n const response = await this.http.get<Receipt>(\r\n `${ENDPOINTS.QUOTES}/${quoteId}/receipt`,\r\n {},\r\n ReceiptSchema\r\n );\r\n\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Polls until execution completes, then returns receipt\r\n * @param quoteId - The quote ID\r\n * @param opts - Polling options\r\n * @returns The receipt when execution completes\r\n */\r\n async pollUntilCompleteByQuoteId(\r\n quoteId: string,\r\n opts?: PollOptions\r\n ): Promise<Receipt> {\r\n const maxAttempts = opts?.maxAttempts ?? 60;\r\n const intervalMs = opts?.intervalMs ?? 2000;\r\n\r\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n const quote = await this.getQuote(quoteId);\r\n\r\n if (opts?.onPoll) {\r\n opts.onPoll(quote);\r\n }\r\n\r\n if (quote.status === 'completed' || quote.status === 'failed') {\r\n return this.getReceiptByQuoteId(quoteId);\r\n }\r\n\r\n if (quote.status === 'expired') {\r\n throw new BeeperError({\r\n code: ErrorCodes.QUOTE_EXPIRED,\r\n message: `Quote ${quoteId} expired while polling`,\r\n retryable: false,\r\n });\r\n }\r\n\r\n if (attempt < maxAttempts - 1) {\r\n await this.sleep(intervalMs);\r\n }\r\n }\r\n\r\n throw new BeeperError({\r\n code: ErrorCodes.TIMEOUT,\r\n message: `Polling timed out after ${maxAttempts} attempts`,\r\n retryable: false,\r\n });\r\n }\r\n\r\n /**\r\n * Checks API health status\r\n * @returns Health status\r\n */\r\n async health(): Promise<Health> {\r\n const response = await this.http.get<Health>(\r\n ENDPOINTS.HEALTH,\r\n {},\r\n HealthSchema\r\n );\r\n\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Sleep helper for polling\r\n */\r\n private sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n }\r\n}\r\n\r\nexport default BeeperClient;\r\n","import { z } from 'zod';\r\n\r\n// ============================================================================\r\n// LEGACY SCHEMA (Backward Compatibility)\r\n// ============================================================================\r\n\r\n/**\r\n * @deprecated Use the new DSL filter schemas instead\r\n * Filter operators schema (legacy)\r\n */\r\nexport const LegacyFilterOperatorSchema = z.enum([\r\n 'eq',\r\n 'ne',\r\n 'gt',\r\n 'gte',\r\n 'lt',\r\n 'lte',\r\n 'in',\r\n 'nin',\r\n 'contains',\r\n 'startsWith',\r\n 'endsWith',\r\n]);\r\n\r\n/**\r\n * @deprecated Use the new DSL filter schemas instead\r\n * Filter value schema - supports primitives and arrays (legacy)\r\n */\r\nexport const LegacyFilterValueSchema = z.union([\r\n z.string(),\r\n z.number(),\r\n z.boolean(),\r\n z.array(z.string()),\r\n z.array(z.number()),\r\n]);\r\n\r\n/**\r\n * @deprecated Use the new DSL filter schemas instead\r\n * Field comparison schema (legacy)\r\n */\r\nexport const LegacyFieldComparisonSchema = z.object({\r\n field: z.string().min(1),\r\n op: LegacyFilterOperatorSchema,\r\n value: LegacyFilterValueSchema,\r\n});\r\n\r\n/**\r\n * @deprecated Use RecipientFilterSchema instead\r\n * Recursive filter DSL schema (legacy)\r\n */\r\nexport const LegacyRecipientFilterDSLSchema: z.ZodType<unknown> = z.lazy(() =>\r\n z.union([\r\n // Match all\r\n z.object({ all: z.literal(true) }),\r\n // Logical AND\r\n z.object({ and: z.array(LegacyRecipientFilterDSLSchema).min(1) }),\r\n // Logical OR\r\n z.object({ or: z.array(LegacyRecipientFilterDSLSchema).min(1) }),\r\n // Logical NOT\r\n z.object({ not: LegacyRecipientFilterDSLSchema }),\r\n // Field comparison\r\n LegacyFieldComparisonSchema,\r\n ])\r\n);\r\n\r\n// Legacy aliases for backward compatibility\r\nexport const FilterOperatorSchema = LegacyFilterOperatorSchema;\r\nexport const FilterValueSchema = LegacyFilterValueSchema;\r\nexport const FieldComparisonSchema = LegacyFieldComparisonSchema;\r\n\r\n// ============================================================================\r\n// NEW DSL FILTER SCHEMAS (Matching Backend)\r\n// ============================================================================\r\n\r\n// ----------------------------------------------------------------------------\r\n// 1. PLATFORM FILTER\r\n// ----------------------------------------------------------------------------\r\n\r\nexport const PlatformFilterSchema = z.object({\r\n platform: z.enum(['all', 'farcaster', 'twitter']),\r\n});\r\n\r\n// ----------------------------------------------------------------------------\r\n// 2. SOCIAL FILTERS\r\n// ----------------------------------------------------------------------------\r\n\r\nexport const SpecificUsersFilterSchema = z.object({\r\n specificIds: z.array(z.string()).optional(),\r\n specificFids: z.array(z.number().int()).optional(),\r\n specificUsernames: z.array(z.string()).optional(),\r\n specificUsersMode: z.enum(['exclusive', 'additive']).optional(),\r\n});\r\n\r\nexport const ExcludeUsersFilterSchema = z.object({\r\n excludeFids: z.array(z.number().int()).optional(),\r\n excludeUsernames: z.array(z.string()).optional(),\r\n});\r\n\r\nexport const MinFollowersFilterSchema = z.object({\r\n minFollowers: z.number().int().min(0),\r\n});\r\n\r\nexport const MaxFollowersFilterSchema = z.object({\r\n maxFollowers: z.number().int().min(0),\r\n});\r\n\r\nexport const MinFollowingFilterSchema = z.object({\r\n minFollowing: z.number().int().min(0),\r\n});\r\n\r\nexport const MaxFollowingFilterSchema = z.object({\r\n maxFollowing: z.number().int().min(0),\r\n});\r\n\r\nexport const FollowersOfFilterSchema = z.object({\r\n followersOf: z.number().int(),\r\n});\r\n\r\nexport const FollowingOfFilterSchema = z.object({\r\n followingOf: z.number().int(),\r\n});\r\n\r\nexport const MutualsWithFilterSchema = z.object({\r\n mutualsWith: z.number().int(),\r\n});\r\n\r\nexport const SignalTokenFilterSchema = z.object({\r\n signalTokens: z.array(\r\n z.object({\r\n tokenAddress: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid token address'),\r\n })\r\n ),\r\n});\r\n\r\nexport const TimezoneFilterSchema = z.object({\r\n timezones: z.array(\r\n z.object({\r\n offset: z.number(), // UTC offset in hours (e.g., -5, +9, +5.5)\r\n range: z.number().min(0).max(12).optional(), // Range in hours (+/-)\r\n })\r\n ),\r\n});\r\n\r\nexport const CountryFilterSchema = z.object({\r\n countries: z.array(\r\n z.object({\r\n code: z.string().length(2), // ISO 3166-1 alpha-2 country code\r\n })\r\n ),\r\n});\r\n\r\nexport const RolesFilterSchema = z.object({\r\n roles: z.array(z.string()),\r\n});\r\n\r\n// Combined Social Filter\r\nexport const SocialFilterSchema = z.object({\r\n specificIds: z.array(z.string()).optional(),\r\n specificFids: z.array(z.number().int()).optional(),\r\n specificUsernames: z.array(z.string()).optional(),\r\n specificUsersMode: z.enum(['exclusive', 'additive']).optional(),\r\n excludeFids: z.array(z.number().int()).optional(),\r\n excludeUsernames: z.array(z.string()).optional(),\r\n followersOf: z.number().int().optional(),\r\n followingOf: z.number().int().optional(),\r\n mutualsWith: z.number().int().optional(),\r\n minFollowers: z.number().int().min(0).optional(),\r\n maxFollowers: z.number().int().min(0).optional(),\r\n minFollowing: z.number().int().min(0).optional(),\r\n maxFollowing: z.number().int().min(0).optional(),\r\n signalTokens: z\r\n .array(\r\n z.object({\r\n tokenAddress: z.string(),\r\n })\r\n )\r\n .optional(),\r\n timezones: z\r\n .array(\r\n z.object({\r\n offset: z.number(),\r\n range: z.number().min(0).max(12).optional(),\r\n })\r\n )\r\n .optional(),\r\n countries: z\r\n .array(\r\n z.object({\r\n code: z.string(),\r\n })\r\n )\r\n .optional(),\r\n roles: z.array(z.string()).optional(),\r\n});\r\n\r\n// ----------------------------------------------------------------------------\r\n// 3. ACTIVITY FILTERS\r\n// ----------------------------------------------------------------------------\r\n\r\nexport const ActiveInLastDaysFilterSchema = z.object({\r\n activeInLastDays: z.number().int().min(1).max(365),\r\n});\r\n\r\n// ----------------------------------------------------------------------------\r\n// 4. REPUTATION FILTERS\r\n// ----------------------------------------------------------------------------\r\n\r\nexport const NeynarScoreMinFilterSchema = z.object({\r\n neynarScoreMin: z.number().min(0).max(1),\r\n});\r\n\r\nexport const NeynarScoreMaxFilterSchema = z.object({\r\n neynarScoreMax: z.number().min(0).max(1),\r\n});\r\n\r\nexport const QuotientScoreMinFilterSchema = z.object({\r\n quotientScoreMin: z.number().min(0).max(1),\r\n});\r\n\r\nexport const QuotientScoreMaxFilterSchema = z.object({\r\n quotientScoreMax: z.number().min(0).max(1),\r\n});\r\n\r\nexport const SpamLabelFilterSchema = z.object({\r\n spamLabel: z.enum(['not_spam_only', 'spam_only', 'all']),\r\n});\r\n\r\nexport const ProSubscriptionFilterSchema = z.object({\r\n proSubscriptionRequired: z.boolean(),\r\n});\r\n\r\nexport const MinProTenureDaysFilterSchema = z.object({\r\n minProTenureDays: z.number().int().min(0),\r\n});\r\n\r\nexport const MinTenureDaysFilterSchema = z.object({\r\n minTenureDays: z.number().int().min(0),\r\n});\r\n\r\nexport const VerifiedOnlyFilterSchema = z.object({\r\n verifiedOnly: z.boolean(),\r\n});\r\n\r\n// Combined Reputation Filter\r\nexport const ReputationFilterSchema = z.object({\r\n neynarScoreMin: z.number().min(0).max(1).optional(),\r\n neynarScoreMax: z.number().min(0).max(1).optional(),\r\n quotientScoreMin: z.number().min(0).max(1).optional(),\r\n quotientScoreMax: z.number().min(0).max(1).optional(),\r\n spamLabel: z.enum(['not_spam_only', 'spam_only', 'all']).optional(),\r\n proSubscriptionRequired: z.boolean().optional(),\r\n minProTenureDays: z.number().int().min(0).optional(),\r\n minTenureDays: z.number().int().min(0).optional(),\r\n verifiedOnly: z.boolean().optional(),\r\n});\r\n\r\n// ----------------------------------------------------------------------------\r\n// 5. ECONOMICS FILTERS\r\n// ----------------------------------------------------------------------------\r\n\r\nexport const MaxAttentionPriceFilterSchema = z.object({\r\n maxAttentionPriceUsd: z.number().positive(),\r\n});\r\n\r\nexport const MinAttentionPriceFilterSchema = z.object({\r\n minAttentionPriceUsd: z.number().min(0),\r\n});\r\n\r\nexport const MinFidFilterSchema = z.object({\r\n minFid: z.number().int().min(1),\r\n});\r\n\r\nexport const MaxFidFilterSchema = z.object({\r\n maxFid: z.number().int().min(1),\r\n});\r\n\r\nexport const MinBatteryPercentageFilterSchema = z.object({\r\n minBatteryPercentage: z.number().min(0).max(100),\r\n});\r\n\r\nexport const ExcludePingedTodayFilterSchema = z.object({\r\n excludePingedToday: z.boolean(),\r\n});\r\n\r\nexport const HasRechargedInLastDaysFilterSchema = z.object({\r\n hasRechargedInLastDays: z.number().int().min(1),\r\n});\r\n\r\nexport const RequireLotteryOptInFilterSchema = z.object({\r\n requireLotteryOptIn: z.boolean(),\r\n});\r\n\r\nexport const RequireQuizOptInFilterSchema = z.object({\r\n requireQuizOptIn: z.boolean(),\r\n});\r\n\r\nexport const MinCastCountFilterSchema = z.object({\r\n minCastCount: z.number().int().min(0),\r\n});\r\n\r\nexport const MinClickThroughRateFilterSchema = z.object({\r\n minClickThroughRate: z.number().min(0).max(1),\r\n});\r\n\r\nexport const IsWaitlistedFilterSchema = z.object({\r\n isWaitlisted: z.boolean(),\r\n});\r\n\r\nexport const HasTierFilterSchema = z.object({\r\n hasTier: z.boolean(),\r\n});\r\n\r\n// Combined Beeper Economics Filter\r\nexport const BeeperEconomicsFilterSchema = z.object({\r\n maxAttentionPriceUsd: z.number().min(0).optional(),\r\n minAttentionPriceUsd: z.number().min(0).optional(),\r\n minFid: z.number().int().min(1).optional(),\r\n maxFid: z.number().int().min(1).optional(),\r\n minBatteryPercentage: z.number().min(0).max(100).optional(),\r\n excludePingedToday: z.boolean().optional(),\r\n hasRechargedInLastDays: z.number().int().min(1).optional(),\r\n activeInLastDays: z.number().int().min(0).optional(),\r\n requireLotteryOptIn: z.boolean().optional(),\r\n requireQuizOptIn: z.boolean().optional(),\r\n minCastCount: z.number().int().min(0).optional(),\r\n minClickThroughRate: z.number().min(0).max(1).optional(),\r\n isWaitlisted: z.boolean().optional(),\r\n hasTier: z.boolean().optional(),\r\n});\r\n\r\n// ----------------------------------------------------------------------------\r\n// 6. ONCHAIN FILTERS\r\n// ----------------------------------------------------------------------------\r\n\r\nexport const TokenHolderFilterSchema = z.object({\r\n tokenHolder: z.object({\r\n chain: z.enum(['base', 'ethereum']),\r\n contractAddress: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid contract address'),\r\n tokenStandard: z.enum(['ERC20', 'ERC721', 'ERC1155']),\r\n tokenId: z.string().optional(), // Required for ERC1155, optional for ERC721\r\n minBalance: z.string().optional(),\r\n symbol: z.string().optional(),\r\n name: z.string().optional(),\r\n }),\r\n});\r\n\r\nexport const CachedTokenHolderFilterSchema = z.object({\r\n cachedTokenHolder: z.object({\r\n chain: z.enum(['base', 'ethereum']),\r\n contractAddress: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid contract address'),\r\n tokenStandard: z.enum(['ERC20', 'ERC721', 'ERC1155']).default('ERC20'),\r\n tokenId: z.string().optional(),\r\n tokenSymbol: z.string().optional(),\r\n tokenName: z.string().optional(),\r\n minBalance: z.union([z.string(), z.number()]).optional(),\r\n }),\r\n});\r\n\r\nexport const HasBaseWalletFilterSchema = z.object({\r\n hasBaseWallet: z.boolean(),\r\n});\r\n\r\nexport const HasVerifiedWalletFilterSchema = z.object({\r\n hasVerifiedWallet: z.boolean(),\r\n});\r\n\r\n// Token Holder Discovery Schema (for array of token holders)\r\nexport const TokenHolderDiscoverySchema = z.object({\r\n chain: z.enum(['base', 'ethereum']),\r\n contractAddress: z.string(),\r\n tokenStandard: z.enum(['ERC20', 'ERC721', 'ERC1155']),\r\n tokenId: z.string().optional(),\r\n minBalance: z.union([z.string(), z.number()]).optional(),\r\n symbol: z.string().optional(),\r\n name: z.string().optional(),\r\n});\r\n\r\n// Cached Token Holder Schema (for array)\r\nexport const CachedTokenHolderSchema = z.object({\r\n chain: z.enum(['base', 'ethereum']),\r\n contractAddress: z.string(),\r\n tokenStandard: z.enum(['ERC20', 'ERC721', 'ERC1155']).default('ERC20'),\r\n tokenId: z.string().optional(),\r\n tokenSymbol: z.string().optional(),\r\n tokenName: z.string().optional(),\r\n minBalance: z.union([z.string(), z.number()]).optional(),\r\n});\r\n\r\n// Combined Onchain Filter\r\nexport const OnchainFilterSchema = z.object({\r\n hasBaseWallet: z.boolean().optional(),\r\n tokenHolders: z.array(TokenHolderDiscoverySchema).optional(),\r\n cachedTokenHolders: z.array(CachedTokenHolderSchema).optional(),\r\n hasVerifiedWallet: z.boolean().optional(),\r\n});\r\n\r\n// ----------------------------------------------------------------------------\r\n// 7. SORTING OPTIONS\r\n// ----------------------------------------------------------------------------\r\n\r\nexport const OrderBySchema = z.enum([\r\n 'attention_price_asc',\r\n 'attention_price_desc',\r\n 'neynar_score_desc',\r\n 'followers_desc',\r\n 'followers_asc',\r\n 'recent_activity',\r\n 'battery_desc',\r\n 'random',\r\n]);\r\n\r\n// ----------------------------------------------------------------------------\r\n// 8. COMBINED RECIPIENT FILTER SCHEMA (Main DSL)\r\n// ----------------------------------------------------------------------------\r\n\r\n/**\r\n * Complete Recipient Filter DSL Schema matching backend\r\n */\r\nexport const RecipientFilterSchema = z.object({\r\n // Platform filter\r\n platform: z.enum(['all', 'farcaster', 'twitter']).optional(),\r\n\r\n // Social targeting\r\n social: SocialFilterSchema.optional(),\r\n\r\n // Reputation filters\r\n reputation: ReputationFilterSchema.optional(),\r\n\r\n // Onchain filters\r\n onchain: OnchainFilterSchema.optional(),\r\n\r\n // Beeper economics filters\r\n beeperEconomics: BeeperEconomicsFilterSchema.optional(),\r\n\r\n // Sorting and limits\r\n orderBy: OrderBySchema.optional(),\r\n limit: z.number().int().min(1).optional(),\r\n});\r\n\r\n// ----------------------------------------------------------------------------\r\n// 9. FILTER EXPRESSION (with AND/OR/NOT combinators)\r\n// ----------------------------------------------------------------------------\r\n\r\n/**\r\n * Filter expression supporting logical combinators\r\n */\r\nexport const FilterExpressionSchema: z.ZodType<unknown> = z.lazy(() =>\r\n z.union([\r\n // Match all users\r\n z.object({ all: z.literal(true) }),\r\n\r\n // Logical AND\r\n z.object({ and: z.array(FilterExpressionSchema).min(1) }),\r\n\r\n // Logical OR\r\n z.object({ or: z.array(FilterExpressionSchema).min(1) }),\r\n\r\n // Logical NOT\r\n z.object({ not: FilterExpressionSchema }),\r\n\r\n // Platform filter\r\n PlatformFilterSchema,\r\n\r\n // Activity filter\r\n ActiveInLastDaysFilterSchema,\r\n\r\n // Reputation filters\r\n NeynarScoreMinFilterSchema,\r\n NeynarScoreMaxFilterSchema,\r\n QuotientScoreMinFilterSchema,\r\n QuotientScoreMaxFilterSchema,\r\n SpamLabelFilterSchema,\r\n ProSubscriptionFilterSchema,\r\n MinProTenureDaysFilterSchema,\r\n MinTenureDaysFilterSchema,\r\n VerifiedOnlyFilterSchema,\r\n\r\n // Social filters\r\n MinFollowersFilterSchema,\r\n MaxFollowersFilterSchema,\r\n MinFollowingFilterSchema,\r\n MaxFollowingFilterSchema,\r\n FollowersOfFilterSchema,\r\n FollowingOfFilterSchema,\r\n MutualsWithFilterSchema,\r\n\r\n // Economics filters\r\n MaxAttentionPriceFilterSchema,\r\n MinAttentionPriceFilterSchema,\r\n MinFidFilterSchema,\r\n MaxFidFilterSchema,\r\n MinBatteryPercentageFilterSchema,\r\n ExcludePingedTodayFilterSchema,\r\n HasRechargedInLastDaysFilterSchema,\r\n RequireLotteryOptInFilterSchema,\r\n RequireQuizOptInFilterSchema,\r\n MinCastCountFilterSchema,\r\n MinClickThroughRateFilterSchema,\r\n IsWaitlistedFilterSchema,\r\n HasTierFilterSchema,\r\n\r\n // Onchain filters\r\n TokenHolderFilterSchema,\r\n CachedTokenHolderFilterSchema,\r\n HasBaseWalletFilterSchema,\r\n HasVerifiedWalletFilterSchema,\r\n\r\n // Full recipient filter (structured DSL)\r\n RecipientFilterSchema,\r\n\r\n // Legacy field comparison (for backward compatibility)\r\n LegacyFieldComparisonSchema,\r\n ])\r\n);\r\n\r\n// Backward compatibility alias\r\nexport const RecipientFilterDSLSchema = FilterExpressionSchema;\r\n\r\n// ----------------------------------------------------------------------------\r\n// TYPE EXPORTS\r\n// ----------------------------------------------------------------------------\r\n\r\nexport type PlatformFilter = z.infer<typeof PlatformFilterSchema>;\r\nexport type SocialFilter = z.infer<typeof SocialFilterSchema>;\r\nexport type ReputationFilter = z.infer<typeof ReputationFilterSchema>;\r\nexport type OnchainFilter = z.infer<typeof OnchainFilterSchema>;\r\nexport type BeeperEconomicsFilter = z.infer<typeof BeeperEconomicsFilterSchema>;\r\nexport type RecipientFilter = z.infer<typeof RecipientFilterSchema>;\r\nexport type FilterExpression = z.infer<typeof FilterExpressionSchema>;\r\nexport type OrderBy = z.infer<typeof OrderBySchema>;\r\nexport type TokenHolderDiscovery = z.infer<typeof TokenHolderDiscoverySchema>;\r\nexport type CachedTokenHolder = z.infer<typeof CachedTokenHolderSchema>;\r\n\r\n// Legacy type exports\r\nexport type LegacyFilterOperator = z.infer<typeof LegacyFilterOperatorSchema>;\r\nexport type LegacyFilterValue = z.infer<typeof LegacyFilterValueSchema>;\r\nexport type LegacyFieldComparison = z.infer<typeof LegacyFieldComparisonSchema>;\r\n\r\n// ----------------------------------------------------------------------------\r\n// VALIDATION HELPERS\r\n// ----------------------------------------------------------------------------\r\n\r\n/**\r\n * Validate a filter DSL expression\r\n */\r\nexport function validateFilter(filter: unknown): boolean {\r\n const result = FilterExpressionSchema.safeParse(filter);\r\n return result.success;\r\n}\r\n\r\n/**\r\n * Parse and validate a filter DSL expression\r\n */\r\nexport function parseFilter(filter: unknown) {\r\n return FilterExpressionSchema.parse(filter);\r\n}\r\n\r\n/**\r\n * Safely parse a filter DSL expression\r\n */\r\nexport function safeParseFilter(filter: unknown) {\r\n return FilterExpressionSchema.safeParse(filter);\r\n}\r\n\r\n/**\r\n * Validate a structured recipient filter\r\n */\r\nexport function validateRecipientFilter(filter: unknown): boolean {\r\n const result = RecipientFilterSchema.safeParse(filter);\r\n return result.success;\r\n}\r\n\r\n/**\r\n * Parse and validate a structured recipient filter\r\n */\r\nexport function parseRecipientFilter(filter: unknown) {\r\n return RecipientFilterSchema.parse(filter);\r\n}\r\n\r\n/**\r\n * Safely parse a structured recipient filter\r\n */\r\nexport function safeParseRecipientFilter(filter: unknown) {\r\n return RecipientFilterSchema.safeParse(filter);\r\n}\r\n\r\n/**\r\n * Validate that a filter has at least some targeting criteria\r\n */\r\nexport function validateFilterHasTargeting(filter: RecipientFilter): boolean {\r\n const hasSocial =\r\n filter.social?.specificFids?.length ||\r\n filter.social?.specificUsernames?.length ||\r\n filter.social?.followersOf ||\r\n filter.social?.followingOf ||\r\n filter.social?.mutualsWith;\r\n\r\n // If no specific social targeting, must have other filters to narrow down\r\n if (!hasSocial) {\r\n const hasOtherFilters =\r\n filter.reputation || filter.onchain || filter.beeperEconomics;\r\n return !!hasOtherFilters;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Get human-readable description of filters\r\n */\r\nexport function describeFilters(filter: RecipientFilter): string[] {\r\n const descriptions: string[] = [];\r\n\r\n // Platform\r\n if (filter.platform && filter.platform !== 'all') {\r\n descriptions.push(`Platform: ${filter.platform}`);\r\n }\r\n\r\n // Social\r\n if (filter.social?.specificFids?.length) {\r\n descriptions.push(`${filter.social.specificFids.length} specific users`);\r\n }\r\n if (filter.social?.followersOf) {\r\n descriptions.push(`Followers of FID ${filter.social.followersOf}`);\r\n }\r\n if (filter.social?.mutualsWith) {\r\n descriptions.push(`Mutual followers with FID ${filter.social.mutualsWith}`);\r\n }\r\n if (filter.social?.minFollowers) {\r\n descriptions.push(`Min ${filter.social.minFollowers} followers`);\r\n }\r\n if (filter.social?.signalTokens?.length) {\r\n descriptions.push(\r\n `Signal token holders: ${filter.social.signalTokens.length} token(s)`\r\n );\r\n }\r\n if (filter.social?.timezones && filter.social.timezones.length > 0) {\r\n descriptions.push(`${filter.social.timezones.length} timezone(s)`);\r\n }\r\n if (filter.social?.countries && filter.social.countries.length > 0) {\r\n descriptions.push(`${filter.social.countries.length} country/countries`);\r\n }\r\n if (filter.social?.roles && filter.social.roles.length > 0) {\r\n descriptions.push(`${filter.social.roles.length} role(s)`);\r\n }\r\n\r\n // Reputation\r\n if (filter.reputation?.neynarScoreMin) {\r\n descriptions.push(`Neynar score >= ${filter.reputation.neynarScoreMin}`);\r\n }\r\n if (filter.reputation?.quotientScoreMin) {\r\n descriptions.push(`Quotient score >= ${filter.reputation.quotientScoreMin}`);\r\n }\r\n if (filter.reputation?.spamLabel === 'not_spam_only') {\r\n descriptions.push('Non-spam only');\r\n }\r\n if (filter.reputation?.proSubscriptionRequired) {\r\n descriptions.push('Pro subscribers');\r\n }\r\n\r\n // Onchain\r\n if (filter.onchain?.hasBaseWallet) {\r\n descriptions.push('Base wallet holders');\r\n }\r\n if (filter.onchain?.tokenHolders?.length) {\r\n descriptions.push(\r\n `Token holders: ${filter.onchain.tokenHolders.length} token(s)`\r\n );\r\n }\r\n if (filter.onchain?.cachedTokenHolders?.length) {\r\n const tokenNames = filter.onchain.cachedTokenHolders\r\n .map((t) => t.tokenSymbol || t.contractAddress.slice(0, 10))\r\n .join(', ');\r\n descriptions.push(`Holders of: ${tokenNames}`);\r\n }\r\n\r\n // Beeper Economics\r\n if (filter.beeperEconomics?.maxAttentionPriceUsd) {\r\n descriptions.push(\r\n `Max $${filter.beeperEconomics.maxAttentionPriceUsd}/msg`\r\n );\r\n }\r\n if (filter.beeperEconomics?.activeInLastDays) {\r\n descriptions.push(\r\n `Active in last ${filter.beeperEconomics.activeInLastDays} days`\r\n );\r\n }\r\n if (filter.beeperEconomics?.hasRechargedInLastDays) {\r\n descriptions.push(\r\n `Recharged in last ${filter.beeperEconomics.hasRechargedInLastDays} days`\r\n );\r\n }\r\n if (filter.beeperEconomics?.minBatteryPercentage) {\r\n descriptions.push(`Min ${filter.beeperEconomics.minBatteryPercentage}% battery`);\r\n }\r\n\r\n return descriptions;\r\n}\r\n","import { z } from 'zod';\r\nimport { RecipientFilterDSLSchema } from './filters.schema.js';\r\n\r\n/**\r\n * Supported networks\r\n */\r\nexport const NetworkSchema = z.enum([\r\n 'ethereum',\r\n 'polygon',\r\n 'base',\r\n 'arbitrum',\r\n 'optimism',\r\n]);\r\n\r\n/**\r\n * Supported tokens\r\n */\r\nexport const TokenTypeSchema = z.enum(['USDC', 'USDT', 'ETH', 'MATIC']);\r\n\r\n/**\r\n * Distribution strategies\r\n */\r\nexport const DistributionStrategySchema = z.enum([\r\n 'equal',\r\n 'weighted',\r\n 'proportional',\r\n]);\r\n\r\n/**\r\n * Draft status\r\n */\r\nexport const DraftStatusSchema = z.enum(['draft', 'quoted', 'executed']);\r\n\r\n/**\r\n * Draft input schema - for creating new drafts\r\n */\r\nexport const DraftInputSchema = z.object({\r\n name: z.string().min(1).max(255),\r\n amount: z.string().regex(/^\\d+(\\.\\d+)?$/, 'Amount must be a valid decimal string'),\r\n token: TokenTypeSchema,\r\n network: NetworkSchema,\r\n filter: RecipientFilterDSLSchema,\r\n strategy: DistributionStrategySchema,\r\n weights: z.record(z.string(), z.number().min(0)).optional(),\r\n metadata: z.record(z.string(), z.unknown()).optional(),\r\n});\r\n\r\n/**\r\n * Full draft schema - includes server-generated fields\r\n */\r\nexport const DraftSchema = z.object({\r\n id: z.string().uuid(),\r\n name: z.string(),\r\n amount: z.string(),\r\n token: TokenTypeSchema,\r\n network: NetworkSchema,\r\n filter: RecipientFilterDSLSchema,\r\n strategy: DistributionStrategySchema,\r\n weights: z.record(z.string(), z.number()).optional(),\r\n metadata: z.record(z.string(), z.unknown()).optional(),\r\n createdAt: z.string().datetime(),\r\n updatedAt: z.string().datetime(),\r\n status: DraftStatusSchema,\r\n});\r\n\r\n/**\r\n * Draft update schema - partial update\r\n */\r\nexport const DraftUpdateSchema = DraftInputSchema.partial();\r\n\r\n/**\r\n * Validate draft input\r\n */\r\nexport function validateDraftInput(input: unknown) {\r\n return DraftInputSchema.safeParse(input);\r\n}\r\n\r\n/**\r\n * Parse draft input\r\n */\r\nexport function parseDraftInput(input: unknown) {\r\n return DraftInputSchema.parse(input);\r\n}\r\n\r\n/**\r\n * Validate draft response\r\n */\r\nexport function validateDraft(draft: unknown) {\r\n return DraftSchema.safeParse(draft);\r\n}\r\n\r\n/**\r\n * Parse draft response\r\n */\r\nexport function parseDraft(draft: unknown) {\r\n return DraftSchema.parse(draft);\r\n}\r\n\r\n// Type exports\r\nexport type DraftInputSchemaType = z.infer<typeof DraftInputSchema>;\r\nexport type DraftSchemaType = z.infer<typeof DraftSchema>;\r\nexport type DraftUpdateSchemaType = z.infer<typeof DraftUpdateSchema>;\r\n","import { randomUUID } from 'node:crypto';\r\nimport type { z } from 'zod';\r\nimport { DraftInputSchema } from '../schemas/draft.schema.js';\r\nimport type { DraftSchema } from '../schemas/draft.schema.js';\r\ntype Draft = z.infer<typeof DraftSchema>;\r\ntype DraftInput = z.infer<typeof DraftInputSchema>;\r\nimport { BeeperError, ErrorCodes } from '../errors/index.js';\r\n\r\n/**\r\n * Create a new draft from input (pure function, no API calls)\r\n *\r\n * @param input - The draft input configuration\r\n * @returns A Draft object with generated ID and timestamps\r\n * @throws BeeperError if input validation fails\r\n */\r\nexport function createDraft(input: DraftInput): Draft {\r\n // Validate the input\r\n const validated = validateDraftInput(input);\r\n\r\n const now = new Date().toISOString();\r\n\r\n const draft: Draft = {\r\n id: randomUUID(),\r\n name: validated.name,\r\n amount: validated.amount,\r\n token: validated.token,\r\n network: validated.network,\r\n filter: validated.filter,\r\n strategy: validated.strategy,\r\n createdAt: now,\r\n updatedAt: now,\r\n status: 'draft',\r\n };\r\n\r\n // Only add optional properties if defined\r\n if (validated.weights !== undefined) {\r\n draft.weights = validated.weights;\r\n }\r\n if (validated.metadata !== undefined) {\r\n draft.metadata = validated.metadata;\r\n }\r\n\r\n return draft;\r\n}\r\n\r\n/**\r\n * Validate draft input using Zod schema\r\n *\r\n * @param input - Unknown input to validate\r\n * @returns Validated DraftInput\r\n * @throws BeeperError if validation fails\r\n */\r\nexport function validateDraftInput(input: unknown): DraftInput {\r\n const result = DraftInputSchema.safeParse(input);\r\n\r\n if (!result.success) {\r\n const issues = result.error.issues.map((issue) => ({\r\n path: issue.path.join('.'),\r\n message: issue.message,\r\n }));\r\n\r\n throw new BeeperError({\r\n code: ErrorCodes.VALIDATION_ERROR,\r\n message: 'Invalid draft input',\r\n context: {\r\n details: { issues },\r\n },\r\n retryable: false,\r\n });\r\n }\r\n\r\n // Cast to DraftInput since Zod's recursive schema types as unknown\r\n return result.data as DraftInput;\r\n}\r\n\r\n/**\r\n * Update an existing draft with new values\r\n *\r\n * @param draft - The existing draft to update\r\n * @param updates - Partial updates to apply\r\n * @returns Updated draft with new updatedAt timestamp\r\n */\r\nexport function updateDraft(\r\n draft: Draft,\r\n updates: Partial<DraftInput>\r\n): Draft {\r\n // Build merged input, preserving undefined for optional fields\r\n const mergedInput: DraftInput = {\r\n name: updates.name ?? draft.name,\r\n amount: updates.amount ?? draft.amount,\r\n token: updates.token ?? draft.token,\r\n network: updates.network ?? draft.network,\r\n filter: updates.filter ?? draft.filter,\r\n strategy: updates.strategy ?? draft.strategy,\r\n };\r\n\r\n // Handle optional fields explicitly\r\n if (updates.weights !== undefined) {\r\n mergedInput.weights = updates.weights;\r\n } else if (draft.weights !== undefined) {\r\n mergedInput.weights = draft.weights;\r\n }\r\n\r\n if (updates.metadata !== undefined) {\r\n mergedInput.metadata = updates.metadata;\r\n } else if (draft.metadata !== undefined) {\r\n mergedInput.metadata = draft.metadata;\r\n }\r\n\r\n const validated = validateDraftInput(mergedInput);\r\n\r\n const updatedDraft: Draft = {\r\n ...draft,\r\n name: validated.name,\r\n amount: validated.amount,\r\n token: validated.token,\r\n network: validated.network,\r\n filter: validated.filter,\r\n strategy: validated.strategy,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n\r\n // Only add optional properties if defined\r\n if (validated.weights !== undefined) {\r\n updatedDraft.weights = validated.weights;\r\n }\r\n if (validated.metadata !== undefined) {\r\n updatedDraft.metadata = validated.metadata;\r\n }\r\n\r\n return updatedDraft;\r\n}\r\n\r\n/**\r\n * Check if a draft is ready for quoting\r\n *\r\n * @param draft - The draft to check\r\n * @returns true if the draft can be quoted\r\n */\r\nexport function isReadyForQuote(draft: Draft): boolean {\r\n return (\r\n draft.status === 'draft' &&\r\n draft.name.length > 0 &&\r\n parseFloat(draft.amount) > 0\r\n );\r\n}\r\n","import { z } from 'zod';\r\nimport type { HttpClient } from '../client/http.js';\r\nimport type { DraftSchema } from '../schemas/draft.schema.js';\r\nimport type { QuoteOptionsSchema } from '../schemas/quote.schema.js';\r\ntype Draft = z.infer<typeof DraftSchema>;\r\ntype QuoteOptions = z.infer<typeof QuoteOptionsSchema>;\r\nimport { BeeperError, ErrorCodes } from '../errors/index.js';\r\n\r\n/** API Quote response schema (matches HTTP contract) */\r\nexport const ApiQuoteResponseSchema = z.object({\r\n id: z.string().regex(/^qt_[a-zA-Z0-9]+$/),\r\n status: z.enum([\r\n 'pending', 'deposit_confirmed', 'executing', 'completed', 'expired', 'failed',\r\n ]),\r\n recipientCount: z.number().int().min(0),\r\n totalAmount: z.string(),\r\n protocolFee: z.string(),\r\n depositAmount: z.string(),\r\n depositAddress: z.string().regex(/^0x[a-fA-F0-9]{40}$/),\r\n depositChainId: z.number().int(),\r\n depositTokenAddress: z.string().regex(/^0x[a-fA-F0-9]{40}$/),\r\n expiresAt: z.string().datetime(),\r\n input: z.record(z.unknown()),\r\n createdAt: z.string().datetime(),\r\n updatedAt: z.string().datetime(),\r\n});\r\n\r\nexport type ApiQuoteResponse = z.infer<typeof ApiQuoteResponseSchema>;\r\nexport type QuoteStatus =\r\n | 'pending' | 'deposit_confirmed' | 'executing'\r\n | 'completed' | 'expired' | 'failed';\r\n\r\n/** Create a quote for a draft */\r\nexport async function createQuote(\r\n httpClient: HttpClient,\r\n draft: Draft,\r\n opts?: Partial<QuoteOptions>\r\n): Promise<ApiQuoteResponse> {\r\n const body = {\r\n filter: draft.filter,\r\n tokenAddress: getTokenAddress(draft.token, draft.network),\r\n chainId: getChainId(draft.network),\r\n amountPerRecipient: draft.amount,\r\n budgetCap: opts?.amount ?? draft.amount,\r\n memo: draft.name,\r\n metadata: draft.metadata,\r\n ttlSeconds: 300,\r\n };\r\n\r\n const response = await httpClient.post<ApiQuoteResponse>(\r\n '/api/v1/sdk/send/quotes',\r\n body,\r\n {},\r\n ApiQuoteResponseSchema\r\n );\r\n\r\n return response.data;\r\n}\r\n\r\n/** Get an existing quote by ID */\r\nexport async function getQuote(\r\n httpClient: HttpClient,\r\n quoteId: string\r\n): Promise<ApiQuoteResponse> {\r\n if (!quoteId.match(/^qt_[a-zA-Z0-9]+$/)) {\r\n throw new BeeperError({\r\n code: ErrorCodes.VALIDATION_ERROR,\r\n message: 'Invalid quote ID format. Expected format: qt_xxxxx',\r\n retryable: false,\r\n });\r\n }\r\n\r\n const response = await httpClient.get<ApiQuoteResponse>(\r\n `/api/v1/sdk/send/quotes/${quoteId}`,\r\n {},\r\n ApiQuoteResponseSchema\r\n );\r\n\r\n return response.data;\r\n}\r\n\r\n/** Check if a quote has expired */\r\nexport function isQuoteExpired(quote: ApiQuoteResponse): boolean {\r\n return quote.status === 'expired' || new Date(quote.expiresAt) < new Date();\r\n}\r\n\r\n/** Check if a quote is ready for deposit confirmation */\r\nexport function isReadyForDeposit(quote: ApiQuoteResponse): boolean {\r\n return quote.status === 'pending' && !isQuoteExpired(quote);\r\n}\r\n\r\n/** Get chain ID for a network */\r\nfunction getChainId(network: string): number {\r\n const chainIds: Record<string, number> = {\r\n ethereum: 1, base: 8453, arbitrum: 42161, polygon: 137, optimism: 10,\r\n };\r\n return chainIds[network] ?? 1;\r\n}\r\n\r\n/** Get token address for a token/network combination */\r\nfunction getTokenAddress(token: string, network: string): string {\r\n const addresses: Record<string, Record<string, string>> = {\r\n USDC: {\r\n ethereum: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\r\n base: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\r\n arbitrum: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\r\n polygon: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\r\n optimism: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\r\n },\r\n USDT: {\r\n ethereum: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n base: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2',\r\n arbitrum: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\r\n polygon: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\r\n optimism: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\r\n },\r\n };\r\n return addresses[token]?.[network] ?? '0x0000000000000000000000000000000000000000';\r\n}\r\n","import { z } from 'zod';\r\nimport type { HttpClient } from '../client/http.js';\r\nimport { BeeperError, ErrorCodes } from '../errors/index.js';\r\n\r\n/**\r\n * Confirm deposit response schema (matches HTTP contract)\r\n */\r\nexport const ConfirmDepositResponseSchema = z.object({\r\n quoteId: z.string(),\r\n status: z.enum(['confirmed', 'pending_verification']),\r\n detectedAmount: z.string(),\r\n sufficient: z.boolean(),\r\n blockNumber: z.number().int(),\r\n confirmedAt: z.string().datetime(),\r\n});\r\n\r\nexport type ConfirmDepositResponse = z.infer<typeof ConfirmDepositResponseSchema>;\r\n\r\n/**\r\n * Parameters for confirming a deposit\r\n */\r\nexport interface ConfirmDepositParams {\r\n /** Transaction hash of the deposit (0x + 64 hex chars) */\r\n txHash: string;\r\n /** Unique idempotency key for safe retries */\r\n idempotencyKey: string;\r\n}\r\n\r\n/**\r\n * Confirm that a deposit has been made for a quote\r\n *\r\n * @param httpClient - The HTTP client instance\r\n * @param quoteId - The quote ID to confirm deposit for\r\n * @param params - Deposit confirmation parameters\r\n * @returns The confirmation result\r\n * @throws BeeperError if validation fails or API returns error\r\n */\r\nexport async function confirmDeposit(\r\n httpClient: HttpClient,\r\n quoteId: string,\r\n params: ConfirmDepositParams\r\n): Promise<ConfirmDepositResponse> {\r\n // Validate quote ID format\r\n validateQuoteId(quoteId);\r\n\r\n // Validate transaction hash format\r\n validateTxHash(params.txHash);\r\n\r\n // Validate idempotency key\r\n if (!params.idempotencyKey || params.idempotencyKey.length === 0) {\r\n throw new BeeperError({\r\n code: ErrorCodes.VALIDATION_ERROR,\r\n message: 'Idempotency key is required for deposit confirmation',\r\n retryable: false,\r\n });\r\n }\r\n\r\n const response = await httpClient.post<ConfirmDepositResponse>(\r\n `/api/v1/sdk/send/quotes/${quoteId}/confirm`,\r\n { txHash: params.txHash },\r\n { idempotencyKey: params.idempotencyKey },\r\n ConfirmDepositResponseSchema\r\n );\r\n\r\n return response.data;\r\n}\r\n\r\n/**\r\n * Check if a deposit confirmation was successful\r\n */\r\nexport function isDepositSufficient(result: ConfirmDepositResponse): boolean {\r\n return result.status === 'confirmed' && result.sufficient;\r\n}\r\n\r\n/**\r\n * Validate transaction hash format\r\n */\r\nfunction validateTxHash(txHash: string): void {\r\n const txHashRegex = /^0x[a-fA-F0-9]{64}$/;\r\n\r\n if (!txHashRegex.test(txHash)) {\r\n throw new BeeperError({\r\n code: ErrorCodes.VALIDATION_ERROR,\r\n message:\r\n 'Invalid transaction hash format. Expected 0x followed by 64 hex characters.',\r\n context: {\r\n details: {\r\n provided: txHash,\r\n expectedFormat: '0x + 64 hex characters',\r\n },\r\n },\r\n retryable: false,\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Validate quote ID format\r\n */\r\nfunction validateQuoteId(quoteId: string): void {\r\n if (!quoteId.match(/^qt_[a-zA-Z0-9]+$/)) {\r\n throw new BeeperError({\r\n code: ErrorCodes.VALIDATION_ERROR,\r\n message: 'Invalid quote ID format. Expected format: qt_xxxxx',\r\n retryable: false,\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Generate a recommended idempotency key for deposit confirmation\r\n */\r\nexport function generateDepositIdempotencyKey(quoteId: string): string {\r\n return `confirm-${quoteId}`;\r\n}\r\n","import { z } from 'zod';\r\nimport type { HttpClient } from '../client/http.js';\r\nimport { BeeperError, ErrorCodes } from '../errors/index.js';\r\n\r\n/**\r\n * Execute response schema (matches HTTP contract)\r\n */\r\nexport const ExecuteSendResponseSchema = z.object({\r\n quoteId: z.string(),\r\n status: z.enum(['executing', 'queued']),\r\n estimatedCompletionAt: z.string().datetime(),\r\n batchId: z.string(),\r\n});\r\n\r\nexport type ExecuteSendResponse = z.infer<typeof ExecuteSendResponseSchema>;\r\n\r\n/**\r\n * Parameters for executing a send\r\n */\r\nexport interface ExecuteSendParams {\r\n /** Unique idempotency key for safe retries */\r\n idempotencyKey: string;\r\n}\r\n\r\n/**\r\n * Trigger execution of a send operation\r\n *\r\n * @param httpClient - The HTTP client instance\r\n * @param quoteId - The quote ID to execute\r\n * @param params - Execution parameters\r\n * @returns The execution result\r\n * @throws BeeperError if validation fails or API returns error\r\n */\r\nexport async function executeSend(\r\n httpClient: HttpClient,\r\n quoteId: string,\r\n params: ExecuteSendParams\r\n): Promise<ExecuteSendResponse> {\r\n // Validate quote ID format\r\n validateQuoteId(quoteId);\r\n\r\n // Validate idempotency key\r\n if (!params.idempotencyKey || params.idempotencyKey.length === 0) {\r\n throw new BeeperError({\r\n code: ErrorCodes.VALIDATION_ERROR,\r\n message: 'Idempotency key is required for execution',\r\n retryable: false,\r\n });\r\n }\r\n\r\n const response = await httpClient.post<ExecuteSendResponse>(\r\n `/api/v1/sdk/send/quotes/${quoteId}/execute`,\r\n {}, // Empty body as per HTTP contract\r\n { idempotencyKey: params.idempotencyKey },\r\n ExecuteSendResponseSchema\r\n );\r\n\r\n return response.data;\r\n}\r\n\r\n/**\r\n * Check if execution is in progress\r\n */\r\nexport function isExecuting(result: ExecuteSendResponse): boolean {\r\n return result.status === 'executing' || result.status === 'queued';\r\n}\r\n\r\n/**\r\n * Get estimated time remaining for execution\r\n */\r\nexport function getEstimatedTimeRemaining(\r\n result: ExecuteSendResponse\r\n): number {\r\n const estimatedCompletion = new Date(result.estimatedCompletionAt);\r\n const now = new Date();\r\n return Math.max(0, estimatedCompletion.getTime() - now.getTime());\r\n}\r\n\r\n/**\r\n * Validate quote ID format\r\n */\r\nfunction validateQuoteId(quoteId: string): void {\r\n if (!quoteId.match(/^qt_[a-zA-Z0-9]+$/)) {\r\n throw new BeeperError({\r\n code: ErrorCodes.VALIDATION_ERROR,\r\n message: 'Invalid quote ID format. Expected format: qt_xxxxx',\r\n retryable: false,\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Generate a recommended idempotency key for execution\r\n */\r\nexport function generateExecuteIdempotencyKey(quoteId: string): string {\r\n return `execute-${quoteId}`;\r\n}\r\n","import { z } from 'zod';\r\nimport type { HttpClient } from '../client/http.js';\r\nimport { BeeperError, ErrorCodes } from '../errors/index.js';\r\n\r\n/** Receipt transaction schema */\r\nexport const ReceiptTransactionSchema = z.object({\r\n recipient: z.string().regex(/^0x[a-fA-F0-9]{40}$/),\r\n amount: z.string(),\r\n txHash: z.string().nullable(),\r\n status: z.enum(['success', 'failed']),\r\n error: z.string().nullable().optional(),\r\n});\r\n\r\n/** API Receipt response schema (matches HTTP contract) */\r\nexport const ApiReceiptResponseSchema = z.object({\r\n quoteId: z.string(),\r\n status: z.enum(['completed', 'partial', 'failed']),\r\n successCount: z.number().int().min(0),\r\n failureCount: z.number().int().min(0),\r\n totalSent: z.string(),\r\n refundAmount: z.string(),\r\n refundTxHash: z.string().nullable().optional(),\r\n transactions: z.array(ReceiptTransactionSchema),\r\n completedAt: z.string().datetime(),\r\n});\r\n\r\nexport type ApiReceiptResponse = z.infer<typeof ApiReceiptResponseSchema>;\r\nexport type ReceiptTransaction = z.infer<typeof ReceiptTransactionSchema>;\r\nexport type ReceiptStatus = 'completed' | 'partial' | 'failed';\r\n\r\n/** Options for polling */\r\nexport interface PollOptions {\r\n maxAttempts?: number;\r\n intervalMs?: number;\r\n signal?: AbortSignal;\r\n}\r\n\r\nconst DEFAULT_MAX_ATTEMPTS = 60;\r\nconst DEFAULT_INTERVAL_MS = 5000;\r\n\r\n/**\r\n * Get the receipt for a quote\r\n */\r\nexport async function getReceipt(\r\n httpClient: HttpClient,\r\n quoteId: string\r\n): Promise<ApiReceiptResponse> {\r\n if (!quoteId.match(/^qt_[a-zA-Z0-9]+$/)) {\r\n throw new BeeperError({\r\n code: ErrorCodes.VALIDATION_ERROR,\r\n message: 'Invalid quote ID format. Expected format: qt_xxxxx',\r\n retryable: false,\r\n });\r\n }\r\n\r\n const response = await httpClient.get<ApiReceiptResponse>(\r\n `/api/v1/sdk/send/quotes/${quoteId}/receipt`,\r\n {},\r\n ApiReceiptResponseSchema\r\n );\r\n\r\n return response.data;\r\n}\r\n\r\n/**\r\n * Poll until the execution is complete\r\n */\r\nexport async function pollUntilComplete(\r\n httpClient: HttpClient,\r\n quoteId: string,\r\n opts?: PollOptions\r\n): Promise<ApiReceiptResponse> {\r\n const maxAttempts = opts?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\r\n const intervalMs = opts?.intervalMs ?? DEFAULT_INTERVAL_MS;\r\n\r\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n if (opts?.signal?.aborted) {\r\n throw new BeeperError({\r\n code: ErrorCodes.TIMEOUT,\r\n message: 'Polling was aborted',\r\n retryable: false,\r\n });\r\n }\r\n\r\n try {\r\n const receipt = await getReceipt(httpClient, quoteId);\r\n if (isComplete(receipt)) return receipt;\r\n } catch (error) {\r\n // 428 = execution not complete yet, continue polling\r\n if (!(error instanceof BeeperError && error.context.statusCode === 428)) {\r\n throw error;\r\n }\r\n }\r\n\r\n if (attempt < maxAttempts - 1) {\r\n await sleep(intervalMs, opts?.signal);\r\n }\r\n }\r\n\r\n throw new BeeperError({\r\n code: ErrorCodes.QUOTE_EXPIRED,\r\n message: `Polling timed out after ${maxAttempts} attempts`,\r\n context: { details: { quoteId, maxAttempts } },\r\n retryable: false,\r\n });\r\n}\r\n\r\n/** Check if a receipt indicates completion */\r\nexport function isComplete(receipt: ApiReceiptResponse): boolean {\r\n return ['completed', 'partial', 'failed'].includes(receipt.status);\r\n}\r\n\r\n/** Check if execution was fully successful */\r\nexport function isSuccess(receipt: ApiReceiptResponse): boolean {\r\n return receipt.status === 'completed' && receipt.failureCount === 0;\r\n}\r\n\r\n/** Get the success rate as a percentage */\r\nexport function getSuccessRate(receipt: ApiReceiptResponse): number {\r\n const total = receipt.successCount + receipt.failureCount;\r\n return total === 0 ? 0 : (receipt.successCount / total) * 100;\r\n}\r\n\r\n/** Get failed transactions from a receipt */\r\nexport function getFailedTransactions(\r\n receipt: ApiReceiptResponse\r\n): ReceiptTransaction[] {\r\n return receipt.transactions.filter((tx) => tx.status === 'failed');\r\n}\r\n\r\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const timeoutId = setTimeout(resolve, ms);\r\n signal?.addEventListener('abort', () => {\r\n clearTimeout(timeoutId);\r\n reject(new Error('Aborted'));\r\n });\r\n });\r\n}\r\n","/**\r\n * FilterBuilder - Fluent API for building SDK filter expressions\r\n *\r\n * Used to construct filter objects for the /api/v1/sdk/send/quotes endpoint.\r\n * Supports logical combinators (and, or, not) and various filter types.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { FilterBuilder } from '@beeper/sdk';\r\n *\r\n * const filter = FilterBuilder.and([\r\n * FilterBuilder.platform('farcaster'),\r\n * FilterBuilder.activeInLastDays(30),\r\n * FilterBuilder.neynarScoreMin(0.5),\r\n * FilterBuilder.or([\r\n * FilterBuilder.minFollowers(1000),\r\n * FilterBuilder.followersOf(12345),\r\n * ]),\r\n * ]);\r\n *\r\n * // Use in API request\r\n * const draft = client.createDraft({\r\n * filter: filter.toJSON(),\r\n * // ... other params\r\n * });\r\n * ```\r\n */\r\n\r\n// =============================================================================\r\n// Type Definitions\r\n// =============================================================================\r\n\r\n/** Supported blockchain chains */\r\nexport type WalletChain =\r\n | 'ethereum'\r\n | 'base'\r\n | 'arbitrum'\r\n | 'polygon'\r\n | 'optimism';\r\n\r\n/** Supported platforms */\r\nexport type Platform = 'all' | 'farcaster' | 'twitter';\r\n\r\n/** Spam label filter values */\r\nexport type SpamLabel = 'spam_only' | 'not_spam_only';\r\n\r\n/** Extended spam label for spamLabel filter */\r\nexport type SpamLabelOption = 'not_spam_only' | 'spam_only' | 'all';\r\n\r\n/** Timezone filter options */\r\nexport interface TimezoneOptions {\r\n /** UTC offset in hours (e.g., -5 for EST, 9 for JST) */\r\n offset: number;\r\n /** Range in hours (optional, for fuzzy matching) */\r\n range?: number;\r\n}\r\n\r\n/** Order by options for result sorting */\r\nexport type OrderByOption =\r\n | 'attention_price_asc'\r\n | 'attention_price_desc'\r\n | 'neynar_score_desc'\r\n | 'followers_desc'\r\n | 'followers_asc'\r\n | 'recent_activity'\r\n | 'battery_desc'\r\n | 'random';\r\n\r\n/** Token holder filter options */\r\nexport interface TokenHolderOptions {\r\n /** Token contract address (0x prefixed) */\r\n tokenAddress: string;\r\n /** Chain ID (1 = Ethereum, 8453 = Base, 42161 = Arbitrum) */\r\n chainId: number;\r\n /** Minimum balance in wei (optional) */\r\n minBalance?: string;\r\n}\r\n\r\n/** Base filter expression that all filters extend */\r\nexport type FilterExpressionJSON =\r\n // Logical operators\r\n | { and: FilterExpressionJSON[] }\r\n | { or: FilterExpressionJSON[] }\r\n | { not: FilterExpressionJSON }\r\n // Tag-based filters\r\n | { hasTag: string }\r\n | { hasAnyTag: string[] }\r\n | { hasAllTags: string[] }\r\n // Wallet/chain filters\r\n | { walletChain: WalletChain }\r\n | { walletHasToken: { tokenAddress: string; chainId: number } }\r\n | {\r\n walletMinBalance: {\r\n tokenAddress: string;\r\n chainId: number;\r\n minBalance: string;\r\n };\r\n }\r\n // User ID filters\r\n | { userId: string }\r\n | { userIds: string[] }\r\n // FID-based filters\r\n | { fid: number }\r\n | { fids: number[] }\r\n // Time-based filters\r\n | { createdAfter: string }\r\n | { createdBefore: string }\r\n | { lastActiveAfter: string }\r\n // Reward/quest filters\r\n | { completedReward: string }\r\n | { notCompletedReward: string }\r\n | { completedQuest: string }\r\n | { hasAchievement: string }\r\n // Platform filter\r\n | { platform: Platform }\r\n // Activity filter\r\n | { activeInLastDays: number }\r\n // Neynar score filters\r\n | { neynarScoreMin: number }\r\n | { neynarScoreMax: number }\r\n | { neynarScoreRange: { min?: number; max?: number } }\r\n // Follower filters\r\n | { minFollowers: number }\r\n | { maxFollowers: number }\r\n | { followerRange: { min?: number; max?: number } }\r\n // Social graph filters\r\n | { followersOf: number }\r\n | { mutualsWith: number }\r\n // Economics filter\r\n | { maxAttentionPriceUsd: number }\r\n // Spam filter (deprecated spamLabelNot removed)\r\n // P2 Filters\r\n | { tokenHolders: Array<{ tokenAddress: string; chainId: number; minBalance?: string }> }\r\n | { cachedTokenHolders: Array<{ tokenAddress: string; chainId: number; minBalance?: string }> }\r\n | { spamLabel: SpamLabelOption }\r\n | { signalTokens: string[] }\r\n | { hasBaseWallet: boolean }\r\n | { hasVerifiedWallet: boolean }\r\n | { verifiedOnly: boolean }\r\n | { proSubscriptionRequired: boolean }\r\n | { minTenureDays: number }\r\n // P3 Filters\r\n | { timezones: Array<{ offset: number; range?: number }> }\r\n | { countries: Array<{ code: string }> }\r\n | { quotientScoreMin: number }\r\n | { quotientScoreMax: number }\r\n | { quotientScoreRange: { min?: number; max?: number } }\r\n | { minBatteryPercentage: number }\r\n | { hasRechargedInLastDays: number }\r\n | { excludePingedToday: boolean }\r\n | { requireLotteryOptIn: boolean }\r\n | { requireQuizOptIn: boolean }\r\n | { minCastCount: number }\r\n | { orderBy: OrderByOption }\r\n | { limit: number };\r\n\r\n/**\r\n * FilterExpression class - wraps a filter JSON object with builder methods\r\n */\r\nexport class FilterExpression {\r\n private readonly expression: FilterExpressionJSON;\r\n\r\n constructor(expression: FilterExpressionJSON) {\r\n this.expression = expression;\r\n }\r\n\r\n /**\r\n * Convert the filter expression to JSON format for API requests\r\n */\r\n toJSON(): FilterExpressionJSON {\r\n return this.expression;\r\n }\r\n\r\n /**\r\n * Combine this filter with another using AND logic\r\n */\r\n and(other: FilterExpression): FilterExpression {\r\n return FilterBuilder.and([this, other]);\r\n }\r\n\r\n /**\r\n * Combine this filter with another using OR logic\r\n */\r\n or(other: FilterExpression): FilterExpression {\r\n return FilterBuilder.or([this, other]);\r\n }\r\n\r\n /**\r\n * Negate this filter\r\n */\r\n not(): FilterExpression {\r\n return FilterBuilder.not(this);\r\n }\r\n}\r\n\r\n/**\r\n * FilterBuilder - Static factory methods for creating filter expressions\r\n *\r\n * All methods return FilterExpression objects that can be combined\r\n * using and(), or(), and not() methods.\r\n */\r\nexport class FilterBuilder {\r\n // ===========================================================================\r\n // Logical Combinators\r\n // ===========================================================================\r\n\r\n /**\r\n * Combine multiple filters with AND logic (all must match)\r\n * @param filters - Array of filter expressions to combine\r\n */\r\n static and(filters: FilterExpression[]): FilterExpression {\r\n if (filters.length === 0) {\r\n throw new Error('and() requires at least one filter');\r\n }\r\n if (filters.length === 1) {\r\n return filters[0]!;\r\n }\r\n return new FilterExpression({\r\n and: filters.map((f) => f.toJSON()),\r\n });\r\n }\r\n\r\n /**\r\n * Combine multiple filters with OR logic (any must match)\r\n * @param filters - Array of filter expressions to combine\r\n */\r\n static or(filters: FilterExpression[]): FilterExpression {\r\n if (filters.length === 0) {\r\n throw new Error('or() requires at least one filter');\r\n }\r\n if (filters.length === 1) {\r\n return filters[0]!;\r\n }\r\n return new FilterExpression({\r\n or: filters.map((f) => f.toJSON()),\r\n });\r\n }\r\n\r\n /**\r\n * Negate a filter (matches users who do NOT match the filter)\r\n * @param filter - Filter expression to negate\r\n */\r\n static not(filter: FilterExpression): FilterExpression {\r\n return new FilterExpression({\r\n not: filter.toJSON(),\r\n });\r\n }\r\n\r\n // ===========================================================================\r\n // Platform Filter\r\n // ===========================================================================\r\n\r\n /**\r\n * Filter by platform\r\n * @param p - Platform to target: 'all', 'farcaster', or 'twitter'\r\n */\r\n static platform(p: Platform): FilterExpression {\r\n return new FilterExpression({ platform: p });\r\n }\r\n\r\n // ===========================================================================\r\n // Activity Filters\r\n // ===========================================================================\r\n\r\n /**\r\n * Filter users who have been active within the last N days\r\n * @param days - Number of days (1-365)\r\n */\r\n static activeInLastDays(days: number): FilterExpression {\r\n if (days < 1 || days > 365) {\r\n throw new Error('activeInLastDays must be between 1 and 365');\r\n }\r\n return new FilterExpression({ activeInLastDays: days });\r\n }\r\n\r\n // ===========================================================================\r\n // Reputation Filters (Neynar Score)\r\n // ===========================================================================\r\n\r\n /**\r\n * Filter users with Neynar score >= minimum\r\n * @param score - Minimum score (0-1)\r\n */\r\n static neynarScoreMin(score: number): FilterExpression {\r\n if (score < 0 || score > 1) {\r\n throw new Error('neynarScoreMin must be between 0 and 1');\r\n }\r\n return new FilterExpression({ neynarScoreMin: score });\r\n }\r\n\r\n /**\r\n * Filter users with Neynar score <= maximum\r\n * @param score - Maximum score (0-1)\r\n */\r\n static neynarScoreMax(score: number): FilterExpression {\r\n if (score < 0 || score > 1) {\r\n throw new Error('neynarScoreMax must be between 0 and 1');\r\n }\r\n return new FilterExpression({ neynarScoreMax: score });\r\n }\r\n\r\n /**\r\n * Filter users with Neynar score in a range\r\n * @param min - Minimum score (0-1, optional)\r\n * @param max - Maximum score (0-1, optional)\r\n */\r\n static neynarScoreRange(min?: number, max?: number): FilterExpression {\r\n if (min !== undefined && (min < 0 || min > 1)) {\r\n throw new Error('neynarScoreRange min must be between 0 and 1');\r\n }\r\n if (max !== undefined && (max < 0 || max > 1)) {\r\n throw new Error('neynarScoreRange max must be between 0 and 1');\r\n }\r\n const range: { min?: number; max?: number } = {};\r\n if (min !== undefined) range.min = min;\r\n if (max !== undefined) range.max = max;\r\n return new FilterExpression({ neynarScoreRange: range });\r\n }\r\n\r\n /**\r\n * Filter by spam label\r\n * @param label - Spam label filter: 'not_spam_only', 'spam_only', or 'all'\r\n */\r\n static spamLabel(label: SpamLabelOption): FilterExpression {\r\n return new FilterExpression({ spamLabel: label });\r\n }\r\n\r\n /**\r\n * Filter to exclude spam users (convenience method)\r\n * @deprecated Use spamLabel('not_spam_only') instead\r\n */\r\n static excludeSpam(): FilterExpression {\r\n return new FilterExpression({ spamLabel: 'not_spam_only' });\r\n }\r\n\r\n // ===========================================================================\r\n // Social Graph Filters (Followers)\r\n // ===========================================================================\r\n\r\n /**\r\n * Filter users with at least N followers\r\n * @param count - Minimum follower count\r\n */\r\n static minFollowers(count: number): FilterExpression {\r\n if (count < 0) {\r\n throw new Error('minFollowers must be >= 0');\r\n }\r\n return new FilterExpression({ minFollowers: count });\r\n }\r\n\r\n /**\r\n * Filter users with at most N followers\r\n * @param count - Maximum follower count\r\n */\r\n static maxFollowers(count: number): FilterExpression {\r\n if (count < 0) {\r\n throw new Error('maxFollowers must be >= 0');\r\n }\r\n return new FilterExpression({ maxFollowers: count });\r\n }\r\n\r\n /**\r\n * Filter users with follower count in a range\r\n * @param min - Minimum follower count (optional)\r\n * @param max - Maximum follower count (optional)\r\n */\r\n static followerRange(min?: number, max?: number): FilterExpression {\r\n if (min !== undefined && min < 0) {\r\n throw new Error('followerRange min must be >= 0');\r\n }\r\n if (max !== undefined && max < 0) {\r\n throw new Error('followerRange max must be >= 0');\r\n }\r\n const range: { min?: number; max?: number } = {};\r\n if (min !== undefined) range.min = min;\r\n if (max !== undefined) range.max = max;\r\n return new FilterExpression({ followerRange: range });\r\n }\r\n\r\n /**\r\n * Filter users who follow a specific FID\r\n * @param fid - Farcaster ID to check followers of\r\n */\r\n static followersOf(fid: number): FilterExpression {\r\n if (fid < 1) {\r\n throw new Error('followersOf FID must be >= 1');\r\n }\r\n return new FilterExpression({ followersOf: fid });\r\n }\r\n\r\n /**\r\n * Filter users who have mutual follows with a specific FID\r\n * @param fid - Farcaster ID to check mutual follows with\r\n */\r\n static mutualsWith(fid: number): FilterExpression {\r\n if (fid < 1) {\r\n throw new Error('mutualsWith FID must be >= 1');\r\n }\r\n return new FilterExpression({ mutualsWith: fid });\r\n }\r\n\r\n // ===========================================================================\r\n // Economics Filters\r\n // ===========================================================================\r\n\r\n /**\r\n * Filter users with attention price <= maximum USD\r\n * @param usd - Maximum attention price in USD\r\n */\r\n static maxAttentionPriceUsd(usd: number): FilterExpression {\r\n if (usd < 0) {\r\n throw new Error('maxAttentionPriceUsd must be >= 0');\r\n }\r\n return new FilterExpression({ maxAttentionPriceUsd: usd });\r\n }\r\n\r\n // ===========================================================================\r\n // Onchain Filters (Token Holdings)\r\n // ===========================================================================\r\n\r\n /**\r\n * Filter users who hold a specific token\r\n * @param opts - Token holder options (tokenAddress, chainId, optional minBalance)\r\n */\r\n static tokenHolder(opts: TokenHolderOptions): FilterExpression {\r\n if (!/^0x[a-fA-F0-9]{40}$/.test(opts.tokenAddress)) {\r\n throw new Error('tokenAddress must be a valid Ethereum address');\r\n }\r\n\r\n if (opts.minBalance !== undefined) {\r\n if (!/^[0-9]+$/.test(opts.minBalance)) {\r\n throw new Error('minBalance must be a numeric string (wei)');\r\n }\r\n return new FilterExpression({\r\n walletMinBalance: {\r\n tokenAddress: opts.tokenAddress,\r\n chainId: opts.chainId,\r\n minBalance: opts.minBalance,\r\n },\r\n });\r\n }\r\n\r\n return new FilterExpression({\r\n walletHasToken: {\r\n tokenAddress: opts.tokenAddress,\r\n chainId: opts.chainId,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Filter users who hold any of the specified tokens (multiple token filter)\r\n * @param opts - Array of token holder options (max 10)\r\n */\r\n static tokenHolders(opts: TokenHolderOptions[]): FilterExpression {\r\n if (opts.length === 0) {\r\n throw new Error('tokenHolders requires at least one token option');\r\n }\r\n if (opts.length > 10) {\r\n throw new Error('tokenHolders cannot exceed 10 tokens');\r\n }\r\n for (const opt of opts) {\r\n if (!/^0x[a-fA-F0-9]{40}$/.test(opt.tokenAddress)) {\r\n throw new Error('tokenAddress must be a valid Ethereum address');\r\n }\r\n if (opt.minBalance !== undefined && !/^[0-9]+$/.test(opt.minBalance)) {\r\n throw new Error('minBalance must be a numeric string (wei)');\r\n }\r\n }\r\n return new FilterExpression({\r\n tokenHolders: opts.map((o) => ({\r\n tokenAddress: o.tokenAddress,\r\n chainId: o.chainId,\r\n ...(o.minBalance !== undefined ? { minBalance: o.minBalance } : {}),\r\n })),\r\n });\r\n }\r\n\r\n /**\r\n * Filter users who hold any of the specified tokens (uses pre-synced cache for faster queries)\r\n * @param opts - Array of token holder options (max 10)\r\n */\r\n static cachedTokenHolders(opts: TokenHolderOptions[]): FilterExpression {\r\n if (opts.length === 0) {\r\n throw new Error('cachedTokenHolders requires at least one token option');\r\n }\r\n if (opts.length > 10) {\r\n throw new Error('cachedTokenHolders cannot exceed 10 tokens');\r\n }\r\n for (const opt of opts) {\r\n if (!/^0x[a-fA-F0-9]{40}$/.test(opt.tokenAddress)) {\r\n throw new Error('tokenAddress must be a valid Ethereum address');\r\n }\r\n if (opt.minBalance !== undefined && !/^[0-9]+$/.test(opt.minBalance)) {\r\n throw new Error('minBalance must be a numeric string (wei)');\r\n }\r\n }\r\n return new FilterExpression({\r\n cachedTokenHolders: opts.map((o) => ({\r\n tokenAddress: o.tokenAddress,\r\n chainId: o.chainId,\r\n ...(o.minBalance !== undefined ? { minBalance: o.minBalance } : {}),\r\n })),\r\n });\r\n }\r\n\r\n /**\r\n * Filter users who have configured specific signal tokens\r\n * @param tokenAddresses - Array of token contract addresses (max 20)\r\n */\r\n static signalTokens(tokenAddresses: string[]): FilterExpression {\r\n if (tokenAddresses.length === 0) {\r\n throw new Error('signalTokens requires at least one token address');\r\n }\r\n if (tokenAddresses.length > 20) {\r\n throw new Error('signalTokens cannot exceed 20 tokens');\r\n }\r\n for (const addr of tokenAddresses) {\r\n if (!/^0x[a-fA-F0-9]{40}$/.test(addr)) {\r\n throw new Error('tokenAddress must be a valid Ethereum address');\r\n }\r\n }\r\n return new FilterExpression({ signalTokens: tokenAddresses });\r\n }\r\n\r\n /**\r\n * Filter users with a wallet on a specific chain\r\n * @param chain - Blockchain chain\r\n */\r\n static walletChain(chain: WalletChain): FilterExpression {\r\n return new FilterExpression({ walletChain: chain });\r\n }\r\n\r\n /**\r\n * Filter users who have a Base chain wallet\r\n */\r\n static hasBaseWallet(): FilterExpression {\r\n return new FilterExpression({ hasBaseWallet: true });\r\n }\r\n\r\n /**\r\n * Filter users who have a verified wallet\r\n */\r\n static hasVerifiedWallet(): FilterExpression {\r\n return new FilterExpression({ hasVerifiedWallet: true });\r\n }\r\n\r\n // ===========================================================================\r\n // Verification Filters\r\n // ===========================================================================\r\n\r\n /**\r\n * Filter to only verified users\r\n */\r\n static verifiedOnly(): FilterExpression {\r\n return new FilterExpression({ verifiedOnly: true });\r\n }\r\n\r\n /**\r\n * Filter to only users with Pro subscription\r\n */\r\n static proSubscriptionRequired(): FilterExpression {\r\n return new FilterExpression({ proSubscriptionRequired: true });\r\n }\r\n\r\n /**\r\n * Filter users with minimum account tenure\r\n * @param days - Minimum number of days since account creation\r\n */\r\n static minTenureDays(days: number): FilterExpression {\r\n if (days < 0) {\r\n throw new Error('minTenureDays must be >= 0');\r\n }\r\n return new FilterExpression({ minTenureDays: days });\r\n }\r\n\r\n // ===========================================================================\r\n // User ID Filters\r\n // ===========================================================================\r\n\r\n /**\r\n * Filter by specific user ID\r\n * @param id - User ID\r\n */\r\n static userId(id: string): FilterExpression {\r\n return new FilterExpression({ userId: id });\r\n }\r\n\r\n /**\r\n * Filter by multiple user IDs\r\n * @param ids - Array of user IDs (max 1000)\r\n */\r\n static userIds(ids: string[]): FilterExpression {\r\n if (ids.length === 0) {\r\n throw new Error('userIds requires at least one ID');\r\n }\r\n if (ids.length > 1000) {\r\n throw new Error('userIds cannot exceed 1000 IDs');\r\n }\r\n return new FilterExpression({ userIds: ids });\r\n }\r\n\r\n /**\r\n * Filter by specific Farcaster ID\r\n * @param fid - Farcaster ID\r\n */\r\n static fid(fid: number): FilterExpression {\r\n return new FilterExpression({ fid });\r\n }\r\n\r\n /**\r\n * Filter by multiple Farcaster IDs\r\n * @param fids - Array of Farcaster IDs (max 1000)\r\n */\r\n static fids(fids: number[]): FilterExpression {\r\n if (fids.length === 0) {\r\n throw new Error('fids requires at least one FID');\r\n }\r\n if (fids.length > 1000) {\r\n throw new Error('fids cannot exceed 1000 FIDs');\r\n }\r\n return new FilterExpression({ fids });\r\n }\r\n\r\n // ===========================================================================\r\n // Tag Filters\r\n // ===========================================================================\r\n\r\n /**\r\n * Filter users with a specific tag\r\n * @param tag - Tag name (max 64 chars)\r\n */\r\n static hasTag(tag: string): FilterExpression {\r\n if (tag.length > 64) {\r\n throw new Error('Tag must be 64 characters or less');\r\n }\r\n return new FilterExpression({ hasTag: tag });\r\n }\r\n\r\n /**\r\n * Filter users with any of the specified tags\r\n * @param tags - Array of tag names (1-20 tags)\r\n */\r\n static hasAnyTag(tags: string[]): FilterExpression {\r\n if (tags.length === 0 || tags.length > 20) {\r\n throw new Error('hasAnyTag requires 1-20 tags');\r\n }\r\n return new FilterExpression({ hasAnyTag: tags });\r\n }\r\n\r\n /**\r\n * Filter users with all of the specified tags\r\n * @param tags - Array of tag names (1-20 tags)\r\n */\r\n static hasAllTags(tags: string[]): FilterExpression {\r\n if (tags.length === 0 || tags.length > 20) {\r\n throw new Error('hasAllTags requires 1-20 tags');\r\n }\r\n return new FilterExpression({ hasAllTags: tags });\r\n }\r\n\r\n // ===========================================================================\r\n // Time-based Filters\r\n // ===========================================================================\r\n\r\n /**\r\n * Filter users created after a specific date\r\n * @param date - Date or ISO 8601 string\r\n */\r\n static createdAfter(date: Date | string): FilterExpression {\r\n const isoString = date instanceof Date ? date.toISOString() : date;\r\n return new FilterExpression({ createdAfter: isoString });\r\n }\r\n\r\n /**\r\n * Filter users created before a specific date\r\n * @param date - Date or ISO 8601 string\r\n */\r\n static createdBefore(date: Date | string): FilterExpression {\r\n const isoString = date instanceof Date ? date.toISOString() : date;\r\n return new FilterExpression({ createdBefore: isoString });\r\n }\r\n\r\n /**\r\n * Filter users who were last active after a specific date\r\n * @param date - Date or ISO 8601 string\r\n */\r\n static lastActiveAfter(date: Date | string): FilterExpression {\r\n const isoString = date instanceof Date ? date.toISOString() : date;\r\n return new FilterExpression({ lastActiveAfter: isoString });\r\n }\r\n\r\n // ===========================================================================\r\n // Reward/Quest Filters\r\n // ===========================================================================\r\n\r\n /**\r\n * Filter users who completed a specific reward\r\n * @param rewardId - Reward ID\r\n */\r\n static completedReward(rewardId: string): FilterExpression {\r\n return new FilterExpression({ completedReward: rewardId });\r\n }\r\n\r\n /**\r\n * Filter users who have NOT completed a specific reward\r\n * @param rewardId - Reward ID\r\n */\r\n static notCompletedReward(rewardId: string): FilterExpression {\r\n return new FilterExpression({ notCompletedReward: rewardId });\r\n }\r\n\r\n /**\r\n * Filter users who completed a specific quest\r\n * @param questId - Quest ID\r\n */\r\n static completedQuest(questId: string): FilterExpression {\r\n return new FilterExpression({ completedQuest: questId });\r\n }\r\n\r\n /**\r\n * Filter users who have a specific achievement\r\n * @param achievementId - Achievement ID\r\n */\r\n static hasAchievement(achievementId: string): FilterExpression {\r\n return new FilterExpression({ hasAchievement: achievementId });\r\n }\r\n\r\n // ===========================================================================\r\n // Geography Filters\r\n // ===========================================================================\r\n\r\n /**\r\n * Filter users by timezone\r\n * @param zones - Array of timezone options with UTC offset and optional range (max 24)\r\n */\r\n static timezones(zones: TimezoneOptions[]): FilterExpression {\r\n if (zones.length === 0) {\r\n throw new Error('timezones requires at least one timezone');\r\n }\r\n if (zones.length > 24) {\r\n throw new Error('timezones cannot exceed 24 entries');\r\n }\r\n for (const zone of zones) {\r\n if (zone.offset < -12 || zone.offset > 14) {\r\n throw new Error('timezone offset must be between -12 and 14');\r\n }\r\n if (zone.range !== undefined && (zone.range < 0 || zone.range > 12)) {\r\n throw new Error('timezone range must be between 0 and 12');\r\n }\r\n }\r\n return new FilterExpression({ timezones: zones });\r\n }\r\n\r\n /**\r\n * Filter users by country (ISO 3166-1 alpha-2 codes)\r\n * @param codes - Array of ISO 3166-1 alpha-2 country codes (e.g., ['US', 'CA', 'GB'])\r\n */\r\n static countries(codes: string[]): FilterExpression {\r\n if (codes.length === 0) {\r\n throw new Error('countries requires at least one country code');\r\n }\r\n if (codes.length > 50) {\r\n throw new Error('countries cannot exceed 50 country codes');\r\n }\r\n for (const code of codes) {\r\n if (!/^[A-Z]{2}$/.test(code)) {\r\n throw new Error('Country codes must be ISO 3166-1 alpha-2 format (e.g., US, CA, GB)');\r\n }\r\n }\r\n // Convert to backend format: [{code: 'US'}, {code: 'CA'}]\r\n return new FilterExpression({ countries: codes.map(code => ({ code })) });\r\n }\r\n\r\n // ===========================================================================\r\n // Engagement & Quality Filters\r\n // ===========================================================================\r\n\r\n /**\r\n * Filter users with quotient score >= minimum\r\n * @param score - Minimum quotient score (0-1, where 0.5=Casual, 0.75=Influential, 0.9=Exceptional)\r\n */\r\n static quotientScoreMin(score: number): FilterExpression {\r\n if (score < 0 || score > 1) {\r\n throw new Error('quotientScoreMin must be between 0 and 1');\r\n }\r\n return new FilterExpression({ quotientScoreMin: score });\r\n }\r\n\r\n /**\r\n * Filter users with quotient score <= maximum\r\n * @param score - Maximum quotient score (0-1)\r\n */\r\n static quotientScoreMax(score: number): FilterExpression {\r\n if (score < 0 || score > 1) {\r\n throw new Error('quotientScoreMax must be between 0 and 1');\r\n }\r\n return new FilterExpression({ quotientScoreMax: score });\r\n }\r\n\r\n /**\r\n * Filter users with quotient score in a range\r\n * @param min - Minimum score (0-1, optional)\r\n * @param max - Maximum score (0-1, optional)\r\n */\r\n static quotientScoreRange(min?: number, max?: number): FilterExpression {\r\n if (min !== undefined && (min < 0 || min > 1)) {\r\n throw new Error('quotientScoreRange min must be between 0 and 1');\r\n }\r\n if (max !== undefined && (max < 0 || max > 1)) {\r\n throw new Error('quotientScoreRange max must be between 0 and 1');\r\n }\r\n const range: { min?: number; max?: number } = {};\r\n if (min !== undefined) range.min = min;\r\n if (max !== undefined) range.max = max;\r\n return new FilterExpression({ quotientScoreRange: range });\r\n }\r\n\r\n /**\r\n * Filter users with minimum battery percentage\r\n * @param pct - Minimum battery percentage (0-100)\r\n */\r\n static minBatteryPercentage(pct: number): FilterExpression {\r\n if (pct < 0 || pct > 100) {\r\n throw new Error('minBatteryPercentage must be between 0 and 100');\r\n }\r\n return new FilterExpression({ minBatteryPercentage: pct });\r\n }\r\n\r\n /**\r\n * Filter users who have recharged their battery within the last N days\r\n * @param days - Number of days\r\n */\r\n static hasRechargedInLastDays(days: number): FilterExpression {\r\n if (days < 1) {\r\n throw new Error('hasRechargedInLastDays must be >= 1');\r\n }\r\n return new FilterExpression({ hasRechargedInLastDays: days });\r\n }\r\n\r\n /**\r\n * Exclude users who have already been pinged today\r\n */\r\n static excludePingedToday(): FilterExpression {\r\n return new FilterExpression({ excludePingedToday: true });\r\n }\r\n\r\n // ===========================================================================\r\n // Opt-In Filters\r\n // ===========================================================================\r\n\r\n /**\r\n * Filter to only users who have opted into lottery rewards\r\n */\r\n static requireLotteryOptIn(): FilterExpression {\r\n return new FilterExpression({ requireLotteryOptIn: true });\r\n }\r\n\r\n /**\r\n * Filter to only users who have opted into quiz rewards\r\n */\r\n static requireQuizOptIn(): FilterExpression {\r\n return new FilterExpression({ requireQuizOptIn: true });\r\n }\r\n\r\n // ===========================================================================\r\n // Activity Count Filters\r\n // ===========================================================================\r\n\r\n /**\r\n * Filter users with minimum cast count\r\n * @param count - Minimum number of casts\r\n */\r\n static minCastCount(count: number): FilterExpression {\r\n if (count < 0) {\r\n throw new Error('minCastCount must be >= 0');\r\n }\r\n return new FilterExpression({ minCastCount: count });\r\n }\r\n\r\n // ===========================================================================\r\n // Ordering & Pagination\r\n // ===========================================================================\r\n\r\n /**\r\n * Set the order for results\r\n * @param order - Order option for sorting results\r\n */\r\n static orderBy(order: OrderByOption): FilterExpression {\r\n return new FilterExpression({ orderBy: order });\r\n }\r\n\r\n /**\r\n * Limit the number of results\r\n * @param n - Maximum number of results\r\n * @deprecated Limit is controlled by budgetCap, not this filter. This method will be removed.\r\n */\r\n static limit(n: number): FilterExpression {\r\n console.warn('FilterBuilder.limit() is deprecated. Use budgetCap to control result count.');\r\n if (n < 1 || n > 10000) {\r\n throw new Error('limit must be between 1 and 10000');\r\n }\r\n return new FilterExpression({ limit: n });\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// Default Export\r\n// =============================================================================\r\n\r\nexport default FilterBuilder;\r\n","import { z } from 'zod';\r\nimport { NetworkSchema, TokenTypeSchema } from './draft.schema.js';\r\n\r\n/**\r\n * Gas tier options\r\n */\r\nexport const GasTierSchema = z.enum(['slow', 'standard', 'fast']);\r\n\r\n/**\r\n * Quote options schema\r\n */\r\nexport const QuoteOptionsSchema = z.object({\r\n draftId: z.string().uuid(),\r\n amount: z.string().regex(/^\\d+(\\.\\d+)?$/).optional(),\r\n gasTier: GasTierSchema.optional(),\r\n slippageTolerance: z.number().min(0).max(1).optional(),\r\n});\r\n\r\n/**\r\n * Quote recipient schema\r\n */\r\nexport const QuoteRecipientSchema = z.object({\r\n address: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid Ethereum address'),\r\n amount: z.string(),\r\n share: z.number().min(0).max(1),\r\n});\r\n\r\n/**\r\n * Quote schema\r\n */\r\nexport const QuoteSchema = z.object({\r\n id: z.string().uuid(),\r\n draftId: z.string().uuid(),\r\n totalAmount: z.string(),\r\n estimatedGas: z.string(),\r\n gasPrice: z.string(),\r\n networkFee: z.string(),\r\n platformFee: z.string(),\r\n totalCost: z.string(),\r\n token: TokenTypeSchema,\r\n network: NetworkSchema,\r\n recipients: z.array(QuoteRecipientSchema),\r\n recipientCount: z.number().int().positive(),\r\n expiresAt: z.string().datetime(),\r\n createdAt: z.string().datetime(),\r\n isValid: z.boolean(),\r\n});\r\n\r\n/**\r\n * Confirm result schema\r\n */\r\nexport const ConfirmResultSchema = z.object({\r\n valid: z.boolean(),\r\n invalidReason: z.string().optional(),\r\n currentGasEstimate: z.string(),\r\n priceChange: z.string(),\r\n canExecute: z.boolean(),\r\n});\r\n\r\n/**\r\n * Execute result status\r\n */\r\nexport const ExecuteStatusSchema = z.enum(['pending', 'confirmed', 'failed']);\r\n\r\n/**\r\n * Execute result schema\r\n */\r\nexport const ExecuteResultSchema = z.object({\r\n id: z.string().uuid(),\r\n quoteId: z.string().uuid(),\r\n transactionHash: z.string().regex(/^0x[a-fA-F0-9]{64}$/),\r\n status: ExecuteStatusSchema,\r\n blockNumber: z.number().int().positive().optional(),\r\n initiatedAt: z.string().datetime(),\r\n confirmedAt: z.string().datetime().optional(),\r\n confirmations: z.number().int().min(0),\r\n receiptId: z.string().uuid().optional(),\r\n});\r\n\r\n/**\r\n * Validate quote options\r\n */\r\nexport function validateQuoteOptions(options: unknown) {\r\n return QuoteOptionsSchema.safeParse(options);\r\n}\r\n\r\n/**\r\n * Parse quote options\r\n */\r\nexport function parseQuoteOptions(options: unknown) {\r\n return QuoteOptionsSchema.parse(options);\r\n}\r\n\r\n/**\r\n * Validate quote response\r\n */\r\nexport function validateQuote(quote: unknown) {\r\n return QuoteSchema.safeParse(quote);\r\n}\r\n\r\n/**\r\n * Parse quote response\r\n */\r\nexport function parseQuote(quote: unknown) {\r\n return QuoteSchema.parse(quote);\r\n}\r\n\r\n/**\r\n * Validate execute result\r\n */\r\nexport function validateExecuteResult(result: unknown) {\r\n return ExecuteResultSchema.safeParse(result);\r\n}\r\n\r\n/**\r\n * Parse execute result\r\n */\r\nexport function parseExecuteResult(result: unknown) {\r\n return ExecuteResultSchema.parse(result);\r\n}\r\n\r\n// Type exports\r\nexport type QuoteOptionsSchemaType = z.infer<typeof QuoteOptionsSchema>;\r\nexport type QuoteSchemaType = z.infer<typeof QuoteSchema>;\r\nexport type ExecuteResultSchemaType = z.infer<typeof ExecuteResultSchema>;\r\nexport type ConfirmResultSchemaType = z.infer<typeof ConfirmResultSchema>;\r\n","import { z } from 'zod';\r\nimport { NetworkSchema, TokenTypeSchema } from './draft.schema.js';\r\n\r\n/**\r\n * Transfer status\r\n */\r\nexport const TransferStatusSchema = z.enum(['success', 'failed']);\r\n\r\n/**\r\n * Receipt transfer schema\r\n */\r\nexport const ReceiptTransferSchema = z.object({\r\n recipient: z.string().regex(/^0x[a-fA-F0-9]{40}$/),\r\n amount: z.string(),\r\n status: TransferStatusSchema,\r\n logIndex: z.number().int().min(0),\r\n});\r\n\r\n/**\r\n * Receipt schema\r\n */\r\nexport const ReceiptSchema = z.object({\r\n id: z.string().uuid(),\r\n executionId: z.string().uuid(),\r\n quoteId: z.string().uuid(),\r\n draftId: z.string().uuid(),\r\n transactionHash: z.string().regex(/^0x[a-fA-F0-9]{64}$/),\r\n blockNumber: z.number().int().positive(),\r\n blockTimestamp: z.string().datetime(),\r\n network: NetworkSchema,\r\n token: TokenTypeSchema,\r\n totalAmount: z.string(),\r\n gasUsed: z.string(),\r\n gasPrice: z.string(),\r\n gasCost: z.string(),\r\n transfers: z.array(ReceiptTransferSchema),\r\n successfulTransfers: z.number().int().min(0),\r\n failedTransfers: z.number().int().min(0),\r\n createdAt: z.string().datetime(),\r\n});\r\n\r\n/**\r\n * Validate receipt response\r\n */\r\nexport function validateReceipt(receipt: unknown) {\r\n return ReceiptSchema.safeParse(receipt);\r\n}\r\n\r\n/**\r\n * Parse receipt response\r\n */\r\nexport function parseReceipt(receipt: unknown) {\r\n return ReceiptSchema.parse(receipt);\r\n}\r\n\r\n// Type exports\r\nexport type ReceiptSchemaType = z.infer<typeof ReceiptSchema>;\r\nexport type ReceiptTransferSchemaType = z.infer<typeof ReceiptTransferSchema>;\r\n"]}