@mustafair/reputation-sdk
Version:
Official SDK for integrating CARV ID authentication and MustaFair reputation systems into decentralized applications
473 lines (368 loc) • 11.7 kB
Markdown
# @mustafair/reputation-sdk
The official SDK for integrating CARV ID authentication and MustaFair reputation systems into decentralized applications.
[](https://badge.fury.io/js/@mustafair%2Freputation-sdk)
[](https://opensource.org/licenses/MIT)
## Features
- 🔐 **CARV ID Authentication** - Seamless Web3 identity verification
- 🏆 **Reputation System** - Access on-chain reputation NFTs and scoring
- 🌐 **Multi-chain Support** - BSC Testnet and local development
- 📊 **Comprehensive APIs** - Query profiles, leaderboards, and statistics
- 🔗 **Web2 Integration** - GitHub and Google account binding
- 🛠️ **Developer Friendly** - TypeScript support with full type safety
- ⚡ **Performance Optimized** - Batch operations and caching
## Installation
```bash
npm install @mustafair/reputation-sdk
# With yarn
yarn add @mustafair/reputation-sdk
# With pnpm
pnpm add @mustafair/reputation-sdk
```
### Peer Dependencies
If you're building a Web3 dApp, you'll likely want to install these peer dependencies:
```bash
npm install viem wagmi
```
## Quick Start
### Basic Usage (Public APIs Only)
```typescript
import { Fair3ReputationSDK } from '@mustafair/reputation-sdk';
// Initialize the SDK
const sdk = new Fair3ReputationSDK('https://musta-fair.vercel.app');
// Get user's reputation profile
const profile = await sdk.getProfile('0x742B6A2A5e29Ad0C20a78B5b6dE55fB2E8B1e8C3');
console.log('Reputation Score:', profile.reputation?.contributionScore);
// Check if user has a CARV ID
const hasIdentity = await sdk.hasCarvId('0x742B6A2A5e29Ad0C20a78B5b6dE55fB2E8B1e8C3');
// Get leaderboard
const leaderboard = await sdk.getLeaderboard({
tier: 'Gold',
sortBy: 'score',
limit: 10
});
```
### With CARV ID Authentication
```typescript
import { Fair3ReputationSDK } from '@mustafair/reputation-sdk';
import { useAccount, useSignMessage } from 'wagmi';
const sdk = new Fair3ReputationSDK('https://musta-fair.vercel.app', 10000, {
contractAddress: '0x742B6A2A5e29Ad0C20a78B5b6dE55fB2E8B1e8C3',
chainId: 97 // BSC Testnet
});
// Initialize with wallet connection
const { address, isConnected, chainId } = useAccount();
const { signMessageAsync } = useSignMessage();
await sdk.initialize({
address: address!,
isConnected,
chainId: chainId!
});
// Authenticate with CARV ID
const authResult = await sdk.authenticateWithCarvId(
(message) => signMessageAsync({ message }),
{
fetchMetadata: true,
fetchWeb2Achievements: true
}
);
if (authResult.success) {
console.log('Authentication successful:', authResult.user);
} else {
console.error('Authentication failed:', authResult.error);
}
```
## API Reference
### Constructor
```typescript
new Fair3ReputationSDK(baseUrl?, timeout?, authConfig?)
```
- `baseUrl` (optional): API base URL (default: 'https://musta-fair.vercel.app')
- `timeout` (optional): Request timeout in ms (default: 10000)
- `authConfig` (optional): CARV ID authentication configuration
### Core Methods
#### Profile & Identity
```typescript
// Get complete user profile
const profile = await sdk.getProfile(address: string): Promise<FullProfileData>
// Get CARV ID profile only
const carvId = await sdk.getCarvIdProfile(address: string): Promise<CarvIdProfile>
// Get reputation data only
const reputation = await sdk.getReputation(address: string): Promise<ReputationData | null>
// Check if user has CARV ID
const hasId = await sdk.hasCarvId(address: string): Promise<boolean>
// Check if user has reputation NFT
const hasRep = await sdk.hasReputation(address: string): Promise<boolean>
```
#### Leaderboards & Statistics
```typescript
// Get paginated leaderboard
const leaderboard = await sdk.getLeaderboard(filters?: LeaderboardFilters): Promise<LeaderboardData>
// Get platform statistics
const stats = await sdk.getStats(): Promise<PlatformStats>
// Get top performers by tier
const topUsers = await sdk.getTopPerformers(tier?: string, limit?: number): Promise<LeaderboardEntry[]>
```
#### Authentication (Web3 Integration Required)
```typescript
// Initialize SDK with wallet connection
await sdk.initialize(walletConnection?: WalletConnection): Promise<void>
// Set wallet connection
sdk.setWalletConnection(connection: WalletConnection): void
// Authenticate with CARV ID
const result = await sdk.authenticateWithCarvId(
signMessage: (message: string) => Promise<string>,
options?: AuthOptions
): Promise<AuthenticationResult>
// Check if wallet is ready for authentication
const isReady = sdk.isWalletReady(): boolean
```
#### Utility Methods
```typescript
// Validate Ethereum addresses
const { valid, invalid } = Fair3ReputationSDK.validateAddresses(addresses: string[])
// Check reputation requirements
const check = await sdk.checkReputationRequirements(address: string, requirements: Requirements)
// Batch fetch profiles
const profiles = await sdk.getBatchProfiles(addresses: string[], options?: BatchOptions)
// Get tier numeric value
const tierValue = Fair3ReputationSDK.getTierValue(tier: string): number
// Format score with suffix
const formatted = Fair3ReputationSDK.formatScore(score: number): string
```
## Type Definitions
### Core Interfaces
```typescript
interface ReputationData {
tokenId: string;
contributionScore: number;
tier: 'Bronze' | 'Silver' | 'Gold' | 'Platinum';
tierLevel: number;
creationDate: string;
carvIdLinked: boolean;
carvIdHash: string;
isActive: boolean;
metadata: any;
contractAddress: string;
}
interface CarvIdData {
tokenId: string;
metadata: any;
contractAddress: string;
isValid: boolean;
}
interface Web2Binding {
provider: 'github' | 'google';
username?: string;
email?: string;
verified: boolean;
linkedAt: string;
}
interface FullProfileData {
wallet: string;
reputation: ReputationData | null;
carvId: CarvIdData | null;
web2Achievements: Web2Achievements | null;
network: string;
chainId: number;
contracts: {
reputationNFT?: string;
carvId?: string;
};
timestamp: string;
}
```
### Authentication Interfaces
```typescript
interface WalletConnection {
address: string;
isConnected: boolean;
chainId: number;
connector?: any;
}
interface CarvIdAuthConfig {
contractAddress: string;
chainId: number;
requiredChains?: number[];
signMessageTemplate?: string;
}
interface AuthenticationResult {
success: boolean;
user?: {
address: string;
tokenId: string;
signature: string;
message: string;
metadata?: any;
web2Achievements?: any;
identityHash: string;
};
error?: string;
}
```
## Integration Examples
### React + Wagmi
```typescript
import { Fair3ReputationSDK } from '@mustafair/reputation-sdk';
import { useAccount, useSignMessage } from 'wagmi';
import { useEffect, useState } from 'react';
function MyComponent() {
const { address, isConnected, chainId } = useAccount();
const { signMessageAsync } = useSignMessage();
const [sdk] = useState(() => new Fair3ReputationSDK());
const [profile, setProfile] = useState(null);
useEffect(() => {
if (isConnected && address) {
sdk.initialize({ address, isConnected, chainId: chainId! });
loadProfile();
}
}, [isConnected, address, chainId]);
const loadProfile = async () => {
try {
const userProfile = await sdk.getProfile(address!);
setProfile(userProfile);
} catch (error) {
console.error('Failed to load profile:', error);
}
};
const authenticate = async () => {
try {
const result = await sdk.authenticateWithCarvId(
(message) => signMessageAsync({ message })
);
if (result.success) {
console.log('Authenticated!', result.user);
}
} catch (error) {
console.error('Authentication failed:', error);
}
};
return (
<div>
{profile?.reputation && (
<div>
<h3>Reputation: {profile.reputation.tier}</h3>
<p>Score: {profile.reputation.contributionScore}</p>
</div>
)}
<button onClick={authenticate}>Authenticate with CARV ID</button>
</div>
);
}
```
### Node.js Backend
```typescript
import { Fair3ReputationSDK } from '@mustafair/reputation-sdk';
const sdk = new Fair3ReputationSDK();
// API endpoint to get user reputation
app.get('/api/user/:address/reputation', async (req, res) => {
try {
const { address } = req.params;
const reputation = await sdk.getReputation(address);
if (!reputation) {
return res.status(404).json({ error: 'No reputation found' });
}
res.json(reputation);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Check if user meets requirements
app.post('/api/check-requirements', async (req, res) => {
const { address, requirements } = req.body;
const check = await sdk.checkReputationRequirements(address, requirements);
res.json(check);
});
```
### Vue.js + Viem
```typescript
import { Fair3ReputationSDK } from '@mustafair/reputation-sdk';
import { createWalletClient, custom } from 'viem';
import { bscTestnet } from 'viem/chains';
export default {
data() {
return {
sdk: new Fair3ReputationSDK(),
wallet: null,
profile: null
};
},
async mounted() {
await this.connectWallet();
},
methods: {
async connectWallet() {
if (window.ethereum) {
this.wallet = createWalletClient({
chain: bscTestnet,
transport: custom(window.ethereum)
});
const [address] = await this.wallet.getAddresses();
await this.sdk.initialize({
address,
isConnected: true,
chainId: bscTestnet.id
});
this.profile = await this.sdk.getProfile(address);
}
},
async authenticate() {
const result = await this.sdk.authenticateWithCarvId(
async (message) => {
const [address] = await this.wallet.getAddresses();
return await this.wallet.signMessage({
account: address,
message
});
}
);
if (result.success) {
console.log('Authenticated!', result.user);
}
}
}
};
```
## Error Handling
The SDK provides comprehensive error handling with specific error types:
```typescript
try {
const profile = await sdk.getProfile(address);
} catch (error) {
if (error.message.includes('Invalid address')) {
// Handle invalid address
} else if (error.message.includes('timeout')) {
// Handle timeout
} else {
// Handle other errors
}
}
```
## Constants
The SDK exports useful constants:
```typescript
import { FAIR3_CONSTANTS } from '@mustafair/reputation-sdk';
console.log(FAIR3_CONSTANTS.SUPPORTED_CHAINS);
console.log(FAIR3_CONSTANTS.CONTRACT_ADDRESSES);
console.log(FAIR3_CONSTANTS.TIER_VALUES);
console.log(FAIR3_CONSTANTS.API_ENDPOINTS);
```
## Development
### Building from Source
```bash
git clone https://github.com/chrsnikhil/MustaFair.git
cd MustaFair/sdk
npm install
npm run build
```
### Testing
```bash
npm run test
```
## Support
- **Documentation**: [https://musta-fair.vercel.app/docs](https://musta-fair.vercel.app/docs)
- **GitHub Issues**: [https://github.com/chrsnikhil/MustaFair/issues](https://github.com/chrsnikhil/MustaFair/issues)
- **Demo**: [https://musta-fair.vercel.app](https://musta-fair.vercel.app)
## Related Projects
- [MustaFair Platform](https://musta-fair.vercel.app) - The main platform
- [CARV Protocol](https://carv.io) - The underlying identity protocol
---