Trust Levels
PartyLayer supports three trust levels for wallet management, allowing users to progressively take more control over their Canton party.
Overview
| Level | Name | Who Signs | Security | UX |
|---|---|---|---|---|
| 1 | Embedded | PartyLayer node | Good | Best |
| 2 | Custodial | Third-party (Copper.co, Fireblocks) | Better | Good |
| 3 | Self-Custody | User's own wallet | Best | Manual |
Level 1: Embedded (Default)
PartyLayer's Canton participant node signs transactions on behalf of the user. The user authenticates via Auth0, and PartyLayer submits commands using their allocated party.
Pros: Zero friction, no wallet setup, instant onboarding Cons: Trust in PartyLayer as custodian
// Users start at embedded level by default
const { wallet } = useWallet();
console.log(wallet.trustLevel); // 'embedded'Level 2: Custodial
A regulated third-party custodian (Copper.co or Fireblocks) holds signing authority. PartyLayer submits unsigned commands, and the custodian signs them.
Pros: Regulatory compliance, institutional-grade security Cons: Requires custodian account, slightly more latency
Level 3: Self-Custody
The user connects their own Canton-compatible wallet (Canton Console, Loop, etc.) and signs transactions directly.
Pros: Full control, no third-party trust Cons: User must manage their own wallet
Migration Flow
Users can upgrade their trust level through a Daml-based migration contract:
import { useTrustLevel } from '@partylayer/enterprise-react';
function UpgradeWallet() {
const { level, requestUpgrade, isUpgrading } = useTrustLevel();
return (
<div>
<p>Current Level: {level}</p>
{level === 'embedded' && (
<button
onClick={() => requestUpgrade('custodial')}
disabled={isUpgrading}
>
{isUpgrading ? 'Upgrading...' : 'Upgrade to Custodial'}
</button>
)}
</div>
);
}Migration Process
- Request — User initiates upgrade via SDK
- PartyMigration Contract — A Daml contract is created on Canton
- Approval — Operator (PartyLayer) reviews and approves
- Execution — Keys/signing authority transferred to new custodian
- Completion — Wallet record updated, webhook event fired
Migration Events
// Webhook: user.upgraded
{
"type": "user.upgraded",
"data": {
"userId": "usr_abc",
"fromLevel": "embedded",
"toLevel": "custodial",
"completedAt": "2026-03-01T12:00:00Z"
}
}