UNPKG

cdp-wallet-onramp-kit

Version:

Complete toolkit for Coinbase Developer Platform (CDP) Embedded Wallets and Onramp integration with reusable components, utilities, and documentation

125 lines (112 loc) 3.72 kB
import { NextRequest, NextResponse } from 'next/server'; import { generateOnrampUrl } from 'cdp-wallet-onramp-kit/lib/cdp-auth'; import { onrampUrlSchema, validateRequest, createErrorResponse, validateEnvironment } from 'cdp-wallet-onramp-kit/lib/validation'; /** * API route for generating complete onramp URLs with session tokens * * POST /api/onramp/url * * Request Body: * { * addresses: Array<{ address: string, blockchains: string[] }>, * assets?: string[], * defaultAsset?: string, * defaultNetwork?: string, * presetFiatAmount?: number, * presetCryptoAmount?: number, * redirectUrl?: string, * partnerUserId?: string * } * * Response: * - Success: { url: string, expiresIn: number } * - Error: { error: string, details?: Record<string, unknown> } * * Copy this file to: app/api/onramp/url/route.ts */ export async function POST(request: NextRequest) { try { // Validate environment variables const envCheck = validateEnvironment(); if (!envCheck.isValid) { console.error('Missing environment variables:', envCheck.missing); return NextResponse.json( createErrorResponse( 'Server configuration error. Please check your CDP API credentials.', { missing: envCheck.missing } ), { status: 500 } ); } // Parse and validate request body const body = await request.json(); const validatedData = validateRequest(onrampUrlSchema, body); // Generate complete onramp URL with session token const onrampUrl = await generateOnrampUrl({ addresses: validatedData.addresses, assets: validatedData.assets, defaultAsset: validatedData.defaultAsset, defaultNetwork: validatedData.defaultNetwork, presetFiatAmount: validatedData.presetFiatAmount, presetCryptoAmount: validatedData.presetCryptoAmount, redirectUrl: validatedData.redirectUrl, partnerUserId: validatedData.partnerUserId }); return NextResponse.json({ url: onrampUrl, expiresIn: 300 // URL is valid for 5 minutes (session token lifetime) }); } catch (error) { console.error('Onramp URL generation error:', error); // Handle validation errors if (error instanceof Error && error.message.startsWith('Validation failed')) { return NextResponse.json( createErrorResponse('Invalid request parameters', error.message), { status: 400 } ); } // Handle CDP API key errors if (error instanceof Error && error.message.includes('CDP_API_KEY')) { return NextResponse.json( createErrorResponse('Server configuration error. Please check your CDP API credentials.'), { status: 500 } ); } // Handle CDP API errors if (error instanceof Error && error.message.includes('Failed to')) { return NextResponse.json( createErrorResponse('Failed to generate onramp URL', error.message), { status: 502 } ); } // Generic error return NextResponse.json( createErrorResponse('Failed to generate onramp URL. Please try again.'), { status: 500 } ); } } // Handle unsupported methods export async function GET() { return NextResponse.json( createErrorResponse('Method not allowed. Use POST to generate onramp URLs.'), { status: 405 } ); } export async function PUT() { return NextResponse.json( createErrorResponse('Method not allowed. Use POST to generate onramp URLs.'), { status: 405 } ); } export async function DELETE() { return NextResponse.json( createErrorResponse('Method not allowed. Use POST to generate onramp URLs.'), { status: 405 } ); }