UPC — Universal Private ComplianceSDK Reference

Storage Providers

IASPProvider implementations — MemoryProvider, LocalStorageProvider, and RESTProvider for different ASP storage backends.

Storage Providers

The IASPProvider interface abstracts where the ASP's Merkle tree data is stored. All providers implement the same interface:

interface IASPProvider {
  getMembers(): Promise<string[]>
  addMember(address: string): Promise<void>
  removeMember(address: string): Promise<void>
  getRoot(): Promise<Hex>
  saveRoot(root: Hex): Promise<void>
}

MemoryProvider

In-memory storage — data is lost on process restart. Useful for testing and development.

import { MemoryProvider } from '@permissionless-technologies/upc-sdk/providers'

const provider = new MemoryProvider()
// Optionally seed with initial members
const provider = new MemoryProvider({
  initialMembers: ['0xAddress1', '0xAddress2'],
})

LocalStorageProvider

Browser localStorage — persists across page refreshes. Suitable for client-side ASPs in browser environments.

import { LocalStorageProvider } from '@permissionless-technologies/upc-sdk/providers'

const provider = new LocalStorageProvider({
  key: 'my-asp-data',  // localStorage key (default: 'upc-asp')
})

RESTProvider

Communicates with a remote ASP API server. Use this when the ASP is operated server-side and clients need to query it for proof generation.

import { RESTProvider } from '@permissionless-technologies/upc-sdk/providers'

// Client-side: read-only provider pointing to your ASP API
const provider = new RESTProvider({
  url: 'https://my-asp.example.com/api',
  apiKey?: string,   // optional authentication
})

The REST API follows the standard UPC ASP API schema (OpenAPI spec available in the SDK):

GET  /members           - List all member addresses
POST /members           - Add a member
DELETE /members/:addr   - Remove a member
GET  /root              - Current Merkle root
GET  /proof/:address    - Generate membership proof

Custom Provider

Implement IASPProvider to use any storage backend (database, IPFS, etc.):

import { IASPProvider } from '@permissionless-technologies/upc-sdk/providers'

class DatabaseProvider implements IASPProvider {
  async getMembers(): Promise<string[]> {
    return db.query('SELECT address FROM asp_members')
  }

  async addMember(address: string): Promise<void> {
    await db.run('INSERT INTO asp_members (address) VALUES (?)', address)
  }

  // ... implement all interface methods
}

const asp = createASPClient({
  provider: new DatabaseProvider(),
  // ...
})

On this page