@compass-labs/widgets 0.1.2 → 0.1.3

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.
@@ -516,7 +516,7 @@ async function handleSwapQuote(client, params) {
516
516
  slippage: 1,
517
517
  gasSponsorship: true
518
518
  });
519
- const estimatedAmountOut = response.estimatedAmountOut;
519
+ const estimatedAmountOut = response.estimatedAmountOut || "0";
520
520
  return jsonResponse({
521
521
  tokenIn,
522
522
  tokenOut,
@@ -525,9 +525,30 @@ async function handleSwapQuote(client, params) {
525
525
  });
526
526
  } catch (error) {
527
527
  console.error("Swap quote error:", error);
528
+ let errorMessage = "Failed to get swap quote";
529
+ try {
530
+ const bodyMessage = error?.body?.message || error?.message || "";
531
+ if (bodyMessage.includes("{")) {
532
+ const jsonMatch = bodyMessage.match(/\{.*\}/s);
533
+ if (jsonMatch) {
534
+ const parsed = JSON.parse(jsonMatch[0]);
535
+ errorMessage = parsed.description || parsed.error || parsed.message || errorMessage;
536
+ }
537
+ } else if (bodyMessage) {
538
+ const balanceMatch = bodyMessage.match(/Insufficient \w+ balance[^.]+/i);
539
+ if (balanceMatch) {
540
+ errorMessage = balanceMatch[0];
541
+ } else {
542
+ errorMessage = bodyMessage;
543
+ }
544
+ }
545
+ } catch {
546
+ errorMessage = error?.body?.error || error?.message || "Failed to get swap quote";
547
+ }
528
548
  return jsonResponse({
529
- error: error instanceof Error ? error.message : "Failed to get swap quote"
530
- }, 500);
549
+ error: "Swap quote failed",
550
+ message: errorMessage
551
+ }, 400);
531
552
  }
532
553
  }
