Add New Wallet Adapter in Wallet Service

Adding New Wallet Providers

The system is designed to be provider-agnostic through the adapter pattern. To add a new wallet provider, follow these steps:

1. Create a New Adapter

Create a new adapter file in src/adapters/ (e.g., newprovider.adapter.ts):

import { Injectable } from '@nestjs/common';
import { IWalletAdapter, IWalletAdapterWithOtp } from './interfaces/wallet-adapter.interface';
import { OnboardUserDto } from '../dto/onboard-user.dto';
import { UploadVcDto } from '../dto/upload-vc.dto';
import { WatchVcDto } from '../dto/watch-vc.dto';
import { WatchCallbackDto } from '../dto/watch-callback.dto';

@Injectable()
export class NewProviderAdapter implements IWalletAdapter {
  private readonly apiBaseUrl: string;
  private readonly apiKey: string;

  constructor() {
    this.apiBaseUrl = process.env.NEW_PROVIDER_API_BASE || '';
    this.apiKey = process.env.NEW_PROVIDER_API_KEY || '';
  }

  async onboardUser(data: OnboardUserDto) {
    // Implement user onboarding logic
    // Make API calls to the new provider
    // Transform responses to match the interface
  }

  async getAllVCs(userId: string, token: string) {
    // Implement VC listing logic
  }

  async getVCById(userId: string, vcId: string, token: string) {
    // Implement VC retrieval logic
  }

  async uploadVCFromQR(userId: string, qrData: string, token: string) {
    // Implement VC upload logic
  }

  async login(data: any) {
    // Implement login logic
  }

  // Optional: Implement OTP methods if supported
  async verifyLogin?(data: any) {
    // Implement OTP verification
  }

  async resendOtp?(data: any) {
    // Implement OTP resend
  }

  // Optional: Implement watching methods if supported
  async watchVC?(data: WatchVcDto) {
    // Implement VC watching
  }

  async processCallback?(data: WatchCallbackDto) {
    // Implement callback processing
  }
}

2. Update the Adapter Factory

Modify src/adapters/adapter.factory.ts:

import { DhiwayAdapter } from './dhiway.adapter';
import { NewProviderAdapter } from './newprovider.adapter';

export function createWalletAdapter(): IWalletAdapter {
  const provider = process.env.WALLET_PROVIDER || 'dhiway';
  
  switch (provider) {
    case 'dhiway':
      return new DhiwayAdapter();
    case 'newprovider':
      return new NewProviderAdapter();
    default:
      throw new Error(`Unsupported wallet provider: ${provider}`);
  }
}

3. Update Environment Variables

Add new provider configuration to .env.example:

# New Provider Configuration
NEW_PROVIDER_API_BASE=https://api.newprovider.com
NEW_PROVIDER_API_KEY=your-new-provider-api-key

4. Update the Wallet Module

Modify src/wallet/wallet.module.ts:

import { NewProviderAdapter } from '../adapters/newprovider.adapter';

@Module({
  // ... existing imports
  providers: [
    WalletService,
    WalletVCService,
    WalletVCWatcherService,
    WatcherCronService,
    {
      provide: 'WALLET_ADAPTER',
      useFactory: createWalletAdapter,
    },
    DhiwayAdapter,
    NewProviderAdapter, // Add new adapter
  ],
  // ... rest of module
})
export class WalletModule {}

5. Update Configuration

Set the new provider in your environment:

WALLET_PROVIDER=newprovider

Last updated