Hanzo

MPC Wallets

Non-custodial MPC-powered wallets for customers and institutional clients with threshold signatures and key share rotation.

MPC Wallets — Non-Custodial Client Wallets

Lux Financial uses MPC (Multi-Party Computation) threshold signatures for all client wallets. No single party — not even Lux — ever holds a complete private key. Clients maintain true self-custody with institutional-grade security.

How It Works

Client Device          Lux MPC Node          Recovery Node
     |                      |                      |
     |    Key Share 1       |    Key Share 2       |    Key Share 3
     |                      |                      |
     +----------+-----------+----------+-----------+
                |                      |
           Threshold Signing (2-of-3)
                |
           Valid Signature
                |
           Broadcast to Chain

Key Properties

  • Non-custodial: The client's key share never leaves their device
  • 2-of-3 threshold: Any 2 of 3 shares can produce a valid signature
  • No single point of failure: Compromise of any single share reveals nothing
  • Key rotation: Shares can be refreshed without changing the public key or addresses
  • Multi-chain: One key management plane, 16+ blockchain networks

Wallet Lifecycle

Account Creation

When a client registers on app.lux.financial, the platform:

  1. Creates the client account in the Bank API
  2. Runs compliance checks (KYC/AML/PEP)
  3. Once cleared, triggers MPC keygen via the MPC cluster
// Bank triggers wallet creation after compliance clearance
const wallet = await tradingService.mpcCreateWallet(accountId);
// Returns: { wallet_id, ecdsa_pub_key, eth_address, btc_address }

Key Generation (Distributed)

The MPC cluster runs CGGMP21 or FROST keygen across 3 nodes:

POST /api/v1/vaults/{vaultId}/wallets
{
  "protocol": "cggmp21",
  "curve": "secp256k1",
  "threshold": 2,
  "parties": 3,
  "label": "client-{accountId}"
}

Each node stores its encrypted key share in KMS (AES-256-GCM):

Node 1 (Client device) -> Encrypted share in device secure enclave
Node 2 (Lux MPC node)  -> Encrypted share in Hanzo KMS
Node 3 (Recovery node)  -> Encrypted share in cold storage HSM

Transaction Signing

When a client submits a trade or withdrawal:

  1. Client approves on device (biometric/PIN)
  2. Client share + Lux node share participate in threshold signing
  3. Signature is produced without reconstructing the full key
  4. Transaction is broadcast
POST /api/v1/generate_mpc_sig
{
  "wallet_id": "w_...",
  "payload": "0xabc123...",  # Transaction hash (hex)
  "chain": "ethereum"
}

Key Rotation (Proactive Refresh)

Shares are periodically rotated to limit exposure window:

POST /api/v1/wallets/{walletId}/reshare
{
  "new_threshold": 2,
  "new_participants": ["node-1", "node-2", "node-3"]
}

The public key and all derived addresses remain unchanged.

Supported Chains

ChainCurveProtocolAddresses
Ethereum / EVMsecp256k1CGGMP210x...
Bitcoinsecp256k1CGGMP21bc1...
Solanaed25519FROST...
Lux C-Chainsecp256k1CGGMP210x...
Lux X-Chainsecp256k1CGGMP21X-lux1...
Lux P-Chainsecp256k1CGGMP21P-lux1...
XRP Ledgered25519FROSTr...
Cosmossecp256k1CGGMP21cosmos1...

Integration with Trading

The bank's TradingService integrates MPC signing directly:

// Sign a withdrawal transaction
const sig = await tradingService.mpcSign(
  walletId,
  txHash,    // hex-encoded transaction hash
  'ethereum'
);
// Returns: { r, s, signature }

// Sign via KMS for simpler operations
const sig = await tradingService.kmsSign(keyId, payload);

Smart Order Router

Orders are routed between CEX and DEX based on best price:

const result = await tradingService.submitOrder(accountId, {
  symbol: 'BTC-USD',
  side: 'buy',
  type: 'limit',
  quantity: 1.5,
  price: 45000,
});
// Returns: { venue: 'cex' | 'dex', order: {...} }

For DEX orders, the MPC wallet automatically signs the on-chain transaction.

Security Model

LayerProtection
Key shares at restAES-256-GCM (KMS master key via Argon2id)
Key shares in transitTLS 1.3 + Ed25519 message signing
Client device shareSecure enclave / TEE
Recovery shareOffline HSM in geographically separate facility
Signing requestsJWT + RBAC + policy engine approval
Key rotationAutomatic proactive refresh on configurable schedule

Compliance Integration

MPC wallets are fully integrated with the compliance engine:

  • Wallet creation is gated on KYC clearance
  • Transaction signing checks account sanctions status in real-time
  • Large withdrawals trigger surveillance alerts
  • PEP accounts require additional approval workflows
  • All signing operations produce audit logs

Source

  • MPC Cluster: luxfi/mpc (Go, CGGMP21/FROST)
  • KMS: luxfi/kms (TypeScript/Go, AES-256-GCM)
  • Bank Integration: luxfi/bank/app/api/src/trading/ (TypeScript/NestJS)
  • Wallet UI: luxfi/exchange/packages/wallet (TypeScript/React)

How is this guide?

Last updated on

On this page