533
554
  async function handleSwapPrepare(client, body) {
@@ -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 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 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 console.error('[Compass Handler Error]', error);\n const message = error instanceof Error ? error.message : 'Internal server error';\n return jsonResponse({ error: message }, 500);\n }\n };\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 all operations) ---\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 // Create public client for waiting on receipts\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,\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 // 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: 'Transaction reverted' }, 500);\n }\n\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 console.log('[Transfer Approve] Checking approval for:', { owner, chain, token });\n\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 console.log('[Transfer Approve] Full API response keys:', Object.keys(response));\n console.log('[Transfer Approve] API response:', JSON.stringify(response, null, 2));\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 console.log('[Transfer Approve] No eip712 or transaction - returning approved: true');\n return jsonResponse({\n approved: true,\n message: 'Token already approved for Permit2',\n });\n }\n\n if (eip712) {\n console.log('[Transfer Approve] Got EIP712 data - returning approved: false');\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 TransferPrepareBody {\n owner: string;\n chain?: string;\n token: string;\n amount: string;\n action: 'DEPOSIT' | 'WITHDRAW';\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 } = 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 console.log('[Transfer Prepare] Using gas sponsor as spender:', spender);\n }\n\n console.log('[Transfer Prepare] Calling earnTransfer with:', {\n owner,\n chain,\n token,\n amount,\n action,\n gasSponsorship: true,\n spender,\n });\n\n const 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 console.log('[Transfer Prepare] EIP712 message spender:', (response as any).eip712?.message?.spender);\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}\n\nasync function handleTransferExecute(\n client: CompassApiSDK,\n body: TransferExecuteBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base', eip712, signature } = 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 console.log('[Transfer Execute] Gas sponsor address:', sponsorAccount.address);\n console.log('[Transfer Execute] EIP712 primaryType:', eip712?.primaryType);\n console.log('[Transfer Execute] EIP712 message spender:', eip712?.message?.spender);\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 console.log('[Transfer Execute] Full request to gasSponsorshipPrepare:', JSON.stringify({\n chain,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signatureLength: signature?.length,\n }, null, 2));\n\n let response;\n try {\n response = await client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signature,\n });\n } catch (prepareError: any) {\n console.error('[Transfer Execute] gasSponsorshipPrepare failed:', {\n error: prepareError?.message,\n body: prepareError?.body,\n statusCode: prepareError?.statusCode,\n });\n throw prepareError;\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// --- 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;\n\n return jsonResponse({\n tokenIn,\n tokenOut,\n amountIn,\n estimatedAmountOut: estimatedAmountOut?.toString() || '0',\n });\n } catch (error) {\n console.error('Swap quote error:', error);\n return jsonResponse({\n error: error instanceof Error ? error.message : 'Failed to get swap quote'\n }, 500);\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 console.error('Swap prepare error:', 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 console.log('[Swap Execute] Calling gasSponsorshipPrepare...');\n\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 console.log('[Swap Execute] Transaction successful:', txHash);\n\n return jsonResponse({ txHash, success: true });\n } catch (error) {\n console.error('Swap execute error:', 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).balance || '0',\n balanceRaw: (response as any).balanceRaw || '0',\n });\n } catch (error) {\n console.error('Token balance error:', error);\n return jsonResponse({\n token,\n address,\n balance: '0',\n balanceRaw: '0',\n });\n }\n}\n\n// --- Bundle Handlers ---\n\ninterface BundleAction {\n action_type: 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"]}
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 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 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 console.error('[Compass Handler Error]', error);\n const message = error instanceof Error ? error.message : 'Internal server error';\n return jsonResponse({ error: message }, 500);\n }\n };\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 all operations) ---\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 // Create public client for waiting on receipts\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,\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 // 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: 'Transaction reverted' }, 500);\n }\n\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 console.log('[Transfer Approve] Checking approval for:', { owner, chain, token });\n\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 console.log('[Transfer Approve] Full API response keys:', Object.keys(response));\n console.log('[Transfer Approve] API response:', JSON.stringify(response, null, 2));\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 console.log('[Transfer Approve] No eip712 or transaction - returning approved: true');\n return jsonResponse({\n approved: true,\n message: 'Token already approved for Permit2',\n });\n }\n\n if (eip712) {\n console.log('[Transfer Approve] Got EIP712 data - returning approved: false');\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 TransferPrepareBody {\n owner: string;\n chain?: string;\n token: string;\n amount: string;\n action: 'DEPOSIT' | 'WITHDRAW';\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 } = 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 console.log('[Transfer Prepare] Using gas sponsor as spender:', spender);\n }\n\n console.log('[Transfer Prepare] Calling earnTransfer with:', {\n owner,\n chain,\n token,\n amount,\n action,\n gasSponsorship: true,\n spender,\n });\n\n const 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 console.log('[Transfer Prepare] EIP712 message spender:', (response as any).eip712?.message?.spender);\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}\n\nasync function handleTransferExecute(\n client: CompassApiSDK,\n body: TransferExecuteBody,\n config: CompassHandlerConfig\n): Promise<Response> {\n const { owner, chain = 'base', eip712, signature } = 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 console.log('[Transfer Execute] Gas sponsor address:', sponsorAccount.address);\n console.log('[Transfer Execute] EIP712 primaryType:', eip712?.primaryType);\n console.log('[Transfer Execute] EIP712 message spender:', eip712?.message?.spender);\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 console.log('[Transfer Execute] Full request to gasSponsorshipPrepare:', JSON.stringify({\n chain,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signatureLength: signature?.length,\n }, null, 2));\n\n let response;\n try {\n response = await client.gasSponsorship.gasSponsorshipPrepare({\n chain: chain as any,\n owner,\n sender: sponsorAccount.address,\n eip712,\n signature,\n });\n } catch (prepareError: any) {\n console.error('[Transfer Execute] gasSponsorshipPrepare failed:', {\n error: prepareError?.message,\n body: prepareError?.body,\n statusCode: prepareError?.statusCode,\n });\n throw prepareError;\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// --- 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 console.error('Swap quote error:', error);\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 console.error('Swap prepare error:', 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 console.log('[Swap Execute] Calling gasSponsorshipPrepare...');\n\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 console.log('[Swap Execute] Transaction successful:', txHash);\n\n return jsonResponse({ txHash, success: true });\n } catch (error) {\n console.error('Swap execute error:', 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).balance || '0',\n balanceRaw: (response as any).balanceRaw || '0',\n });\n } catch (error) {\n console.error('Token balance error:', error);\n return jsonResponse({\n token,\n address,\n balance: '0',\n balanceRaw: '0',\n });\n }\n}\n\n// --- Bundle Handlers ---\n\ninterface BundleAction {\n action_type: 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"]}
@@ -514,7 +514,7 @@ async function handleSwapQuote(client, params) {
514
514
  slippage: 1,
515
515
  gasSponsorship: true
516
516
  });
517
- const estimatedAmountOut = response.estimatedAmountOut;
517
+ const estimatedAmountOut = response.estimatedAmountOut || "0";
518
518
  return jsonResponse({
519
519
  tokenIn,
520
520
  tokenOut,
@@ -523,9 +523,30 @@ async function handleSwapQuote(client, params) {
523
523
  });
524
524
  } catch (error) {
525
525
  console.error("Swap quote error:", error);
526
+ let errorMessage = "Failed to get swap quote";
527
+ try {
528
+ const bodyMessage = error?.body?.message || error?.message || "";
529
+ if (bodyMessage.includes("{")) {
530
+ const jsonMatch = bodyMessage.match(/\{.*\}/s);
531
+ if (jsonMatch) {
532
+ const parsed = JSON.parse(jsonMatch[0]);
533
+ errorMessage = parsed.description || parsed.error || parsed.message || errorMessage;
534
+ }
535
+ } else if (bodyMessage) {
536
+ const balanceMatch = bodyMessage.match(/Insufficient \w+ balance[^.]+/i);
537
+ if (balanceMatch) {
538
+ errorMessage = balanceMatch[0];
539
+ } else {
540
+ errorMessage = bodyMessage;
541
+ }
542
+ }
543
+ } catch {
544
+ errorMessage = error?.body?.error || error?.message || "Failed to get swap quote";
545
+ }
526
546
  return jsonResponse({
527
- error: error instanceof Error ? error.message : "Failed to get swap quote"
528
- }, 500);
547
+ error: "Swap quote failed",
548
+ message: errorMessage
549
+ }, 400);
529
550
  }
530
551
  }
531
552
  async function handleSwapPrepare(client, body) {