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 proofCustom 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(),
// ...
})