UPC — Universal Private Compliance

SDK Quickstart

Install the UPC SDK, create an ASP, add members, and generate your first membership proof.

Installation

npm install @permissionless-technologies/upc-sdk

Setup

import { createASPClient } from '@permissionless-technologies/upc-sdk'
import { createPublicClient, createWalletClient, http } from 'viem'
import { mainnet } from 'viem/chains'

const publicClient = createPublicClient({ chain: mainnet, transport: http() })
const walletClient = createWalletClient({ chain: mainnet, transport: http() })

const asp = createASPClient({
  publicClient,
  walletClient,
  registryAddress: '0x...AttestationHubAddress',
  provider: new MemoryProvider(),   // or LocalStorageProvider, RESTProvider
})

Register an ASP On-Chain

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

// Register your ASP in the AttestationHub
const { aspId, txHash } = await asp.register({
  name: 'My Compliance ASP',
  description: 'OFAC sanctions screen for DeFi protocol',
  url: 'https://my-asp.example.com',
  walletClient,
})

console.log('ASP registered with ID:', aspId)

Add Members

// Add an approved address to the ASP Merkle tree
await asp.addMember('0xApprovedAddress')

// Add multiple members at once
await asp.addMembers([
  '0xAddress1',
  '0xAddress2',
  '0xAddress3',
])

Publish Root On-Chain

// Publish the current Merkle root to the AttestationHub
const { txHash } = await asp.publishRoot({ walletClient })
console.log('Root published:', txHash)

Generate a Membership Proof

On the user side:

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

const userAsp = createASPClient({
  publicClient,
  registryAddress: '0x...AttestationHubAddress',
  provider: new RESTProvider({ url: 'https://my-asp.example.com' }),
})

// Generate ZK membership proof for your identity
const proof = await userAsp.generateProof({
  identity: myAddress,    // The address to prove membership for
  aspId: 1n,
})

console.log('Proof generated:', proof)

Verify a Proof On-Chain

// Verify the proof against the AttestationHub (on-chain)
const isValid = await asp.verifyProof({
  proof,
  aspId: 1n,
})

console.log('Proof valid:', isValid)

React Integration

import { ASPProvider, useASP } from '@permissionless-technologies/upc-sdk/react'

function ComplianceStatus() {
  const { isCompliant, proof, generateProof } = useASP({ aspId: 1n })

  return (
    <div>
      <p>Compliance status: {isCompliant ? 'Approved' : 'Not approved'}</p>
      {!isCompliant && (
        <button onClick={generateProof}>Generate Compliance Proof</button>
      )}
    </div>
  )
}

Use in a Smart Contract

import { IAttestationVerifier } from "@permissionless-technologies/upc-sdk/contracts";

contract MyDeFiProtocol {
    IAttestationVerifier public immutable verifier;

    constructor(address _verifier) {
        verifier = IAttestationVerifier(_verifier);
    }

    function deposit(uint256 amount, bytes calldata proof) external {
        // Require membership proof from this ASP
        require(verifier.verify(msg.sender, proof), "Compliance proof required");
        // ... deposit logic
    }
}

Next Steps

On this page