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-sdkSetup
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
- Concepts — What is an ASP? — Merkle tree, membership proofs
- SDK Reference — full API documentation
- Running an ASP — operate your own compliance service