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
text/typescript
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 }
);
}