Guides
Trust Levels

Trust Levels

PartyLayer supports three trust levels for wallet management, allowing users to progressively take more control over their Canton party.

Overview

LevelNameWho SignsSecurityUX
1EmbeddedPartyLayer nodeGoodBest
2CustodialThird-party (Copper.co, Fireblocks)BetterGood
3Self-CustodyUser's own walletBestManual

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

  1. Request — User initiates upgrade via SDK
  2. PartyMigration Contract — A Daml contract is created on Canton
  3. Approval — Operator (PartyLayer) reviews and approves
  4. Execution — Keys/signing authority transferred to new custodian
  5. 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"
  }
}