cdp-wallet-onramp-kit
Version:
Complete toolkit for Coinbase Developer Platform (CDP) Embedded Wallets and Onramp integration with reusable components, utilities, and documentation
127 lines (112 loc) • 3.76 kB
text/typescript
import { NextRequest, NextResponse } from 'next/server';
import { generateJWT, createSessionToken } from 'cdp-wallet-onramp-kit/lib/cdp-auth';
import {
sessionTokenSchema,
validateRequest,
createErrorResponse,
validateEnvironment
} from 'cdp-wallet-onramp-kit/lib/validation';
/**
* API route for creating onramp session tokens
*
* POST /api/onramp/session
*
* Request Body:
* - For wallet users: { userAddress: string, assets?: string[] }
* - For guest checkout: { guestCheckout: true, assets?: string[] }
*
* Response:
* - Success: { sessionToken: string, expiresIn: number }
* - Error: { error: string, details?: Record<string, unknown> }
*
* Copy this file to: app/api/onramp/session/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(sessionTokenSchema, body);
// Generate CDP JWT
const jwt = await generateJWT();
// Create session token with CDP API
const requestBody = 'guestCheckout' in validatedData && validatedData.guestCheckout
? {
// Guest checkout doesn't require specific addresses
addresses: [],
assets: validatedData.assets || ['ETH', 'USDC']
}
: {
addresses: [
{
address: (validatedData as { userAddress: string }).userAddress,
blockchains: ['base']
}
],
assets: validatedData.assets || ['ETH', 'USDC']
};
const sessionToken = await createSessionToken(jwt, requestBody);
return NextResponse.json({
sessionToken,
expiresIn: 300 // 5 minutes
});
} catch (error) {
console.error('Session token creation 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 create session token')) {
return NextResponse.json(
createErrorResponse('Failed to create session token', error.message),
{ status: 502 }
);
}
// Generic error
return NextResponse.json(
createErrorResponse('Failed to create session token. Please try again.'),
{ status: 500 }
);
}
}
// Handle unsupported methods
export async function GET() {
return NextResponse.json(
createErrorResponse('Method not allowed. Use POST to create session tokens.'),
{ status: 405 }
);
}
export async function PUT() {
return NextResponse.json(
createErrorResponse('Method not allowed. Use POST to create session tokens.'),
{ status: 405 }
);
}
export async function DELETE() {
return NextResponse.json(
createErrorResponse('Method not allowed. Use POST to create session tokens.'),
{ status: 405 }
);
}