mustafair-carvid-package-hackathon
Version:
CARV ID implementation files for MustaFair decentralized social media platform
73 lines (65 loc) • 2.49 kB
text/typescript
import CredentialsProvider from 'next-auth/providers/credentials';
import { verifyMessage } from 'viem';
import { createHash } from 'crypto';
export const CarvIdProvider = CredentialsProvider({
id: 'carv-id',
name: 'CARV ID',
credentials: {
address: { label: 'Wallet Address', type: 'text' },
tokenId: { label: 'Token ID', type: 'text' },
signature: { label: 'Signature', type: 'text' },
message: { label: 'Message', type: 'text' },
metadata: { label: 'Metadata', type: 'text' },
web2Achievements: { label: 'Web2 Achievements', type: 'text' },
},
async authorize(credentials) {
if (!credentials?.address || !credentials?.signature || !credentials?.message || !credentials?.tokenId) {
throw new Error('Missing required credentials');
}
try {
// Verify the signature
const isValid = await verifyMessage({
address: credentials.address as `0x${string}`,
message: credentials.message,
signature: credentials.signature as `0x${string}`,
});
if (!isValid) {
throw new Error('Invalid signature');
}
// Parse metadata and achievements
const metadata = credentials.metadata ? JSON.parse(credentials.metadata) : null;
const web2Achievements = credentials.web2Achievements ? JSON.parse(credentials.web2Achievements) : null;
// Create identity data for CARV ID user
const identityData = {
provider: 'carv-id',
providerId: credentials.tokenId,
tokenId: credentials.tokenId,
address: credentials.address,
metadata,
web2Achievements,
timestamp: Date.now(),
};
// Generate identity hash
const identityHash = createHash('sha256')
.update(JSON.stringify(identityData))
.digest('hex');
// Return user object
return {
id: credentials.tokenId,
name: metadata?.name || `CARV ID #${credentials.tokenId}`,
email: credentials.address, // Use address as email-like identifier
image: metadata?.image || null,
tokenId: credentials.tokenId,
address: credentials.address,
identityHash,
identityData,
provider: 'carv-id',
metadata,
web2Achievements,
};
} catch (error) {
console.error('CARV ID authentication error:', error);
throw new Error('Authentication failed');
}
},
});