@compass-labs/widgets 0.1.38 → 0.1.39

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/handler.ts"],"names":["mainnet","base","arbitrum","CompassApiSDK","privateKeyToAccount","createWalletClient","http","createPublicClient"],"mappings":"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","file":"index.js","sourcesContent":["import { CompassApiSDK } from '@compass-labs/api-sdk';\nimport {\n createWalletClient,\n createPublicClient,\n http,\n type Chain,\n type Hex,\n} from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { mainnet, base, arbitrum } from 'viem/chains';\n\nconst CHAIN_MAP: Record<string, Chain> = {\n ethereum: mainnet,\n base: base,\n arbitrum: arbitrum,\n};\n\nexport interface CompassHandlerConfig {\n /** Compass API key - keep this in environment variables */\n apiKey: string;\n /** Optional custom API server URL */\n serverUrl?: string;\n /** Gas sponsor private key (required for executing gas-sponsored transactions) */\n gasSponsorPrivateKey?: string;\n /** RPC URLs per chain (required for executing gas-sponsored transactions) */\n rpcUrls?: {\n ethereum?: string;\n base?: string;\n arbitrum?: string;\n };\n}\n\nexport interface CompassRouteContext {\n params: Promise<{ path: string[] }>;\n}\n\ntype NextRequest = Request;\n\n/**\n * Creates a Next.js API route handler for Compass widget operations.\n *\n * This handler proxies requests from client-side widgets to the Compass API,\n * keeping your API key secure on the server.\n *\n * @example\n * ```typescript\n * // app/api/compass/[...path]/route.ts\n * import { createCompassHandler } from '@compass-labs/widgets/server';\n *\n * const handler = createCompassHandler({\n * apiKey: process.env.COMPASS_API_KEY!,\n * gasSponsorPrivateKey: process.env.GAS_SPONSOR_PK,\n * rpcUrls: {\n * ethereum: process.env.ETHEREUM_MAINNET_RPC_URL,\n * base: process.env.BASE_MAINNET_RPC_URL,\n * arbitrum: process.env.ARBITRUM_MAINNET_RPC_URL,\n * },\n * });\n *\n * export const GET = handler;\n * export const POST = handler;\n * ```\n *\n * The handler supports these routes:\n * - GET /api/compass/earn-account/check?owner=0x...&chain=base\n * - POST /api/compass/create-account\n * - POST /api/compass/deposit/prepare\n * - POST /api/compass/deposit/execute\n * - POST /api/compass/withdraw/prepare\n * - POST /api/compass/withdraw/execute\n */\nexport function createCompassHandler(config: CompassHandlerConfig) {\n const { apiKey, serverUrl = 'https://api.compasslabs.ai' } = config;\n\n // Create SDK client\n const client = new CompassApiSDK({\n apiKeyAuth: apiKey,\n serverURL: serverUrl,\n });\n\n return async function handler(\n request: NextRequest,\n context: CompassRouteContext\n ): Promise<Response> {\n try {\n const { path } = await context.params;\n const route = path.join('/');\n const method = request.method;\n\n // Handle GET requests\n if (method === 'GET') {\n const url = new URL(request.url);\n const searchParams = Object.fromEntries(url.searchParams.entries());\n\n switch (route) {\n case 'earn-account/check':\n return await handleEarnAccountCheck(client, searchParams);\n case 'earn-account/balances':\n return await handleEarnAccountBalances(client, searchParams);\n case 'swap/quote':\n return await handleSwapQuote(client, searchParams);\n case 'token/balance':\n return await handleTokenBalance(client, searchParams);\n case 'token/prices':\n return await handleTokenPrices(client, searchParams);\n case 'vaults':\n return await handleVaults(client, searchParams);\n case 'aave/markets':\n return await handleAaveMarkets(client, searchParams);\n case 'pendle/markets':\n return await handlePendleMarkets(client, searchParams);\n case 'positions':\n return await handlePositions(client, searchParams);\n case 'credit-account/check':\n return await handleCreditAccountCheck(client, searchParams);\n case 'credit/positions':\n return await handleCreditPositions(client, searchParams);\n case 'credit/balances':\n return await handleCreditBalances(client, searchParams);\n case 'tx/receipt':\n return await handleTxReceipt(searchParams, config);\n default:\n return jsonResponse({ error: `Unknown GET route: ${route}` }, 404);\n }\n }\n\n // Handle POST requests\n if (method === 'POST') {\n const body = await request.json();\n\n switch (route) {\n case 'create-account':\n return await handleCreateAccount(client, body, config);\n case 'deposit/prepare':\n return await handleManagePrepare(client, body, 'DEPOSIT');\n case 'deposit/execute':\n return await handleExecute(client, body, config);\n case 'withdraw/prepare':\n return await handleManagePrepare(client, body, 'WITHDRAW');\n case 'withdraw/execute':\n return await handleExecute(client, body, config);\n case 'transfer/approve':\n return await handleTransferApprove(client, body);\n case 'transfer/prepare':\n return await handleTransferPrepare(client, body, config);\n case 'transfer/execute':\n return await handleTransferExecute(client, body, config);\n case 'bundle/prepare':\n return await handleBundlePrepare(client, body);\n case 'bundle/execute':\n return await handleBundleExecute(client, body, config);\n case 'swap/prepare':\n return await handleSwapPrepare(client, body);\n case 'swap/execute':\n return await handleSwapExecute(client, body, config);\n case 'rebalance/preview':\n return await handleRebalancePreview(client, body, config);\n case 'credit-account/create':\n return await handleCreditCreateAccount(client, body, config);\n case 'credit/bundle/prepare':\n return await handleCreditBundlePrepare(client, body);\n case 'credit/bundle/execute':\n return await handleCreditExecute(client, body, config);\n case 'credit/transfer':\n return await handleCreditTransfer(client, body);\n case 'approval/execute':\n return await handleApprovalExecute(body, config);\n default:\n return jsonResponse({ error: `Unknown POST route: ${route}` }, 404);\n }\n }\n\n return jsonResponse({ error: `Method ${method} not allowed` }, 405);\n } catch (error) {\n const { message, status } = extractErrorMessage(error);\n return jsonResponse({ error: message }, status);\n }\n };\n}\n\n/**\n * Extracts a user-friendly error message from SDK/API errors.\n * SDK errors contain verbose technical data (Zod dumps, full HTTP bodies) that\n * should never be shown to end-users.\n */\nfunction extractErrorMessage(error: unknown): { message: string; status: number } {\n if (!(error instanceof Error)) {\n return { message: 'Something went wrong. Please try again.', status: 500 };\n }\n\n const raw = error.message || '';\n\n // SDK's CompassAPISDKError and subclasses embed a JSON body in the message.\n // Try to extract the API's own \"detail\" / \"error\" / \"description\" from it.\n const jsonMatch = raw.match(/Body:\\s*(\\{[\\s\\S]*\\})/);\n if (jsonMatch) {\n try {\n const body = JSON.parse(jsonMatch[1]);\n // FastAPI validation error → detail is an array of {msg, loc, type}\n if (Array.isArray(body.detail)) {\n const msgs = body.detail.map((d: any) => d.msg || d.message).filter(Boolean);\n if (msgs.length > 0) return { message: msgs.join('. '), status: 422 };\n }\n // Single-string detail (e.g. \"Insufficient USDC balance\")\n if (typeof body.detail === 'string') return { message: body.detail, status: 422 };\n if (typeof body.error === 'string') return { message: body.error, status: 500 };\n if (typeof body.description === 'string') return { message: body.description, status: 500 };\n } catch {\n // JSON parse failed — fall through\n }\n }\n\n // SDKValidationError (Zod) — replace with generic message\n if (error.name === 'SDKValidationError' || raw.startsWith('Input validation failed')) {\n return { message: 'Invalid request data. Please check your inputs and try again.', status: 400 };\n }\n\n // Known user-facing patterns — pass through as-is\n if (\n raw.includes('Insufficient') ||\n raw.includes('not deployed') ||\n raw.includes('reverted') ||\n raw.includes('not configured') ||\n raw.includes('Unsupported chain')\n ) {\n return { message: raw, status: 500 };\n }\n\n // Fallback — avoid leaking raw SDK internals\n return { message: 'Something went wrong. Please try again.', status: 500 };\n}\n\nfunction jsonResponse(data: unknown, status = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n}\n\n// --- Earn Account Handlers ---\n\ninterface EarnAccountCheckParams {\n owner?: string;\n chain?: string;\n}\n\nasync function handleEarnAccountCheck(\n client: CompassApiSDK,\n params: EarnAccountCheckParams\n): Promise<Response> {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n // Use the SDK's earnCreateAccount method to check if account exists\n // - If response has `transaction` field → account doesn't exist yet\n // - If response has no `transaction` field → account already exists\n const response = await client.earn.earnCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: owner as `0x${string}`,\n estimateGas: false,\n });\n\n const earnAccountAddress = response.earnAccountAddress;\n const hasTransaction = !!response.transaction;\n\n return jsonResponse({\n earnAccountAddress,\n isDeployed: !hasTransaction,\n needsCreation: hasTransaction,\n });\n}\n\ninterface CreateAccountBody {\n owner: string;\n chain?: string;\n}\n\nasync function handleCreateAccount(\n client: CompassApiSDK,\n body: CreateAccountBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base' } = body;\n const { gasSponsorPrivateKey, rpcUrls } = config;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n if (!gasSponsorPrivateKey) {\n return jsonResponse(\n { error: 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.' },\n 500\n );\n }\n\n // Get chain config\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 500);\n }\n\n // Get RPC URL for the chain\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n return jsonResponse({ error: `No RPC URL configured for chain: ${chain}` }, 500);\n }\n\n // Create sponsor account from private key\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n // Create wallet client for signing/sending transactions\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n // Create public client for waiting on receipts\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n // Get create account transaction from API with sponsor as sender\n const response = await client.earn.earnCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: sponsorAccount.address,\n estimateGas: false,\n });\n\n const earnAccountAddress = response.earnAccountAddress;\n\n // If no transaction needed (account may already exist)\n if (!response.transaction) {\n return jsonResponse({\n earnAccountAddress,\n success: true,\n alreadyExists: true,\n });\n }\n\n // Send the transaction from the sponsor wallet\n const transaction = response.transaction;\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n // Wait for the transaction receipt\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n // Check if transaction reverted\n if (receipt.status === 'reverted') {\n return jsonResponse({ error: 'Account creation transaction reverted' }, 500);\n }\n\n return jsonResponse({\n earnAccountAddress,\n txHash,\n success: true,\n });\n}\n\n// --- Manage (Deposit/Withdraw) Handlers ---\n\ninterface ManagePrepareBody {\n amount: string;\n token: string;\n owner: string;\n chain: string;\n venueType: 'VAULT' | 'AAVE' | 'PENDLE_PT';\n vaultAddress?: string;\n marketAddress?: string;\n maxSlippagePercent?: number;\n}\n\ntype ManageAction = 'DEPOSIT' | 'WITHDRAW';\n\nasync function handleManagePrepare(\n client: CompassApiSDK,\n body: ManagePrepareBody,\n action: ManageAction\n): Promise<Response> {\n const { amount, token, owner, chain, venueType, vaultAddress, marketAddress, maxSlippagePercent } = body;\n\n // Build venue based on type\n let venue: any;\n\n if (venueType === 'VAULT' && vaultAddress) {\n venue = {\n type: 'VAULT' as const,\n vaultAddress,\n };\n } else if (venueType === 'AAVE') {\n venue = {\n type: 'AAVE' as const,\n token,\n };\n } else if (venueType === 'PENDLE_PT' && marketAddress) {\n venue = {\n type: 'PENDLE_PT' as const,\n marketAddress,\n token: action === 'DEPOSIT' ? token : undefined,\n maxSlippagePercent: maxSlippagePercent ?? 1.0,\n };\n } else {\n return jsonResponse({ error: 'Invalid venue type or missing address' }, 400);\n }\n\n const response = await client.earn.earnManage({\n owner,\n chain: chain as any,\n venue,\n action,\n amount,\n gasSponsorship: true,\n });\n\n // Extract EIP-712 data for signing\n const eip712 = (response as any).eip712;\n if (!eip712) {\n return jsonResponse({ error: 'No EIP-712 data returned from API' }, 500);\n }\n\n // Normalize types for wallet signing\n // SDK returns camelCase keys (safeTx, eip712Domain) but wallets expect PascalCase (SafeTx)\n // to match the primaryType\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain,\n SafeTx: types.safeTx,\n };\n\n return jsonResponse({\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n });\n}\n\n// --- Execute Handler (shared for deposit/withdraw) ---\n\ninterface ExecuteBody {\n owner: string;\n eip712: any;\n signature: string;\n chain: string;\n}\n\nasync function handleExecute(\n client: CompassApiSDK,\n body: ExecuteBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, eip712, signature, chain } = body;\n const { gasSponsorPrivateKey, rpcUrls } = config;\n\n // Validate gas sponsor config\n if (!gasSponsorPrivateKey) {\n return jsonResponse(\n { error: 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.' },\n 500\n );\n }\n\n // Get chain config\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 500);\n }\n\n // Get RPC URL for the chain\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n return jsonResponse({ error: `No RPC URL configured for chain: ${chain}` }, 500);\n }\n\n // Create sponsor account from private key\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n // Create wallet client for signing/sending transactions\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n // Call gas sponsorship prepare with sponsor as sender\n const response = await client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signature,\n });\n\n // Extract the unsigned transaction from the response\n const transaction = (response as any).transaction;\n if (!transaction) {\n return jsonResponse(\n { error: 'No transaction returned from gas sponsorship prepare' },\n 500\n );\n }\n\n // Send the transaction from the sponsor wallet\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n // Return txHash immediately — client polls /tx/receipt for confirmation\n return jsonResponse({ txHash, success: true });\n}\n\n// --- Transfer Handlers ---\n\ninterface TransferApproveBody {\n owner: string;\n chain?: string;\n token: string;\n}\n\nasync function handleTransferApprove(\n client: CompassApiSDK,\n body: TransferApproveBody\n): Promise<Response> {\n const { owner, chain = 'base', token } = body;\n\n if (!owner || !token) {\n return jsonResponse({ error: 'Missing owner or token parameter' }, 400);\n }\n\n try {\n // Call gas sponsorship approve transfer endpoint\n const response = await client.gasSponsorship.gasSponsorshipApproveTransfer({\n owner: owner as `0x${string}`,\n chain: chain as any,\n token,\n gasSponsorship: true,\n });\n\n // If no EIP-712 data, approval not needed (already approved or using transaction)\n // Note: API might return snake_case (eip_712) or camelCase (eip712)\n const eip712 = (response as any).eip712 || (response as any).eip_712;\n const transaction = (response as any).transaction;\n\n if (!eip712 && !transaction) {\n return jsonResponse({\n approved: true,\n message: 'Token already approved for Permit2',\n });\n }\n\n if (eip712) {\n // Normalize types for wallet signing\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n Permit: types.permit || types.Permit,\n };\n\n return jsonResponse({\n approved: false,\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n });\n }\n\n // Transaction-based approval (for non-EIP2612 tokens)\n return jsonResponse({\n approved: false,\n transaction,\n requiresTransaction: true,\n });\n } catch (error) {\n // Check if error is \"already set\" - treat as approved\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes('already set') || errorMessage.includes('already been set')) {\n return jsonResponse({\n approved: true,\n message: 'Token allowance already set',\n });\n }\n throw error;\n }\n}\n\ninterface ApprovalExecuteBody {\n owner: string;\n chain?: string;\n transaction: any;\n}\n\nasync function handleApprovalExecute(\n body: ApprovalExecuteBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base', transaction } = body;\n const { gasSponsorPrivateKey, rpcUrls } = config;\n\n if (!owner || !transaction) {\n return jsonResponse({ error: 'Missing required parameters (owner, transaction)' }, 400);\n }\n\n if (!gasSponsorPrivateKey) {\n return jsonResponse(\n { error: 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.' },\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n return jsonResponse({ error: `No RPC URL configured for chain: ${chain}` }, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n timeout: 60_000,\n });\n\n if (receipt.status === 'reverted') {\n return jsonResponse({ error: 'Approval transaction reverted' }, 500);\n }\n\n return jsonResponse({ txHash, status: 'success' });\n}\n\ninterface TransferPrepareBody {\n owner: string;\n chain?: string;\n token: string;\n amount: string;\n action: 'DEPOSIT' | 'WITHDRAW';\n product?: 'earn' | 'credit';\n}\n\nasync function handleTransferPrepare(\n client: CompassApiSDK,\n body: TransferPrepareBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base', token, amount, action, product } = body;\n const { gasSponsorPrivateKey } = config;\n\n if (!owner || !token || !amount || !action) {\n return jsonResponse({ error: 'Missing required parameters' }, 400);\n }\n\n // For deposits with gas sponsorship, we need to pass the gas sponsor address as the spender\n // because Permit2 requires msg.sender to match the spender in the signature\n let spender: string | undefined;\n if (action === 'DEPOSIT' && gasSponsorPrivateKey) {\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n spender = sponsorAccount.address;\n }\n\n let response: any;\n if (product === 'credit') {\n response = await client.credit.creditTransfer({\n owner,\n chain: chain as any,\n token,\n amount,\n action,\n gasSponsorship: true,\n ...(spender && { spender }),\n } as any);\n } else {\n response = await client.earn.earnTransfer({\n owner: owner as `0x${string}`,\n chain: chain as any,\n token,\n amount,\n action,\n gasSponsorship: true,\n ...(spender && { spender }),\n } as any);\n }\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n return jsonResponse({ error: 'No EIP-712 data returned from API' }, 500);\n }\n\n // Normalize types based on action\n const types = eip712.types as any;\n let normalizedTypes: Record<string, any>;\n\n if (action === 'DEPOSIT') {\n // Permit2 PermitTransferFrom types\n normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n PermitTransferFrom: types.permitTransferFrom || types.PermitTransferFrom,\n TokenPermissions: types.tokenPermissions || types.TokenPermissions,\n };\n } else {\n // Safe transaction types\n normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n }\n\n return jsonResponse({\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n primaryType: eip712.primaryType,\n });\n}\n\ninterface TransferExecuteBody {\n owner: string;\n chain?: string;\n eip712: any;\n signature: string;\n product?: 'earn' | 'credit';\n}\n\nasync function handleTransferExecute(\n client: CompassApiSDK,\n body: TransferExecuteBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base', eip712, signature, product } = body;\n const { gasSponsorPrivateKey, rpcUrls } = config;\n\n if (!owner || !eip712 || !signature) {\n return jsonResponse({ error: 'Missing required parameters' }, 400);\n }\n\n if (!gasSponsorPrivateKey) {\n return jsonResponse(\n { error: 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.' },\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n return jsonResponse({ error: `No RPC URL configured for chain: ${chain}` }, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n // Call gas sponsorship prepare with sponsor as sender\n const response = await client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signature,\n ...(product === 'credit' && { product: 'credit' }),\n });\n\n const transaction = (response as any).transaction;\n if (!transaction) {\n return jsonResponse(\n { error: 'No transaction returned from gas sponsorship prepare' },\n 500\n );\n }\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n // Return txHash immediately — client polls /tx/receipt for confirmation\n return jsonResponse({ txHash, success: true });\n}\n\n// --- Earn Account Balances Handler ---\n\ninterface EarnAccountBalancesParams {\n owner?: string;\n chain?: string;\n}\n\ninterface TokenTransferData {\n from_address?: string;\n fromAddress?: string;\n to_address?: string;\n toAddress?: string;\n amount: string;\n amount_formatted?: string;\n amountFormatted?: string;\n block_number?: number;\n blockNumber?: number;\n block_timestamp?: string;\n blockTimestamp?: string;\n transaction_hash?: string;\n transactionHash?: string;\n direction: 'in' | 'out';\n}\n\ninterface TokenBalanceData {\n token_address?: string;\n tokenAddress?: string;\n token_symbol?: string;\n tokenSymbol?: string;\n token_decimals?: number;\n tokenDecimals?: number;\n balance: string;\n balance_formatted?: string;\n balanceFormatted?: string;\n usd_value?: string | null;\n usdValue?: string | null;\n transfers: TokenTransferData[];\n}\n\ninterface EarnBalancesApiResponse {\n earn_account_address?: string;\n earnAccountAddress?: string;\n balances: Record<string, TokenBalanceData>;\n total_usd_value?: string | null;\n totalUsdValue?: string | null;\n}\n\nasync function handleEarnAccountBalances(\n client: CompassApiSDK,\n params: EarnAccountBalancesParams\n): Promise<Response> {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n // Use SDK's earnBalances method to get all token balances\n const response = await client.earn.earnBalances({\n chain: chain as any,\n owner: owner as `0x${string}`,\n });\n\n const data = response as unknown as EarnBalancesApiResponse;\n\n // Transform to simplified format for the widget\n // Filter out tokens that only have mint/burn transfers (to/from zero address)\n const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\n const balances: Record<string, { balance: string; usdValue: string }> = {};\n\n for (const [symbol, tokenData] of Object.entries(data.balances)) {\n // Check if this token only has mint/burn transfers\n const hasRealTransfers = tokenData.transfers.some((t) => {\n const fromAddr = (t.from_address || t.fromAddress || '').toLowerCase();\n const toAddr = (t.to_address || t.toAddress || '').toLowerCase();\n return fromAddr !== ZERO_ADDRESS && toAddr !== ZERO_ADDRESS;\n });\n\n // Skip tokens with zero balance that only have mint/burn transfers\n const balanceFormatted = tokenData.balance_formatted || tokenData.balanceFormatted || '0';\n const balanceNum = parseFloat(balanceFormatted);\n if (balanceNum === 0 && !hasRealTransfers) {\n continue;\n }\n\n // Also skip tokens that have non-zero balance but ONLY mint/burn transfers\n // These are likely protocol internal tokens (aTokens, vault shares)\n if (!hasRealTransfers && tokenData.transfers.length > 0) {\n continue;\n }\n\n // Skip tokens with zero USD value\n const usdValue = tokenData.usd_value || tokenData.usdValue || '0';\n const usdValueNum = parseFloat(usdValue);\n if (usdValueNum === 0 || isNaN(usdValueNum)) {\n continue;\n }\n\n balances[symbol] = {\n balance: balanceFormatted,\n usdValue,\n };\n }\n\n const earnAccountAddr = data.earn_account_address || data.earnAccountAddress || '';\n const totalUsd = data.total_usd_value || data.totalUsdValue || '0';\n\n return jsonResponse({\n earnAccountAddress: earnAccountAddr,\n balances,\n totalUsdValue: totalUsd,\n });\n}\n\n// --- Swap Quote Handler ---\n\ninterface SwapQuoteParams {\n owner?: string;\n chain?: string;\n tokenIn?: string;\n tokenOut?: string;\n amountIn?: string;\n}\n\nasync function handleSwapQuote(\n client: CompassApiSDK,\n params: SwapQuoteParams\n): Promise<Response> {\n const { owner, chain = 'base', tokenIn, tokenOut, amountIn } = params;\n\n if (!owner || !tokenIn || !tokenOut || !amountIn) {\n return jsonResponse({ error: 'Missing required parameters: owner, tokenIn, tokenOut, amountIn' }, 400);\n }\n\n try {\n // Call the earn swap endpoint to get estimated_amount_out\n const response = await client.earn.earnSwap({\n owner: owner as `0x${string}`,\n chain: chain as any,\n tokenIn,\n tokenOut,\n amountIn,\n slippage: 1.0,\n gasSponsorship: true,\n });\n\n const estimatedAmountOut = (response as any).estimatedAmountOut || '0';\n\n return jsonResponse({\n tokenIn,\n tokenOut,\n amountIn,\n estimatedAmountOut: estimatedAmountOut?.toString() || '0',\n });\n } catch (error: any) {\n // Extract human-readable error message from API response\n let errorMessage = 'Failed to get swap quote';\n\n try {\n // Try to parse nested error messages from the API\n const bodyMessage = error?.body?.message || error?.message || '';\n\n // Check if the message contains JSON (API sometimes returns nested JSON errors)\n if (bodyMessage.includes('{')) {\n const jsonMatch = bodyMessage.match(/\\{.*\\}/s);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]);\n // Extract description or error field from nested JSON\n errorMessage = parsed.description || parsed.error || parsed.message || errorMessage;\n }\n } else if (bodyMessage) {\n // Check for \"Insufficient ... balance\" pattern\n const balanceMatch = bodyMessage.match(/Insufficient \\w+ balance[^.]+/i);\n if (balanceMatch) {\n errorMessage = balanceMatch[0];\n } else {\n errorMessage = bodyMessage;\n }\n }\n } catch {\n // If parsing fails, try to extract a simple message\n errorMessage = error?.body?.error || error?.message || 'Failed to get swap quote';\n }\n\n return jsonResponse({\n error: 'Swap quote failed',\n message: errorMessage,\n }, 400);\n }\n}\n\n// --- Swap Prepare Handler ---\n\ninterface SwapPrepareBody {\n owner: string;\n chain?: string;\n tokenIn: string;\n tokenOut: string;\n amountIn: string;\n slippage?: number;\n}\n\nasync function handleSwapPrepare(\n client: CompassApiSDK,\n body: SwapPrepareBody\n): Promise<Response> {\n const { owner, chain = 'base', tokenIn, tokenOut, amountIn, slippage = 1.0 } = body;\n\n if (!owner || !tokenIn || !tokenOut || !amountIn) {\n return jsonResponse({ error: 'Missing required parameters: owner, tokenIn, tokenOut, amountIn' }, 400);\n }\n\n try {\n const response = await client.earn.earnSwap({\n owner: owner as `0x${string}`,\n chain: chain as any,\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n gasSponsorship: true,\n });\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n return jsonResponse({ error: 'No EIP-712 data returned from API' }, 500);\n }\n\n // Normalize types for wallet signing\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return jsonResponse({\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n estimatedAmountOut: (response as any).estimatedAmountOut?.toString() || '0',\n });\n } catch (error) {\n return jsonResponse({\n error: error instanceof Error ? error.message : 'Failed to prepare swap'\n }, 500);\n }\n}\n\n// --- Swap Execute Handler ---\n\ninterface SwapExecuteBody {\n owner: string;\n chain?: string;\n eip712: any;\n signature: string;\n}\n\nasync function handleSwapExecute(\n client: CompassApiSDK,\n body: SwapExecuteBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base', eip712, signature } = body;\n\n if (!owner || !eip712 || !signature) {\n return jsonResponse({ error: 'Missing required parameters: owner, eip712, signature' }, 400);\n }\n\n if (!config.gasSponsorPrivateKey) {\n return jsonResponse({ error: 'Gas sponsor not configured' }, 500);\n }\n\n const rpcUrl = config.rpcUrls?.[chain as keyof typeof config.rpcUrls];\n if (!rpcUrl) {\n return jsonResponse({ error: `No RPC URL configured for chain: ${chain}` }, 500);\n }\n\n try {\n const viemChain = CHAIN_MAP[chain];\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 400);\n }\n\n const sponsorAccount = privateKeyToAccount(config.gasSponsorPrivateKey as `0x${string}`);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n // Call gas sponsorship prepare with sponsor as sender\n const response = await client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: sponsorAccount.address,\n eip712,\n signature,\n });\n\n const transaction = (response as any).transaction;\n if (!transaction) {\n return jsonResponse({ error: 'No transaction returned from gas sponsorship prepare' }, 500);\n }\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n return jsonResponse({ error: 'Transaction reverted' }, 500);\n }\n\n return jsonResponse({ txHash, success: true });\n } catch (error) {\n return jsonResponse({\n error: error instanceof Error ? error.message : 'Failed to execute swap'\n }, 500);\n }\n}\n\n// --- Token Balance Handler ---\n\ninterface TokenBalanceParams {\n chain?: string;\n token?: string;\n address?: string;\n}\n\nasync function handleTokenBalance(\n client: CompassApiSDK,\n params: TokenBalanceParams\n): Promise<Response> {\n const { chain = 'base', token, address } = params;\n\n if (!token || !address) {\n return jsonResponse({ error: 'Missing token or address parameter' }, 400);\n }\n\n try {\n const response = await client.token.tokenBalance({\n chain: chain as any,\n token,\n user: address,\n });\n\n return jsonResponse({\n token,\n address,\n balance: (response as any).amount || '0',\n balanceRaw: (response as any).balanceRaw || '0',\n });\n } catch (error) {\n return jsonResponse({\n token,\n address,\n balance: '0',\n balanceRaw: '0',\n });\n }\n}\n\nasync function handleTokenPrices(\n client: CompassApiSDK,\n params: Record<string, string>\n): Promise<Response> {\n const { chain = 'base', tokens } = params;\n\n if (!tokens) {\n return jsonResponse({ error: 'Missing tokens parameter' }, 400);\n }\n\n const tokenList = tokens.split(',').map((t) => t.trim().toUpperCase());\n const prices: Record<string, number> = {};\n\n const results = await Promise.allSettled(\n tokenList.map(async (symbol) => {\n const resp = await client.token.tokenPrice({ chain: chain as any, token: symbol });\n return { symbol, price: parseFloat((resp as any).price || '0') };\n })\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value.price > 0) {\n prices[result.value.symbol] = result.value.price;\n }\n }\n\n return jsonResponse({ prices });\n}\n\n// --- Bundle Handlers ---\n\ninterface BundleAction {\n actionType: string;\n [key: string]: any;\n}\n\ninterface BundlePrepareBody {\n owner: string;\n chain?: string;\n actions: BundleAction[];\n}\n\nasync function handleBundlePrepare(\n client: CompassApiSDK,\n body: BundlePrepareBody\n): Promise<Response> {\n const { owner, chain = 'base', actions } = body;\n\n if (!owner || !actions || actions.length === 0) {\n return jsonResponse({ error: 'Missing owner or actions' }, 400);\n }\n\n const response = await client.earn.earnBundle({\n owner: owner as `0x${string}`,\n chain: chain as any,\n gasSponsorship: true,\n actions: actions as any,\n });\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n return jsonResponse({ error: 'No EIP-712 data returned from API' }, 500);\n }\n\n // Normalize types for wallet signing\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return jsonResponse({\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n actionsCount: (response as any).actionsCount || actions.length,\n });\n}\n\nasync function handleBundleExecute(\n client: CompassApiSDK,\n body: TransferExecuteBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n // Reuse the same execution logic as transfer\n return handleTransferExecute(client, body, config);\n}\n\n// --- Data Fetching Handlers (for server-side proxying) ---\n\ninterface VaultsParams {\n chain?: string;\n orderBy?: string;\n direction?: string;\n limit?: string;\n assetSymbol?: string;\n minTvlUsd?: string;\n}\n\nasync function handleVaults(\n client: CompassApiSDK,\n params: VaultsParams\n): Promise<Response> {\n const { chain = 'base', orderBy = 'apy_7d', direction = 'desc', limit = '100', assetSymbol, minTvlUsd } = params;\n\n try {\n const response = await client.earn.earnVaults({\n chain: chain as any,\n orderBy: orderBy as any,\n direction: direction as any,\n limit: parseInt(limit, 10),\n ...(assetSymbol && { assetSymbol }),\n ...(minTvlUsd && { minTvlUsd: parseFloat(minTvlUsd) }),\n } as any);\n\n return jsonResponse(response);\n } catch (error) {\n return jsonResponse({ error: 'Failed to fetch vaults' }, 500);\n }\n}\n\ninterface AaveMarketsParams {\n chain?: string;\n}\n\nasync function handleAaveMarkets(\n client: CompassApiSDK,\n params: AaveMarketsParams\n): Promise<Response> {\n const { chain = 'base' } = params;\n\n try {\n const response = await client.earn.earnAaveMarkets({\n chain: chain as any,\n } as any);\n\n return jsonResponse(response);\n } catch (error) {\n return jsonResponse({ error: 'Failed to fetch Aave markets' }, 500);\n }\n}\n\ninterface PendleMarketsParams {\n chain?: string;\n orderBy?: string;\n direction?: string;\n limit?: string;\n underlyingSymbol?: string;\n minTvlUsd?: string;\n}\n\nasync function handlePendleMarkets(\n client: CompassApiSDK,\n params: PendleMarketsParams\n): Promise<Response> {\n const { chain = 'base', orderBy = 'implied_apy', direction = 'desc', limit = '100', underlyingSymbol, minTvlUsd } = params;\n\n try {\n const response = await client.earn.earnPendleMarkets({\n chain: chain as any,\n orderBy: orderBy as any,\n direction: direction as any,\n limit: parseInt(limit, 10),\n ...(underlyingSymbol && { underlyingSymbol }),\n ...(minTvlUsd && { minTvlUsd: parseFloat(minTvlUsd) }),\n } as any);\n\n return jsonResponse(response);\n } catch (error) {\n return jsonResponse({ error: 'Failed to fetch Pendle markets' }, 500);\n }\n}\n\ninterface PositionsParams {\n chain?: string;\n owner?: string;\n}\n\n// Helper to safely read a field that might be camelCase or snake_case\nfunction field(obj: any, camel: string, snake: string): any {\n return obj?.[camel] ?? obj?.[snake];\n}\n\n\nasync function handlePositions(\n client: CompassApiSDK,\n params: PositionsParams\n): Promise<Response> {\n const { chain = 'base', owner } = params;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n try {\n const positionsResponse = await client.earn.earnPositions({\n chain: chain as any,\n owner: owner as `0x${string}`,\n } as any);\n\n // Serialize SDK response to plain JSON to avoid proxy/getter issues\n const raw = JSON.parse(JSON.stringify(positionsResponse));\n\n const positions: any[] = [];\n\n // Aave positions — APY is already in percentage form (e.g. 3.34 = 3.34%)\n const aavePositions = raw.aave || [];\n for (const a of aavePositions) {\n const balance = a.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (a.reserveSymbol || a.reserve_symbol || 'UNKNOWN').toUpperCase();\n const pnl = a.pnl;\n\n positions.push({\n protocol: 'aave',\n symbol,\n name: `${symbol} on Aave`,\n balance,\n balanceUsd: a.usdValue || a.usd_value || balance,\n apy: parseFloat(a.apy || '0'),\n pnl: pnl ? {\n unrealizedPnl: pnl.unrealizedPnl ?? pnl.unrealized_pnl ?? '0',\n realizedPnl: pnl.realizedPnl ?? pnl.realized_pnl ?? '0',\n totalPnl: pnl.totalPnl ?? pnl.total_pnl ?? '0',\n totalDeposited: pnl.totalDeposited ?? pnl.total_deposited ?? '0',\n } : null,\n deposits: (a.deposits || []).map((d: any) => ({\n amount: d.inputAmount || d.input_amount || d.amount || '0',\n blockNumber: d.blockNumber || d.block_number || 0,\n timestamp: d.blockTimestamp || d.block_timestamp || undefined,\n txHash: d.transactionHash || d.transaction_hash || d.txHash || '',\n })),\n withdrawals: (a.withdrawals || []).map((w: any) => ({\n amount: w.outputAmount || w.output_amount || w.amount || '0',\n blockNumber: w.blockNumber || w.block_number || 0,\n timestamp: w.blockTimestamp || w.block_timestamp || undefined,\n txHash: w.transactionHash || w.transaction_hash || w.txHash || '',\n })),\n });\n }\n\n // Morpho vault positions — APY is already in percentage form\n const vaultPositions = raw.vaults || [];\n for (const v of vaultPositions) {\n const balance = v.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (v.underlyingSymbol || v.underlying_symbol || 'TOKEN').toUpperCase();\n const vaultName = v.vaultName || v.vault_name || `${symbol} Vault`;\n const pnl = v.pnl;\n\n positions.push({\n protocol: 'vaults',\n symbol,\n name: vaultName,\n balance,\n balanceUsd: v.usdValue || v.usd_value || balance,\n apy: parseFloat(v.apy7d || v.apy_7d || '0'),\n vaultAddress: v.vaultAddress || v.vault_address || undefined,\n pnl: pnl ? {\n unrealizedPnl: pnl.unrealizedPnl ?? pnl.unrealized_pnl ?? '0',\n realizedPnl: pnl.realizedPnl ?? pnl.realized_pnl ?? '0',\n totalPnl: pnl.totalPnl ?? pnl.total_pnl ?? '0',\n totalDeposited: pnl.totalDeposited ?? pnl.total_deposited ?? '0',\n } : null,\n deposits: (v.deposits || []).map((d: any) => ({\n amount: d.inputAmount || d.input_amount || d.amount || '0',\n blockNumber: d.blockNumber || d.block_number || 0,\n timestamp: d.blockTimestamp || d.block_timestamp || undefined,\n txHash: d.transactionHash || d.transaction_hash || d.txHash || '',\n })),\n withdrawals: (v.withdrawals || []).map((w: any) => ({\n amount: w.outputAmount || w.output_amount || w.amount || '0',\n blockNumber: w.blockNumber || w.block_number || 0,\n timestamp: w.blockTimestamp || w.block_timestamp || undefined,\n txHash: w.transactionHash || w.transaction_hash || w.txHash || '',\n })),\n });\n }\n\n // Pendle positions — APY is already in percentage form\n const pendlePositions = raw.pendlePt || raw.pendle_pt || [];\n for (const p of pendlePositions) {\n const balance = p.ptBalance || p.pt_balance || p.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (p.underlyingSymbol || p.underlying_symbol || 'PT').toUpperCase();\n const pnl = p.pnl;\n\n positions.push({\n protocol: 'pendle',\n symbol,\n name: `PT-${symbol}`,\n balance,\n balanceUsd: p.usdValue || p.usd_value || balance,\n apy: parseFloat(p.impliedApy || p.implied_apy || '0'),\n marketAddress: p.marketAddress || p.market_address || undefined,\n pnl: pnl ? {\n unrealizedPnl: pnl.unrealizedPnl ?? pnl.unrealized_pnl ?? '0',\n realizedPnl: pnl.realizedPnl ?? pnl.realized_pnl ?? '0',\n totalPnl: pnl.totalPnl ?? pnl.total_pnl ?? '0',\n totalDeposited: pnl.totalDeposited ?? pnl.total_deposited ?? '0',\n } : null,\n deposits: (p.deposits || []).map((d: any) => ({\n amount: d.inputAmount || d.input_amount || d.amount || '0',\n blockNumber: d.blockNumber || d.block_number || 0,\n timestamp: d.blockTimestamp || d.block_timestamp || undefined,\n txHash: d.transactionHash || d.transaction_hash || d.txHash || '',\n })),\n withdrawals: (p.withdrawals || []).map((w: any) => ({\n amount: w.outputAmount || w.output_amount || w.amount || '0',\n blockNumber: w.blockNumber || w.block_number || 0,\n timestamp: w.blockTimestamp || w.block_timestamp || undefined,\n txHash: w.transactionHash || w.transaction_hash || w.txHash || '',\n })),\n });\n }\n\n return jsonResponse({ positions });\n } catch (error) {\n return jsonResponse({ error: 'Failed to fetch positions' }, 500);\n }\n}\n\n// --- Rebalance Preview Handler ---\n\ninterface RebalanceTarget {\n venueType: 'VAULT' | 'AAVE' | 'PENDLE_PT';\n venueAddress: string;\n targetPercent: number;\n token?: string;\n}\n\ninterface RebalancePreviewBody {\n owner: string;\n chain?: string;\n targets: RebalanceTarget[];\n slippage?: number;\n}\n\nasync function handleRebalancePreview(\n client: CompassApiSDK,\n body: RebalancePreviewBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base', targets, slippage = 0.5 } = body;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n if (!targets || targets.length === 0) {\n return jsonResponse({ error: 'Missing targets' }, 400);\n }\n\n // Validate targets have valid percentages\n for (const t of targets) {\n if (t.targetPercent < 0 || t.targetPercent > 100) {\n return jsonResponse({ error: `Invalid target percentage: ${t.targetPercent}%` }, 400);\n }\n }\n\n try {\n // Step 1: Fetch current positions\n const positionsResponse = await client.earn.earnPositions({\n chain: chain as any,\n owner: owner as `0x${string}`,\n } as any);\n\n const positionsRaw = JSON.parse(JSON.stringify(positionsResponse));\n\n // Step 2: Fetch current balances\n const balancesResponse = await client.earn.earnBalances({\n chain: chain as any,\n owner: owner as `0x${string}`,\n });\n\n const balancesRaw = JSON.parse(JSON.stringify(balancesResponse));\n\n // Step 3: Compute current portfolio USD values\n interface CurrentPosition {\n venueType: string;\n venueAddress: string;\n token: string;\n usdValue: number;\n balance: string;\n }\n\n const currentPositions: CurrentPosition[] = [];\n\n // Aave positions\n for (const a of positionsRaw.aave || []) {\n const balance = a.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (a.reserveSymbol || a.reserve_symbol || 'UNKNOWN').toUpperCase();\n currentPositions.push({\n venueType: 'AAVE',\n venueAddress: symbol,\n token: symbol,\n usdValue: parseFloat(a.usdValue || a.usd_value || balance),\n balance,\n });\n }\n\n // Vault positions\n for (const v of positionsRaw.vaults || []) {\n const balance = v.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (v.underlyingSymbol || v.underlying_symbol || 'TOKEN').toUpperCase();\n currentPositions.push({\n venueType: 'VAULT',\n venueAddress: v.vaultAddress || v.vault_address || '',\n token: symbol,\n usdValue: parseFloat(v.usdValue || v.usd_value || balance),\n balance,\n });\n }\n\n // Pendle positions\n for (const p of positionsRaw.pendlePt || positionsRaw.pendle_pt || []) {\n const balance = p.ptBalance || p.pt_balance || p.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (p.underlyingSymbol || p.underlying_symbol || 'PT').toUpperCase();\n currentPositions.push({\n venueType: 'PENDLE_PT',\n venueAddress: p.marketAddress || p.market_address || '',\n token: symbol,\n usdValue: parseFloat(p.usdValue || p.usd_value || balance),\n balance,\n });\n }\n\n // Include idle balances\n let totalIdleUsd = 0;\n for (const [, tokenData] of Object.entries(balancesRaw.balances || {})) {\n const td = tokenData as any;\n const usdVal = parseFloat(td.usd_value || td.usdValue || '0');\n totalIdleUsd += usdVal;\n }\n\n const totalPositionUsd = currentPositions.reduce((sum, p) => sum + p.usdValue, 0);\n const totalUsd = totalPositionUsd + totalIdleUsd;\n\n if (totalUsd <= 0) {\n return jsonResponse({ error: 'No portfolio value found to rebalance' }, 400);\n }\n\n // Fetch USD prices for all tokens involved in the rebalance via the token\n // price API. This avoids defaulting to 1:1 for non-USD-pegged tokens (e.g. EURC)\n // and works even when the user doesn't hold the token yet.\n const allTokenSymbols = new Set<string>();\n for (const pos of currentPositions) allTokenSymbols.add(pos.token.toUpperCase());\n for (const t of targets) if (t.token) allTokenSymbols.add(t.token.toUpperCase());\n for (const sym of Object.keys(balancesRaw.balances || {})) allTokenSymbols.add(sym.toUpperCase());\n\n const tokenPrices: Record<string, number> = {};\n const priceResults = await Promise.allSettled(\n [...allTokenSymbols].map(async (symbol) => {\n const resp = await client.token.tokenPrice({ chain: chain as any, token: symbol });\n return { symbol, price: parseFloat((resp as any).price || '0') };\n })\n );\n for (const result of priceResults) {\n if (result.status === 'fulfilled' && result.value.price > 0) {\n tokenPrices[result.value.symbol] = result.value.price;\n }\n }\n\n // Step 4: Compute actions\n const bundleActions: any[] = [];\n const actionsSummary: any[] = [];\n const warnings: string[] = [];\n\n const MIN_THRESHOLD_USD = 0.01;\n\n // Collect pending deposits (deferred until after swap computation)\n interface PendingDeposit {\n venue: any;\n venueAddress: string;\n token: string;\n deltaUsd: number;\n }\n const pendingDeposits: PendingDeposit[] = [];\n\n // Compute deltas - create withdrawals immediately, defer deposits\n for (const target of targets) {\n const targetUsd = totalUsd * (target.targetPercent / 100);\n const current = currentPositions.find(\n p => p.venueType === target.venueType && p.venueAddress.toLowerCase() === target.venueAddress.toLowerCase()\n );\n const currentUsd = current?.usdValue || 0;\n const deltaUsd = targetUsd - currentUsd;\n\n if (Math.abs(deltaUsd) < MIN_THRESHOLD_USD) continue;\n\n if (deltaUsd < 0 && current) {\n // Over-allocated: need to withdraw\n const withdrawFraction = Math.abs(deltaUsd) / currentUsd;\n const withdrawAmount = (parseFloat(current.balance) * withdrawFraction).toString();\n\n let venue: any;\n if (target.venueType === 'VAULT') {\n venue = { type: 'VAULT' as const, vaultAddress: target.venueAddress };\n } else if (target.venueType === 'AAVE') {\n venue = { type: 'AAVE' as const, token: current.token };\n } else if (target.venueType === 'PENDLE_PT') {\n venue = { type: 'PENDLE_PT' as const, marketAddress: target.venueAddress, maxSlippagePercent: slippage };\n warnings.push(`Withdrawing from Pendle PT - check maturity implications`);\n }\n\n bundleActions.push({\n body: {\n actionType: 'V2_MANAGE',\n venue,\n action: 'WITHDRAW',\n amount: withdrawAmount,\n },\n });\n\n actionsSummary.push({\n type: 'withdraw',\n venue: target.venueAddress,\n token: current.token,\n amount: withdrawAmount,\n usdValue: Math.abs(deltaUsd),\n });\n } else if (deltaUsd > 0) {\n // Under-allocated: collect deposit needs (deferred until after swap computation)\n let venue: any;\n const token = target.token || current?.token || '';\n\n if (target.venueType === 'VAULT') {\n venue = { type: 'VAULT' as const, vaultAddress: target.venueAddress };\n } else if (target.venueType === 'AAVE') {\n venue = { type: 'AAVE' as const, token };\n } else if (target.venueType === 'PENDLE_PT') {\n venue = { type: 'PENDLE_PT' as const, marketAddress: target.venueAddress, token, maxSlippagePercent: slippage };\n }\n\n pendingDeposits.push({ venue, venueAddress: target.venueAddress, token, deltaUsd });\n }\n }\n\n // Check for positions with implicit 0% target (full withdrawal)\n for (const current of currentPositions) {\n const hasTarget = targets.some(\n t => t.venueType === current.venueType && t.venueAddress.toLowerCase() === current.venueAddress.toLowerCase()\n );\n if (!hasTarget && current.usdValue >= MIN_THRESHOLD_USD) {\n let venue: any;\n if (current.venueType === 'VAULT') {\n venue = { type: 'VAULT' as const, vaultAddress: current.venueAddress };\n } else if (current.venueType === 'AAVE') {\n venue = { type: 'AAVE' as const, token: current.token };\n } else if (current.venueType === 'PENDLE_PT') {\n venue = { type: 'PENDLE_PT' as const, marketAddress: current.venueAddress, maxSlippagePercent: slippage };\n }\n\n // Withdraw everything\n bundleActions.unshift({\n body: {\n actionType: 'V2_MANAGE',\n venue,\n action: 'WITHDRAW',\n amount: current.balance,\n },\n });\n\n actionsSummary.unshift({\n type: 'withdraw',\n venue: current.venueAddress,\n token: current.token,\n amount: current.balance,\n usdValue: current.usdValue,\n });\n }\n }\n\n // Step 5: Compute swap actions for token mismatches between withdrawals and deposits\n // Track available tokens (from withdrawals + idle balances)\n const availableByToken: Record<string, { usd: number; tokenAmount: number }> = {};\n\n for (const action of actionsSummary) {\n if (action.type === 'withdraw') {\n const key = action.token.toUpperCase();\n if (!availableByToken[key]) availableByToken[key] = { usd: 0, tokenAmount: 0 };\n availableByToken[key].usd += action.usdValue;\n availableByToken[key].tokenAmount += parseFloat(action.amount);\n }\n }\n\n // Include idle balances\n for (const [tokenSymbol, tokenData] of Object.entries(balancesRaw.balances || {})) {\n const td = tokenData as any;\n const usdVal = parseFloat(td.usd_value || td.usdValue || '0');\n // Use balance_formatted (human-readable), NOT balance (which is raw wei)\n // Never fall back to usd_value — it's a USD amount, not a token amount\n const bal = parseFloat(td.balance_formatted || td.balanceFormatted || '0');\n if (usdVal > MIN_THRESHOLD_USD) {\n const key = tokenSymbol.toUpperCase();\n if (!availableByToken[key]) availableByToken[key] = { usd: 0, tokenAmount: 0 };\n availableByToken[key].usd += usdVal;\n availableByToken[key].tokenAmount += bal;\n }\n }\n\n // Track deposit needs in USD by token\n const depositNeedsByToken: Record<string, number> = {};\n for (const dep of pendingDeposits) {\n const key = dep.token.toUpperCase();\n depositNeedsByToken[key] = (depositNeedsByToken[key] || 0) + dep.deltaUsd;\n }\n\n // Generate swap actions for token shortfalls\n for (const [depositToken, neededUsd] of Object.entries(depositNeedsByToken)) {\n const availableUsd = availableByToken[depositToken]?.usd || 0;\n let shortfallUsd = neededUsd - availableUsd;\n\n if (shortfallUsd <= MIN_THRESHOLD_USD) continue;\n\n for (const [sourceToken, sourceData] of Object.entries(availableByToken)) {\n if (sourceToken === depositToken) continue;\n\n // Only use excess beyond what's needed for same-token deposits\n const sourceNeeded = depositNeedsByToken[sourceToken] || 0;\n const sourceExcess = sourceData.usd - sourceNeeded;\n if (sourceExcess <= MIN_THRESHOLD_USD) continue;\n\n const swapUsd = Math.min(shortfallUsd, sourceExcess);\n if (swapUsd < MIN_THRESHOLD_USD) continue;\n\n // Calculate token amount proportionally, using tokenPrices as fallback\n const tokenAmountIn = sourceData.usd > 0\n ? (swapUsd / sourceData.usd) * sourceData.tokenAmount\n : (tokenPrices[sourceToken] ? swapUsd / tokenPrices[sourceToken] : swapUsd);\n\n bundleActions.push({\n body: {\n actionType: 'V2_SWAP',\n tokenIn: sourceToken,\n tokenOut: depositToken,\n amountIn: tokenAmountIn.toString(),\n slippage: slippage,\n },\n });\n\n actionsSummary.push({\n type: 'swap',\n token: sourceToken,\n tokenOut: depositToken,\n amount: tokenAmountIn,\n usdValue: swapUsd,\n });\n\n // Update available tracking\n sourceData.usd -= swapUsd;\n sourceData.tokenAmount -= tokenAmountIn;\n const slippageFactor = 1 - (slippage / 100);\n if (!availableByToken[depositToken]) availableByToken[depositToken] = { usd: 0, tokenAmount: 0 };\n const receivedUsd = swapUsd * slippageFactor;\n // Estimate received token amount using implied price from existing data,\n // falling back to the pre-computed tokenPrices map (derived from positions\n // and idle balances) so non-USD-pegged tokens like EURC get a real price.\n const existingData = availableByToken[depositToken];\n const impliedPrice = (existingData.tokenAmount > 0 && existingData.usd > 0)\n ? existingData.usd / existingData.tokenAmount\n : (tokenPrices[depositToken] || 1);\n availableByToken[depositToken].usd += receivedUsd;\n availableByToken[depositToken].tokenAmount += receivedUsd / impliedPrice;\n\n shortfallUsd -= swapUsd;\n\n warnings.push(`Swap ${sourceToken} to ${depositToken} involves slippage risk`);\n\n if (shortfallUsd <= MIN_THRESHOLD_USD) break;\n }\n }\n\n // Step 6: Create deposit actions from pending deposits\n // Cap deposit amounts to what's actually available (accounting for swap slippage)\n for (const dep of pendingDeposits) {\n const key = dep.token.toUpperCase();\n const available = availableByToken[key];\n // Convert desired USD to token amount using implied price, falling back\n // to the pre-computed tokenPrices map for non-USD-pegged tokens like EURC.\n const tokenPrice = (available && available.tokenAmount > 0 && available.usd > 0)\n ? available.usd / available.tokenAmount\n : (tokenPrices[key] || 1);\n const desiredTokens = dep.deltaUsd / tokenPrice;\n // Cap to what's actually available (with 5% buffer for swap slippage and\n // rounding — token prices are now derived from real data rather than\n // defaulting to 1:1, so a smaller buffer is sufficient)\n const maxAvailableTokens = available ? available.tokenAmount * 0.95 : 0;\n\n // Skip deposit entirely if no tokens are available\n if (maxAvailableTokens <= MIN_THRESHOLD_USD) {\n warnings.push(`Skipping deposit to ${dep.token} - insufficient available balance`);\n continue;\n }\n\n const depositTokenAmount = Math.min(desiredTokens, maxAvailableTokens);\n\n bundleActions.push({\n body: {\n actionType: 'V2_MANAGE',\n venue: dep.venue,\n action: 'DEPOSIT',\n amount: depositTokenAmount.toString(),\n },\n });\n\n const depositUsd = depositTokenAmount * tokenPrice;\n actionsSummary.push({\n type: 'deposit',\n venue: dep.venueAddress,\n token: dep.token,\n amount: depositTokenAmount.toString(),\n usdValue: depositUsd,\n });\n\n // Reduce available tracking so subsequent deposits of the same token are capped correctly\n if (available) {\n available.usd -= depositUsd;\n available.tokenAmount -= depositTokenAmount;\n }\n }\n\n if (bundleActions.length === 0 && pendingDeposits.length === 0) {\n return jsonResponse({\n actions: [],\n actionsCount: 0,\n warnings: ['Portfolio is already at target allocation'],\n });\n }\n\n // Sort: withdrawals first, then swaps, then deposits\n bundleActions.sort((a, b) => {\n const getOrder = (action: any) => {\n if (action.body.action === 'WITHDRAW') return 0;\n if (action.body.actionType === 'V2_SWAP') return 1;\n if (action.body.action === 'DEPOSIT') return 2;\n return 3;\n };\n return getOrder(a) - getOrder(b);\n });\n\n actionsSummary.sort((a, b) => {\n const order: Record<string, number> = { withdraw: 0, swap: 1, deposit: 2 };\n return (order[a.type] || 0) - (order[b.type] || 0);\n });\n\n if (actionsSummary.some(a => a.type === 'swap')) {\n warnings.push('Swap amounts are estimates - actual amounts may vary due to slippage');\n }\n\n // Step 7: Call bundle endpoint\n const bundleResponse = await client.earn.earnBundle({\n owner: owner as `0x${string}`,\n chain: chain as any,\n gasSponsorship: true,\n actions: bundleActions as any,\n });\n\n const eip712 = (bundleResponse as any).eip712;\n if (!eip712) {\n return jsonResponse({ error: 'No EIP-712 data returned from bundle API' }, 500);\n }\n\n // Normalize types\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return jsonResponse({\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n actions: actionsSummary,\n actionsCount: bundleActions.length,\n warnings,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to compute rebalance preview';\n return jsonResponse({ error: message }, 502);\n }\n}\n\n// --- Credit Account Handlers ---\n\nconst CREDIT_TOKENS: Record<string, string[]> = {\n base: ['USDC', 'WETH', 'USDT', 'DAI', 'WBTC'],\n ethereum: ['USDC', 'WETH', 'USDT', 'DAI', 'WBTC'],\n arbitrum: ['USDC', 'WETH', 'USDT', 'DAI', 'WBTC'],\n};\n\nasync function handleCreditAccountCheck(\n client: CompassApiSDK,\n params: { owner?: string; chain?: string }\n): Promise<Response> {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n const response = await client.credit.creditCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: owner as `0x${string}`,\n estimateGas: false,\n });\n\n const creditAccountAddress = response.creditAccountAddress;\n const hasTransaction = !!response.transaction;\n\n return jsonResponse({\n creditAccountAddress,\n isDeployed: !hasTransaction,\n needsCreation: hasTransaction,\n });\n}\n\nasync function handleCreditCreateAccount(\n client: CompassApiSDK,\n body: { owner: string; chain?: string },\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base' } = body;\n const { gasSponsorPrivateKey, rpcUrls } = config;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n if (!gasSponsorPrivateKey) {\n return jsonResponse(\n { error: 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.' },\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n return jsonResponse({ error: `No RPC URL configured for chain: ${chain}` }, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const response = await client.credit.creditCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: sponsorAccount.address,\n estimateGas: false,\n });\n\n const creditAccountAddress = response.creditAccountAddress;\n\n if (!response.transaction) {\n return jsonResponse({\n creditAccountAddress,\n success: true,\n alreadyExists: true,\n });\n }\n\n const transaction = response.transaction;\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n return jsonResponse({ error: 'Account creation transaction reverted' }, 500);\n }\n\n return jsonResponse({\n creditAccountAddress,\n txHash,\n success: true,\n });\n}\n\nasync function handleCreditPositions(\n client: CompassApiSDK,\n params: { owner?: string; chain?: string }\n): Promise<Response> {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n const response = await client.credit.creditPositions({\n chain: chain as any,\n owner: owner as `0x${string}`,\n });\n\n return jsonResponse(response);\n}\n\nasync function handleCreditBalances(\n client: CompassApiSDK,\n params: { owner?: string; chain?: string }\n): Promise<Response> {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n const tokens = CREDIT_TOKENS[chain.toLowerCase()] || CREDIT_TOKENS['base'];\n const balances = await Promise.allSettled(\n tokens.map(async (token) => {\n const response = await client.token.tokenBalance({\n chain: chain as any,\n token,\n user: owner,\n });\n return {\n tokenSymbol: token,\n amount: (response as any).amount || '0',\n decimals: (response as any).decimals || 18,\n tokenAddress: (response as any).tokenAddress || '',\n };\n })\n );\n\n const result = balances\n .filter((b): b is PromiseFulfilledResult<any> => b.status === 'fulfilled')\n .map((b) => b.value);\n\n return jsonResponse(result);\n}\n\ninterface CreditBundlePrepareBody {\n owner: string;\n chain?: string;\n actions: Array<Record<string, any>>;\n}\n\nasync function handleCreditBundlePrepare(\n client: CompassApiSDK,\n body: CreditBundlePrepareBody\n): Promise<Response> {\n const { owner, chain = 'base', actions } = body;\n\n if (!owner || !actions || actions.length === 0) {\n return jsonResponse({ error: 'Missing owner or actions' }, 400);\n }\n\n const wrappedActions = actions.map((action: any) => ({ body: action }));\n\n const response = await client.credit.creditBundle({\n owner,\n chain: chain as any,\n gasSponsorship: true,\n actions: wrappedActions as any,\n });\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n return jsonResponse({ error: 'No EIP-712 data returned from API' }, 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return jsonResponse({\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n actionsCount: (response as any).actionsCount || actions.length,\n });\n}\n\ninterface CreditTransferBody {\n owner: string;\n chain?: string;\n token: string;\n amount: string;\n}\n\nasync function handleCreditTransfer(\n client: CompassApiSDK,\n body: CreditTransferBody\n): Promise<Response> {\n const { owner, chain = 'base', token, amount } = body;\n\n if (!owner || !token || !amount) {\n return jsonResponse({ error: 'Missing required parameters' }, 400);\n }\n\n const response = await client.credit.creditTransfer({\n owner,\n chain: chain as any,\n token,\n amount,\n action: 'DEPOSIT',\n gasSponsorship: true,\n } as any);\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n return jsonResponse({ error: 'No EIP-712 data returned from API' }, 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes: Record<string, any> = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n };\n if (types.permitTransferFrom || types.PermitTransferFrom) {\n normalizedTypes.PermitTransferFrom = types.permitTransferFrom || types.PermitTransferFrom;\n }\n if (types.tokenPermissions || types.TokenPermissions) {\n normalizedTypes.TokenPermissions = types.tokenPermissions || types.TokenPermissions;\n }\n if (types.safeTx || types.SafeTx) {\n normalizedTypes.SafeTx = types.safeTx || types.SafeTx;\n }\n\n return jsonResponse({\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n primaryType: eip712.primaryType,\n });\n}\n\n// --- Credit Execute Handler ---\n\ninterface CreditExecuteBody {\n owner: string;\n eip712: any;\n signature: string;\n chain?: string;\n creditAccountAddress: string;\n}\n\nasync function handleCreditExecute(\n client: CompassApiSDK,\n body: CreditExecuteBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, eip712, signature, chain = 'base' } = body;\n const { gasSponsorPrivateKey, rpcUrls } = config;\n\n if (!owner || !eip712 || !signature) {\n return jsonResponse({ error: 'Missing required parameters (owner, eip712, signature)' }, 400);\n }\n\n if (!gasSponsorPrivateKey) {\n return jsonResponse(\n { error: 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.' },\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n return jsonResponse({ error: `No RPC URL configured for chain: ${chain}` }, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n // Delegate to the backend's gas sponsorship prepare endpoint (same proven path\n // as earn). Pass product: \"credit\" so the backend uses the credit Safe address.\n const response = await client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signature,\n product: 'credit',\n });\n\n const transaction = (response as any).transaction;\n if (!transaction) {\n return jsonResponse(\n { error: 'No transaction returned from gas sponsorship prepare' },\n 500\n );\n }\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n return jsonResponse({ error: 'Transaction reverted' }, 500);\n }\n\n return jsonResponse({ txHash, success: true });\n}\n\n// --- Transaction Receipt Handler ---\n\nasync function handleTxReceipt(\n params: Record<string, string>,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { hash, chain } = params;\n\n if (!hash || !chain) {\n return jsonResponse({ error: 'Missing hash or chain parameter' }, 400);\n }\n\n const rpcUrl = config.rpcUrls?.[chain.toLowerCase() as keyof typeof config.rpcUrls];\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 400);\n }\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n try {\n const receipt = await publicClient.getTransactionReceipt({\n hash: hash as `0x${string}`,\n });\n return jsonResponse({\n status: receipt.status,\n blockNumber: receipt.blockNumber.toString(),\n });\n } catch {\n return jsonResponse({ status: 'pending' });\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/server/handler.ts"],"names":["mainnet","base","arbitrum","CompassApiSDK","privateKeyToAccount","createWalletClient","http","createPublicClient"],"mappings":"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","file":"index.js","sourcesContent":["import { CompassApiSDK } from '@compass-labs/api-sdk';\nimport {\n createWalletClient,\n createPublicClient,\n http,\n type Chain,\n type Hex,\n} from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { mainnet, base, arbitrum } from 'viem/chains';\n\nconst CHAIN_MAP: Record<string, Chain> = {\n ethereum: mainnet,\n base: base,\n arbitrum: arbitrum,\n};\n\nexport interface CompassHandlerConfig {\n /** Compass API key - keep this in environment variables */\n apiKey: string;\n /** Optional custom API server URL */\n serverUrl?: string;\n /** Gas sponsor private key (required for executing gas-sponsored transactions) */\n gasSponsorPrivateKey?: string;\n /** RPC URLs per chain (required for executing gas-sponsored transactions) */\n rpcUrls?: {\n ethereum?: string;\n base?: string;\n arbitrum?: string;\n };\n}\n\nexport interface CompassRouteContext {\n params: Promise<{ path: string[] }>;\n}\n\ntype NextRequest = Request;\n\n/**\n * Creates a Next.js API route handler for Compass widget operations.\n *\n * This handler proxies requests from client-side widgets to the Compass API,\n * keeping your API key secure on the server.\n *\n * @example\n * ```typescript\n * // app/api/compass/[...path]/route.ts\n * import { createCompassHandler } from '@compass-labs/widgets/server';\n *\n * const handler = createCompassHandler({\n * apiKey: process.env.COMPASS_API_KEY!,\n * gasSponsorPrivateKey: process.env.GAS_SPONSOR_PK,\n * rpcUrls: {\n * ethereum: process.env.ETHEREUM_MAINNET_RPC_URL,\n * base: process.env.BASE_MAINNET_RPC_URL,\n * arbitrum: process.env.ARBITRUM_MAINNET_RPC_URL,\n * },\n * });\n *\n * export const GET = handler;\n * export const POST = handler;\n * ```\n *\n * The handler supports these routes:\n * - GET /api/compass/earn-account/check?owner=0x...&chain=base\n * - POST /api/compass/create-account\n * - POST /api/compass/deposit/prepare\n * - POST /api/compass/deposit/execute\n * - POST /api/compass/withdraw/prepare\n * - POST /api/compass/withdraw/execute\n */\nexport function createCompassHandler(config: CompassHandlerConfig) {\n const { apiKey, serverUrl = 'https://api.compasslabs.ai' } = config;\n\n // Create SDK client\n const client = new CompassApiSDK({\n apiKeyAuth: apiKey,\n serverURL: serverUrl,\n });\n\n return async function handler(\n request: NextRequest,\n context: CompassRouteContext\n ): Promise<Response> {\n try {\n const { path } = await context.params;\n const route = path.join('/');\n const method = request.method;\n\n // Handle GET requests\n if (method === 'GET') {\n const url = new URL(request.url);\n const searchParams = Object.fromEntries(url.searchParams.entries());\n\n switch (route) {\n case 'earn-account/check':\n return await handleEarnAccountCheck(client, searchParams);\n case 'earn-account/balances':\n return await handleEarnAccountBalances(client, searchParams);\n case 'swap/quote':\n return await handleSwapQuote(client, searchParams);\n case 'token/balance':\n return await handleTokenBalance(client, searchParams);\n case 'token/prices':\n return await handleTokenPrices(client, searchParams);\n case 'vaults':\n return await handleVaults(client, searchParams);\n case 'aave/markets':\n return await handleAaveMarkets(client, searchParams);\n case 'pendle/markets':\n return await handlePendleMarkets(client, searchParams);\n case 'positions':\n return await handlePositions(client, searchParams);\n case 'credit-account/check':\n return await handleCreditAccountCheck(client, searchParams);\n case 'credit/positions':\n return await handleCreditPositions(client, searchParams);\n case 'credit/balances':\n return await handleCreditBalances(client, searchParams);\n case 'tx/receipt':\n return await handleTxReceipt(searchParams, config);\n default:\n return jsonResponse({ error: `Unknown GET route: ${route}` }, 404);\n }\n }\n\n // Handle POST requests\n if (method === 'POST') {\n const body = await request.json();\n\n switch (route) {\n case 'create-account':\n return await handleCreateAccount(client, body, config);\n case 'deposit/prepare':\n return await handleManagePrepare(client, body, 'DEPOSIT');\n case 'deposit/execute':\n return await handleExecute(client, body, config);\n case 'withdraw/prepare':\n return await handleManagePrepare(client, body, 'WITHDRAW');\n case 'withdraw/execute':\n return await handleExecute(client, body, config);\n case 'transfer/approve':\n return await handleTransferApprove(client, body);\n case 'transfer/prepare':\n return await handleTransferPrepare(client, body, config);\n case 'transfer/execute':\n return await handleTransferExecute(client, body, config);\n case 'bundle/prepare':\n return await handleBundlePrepare(client, body);\n case 'bundle/execute':\n return await handleBundleExecute(client, body, config);\n case 'swap/prepare':\n return await handleSwapPrepare(client, body);\n case 'swap/execute':\n return await handleSwapExecute(client, body, config);\n case 'rebalance/preview':\n return await handleRebalancePreview(client, body, config);\n case 'credit-account/create':\n return await handleCreditCreateAccount(client, body, config);\n case 'credit/bundle/prepare':\n return await handleCreditBundlePrepare(client, body);\n case 'credit/bundle/execute':\n return await handleCreditExecute(client, body, config);\n case 'credit/transfer':\n return await handleCreditTransfer(client, body);\n case 'approval/execute':\n return await handleApprovalExecute(body, config);\n default:\n return jsonResponse({ error: `Unknown POST route: ${route}` }, 404);\n }\n }\n\n return jsonResponse({ error: `Method ${method} not allowed` }, 405);\n } catch (error) {\n const { message, status } = extractErrorMessage(error);\n return jsonResponse({ error: message }, status);\n }\n };\n}\n\n/**\n * Extracts a user-friendly error message from SDK/API errors.\n * SDK errors contain verbose technical data (Zod dumps, full HTTP bodies) that\n * should never be shown to end-users.\n */\nfunction extractErrorMessage(error: unknown): { message: string; status: number } {\n if (!(error instanceof Error)) {\n return { message: 'Something went wrong. Please try again.', status: 500 };\n }\n\n const raw = error.message || '';\n\n // SDK's CompassAPISDKError and subclasses embed a JSON body in the message.\n // Try to extract the API's own \"detail\" / \"error\" / \"description\" from it.\n const jsonMatch = raw.match(/Body:\\s*(\\{[\\s\\S]*\\})/);\n if (jsonMatch) {\n try {\n const body = JSON.parse(jsonMatch[1]);\n // FastAPI validation error → detail is an array of {msg, loc, type}\n if (Array.isArray(body.detail)) {\n const msgs = body.detail.map((d: any) => d.msg || d.message).filter(Boolean);\n if (msgs.length > 0) return { message: msgs.join('. '), status: 422 };\n }\n // Single-string detail (e.g. \"Insufficient USDC balance\")\n if (typeof body.detail === 'string') return { message: body.detail, status: 422 };\n if (typeof body.error === 'string') return { message: body.error, status: 500 };\n if (typeof body.description === 'string') return { message: body.description, status: 500 };\n } catch {\n // JSON parse failed — fall through\n }\n }\n\n // SDKValidationError (Zod) — replace with generic message\n if (error.name === 'SDKValidationError' || raw.startsWith('Input validation failed')) {\n return { message: 'Invalid request data. Please check your inputs and try again.', status: 400 };\n }\n\n // Known user-facing patterns — pass through as-is\n if (\n raw.includes('Insufficient') ||\n raw.includes('not deployed') ||\n raw.includes('reverted') ||\n raw.includes('not configured') ||\n raw.includes('Unsupported chain')\n ) {\n return { message: raw, status: 500 };\n }\n\n // Fallback — avoid leaking raw SDK internals\n return { message: 'Something went wrong. Please try again.', status: 500 };\n}\n\nfunction jsonResponse(data: unknown, status = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n}\n\n// --- Earn Account Handlers ---\n\ninterface EarnAccountCheckParams {\n owner?: string;\n chain?: string;\n}\n\nasync function handleEarnAccountCheck(\n client: CompassApiSDK,\n params: EarnAccountCheckParams\n): Promise<Response> {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n // Use the SDK's earnCreateAccount method to check if account exists\n // - If response has `transaction` field → account doesn't exist yet\n // - If response has no `transaction` field → account already exists\n const response = await client.earn.earnCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: owner as `0x${string}`,\n estimateGas: false,\n });\n\n const earnAccountAddress = response.earnAccountAddress;\n const hasTransaction = !!response.transaction;\n\n return jsonResponse({\n earnAccountAddress,\n isDeployed: !hasTransaction,\n needsCreation: hasTransaction,\n });\n}\n\ninterface CreateAccountBody {\n owner: string;\n chain?: string;\n}\n\nasync function handleCreateAccount(\n client: CompassApiSDK,\n body: CreateAccountBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base' } = body;\n const { gasSponsorPrivateKey, rpcUrls } = config;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n if (!gasSponsorPrivateKey) {\n return jsonResponse(\n { error: 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.' },\n 500\n );\n }\n\n // Get chain config\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 500);\n }\n\n // Get RPC URL for the chain\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n return jsonResponse({ error: `No RPC URL configured for chain: ${chain}` }, 500);\n }\n\n // Create sponsor account from private key\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n // Create wallet client for signing/sending transactions\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n // Create public client for waiting on receipts\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n // Get create account transaction from API with sponsor as sender\n const response = await client.earn.earnCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: sponsorAccount.address,\n estimateGas: false,\n });\n\n const earnAccountAddress = response.earnAccountAddress;\n\n // If no transaction needed (account may already exist)\n if (!response.transaction) {\n return jsonResponse({\n earnAccountAddress,\n success: true,\n alreadyExists: true,\n });\n }\n\n // Send the transaction from the sponsor wallet\n const transaction = response.transaction;\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n // Wait for the transaction receipt\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n // Check if transaction reverted\n if (receipt.status === 'reverted') {\n return jsonResponse({ error: 'Account creation transaction reverted' }, 500);\n }\n\n return jsonResponse({\n earnAccountAddress,\n txHash,\n success: true,\n });\n}\n\n// --- Manage (Deposit/Withdraw) Handlers ---\n\ninterface ManagePrepareBody {\n amount: string;\n token: string;\n owner: string;\n chain: string;\n venueType: 'VAULT' | 'AAVE' | 'PENDLE_PT';\n vaultAddress?: string;\n marketAddress?: string;\n maxSlippagePercent?: number;\n}\n\ntype ManageAction = 'DEPOSIT' | 'WITHDRAW';\n\nasync function handleManagePrepare(\n client: CompassApiSDK,\n body: ManagePrepareBody,\n action: ManageAction\n): Promise<Response> {\n const { amount, token, owner, chain, venueType, vaultAddress, marketAddress, maxSlippagePercent } = body;\n\n // Build venue based on type\n let venue: any;\n\n if (venueType === 'VAULT' && vaultAddress) {\n venue = {\n type: 'VAULT' as const,\n vaultAddress,\n };\n } else if (venueType === 'AAVE') {\n venue = {\n type: 'AAVE' as const,\n token,\n };\n } else if (venueType === 'PENDLE_PT' && marketAddress) {\n venue = {\n type: 'PENDLE_PT' as const,\n marketAddress,\n token: action === 'DEPOSIT' ? token : undefined,\n maxSlippagePercent: maxSlippagePercent ?? 1.0,\n };\n } else {\n return jsonResponse({ error: 'Invalid venue type or missing address' }, 400);\n }\n\n const response = await client.earn.earnManage({\n owner,\n chain: chain as any,\n venue,\n action,\n amount,\n gasSponsorship: true,\n });\n\n // Extract EIP-712 data for signing\n const eip712 = (response as any).eip712;\n if (!eip712) {\n return jsonResponse({ error: 'No EIP-712 data returned from API' }, 500);\n }\n\n // Normalize types for wallet signing\n // SDK returns camelCase keys (safeTx, eip712Domain) but wallets expect PascalCase (SafeTx)\n // to match the primaryType\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain,\n SafeTx: types.safeTx,\n };\n\n return jsonResponse({\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n });\n}\n\n// --- Execute Handler (shared for deposit/withdraw) ---\n\ninterface ExecuteBody {\n owner: string;\n eip712: any;\n signature: string;\n chain: string;\n}\n\nasync function handleExecute(\n client: CompassApiSDK,\n body: ExecuteBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, eip712, signature, chain } = body;\n const { gasSponsorPrivateKey, rpcUrls } = config;\n\n // Validate gas sponsor config\n if (!gasSponsorPrivateKey) {\n return jsonResponse(\n { error: 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.' },\n 500\n );\n }\n\n // Get chain config\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 500);\n }\n\n // Get RPC URL for the chain\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n return jsonResponse({ error: `No RPC URL configured for chain: ${chain}` }, 500);\n }\n\n // Create sponsor account from private key\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n // Create wallet client for signing/sending transactions\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n // Call gas sponsorship prepare with sponsor as sender\n const response = await client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signature,\n });\n\n // Extract the unsigned transaction from the response\n const transaction = (response as any).transaction;\n if (!transaction) {\n return jsonResponse(\n { error: 'No transaction returned from gas sponsorship prepare' },\n 500\n );\n }\n\n // Send the transaction from the sponsor wallet\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n // Return txHash immediately — client polls /tx/receipt for confirmation\n return jsonResponse({ txHash, success: true });\n}\n\n// --- Transfer Handlers ---\n\ninterface TransferApproveBody {\n owner: string;\n chain?: string;\n token: string;\n}\n\nasync function handleTransferApprove(\n client: CompassApiSDK,\n body: TransferApproveBody\n): Promise<Response> {\n const { owner, chain = 'base', token } = body;\n\n if (!owner || !token) {\n return jsonResponse({ error: 'Missing owner or token parameter' }, 400);\n }\n\n try {\n // Call gas sponsorship approve transfer endpoint\n const response = await client.gasSponsorship.gasSponsorshipApproveTransfer({\n owner: owner as `0x${string}`,\n chain: chain as any,\n token,\n gasSponsorship: true,\n });\n\n // If no EIP-712 data, approval not needed (already approved or using transaction)\n // Note: API might return snake_case (eip_712) or camelCase (eip712)\n const eip712 = (response as any).eip712 || (response as any).eip_712;\n const transaction = (response as any).transaction;\n\n if (!eip712 && !transaction) {\n return jsonResponse({\n approved: true,\n message: 'Token already approved for Permit2',\n });\n }\n\n if (eip712) {\n // Normalize types for wallet signing\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n Permit: types.permit || types.Permit,\n };\n\n return jsonResponse({\n approved: false,\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n });\n }\n\n // Transaction-based approval (for non-EIP2612 tokens)\n return jsonResponse({\n approved: false,\n transaction,\n requiresTransaction: true,\n });\n } catch (error) {\n // Check if error is \"already set\" - treat as approved\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes('already set') || errorMessage.includes('already been set')) {\n return jsonResponse({\n approved: true,\n message: 'Token allowance already set',\n });\n }\n throw error;\n }\n}\n\ninterface ApprovalExecuteBody {\n owner: string;\n chain?: string;\n transaction: any;\n}\n\nasync function handleApprovalExecute(\n body: ApprovalExecuteBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base', transaction } = body;\n const { gasSponsorPrivateKey, rpcUrls } = config;\n\n if (!owner || !transaction) {\n return jsonResponse({ error: 'Missing required parameters (owner, transaction)' }, 400);\n }\n\n if (!gasSponsorPrivateKey) {\n return jsonResponse(\n { error: 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.' },\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n return jsonResponse({ error: `No RPC URL configured for chain: ${chain}` }, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n timeout: 60_000,\n });\n\n if (receipt.status === 'reverted') {\n return jsonResponse({ error: 'Approval transaction reverted' }, 500);\n }\n\n return jsonResponse({ txHash, status: 'success' });\n}\n\ninterface TransferPrepareBody {\n owner: string;\n chain?: string;\n token: string;\n amount: string;\n action: 'DEPOSIT' | 'WITHDRAW';\n product?: 'earn' | 'credit';\n}\n\nasync function handleTransferPrepare(\n client: CompassApiSDK,\n body: TransferPrepareBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base', token, amount, action, product } = body;\n const { gasSponsorPrivateKey } = config;\n\n if (!owner || !token || !amount || !action) {\n return jsonResponse({ error: 'Missing required parameters' }, 400);\n }\n\n // For deposits with gas sponsorship, we need to pass the gas sponsor address as the spender\n // because Permit2 requires msg.sender to match the spender in the signature\n let spender: string | undefined;\n if (action === 'DEPOSIT' && gasSponsorPrivateKey) {\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n spender = sponsorAccount.address;\n }\n\n let response: any;\n if (product === 'credit') {\n response = await client.credit.creditTransfer({\n owner,\n chain: chain as any,\n token,\n amount,\n action,\n gasSponsorship: true,\n ...(spender && { spender }),\n } as any);\n } else {\n response = await client.earn.earnTransfer({\n owner: owner as `0x${string}`,\n chain: chain as any,\n token,\n amount,\n action,\n gasSponsorship: true,\n ...(spender && { spender }),\n } as any);\n }\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n return jsonResponse({ error: 'No EIP-712 data returned from API' }, 500);\n }\n\n // Normalize types based on action\n const types = eip712.types as any;\n let normalizedTypes: Record<string, any>;\n\n if (action === 'DEPOSIT') {\n // Permit2 PermitTransferFrom types\n normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n PermitTransferFrom: types.permitTransferFrom || types.PermitTransferFrom,\n TokenPermissions: types.tokenPermissions || types.TokenPermissions,\n };\n } else {\n // Safe transaction types\n normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n }\n\n return jsonResponse({\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n primaryType: eip712.primaryType,\n });\n}\n\ninterface TransferExecuteBody {\n owner: string;\n chain?: string;\n eip712: any;\n signature: string;\n product?: 'earn' | 'credit';\n}\n\nasync function handleTransferExecute(\n client: CompassApiSDK,\n body: TransferExecuteBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base', eip712, signature, product } = body;\n const { gasSponsorPrivateKey, rpcUrls } = config;\n\n if (!owner || !eip712 || !signature) {\n return jsonResponse({ error: 'Missing required parameters' }, 400);\n }\n\n if (!gasSponsorPrivateKey) {\n return jsonResponse(\n { error: 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.' },\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n return jsonResponse({ error: `No RPC URL configured for chain: ${chain}` }, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n // Call gas sponsorship prepare with sponsor as sender\n const response = await client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signature,\n ...(product === 'credit' && { product: 'credit' }),\n });\n\n const transaction = (response as any).transaction;\n if (!transaction) {\n return jsonResponse(\n { error: 'No transaction returned from gas sponsorship prepare' },\n 500\n );\n }\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n // Return txHash immediately — client polls /tx/receipt for confirmation\n return jsonResponse({ txHash, success: true });\n}\n\n// --- Earn Account Balances Handler ---\n\ninterface EarnAccountBalancesParams {\n owner?: string;\n chain?: string;\n}\n\ninterface TokenTransferData {\n from_address?: string;\n fromAddress?: string;\n to_address?: string;\n toAddress?: string;\n amount: string;\n amount_formatted?: string;\n amountFormatted?: string;\n block_number?: number;\n blockNumber?: number;\n block_timestamp?: string;\n blockTimestamp?: string;\n transaction_hash?: string;\n transactionHash?: string;\n direction: 'in' | 'out';\n}\n\ninterface TokenBalanceData {\n token_address?: string;\n tokenAddress?: string;\n token_symbol?: string;\n tokenSymbol?: string;\n token_decimals?: number;\n tokenDecimals?: number;\n balance: string;\n balance_formatted?: string;\n balanceFormatted?: string;\n usd_value?: string | null;\n usdValue?: string | null;\n transfers: TokenTransferData[];\n}\n\ninterface EarnBalancesApiResponse {\n earn_account_address?: string;\n earnAccountAddress?: string;\n balances: Record<string, TokenBalanceData>;\n total_usd_value?: string | null;\n totalUsdValue?: string | null;\n}\n\nasync function handleEarnAccountBalances(\n client: CompassApiSDK,\n params: EarnAccountBalancesParams\n): Promise<Response> {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n // Use SDK's earnBalances method to get all token balances\n const response = await client.earn.earnBalances({\n chain: chain as any,\n owner: owner as `0x${string}`,\n });\n\n const data = response as unknown as EarnBalancesApiResponse;\n\n // Transform to simplified format for the widget\n // Filter out tokens that only have mint/burn transfers (to/from zero address)\n const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\n const balances: Record<string, { balance: string; usdValue: string }> = {};\n\n for (const [symbol, tokenData] of Object.entries(data.balances)) {\n // Check if this token only has mint/burn transfers\n const hasRealTransfers = tokenData.transfers.some((t) => {\n const fromAddr = (t.from_address || t.fromAddress || '').toLowerCase();\n const toAddr = (t.to_address || t.toAddress || '').toLowerCase();\n return fromAddr !== ZERO_ADDRESS && toAddr !== ZERO_ADDRESS;\n });\n\n // Skip tokens with zero balance that only have mint/burn transfers\n const balanceFormatted = tokenData.balance_formatted || tokenData.balanceFormatted || '0';\n const balanceNum = parseFloat(balanceFormatted);\n if (balanceNum === 0 && !hasRealTransfers) {\n continue;\n }\n\n // Also skip tokens that have non-zero balance but ONLY mint/burn transfers\n // These are likely protocol internal tokens (aTokens, vault shares)\n if (!hasRealTransfers && tokenData.transfers.length > 0) {\n continue;\n }\n\n // Skip tokens with zero USD value\n const usdValue = tokenData.usd_value || tokenData.usdValue || '0';\n const usdValueNum = parseFloat(usdValue);\n if (usdValueNum === 0 || isNaN(usdValueNum)) {\n continue;\n }\n\n balances[symbol] = {\n balance: balanceFormatted,\n usdValue,\n };\n }\n\n const earnAccountAddr = data.earn_account_address || data.earnAccountAddress || '';\n const totalUsd = data.total_usd_value || data.totalUsdValue || '0';\n\n return jsonResponse({\n earnAccountAddress: earnAccountAddr,\n balances,\n totalUsdValue: totalUsd,\n });\n}\n\n// --- Swap Quote Handler ---\n\ninterface SwapQuoteParams {\n owner?: string;\n chain?: string;\n tokenIn?: string;\n tokenOut?: string;\n amountIn?: string;\n}\n\nasync function handleSwapQuote(\n client: CompassApiSDK,\n params: SwapQuoteParams\n): Promise<Response> {\n const { owner, chain = 'base', tokenIn, tokenOut, amountIn } = params;\n\n if (!owner || !tokenIn || !tokenOut || !amountIn) {\n return jsonResponse({ error: 'Missing required parameters: owner, tokenIn, tokenOut, amountIn' }, 400);\n }\n\n try {\n // Call the earn swap endpoint to get estimated_amount_out\n const response = await client.earn.earnSwap({\n owner: owner as `0x${string}`,\n chain: chain as any,\n tokenIn,\n tokenOut,\n amountIn,\n slippage: 1.0,\n gasSponsorship: true,\n });\n\n const estimatedAmountOut = (response as any).estimatedAmountOut || '0';\n\n return jsonResponse({\n tokenIn,\n tokenOut,\n amountIn,\n estimatedAmountOut: estimatedAmountOut?.toString() || '0',\n });\n } catch (error: any) {\n // Extract human-readable error message from API response\n let errorMessage = 'Failed to get swap quote';\n\n try {\n // Try to parse nested error messages from the API\n const bodyMessage = error?.body?.message || error?.message || '';\n\n // Check if the message contains JSON (API sometimes returns nested JSON errors)\n if (bodyMessage.includes('{')) {\n const jsonMatch = bodyMessage.match(/\\{.*\\}/s);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]);\n // Extract description or error field from nested JSON\n errorMessage = parsed.description || parsed.error || parsed.message || errorMessage;\n }\n } else if (bodyMessage) {\n // Check for \"Insufficient ... balance\" pattern\n const balanceMatch = bodyMessage.match(/Insufficient \\w+ balance[^.]+/i);\n if (balanceMatch) {\n errorMessage = balanceMatch[0];\n } else {\n errorMessage = bodyMessage;\n }\n }\n } catch {\n // If parsing fails, try to extract a simple message\n errorMessage = error?.body?.error || error?.message || 'Failed to get swap quote';\n }\n\n return jsonResponse({\n error: 'Swap quote failed',\n message: errorMessage,\n }, 400);\n }\n}\n\n// --- Swap Prepare Handler ---\n\ninterface SwapPrepareBody {\n owner: string;\n chain?: string;\n tokenIn: string;\n tokenOut: string;\n amountIn: string;\n slippage?: number;\n}\n\nasync function handleSwapPrepare(\n client: CompassApiSDK,\n body: SwapPrepareBody\n): Promise<Response> {\n const { owner, chain = 'base', tokenIn, tokenOut, amountIn, slippage = 1.0 } = body;\n\n if (!owner || !tokenIn || !tokenOut || !amountIn) {\n return jsonResponse({ error: 'Missing required parameters: owner, tokenIn, tokenOut, amountIn' }, 400);\n }\n\n try {\n const response = await client.earn.earnSwap({\n owner: owner as `0x${string}`,\n chain: chain as any,\n tokenIn,\n tokenOut,\n amountIn,\n slippage,\n gasSponsorship: true,\n });\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n return jsonResponse({ error: 'No EIP-712 data returned from API' }, 500);\n }\n\n // Normalize types for wallet signing\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return jsonResponse({\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n estimatedAmountOut: (response as any).estimatedAmountOut?.toString() || '0',\n });\n } catch (error) {\n return jsonResponse({\n error: error instanceof Error ? error.message : 'Failed to prepare swap'\n }, 500);\n }\n}\n\n// --- Swap Execute Handler ---\n\ninterface SwapExecuteBody {\n owner: string;\n chain?: string;\n eip712: any;\n signature: string;\n}\n\nasync function handleSwapExecute(\n client: CompassApiSDK,\n body: SwapExecuteBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base', eip712, signature } = body;\n\n if (!owner || !eip712 || !signature) {\n return jsonResponse({ error: 'Missing required parameters: owner, eip712, signature' }, 400);\n }\n\n if (!config.gasSponsorPrivateKey) {\n return jsonResponse({ error: 'Gas sponsor not configured' }, 500);\n }\n\n const rpcUrl = config.rpcUrls?.[chain as keyof typeof config.rpcUrls];\n if (!rpcUrl) {\n return jsonResponse({ error: `No RPC URL configured for chain: ${chain}` }, 500);\n }\n\n try {\n const viemChain = CHAIN_MAP[chain];\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 400);\n }\n\n const sponsorAccount = privateKeyToAccount(config.gasSponsorPrivateKey as `0x${string}`);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n // Call gas sponsorship prepare with sponsor as sender\n const response = await client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: sponsorAccount.address,\n eip712,\n signature,\n });\n\n const transaction = (response as any).transaction;\n if (!transaction) {\n return jsonResponse({ error: 'No transaction returned from gas sponsorship prepare' }, 500);\n }\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n return jsonResponse({ error: 'Transaction reverted' }, 500);\n }\n\n return jsonResponse({ txHash, success: true });\n } catch (error) {\n return jsonResponse({\n error: error instanceof Error ? error.message : 'Failed to execute swap'\n }, 500);\n }\n}\n\n// --- Token Balance Handler ---\n\ninterface TokenBalanceParams {\n chain?: string;\n token?: string;\n address?: string;\n}\n\nasync function handleTokenBalance(\n client: CompassApiSDK,\n params: TokenBalanceParams\n): Promise<Response> {\n const { chain = 'base', token, address } = params;\n\n if (!token || !address) {\n return jsonResponse({ error: 'Missing token or address parameter' }, 400);\n }\n\n try {\n const response = await client.token.tokenBalance({\n chain: chain as any,\n token,\n user: address,\n });\n\n return jsonResponse({\n token,\n address,\n balance: (response as any).amount || '0',\n balanceRaw: (response as any).balanceRaw || '0',\n });\n } catch (error) {\n return jsonResponse({\n token,\n address,\n balance: '0',\n balanceRaw: '0',\n });\n }\n}\n\nasync function handleTokenPrices(\n client: CompassApiSDK,\n params: Record<string, string>\n): Promise<Response> {\n const { chain = 'base', tokens } = params;\n\n if (!tokens) {\n return jsonResponse({ error: 'Missing tokens parameter' }, 400);\n }\n\n const tokenList = tokens.split(',').map((t) => t.trim().toUpperCase());\n const prices: Record<string, number> = {};\n\n const results = await Promise.allSettled(\n tokenList.map(async (symbol) => {\n const resp = await client.token.tokenPrice({ chain: chain as any, token: symbol });\n return { symbol, price: parseFloat((resp as any).price || '0') };\n })\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value.price > 0) {\n prices[result.value.symbol] = result.value.price;\n }\n }\n\n return jsonResponse({ prices });\n}\n\n// --- Bundle Handlers ---\n\ninterface BundleAction {\n actionType: string;\n [key: string]: any;\n}\n\ninterface BundlePrepareBody {\n owner: string;\n chain?: string;\n actions: BundleAction[];\n}\n\nasync function handleBundlePrepare(\n client: CompassApiSDK,\n body: BundlePrepareBody\n): Promise<Response> {\n const { owner, chain = 'base', actions } = body;\n\n if (!owner || !actions || actions.length === 0) {\n return jsonResponse({ error: 'Missing owner or actions' }, 400);\n }\n\n const response = await client.earn.earnBundle({\n owner: owner as `0x${string}`,\n chain: chain as any,\n gasSponsorship: true,\n actions: actions as any,\n });\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n return jsonResponse({ error: 'No EIP-712 data returned from API' }, 500);\n }\n\n // Normalize types for wallet signing\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return jsonResponse({\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n actionsCount: (response as any).actionsCount || actions.length,\n });\n}\n\nasync function handleBundleExecute(\n client: CompassApiSDK,\n body: TransferExecuteBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n // Reuse the same execution logic as transfer\n return handleTransferExecute(client, body, config);\n}\n\n// --- Data Fetching Handlers (for server-side proxying) ---\n\ninterface VaultsParams {\n chain?: string;\n orderBy?: string;\n direction?: string;\n limit?: string;\n assetSymbol?: string;\n minTvlUsd?: string;\n}\n\nasync function handleVaults(\n client: CompassApiSDK,\n params: VaultsParams\n): Promise<Response> {\n const { chain = 'base', orderBy = 'apy_7d', direction = 'desc', limit = '100', assetSymbol, minTvlUsd } = params;\n\n try {\n const response = await client.earn.earnVaults({\n chain: chain as any,\n orderBy: orderBy as any,\n direction: direction as any,\n limit: parseInt(limit, 10),\n ...(assetSymbol && { assetSymbol }),\n ...(minTvlUsd && { minTvlUsd: parseFloat(minTvlUsd) }),\n } as any);\n\n return jsonResponse(response);\n } catch (error) {\n return jsonResponse({ error: 'Failed to fetch vaults' }, 500);\n }\n}\n\ninterface AaveMarketsParams {\n chain?: string;\n}\n\nasync function handleAaveMarkets(\n client: CompassApiSDK,\n params: AaveMarketsParams\n): Promise<Response> {\n const { chain = 'base' } = params;\n\n try {\n const response = await client.earn.earnAaveMarkets({\n chain: chain as any,\n } as any);\n\n return jsonResponse(response);\n } catch (error) {\n return jsonResponse({ error: 'Failed to fetch Aave markets' }, 500);\n }\n}\n\ninterface PendleMarketsParams {\n chain?: string;\n orderBy?: string;\n direction?: string;\n limit?: string;\n underlyingSymbol?: string;\n minTvlUsd?: string;\n}\n\nasync function handlePendleMarkets(\n client: CompassApiSDK,\n params: PendleMarketsParams\n): Promise<Response> {\n const { chain = 'base', orderBy = 'implied_apy', direction = 'desc', limit = '100', underlyingSymbol, minTvlUsd } = params;\n\n try {\n const response = await client.earn.earnPendleMarkets({\n chain: chain as any,\n orderBy: orderBy as any,\n direction: direction as any,\n limit: parseInt(limit, 10),\n ...(underlyingSymbol && { underlyingSymbol }),\n ...(minTvlUsd && { minTvlUsd: parseFloat(minTvlUsd) }),\n } as any);\n\n return jsonResponse(response);\n } catch (error) {\n return jsonResponse({ error: 'Failed to fetch Pendle markets' }, 500);\n }\n}\n\ninterface PositionsParams {\n chain?: string;\n owner?: string;\n}\n\n// Helper to safely read a field that might be camelCase or snake_case\nfunction field(obj: any, camel: string, snake: string): any {\n return obj?.[camel] ?? obj?.[snake];\n}\n\n\nasync function handlePositions(\n client: CompassApiSDK,\n params: PositionsParams\n): Promise<Response> {\n const { chain = 'base', owner } = params;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n try {\n const positionsResponse = await client.earn.earnPositions({\n chain: chain as any,\n owner: owner as `0x${string}`,\n } as any);\n\n // Serialize SDK response to plain JSON to avoid proxy/getter issues\n const raw = JSON.parse(JSON.stringify(positionsResponse));\n\n const positions: any[] = [];\n\n // Aave positions — APY is already in percentage form (e.g. 3.34 = 3.34%)\n const aavePositions = raw.aave || [];\n for (const a of aavePositions) {\n const balance = a.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (a.reserveSymbol || a.reserve_symbol || 'UNKNOWN').toUpperCase();\n const pnl = a.pnl;\n\n positions.push({\n protocol: 'aave',\n symbol,\n name: `${symbol} on Aave`,\n balance,\n balanceUsd: a.usdValue || a.usd_value || balance,\n apy: parseFloat(a.apy || '0'),\n pnl: pnl ? {\n unrealizedPnl: pnl.unrealizedPnl ?? pnl.unrealized_pnl ?? '0',\n realizedPnl: pnl.realizedPnl ?? pnl.realized_pnl ?? '0',\n totalPnl: pnl.totalPnl ?? pnl.total_pnl ?? '0',\n totalDeposited: pnl.totalDeposited ?? pnl.total_deposited ?? '0',\n } : null,\n deposits: (a.deposits || []).map((d: any) => ({\n amount: d.inputAmount || d.input_amount || d.amount || '0',\n blockNumber: d.blockNumber || d.block_number || 0,\n timestamp: d.blockTimestamp || d.block_timestamp || undefined,\n txHash: d.transactionHash || d.transaction_hash || d.txHash || '',\n })),\n withdrawals: (a.withdrawals || []).map((w: any) => ({\n amount: w.outputAmount || w.output_amount || w.amount || '0',\n blockNumber: w.blockNumber || w.block_number || 0,\n timestamp: w.blockTimestamp || w.block_timestamp || undefined,\n txHash: w.transactionHash || w.transaction_hash || w.txHash || '',\n })),\n });\n }\n\n // Morpho vault positions — APY is already in percentage form\n const vaultPositions = raw.vaults || [];\n for (const v of vaultPositions) {\n const balance = v.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (v.underlyingSymbol || v.underlying_symbol || 'TOKEN').toUpperCase();\n const vaultName = v.vaultName || v.vault_name || `${symbol} Vault`;\n const pnl = v.pnl;\n\n positions.push({\n protocol: 'vaults',\n symbol,\n name: vaultName,\n balance,\n balanceUsd: v.usdValue || v.usd_value || balance,\n apy: parseFloat(v.apy7d || v.apy_7d || '0'),\n vaultAddress: v.vaultAddress || v.vault_address || undefined,\n pnl: pnl ? {\n unrealizedPnl: pnl.unrealizedPnl ?? pnl.unrealized_pnl ?? '0',\n realizedPnl: pnl.realizedPnl ?? pnl.realized_pnl ?? '0',\n totalPnl: pnl.totalPnl ?? pnl.total_pnl ?? '0',\n totalDeposited: pnl.totalDeposited ?? pnl.total_deposited ?? '0',\n } : null,\n deposits: (v.deposits || []).map((d: any) => ({\n amount: d.inputAmount || d.input_amount || d.amount || '0',\n blockNumber: d.blockNumber || d.block_number || 0,\n timestamp: d.blockTimestamp || d.block_timestamp || undefined,\n txHash: d.transactionHash || d.transaction_hash || d.txHash || '',\n })),\n withdrawals: (v.withdrawals || []).map((w: any) => ({\n amount: w.outputAmount || w.output_amount || w.amount || '0',\n blockNumber: w.blockNumber || w.block_number || 0,\n timestamp: w.blockTimestamp || w.block_timestamp || undefined,\n txHash: w.transactionHash || w.transaction_hash || w.txHash || '',\n })),\n });\n }\n\n // Pendle positions — APY is already in percentage form\n const pendlePositions = raw.pendlePt || raw.pendle_pt || [];\n for (const p of pendlePositions) {\n const balance = p.ptBalance || p.pt_balance || p.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (p.underlyingSymbol || p.underlying_symbol || 'PT').toUpperCase();\n const pnl = p.pnl;\n\n positions.push({\n protocol: 'pendle',\n symbol,\n name: `PT-${symbol}`,\n balance,\n balanceUsd: p.usdValue || p.usd_value || balance,\n apy: parseFloat(p.impliedApy || p.implied_apy || '0'),\n marketAddress: p.marketAddress || p.market_address || undefined,\n pnl: pnl ? {\n unrealizedPnl: pnl.unrealizedPnl ?? pnl.unrealized_pnl ?? '0',\n realizedPnl: pnl.realizedPnl ?? pnl.realized_pnl ?? '0',\n totalPnl: pnl.totalPnl ?? pnl.total_pnl ?? '0',\n totalDeposited: pnl.totalDeposited ?? pnl.total_deposited ?? '0',\n } : null,\n deposits: (p.deposits || []).map((d: any) => ({\n amount: d.inputAmount || d.input_amount || d.amount || '0',\n blockNumber: d.blockNumber || d.block_number || 0,\n timestamp: d.blockTimestamp || d.block_timestamp || undefined,\n txHash: d.transactionHash || d.transaction_hash || d.txHash || '',\n })),\n withdrawals: (p.withdrawals || []).map((w: any) => ({\n amount: w.outputAmount || w.output_amount || w.amount || '0',\n blockNumber: w.blockNumber || w.block_number || 0,\n timestamp: w.blockTimestamp || w.block_timestamp || undefined,\n txHash: w.transactionHash || w.transaction_hash || w.txHash || '',\n })),\n });\n }\n\n return jsonResponse({ positions });\n } catch (error) {\n return jsonResponse({ error: 'Failed to fetch positions' }, 500);\n }\n}\n\n// --- Rebalance Preview Handler ---\n\ninterface RebalanceTarget {\n venueType: 'VAULT' | 'AAVE' | 'PENDLE_PT';\n venueAddress: string;\n targetPercent: number;\n token?: string;\n // The allocation % the position had when the user started editing.\n // Used to distinguish intentional changes from data drift.\n originalPercent?: number;\n}\n\ninterface RebalancePreviewBody {\n owner: string;\n chain?: string;\n targets: RebalanceTarget[];\n slippage?: number;\n}\n\nasync function handleRebalancePreview(\n client: CompassApiSDK,\n body: RebalancePreviewBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base', targets, slippage = 0.5 } = body;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n if (!targets || targets.length === 0) {\n return jsonResponse({ error: 'Missing targets' }, 400);\n }\n\n // Validate targets have valid percentages\n for (const t of targets) {\n if (t.targetPercent < 0 || t.targetPercent > 100) {\n return jsonResponse({ error: `Invalid target percentage: ${t.targetPercent}%` }, 400);\n }\n }\n\n try {\n // Step 1: Fetch current positions\n const positionsResponse = await client.earn.earnPositions({\n chain: chain as any,\n owner: owner as `0x${string}`,\n } as any);\n\n const positionsRaw = JSON.parse(JSON.stringify(positionsResponse));\n\n // Step 2: Fetch current balances\n const balancesResponse = await client.earn.earnBalances({\n chain: chain as any,\n owner: owner as `0x${string}`,\n });\n\n const balancesRaw = JSON.parse(JSON.stringify(balancesResponse));\n\n // Step 3: Compute current portfolio USD values\n interface CurrentPosition {\n venueType: string;\n venueAddress: string;\n token: string;\n usdValue: number;\n balance: string;\n }\n\n const currentPositions: CurrentPosition[] = [];\n\n // Aave positions\n for (const a of positionsRaw.aave || []) {\n const balance = a.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (a.reserveSymbol || a.reserve_symbol || 'UNKNOWN').toUpperCase();\n currentPositions.push({\n venueType: 'AAVE',\n venueAddress: symbol,\n token: symbol,\n usdValue: parseFloat(a.usdValue || a.usd_value || balance),\n balance,\n });\n }\n\n // Vault positions\n for (const v of positionsRaw.vaults || []) {\n const balance = v.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (v.underlyingSymbol || v.underlying_symbol || 'TOKEN').toUpperCase();\n currentPositions.push({\n venueType: 'VAULT',\n venueAddress: v.vaultAddress || v.vault_address || '',\n token: symbol,\n usdValue: parseFloat(v.usdValue || v.usd_value || balance),\n balance,\n });\n }\n\n // Pendle positions\n for (const p of positionsRaw.pendlePt || positionsRaw.pendle_pt || []) {\n const balance = p.ptBalance || p.pt_balance || p.balance || '0';\n if (parseFloat(balance) <= 0) continue;\n const symbol = (p.underlyingSymbol || p.underlying_symbol || 'PT').toUpperCase();\n currentPositions.push({\n venueType: 'PENDLE_PT',\n venueAddress: p.marketAddress || p.market_address || '',\n token: symbol,\n usdValue: parseFloat(p.usdValue || p.usd_value || balance),\n balance,\n });\n }\n\n // Include idle balances\n let totalIdleUsd = 0;\n for (const [, tokenData] of Object.entries(balancesRaw.balances || {})) {\n const td = tokenData as any;\n const usdVal = parseFloat(td.usd_value || td.usdValue || '0');\n totalIdleUsd += usdVal;\n }\n\n const totalPositionUsd = currentPositions.reduce((sum, p) => sum + p.usdValue, 0);\n const totalUsd = totalPositionUsd + totalIdleUsd;\n\n if (totalUsd <= 0) {\n return jsonResponse({ error: 'No portfolio value found to rebalance' }, 400);\n }\n\n // Fetch USD prices for all tokens involved in the rebalance via the token\n // price API. This avoids defaulting to 1:1 for non-USD-pegged tokens (e.g. EURC)\n // and works even when the user doesn't hold the token yet.\n const allTokenSymbols = new Set<string>();\n for (const pos of currentPositions) allTokenSymbols.add(pos.token.toUpperCase());\n for (const t of targets) if (t.token) allTokenSymbols.add(t.token.toUpperCase());\n for (const sym of Object.keys(balancesRaw.balances || {})) allTokenSymbols.add(sym.toUpperCase());\n\n const tokenPrices: Record<string, number> = {};\n const priceResults = await Promise.allSettled(\n [...allTokenSymbols].map(async (symbol) => {\n const resp = await client.token.tokenPrice({ chain: chain as any, token: symbol });\n return { symbol, price: parseFloat((resp as any).price || '0') };\n })\n );\n for (const result of priceResults) {\n if (result.status === 'fulfilled' && result.value.price > 0) {\n tokenPrices[result.value.symbol] = result.value.price;\n }\n }\n\n // Step 4: Compute actions\n const bundleActions: any[] = [];\n const actionsSummary: any[] = [];\n const warnings: string[] = [];\n\n const MIN_THRESHOLD_USD = 0.01;\n // Threshold for detecting intentional user changes vs data drift (0.1%)\n const CHANGE_THRESHOLD_PCT = 0.1;\n\n // Collect pending deposits (deferred until after swap computation)\n interface PendingDeposit {\n venue: any;\n venueAddress: string;\n token: string;\n deltaUsd: number;\n }\n const pendingDeposits: PendingDeposit[] = [];\n\n // Compute deltas - create withdrawals immediately, defer deposits\n for (const target of targets) {\n // Skip targets the user didn't actually change — prevents phantom actions\n // from data drift between page load and preview time.\n const originalPct = target.originalPercent ?? target.targetPercent;\n if (Math.abs(target.targetPercent - originalPct) <= CHANGE_THRESHOLD_PCT) continue;\n\n const targetUsd = totalUsd * (target.targetPercent / 100);\n const current = currentPositions.find(\n p => p.venueType === target.venueType && p.venueAddress.toLowerCase() === target.venueAddress.toLowerCase()\n );\n const currentUsd = current?.usdValue || 0;\n const deltaUsd = targetUsd - currentUsd;\n\n if (Math.abs(deltaUsd) < MIN_THRESHOLD_USD) continue;\n\n if (deltaUsd < 0 && current) {\n // Over-allocated: need to withdraw\n const withdrawFraction = Math.abs(deltaUsd) / currentUsd;\n const withdrawAmount = (parseFloat(current.balance) * withdrawFraction).toString();\n\n let venue: any;\n if (target.venueType === 'VAULT') {\n venue = { type: 'VAULT' as const, vaultAddress: target.venueAddress };\n } else if (target.venueType === 'AAVE') {\n venue = { type: 'AAVE' as const, token: current.token };\n } else if (target.venueType === 'PENDLE_PT') {\n venue = { type: 'PENDLE_PT' as const, marketAddress: target.venueAddress, maxSlippagePercent: slippage };\n warnings.push(`Withdrawing from Pendle PT - check maturity implications`);\n }\n\n bundleActions.push({\n body: {\n actionType: 'V2_MANAGE',\n venue,\n action: 'WITHDRAW',\n amount: withdrawAmount,\n },\n });\n\n actionsSummary.push({\n type: 'withdraw',\n venue: target.venueAddress,\n token: current.token,\n amount: withdrawAmount,\n usdValue: Math.abs(deltaUsd),\n });\n } else if (deltaUsd > 0) {\n // Under-allocated: collect deposit needs (deferred until after swap computation)\n let venue: any;\n const token = target.token || current?.token || '';\n\n if (target.venueType === 'VAULT') {\n venue = { type: 'VAULT' as const, vaultAddress: target.venueAddress };\n } else if (target.venueType === 'AAVE') {\n venue = { type: 'AAVE' as const, token };\n } else if (target.venueType === 'PENDLE_PT') {\n venue = { type: 'PENDLE_PT' as const, marketAddress: target.venueAddress, token, maxSlippagePercent: slippage };\n }\n\n pendingDeposits.push({ venue, venueAddress: target.venueAddress, token, deltaUsd });\n }\n }\n\n // Check for positions with implicit 0% target (full withdrawal)\n for (const current of currentPositions) {\n const hasTarget = targets.some(\n t => t.venueType === current.venueType && t.venueAddress.toLowerCase() === current.venueAddress.toLowerCase()\n );\n if (!hasTarget && current.usdValue >= MIN_THRESHOLD_USD) {\n let venue: any;\n if (current.venueType === 'VAULT') {\n venue = { type: 'VAULT' as const, vaultAddress: current.venueAddress };\n } else if (current.venueType === 'AAVE') {\n venue = { type: 'AAVE' as const, token: current.token };\n } else if (current.venueType === 'PENDLE_PT') {\n venue = { type: 'PENDLE_PT' as const, marketAddress: current.venueAddress, maxSlippagePercent: slippage };\n }\n\n // Withdraw everything\n bundleActions.unshift({\n body: {\n actionType: 'V2_MANAGE',\n venue,\n action: 'WITHDRAW',\n amount: current.balance,\n },\n });\n\n actionsSummary.unshift({\n type: 'withdraw',\n venue: current.venueAddress,\n token: current.token,\n amount: current.balance,\n usdValue: current.usdValue,\n });\n }\n }\n\n // Step 5: Compute swap actions for token mismatches between withdrawals and deposits\n // Track available tokens (from withdrawals + idle balances)\n const availableByToken: Record<string, { usd: number; tokenAmount: number }> = {};\n\n for (const action of actionsSummary) {\n if (action.type === 'withdraw') {\n const key = action.token.toUpperCase();\n if (!availableByToken[key]) availableByToken[key] = { usd: 0, tokenAmount: 0 };\n availableByToken[key].usd += action.usdValue;\n availableByToken[key].tokenAmount += parseFloat(action.amount);\n }\n }\n\n // Include idle balances\n for (const [tokenSymbol, tokenData] of Object.entries(balancesRaw.balances || {})) {\n const td = tokenData as any;\n const usdVal = parseFloat(td.usd_value || td.usdValue || '0');\n // Use balance_formatted (human-readable), NOT balance (which is raw wei)\n // Never fall back to usd_value — it's a USD amount, not a token amount\n const bal = parseFloat(td.balance_formatted || td.balanceFormatted || '0');\n if (usdVal > MIN_THRESHOLD_USD) {\n const key = tokenSymbol.toUpperCase();\n if (!availableByToken[key]) availableByToken[key] = { usd: 0, tokenAmount: 0 };\n availableByToken[key].usd += usdVal;\n availableByToken[key].tokenAmount += bal;\n }\n }\n\n // Track deposit needs in USD by token\n const depositNeedsByToken: Record<string, number> = {};\n for (const dep of pendingDeposits) {\n const key = dep.token.toUpperCase();\n depositNeedsByToken[key] = (depositNeedsByToken[key] || 0) + dep.deltaUsd;\n }\n\n // Generate swap actions for token shortfalls\n for (const [depositToken, neededUsd] of Object.entries(depositNeedsByToken)) {\n const availableUsd = availableByToken[depositToken]?.usd || 0;\n let shortfallUsd = neededUsd - availableUsd;\n\n if (shortfallUsd <= MIN_THRESHOLD_USD) continue;\n\n for (const [sourceToken, sourceData] of Object.entries(availableByToken)) {\n if (sourceToken === depositToken) continue;\n\n // Only use excess beyond what's needed for same-token deposits\n const sourceNeeded = depositNeedsByToken[sourceToken] || 0;\n const sourceExcess = sourceData.usd - sourceNeeded;\n if (sourceExcess <= MIN_THRESHOLD_USD) continue;\n\n const swapUsd = Math.min(shortfallUsd, sourceExcess);\n if (swapUsd < MIN_THRESHOLD_USD) continue;\n\n // Calculate token amount proportionally, using tokenPrices as fallback\n const tokenAmountIn = sourceData.usd > 0\n ? (swapUsd / sourceData.usd) * sourceData.tokenAmount\n : (tokenPrices[sourceToken] ? swapUsd / tokenPrices[sourceToken] : swapUsd);\n\n bundleActions.push({\n body: {\n actionType: 'V2_SWAP',\n tokenIn: sourceToken,\n tokenOut: depositToken,\n amountIn: tokenAmountIn.toString(),\n slippage: slippage,\n },\n });\n\n actionsSummary.push({\n type: 'swap',\n token: sourceToken,\n tokenOut: depositToken,\n amount: tokenAmountIn,\n usdValue: swapUsd,\n });\n\n // Update available tracking\n sourceData.usd -= swapUsd;\n sourceData.tokenAmount -= tokenAmountIn;\n const slippageFactor = 1 - (slippage / 100);\n if (!availableByToken[depositToken]) availableByToken[depositToken] = { usd: 0, tokenAmount: 0 };\n const receivedUsd = swapUsd * slippageFactor;\n // Estimate received token amount using implied price from existing data,\n // falling back to the pre-computed tokenPrices map (derived from positions\n // and idle balances) so non-USD-pegged tokens like EURC get a real price.\n const existingData = availableByToken[depositToken];\n const impliedPrice = (existingData.tokenAmount > 0 && existingData.usd > 0)\n ? existingData.usd / existingData.tokenAmount\n : (tokenPrices[depositToken] || 1);\n availableByToken[depositToken].usd += receivedUsd;\n availableByToken[depositToken].tokenAmount += receivedUsd / impliedPrice;\n\n shortfallUsd -= swapUsd;\n\n warnings.push(`Swap ${sourceToken} to ${depositToken} involves slippage risk`);\n\n if (shortfallUsd <= MIN_THRESHOLD_USD) break;\n }\n }\n\n // Step 6: Create deposit actions from pending deposits\n // Cap deposit amounts to what's actually available (accounting for swap slippage)\n for (const dep of pendingDeposits) {\n const key = dep.token.toUpperCase();\n const available = availableByToken[key];\n // Convert desired USD to token amount using implied price, falling back\n // to the pre-computed tokenPrices map for non-USD-pegged tokens like EURC.\n const tokenPrice = (available && available.tokenAmount > 0 && available.usd > 0)\n ? available.usd / available.tokenAmount\n : (tokenPrices[key] || 1);\n const desiredTokens = dep.deltaUsd / tokenPrice;\n // Cap to what's actually available (with 5% buffer for swap slippage and\n // rounding — token prices are now derived from real data rather than\n // defaulting to 1:1, so a smaller buffer is sufficient)\n const maxAvailableTokens = available ? available.tokenAmount * 0.95 : 0;\n\n // Skip deposit entirely if no tokens are available\n if (maxAvailableTokens <= MIN_THRESHOLD_USD) {\n warnings.push(`Skipping deposit to ${dep.token} - insufficient available balance`);\n continue;\n }\n\n const depositTokenAmount = Math.min(desiredTokens, maxAvailableTokens);\n\n bundleActions.push({\n body: {\n actionType: 'V2_MANAGE',\n venue: dep.venue,\n action: 'DEPOSIT',\n amount: depositTokenAmount.toString(),\n },\n });\n\n const depositUsd = depositTokenAmount * tokenPrice;\n actionsSummary.push({\n type: 'deposit',\n venue: dep.venueAddress,\n token: dep.token,\n amount: depositTokenAmount.toString(),\n usdValue: depositUsd,\n });\n\n // Reduce available tracking so subsequent deposits of the same token are capped correctly\n if (available) {\n available.usd -= depositUsd;\n available.tokenAmount -= depositTokenAmount;\n }\n }\n\n if (bundleActions.length === 0 && pendingDeposits.length === 0) {\n return jsonResponse({\n actions: [],\n actionsCount: 0,\n warnings: ['Portfolio is already at target allocation'],\n });\n }\n\n // Sort: withdrawals first, then swaps, then deposits\n bundleActions.sort((a, b) => {\n const getOrder = (action: any) => {\n if (action.body.action === 'WITHDRAW') return 0;\n if (action.body.actionType === 'V2_SWAP') return 1;\n if (action.body.action === 'DEPOSIT') return 2;\n return 3;\n };\n return getOrder(a) - getOrder(b);\n });\n\n actionsSummary.sort((a, b) => {\n const order: Record<string, number> = { withdraw: 0, swap: 1, deposit: 2 };\n return (order[a.type] || 0) - (order[b.type] || 0);\n });\n\n if (actionsSummary.some(a => a.type === 'swap')) {\n warnings.push('Swap amounts are estimates - actual amounts may vary due to slippage');\n }\n\n // Step 7: Call bundle endpoint\n const bundleResponse = await client.earn.earnBundle({\n owner: owner as `0x${string}`,\n chain: chain as any,\n gasSponsorship: true,\n actions: bundleActions as any,\n });\n\n const eip712 = (bundleResponse as any).eip712;\n if (!eip712) {\n return jsonResponse({ error: 'No EIP-712 data returned from bundle API' }, 500);\n }\n\n // Normalize types\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return jsonResponse({\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n actions: actionsSummary,\n actionsCount: bundleActions.length,\n warnings,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to compute rebalance preview';\n return jsonResponse({ error: message }, 502);\n }\n}\n\n// --- Credit Account Handlers ---\n\nconst CREDIT_TOKENS: Record<string, string[]> = {\n base: ['USDC', 'WETH', 'USDT', 'DAI', 'WBTC'],\n ethereum: ['USDC', 'WETH', 'USDT', 'DAI', 'WBTC'],\n arbitrum: ['USDC', 'WETH', 'USDT', 'DAI', 'WBTC'],\n};\n\nasync function handleCreditAccountCheck(\n client: CompassApiSDK,\n params: { owner?: string; chain?: string }\n): Promise<Response> {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n const response = await client.credit.creditCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: owner as `0x${string}`,\n estimateGas: false,\n });\n\n const creditAccountAddress = response.creditAccountAddress;\n const hasTransaction = !!response.transaction;\n\n return jsonResponse({\n creditAccountAddress,\n isDeployed: !hasTransaction,\n needsCreation: hasTransaction,\n });\n}\n\nasync function handleCreditCreateAccount(\n client: CompassApiSDK,\n body: { owner: string; chain?: string },\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base' } = body;\n const { gasSponsorPrivateKey, rpcUrls } = config;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n if (!gasSponsorPrivateKey) {\n return jsonResponse(\n { error: 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.' },\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n return jsonResponse({ error: `No RPC URL configured for chain: ${chain}` }, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const response = await client.credit.creditCreateAccount({\n chain: chain as any,\n owner: owner as `0x${string}`,\n sender: sponsorAccount.address,\n estimateGas: false,\n });\n\n const creditAccountAddress = response.creditAccountAddress;\n\n if (!response.transaction) {\n return jsonResponse({\n creditAccountAddress,\n success: true,\n alreadyExists: true,\n });\n }\n\n const transaction = response.transaction;\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n return jsonResponse({ error: 'Account creation transaction reverted' }, 500);\n }\n\n return jsonResponse({\n creditAccountAddress,\n txHash,\n success: true,\n });\n}\n\nasync function handleCreditPositions(\n client: CompassApiSDK,\n params: { owner?: string; chain?: string }\n): Promise<Response> {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n const response = await client.credit.creditPositions({\n chain: chain as any,\n owner: owner as `0x${string}`,\n });\n\n return jsonResponse(response);\n}\n\nasync function handleCreditBalances(\n client: CompassApiSDK,\n params: { owner?: string; chain?: string }\n): Promise<Response> {\n const { owner, chain = 'base' } = params;\n\n if (!owner) {\n return jsonResponse({ error: 'Missing owner parameter' }, 400);\n }\n\n const tokens = CREDIT_TOKENS[chain.toLowerCase()] || CREDIT_TOKENS['base'];\n const balances = await Promise.allSettled(\n tokens.map(async (token) => {\n const response = await client.token.tokenBalance({\n chain: chain as any,\n token,\n user: owner,\n });\n return {\n tokenSymbol: token,\n amount: (response as any).amount || '0',\n decimals: (response as any).decimals || 18,\n tokenAddress: (response as any).tokenAddress || '',\n };\n })\n );\n\n const result = balances\n .filter((b): b is PromiseFulfilledResult<any> => b.status === 'fulfilled')\n .map((b) => b.value);\n\n return jsonResponse(result);\n}\n\ninterface CreditBundlePrepareBody {\n owner: string;\n chain?: string;\n actions: Array<Record<string, any>>;\n}\n\nasync function handleCreditBundlePrepare(\n client: CompassApiSDK,\n body: CreditBundlePrepareBody\n): Promise<Response> {\n const { owner, chain = 'base', actions } = body;\n\n if (!owner || !actions || actions.length === 0) {\n return jsonResponse({ error: 'Missing owner or actions' }, 400);\n }\n\n const wrappedActions = actions.map((action: any) => ({ body: action }));\n\n const response = await client.credit.creditBundle({\n owner,\n chain: chain as any,\n gasSponsorship: true,\n actions: wrappedActions as any,\n });\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n return jsonResponse({ error: 'No EIP-712 data returned from API' }, 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n SafeTx: types.safeTx || types.SafeTx,\n };\n\n return jsonResponse({\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n actionsCount: (response as any).actionsCount || actions.length,\n });\n}\n\ninterface CreditTransferBody {\n owner: string;\n chain?: string;\n token: string;\n amount: string;\n}\n\nasync function handleCreditTransfer(\n client: CompassApiSDK,\n body: CreditTransferBody\n): Promise<Response> {\n const { owner, chain = 'base', token, amount } = body;\n\n if (!owner || !token || !amount) {\n return jsonResponse({ error: 'Missing required parameters' }, 400);\n }\n\n const response = await client.credit.creditTransfer({\n owner,\n chain: chain as any,\n token,\n amount,\n action: 'DEPOSIT',\n gasSponsorship: true,\n } as any);\n\n const eip712 = (response as any).eip712;\n if (!eip712) {\n return jsonResponse({ error: 'No EIP-712 data returned from API' }, 500);\n }\n\n const types = eip712.types as any;\n const normalizedTypes: Record<string, any> = {\n EIP712Domain: types.eip712Domain || types.EIP712Domain,\n };\n if (types.permitTransferFrom || types.PermitTransferFrom) {\n normalizedTypes.PermitTransferFrom = types.permitTransferFrom || types.PermitTransferFrom;\n }\n if (types.tokenPermissions || types.TokenPermissions) {\n normalizedTypes.TokenPermissions = types.tokenPermissions || types.TokenPermissions;\n }\n if (types.safeTx || types.SafeTx) {\n normalizedTypes.SafeTx = types.safeTx || types.SafeTx;\n }\n\n return jsonResponse({\n eip712,\n normalizedTypes,\n domain: eip712.domain,\n message: eip712.message,\n primaryType: eip712.primaryType,\n });\n}\n\n// --- Credit Execute Handler ---\n\ninterface CreditExecuteBody {\n owner: string;\n eip712: any;\n signature: string;\n chain?: string;\n creditAccountAddress: string;\n}\n\nasync function handleCreditExecute(\n client: CompassApiSDK,\n body: CreditExecuteBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, eip712, signature, chain = 'base' } = body;\n const { gasSponsorPrivateKey, rpcUrls } = config;\n\n if (!owner || !eip712 || !signature) {\n return jsonResponse({ error: 'Missing required parameters (owner, eip712, signature)' }, 400);\n }\n\n if (!gasSponsorPrivateKey) {\n return jsonResponse(\n { error: 'Gas sponsor not configured. Set gasSponsorPrivateKey in handler config.' },\n 500\n );\n }\n\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 500);\n }\n\n const rpcUrl = rpcUrls?.[chain.toLowerCase() as keyof typeof rpcUrls];\n if (!rpcUrl) {\n return jsonResponse({ error: `No RPC URL configured for chain: ${chain}` }, 500);\n }\n\n const sponsorAccount = privateKeyToAccount(gasSponsorPrivateKey as Hex);\n\n const walletClient = createWalletClient({\n account: sponsorAccount,\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n // Delegate to the backend's gas sponsorship prepare endpoint (same proven path\n // as earn). Pass product: \"credit\" so the backend uses the credit Safe address.\n const response = await client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signature,\n product: 'credit',\n });\n\n const transaction = (response as any).transaction;\n if (!transaction) {\n return jsonResponse(\n { error: 'No transaction returned from gas sponsorship prepare' },\n 500\n );\n }\n\n const txHash = await walletClient.sendTransaction({\n to: transaction.to as Hex,\n data: transaction.data as Hex,\n value: transaction.value ? BigInt(transaction.value) : 0n,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n return jsonResponse({ error: 'Transaction reverted' }, 500);\n }\n\n return jsonResponse({ txHash, success: true });\n}\n\n// --- Transaction Receipt Handler ---\n\nasync function handleTxReceipt(\n params: Record<string, string>,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { hash, chain } = params;\n\n if (!hash || !chain) {\n return jsonResponse({ error: 'Missing hash or chain parameter' }, 400);\n }\n\n const rpcUrl = config.rpcUrls?.[chain.toLowerCase() as keyof typeof config.rpcUrls];\n const viemChain = CHAIN_MAP[chain.toLowerCase()];\n\n if (!viemChain) {\n return jsonResponse({ error: `Unsupported chain: ${chain}` }, 400);\n }\n\n if (!rpcUrl) {\n return jsonResponse({ error: `No RPC URL configured for chain: ${chain}` }, 500);\n }\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(rpcUrl),\n });\n\n try {\n const receipt = await publicClient.getTransactionReceipt({\n hash: hash as `0x${string}`,\n });\n return jsonResponse({\n status: receipt.status,\n blockNumber: receipt.blockNumber.toString(),\n });\n } catch {\n return jsonResponse({ status: 'pending' });\n }\n}\n"]}