Skip to content

Sandijigs/passkey-multisig

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

2 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ” Passkey-Protected Multisig

A secure multisig wallet where each signer authenticates using biometrics/passkeys (Face ID, Touch ID), built with Clarity 4 and Epoch 3.3.

βœ… Project Status

  • βœ… Clarity 4 compatible (Epoch 3.3)
  • βœ… All tests passing (13 comprehensive test cases)
  • βœ… Event logging for monitoring and audit trails
  • βœ… Best practices .gitignore
  • βœ… Syntax validated with Clarinet 3.11.0
  • βœ… Ready for testnet deployment
  • βœ… Comprehensive documentation

🎯 Clarity 4 Features Used

Feature Usage Line Reference
secp256r1-verify Verify passkey signatures from each signer 291, 357
stacks-block-time Time-bound transaction approvals and event timestamps 210, 285
to-ascii? Human-readable transaction descriptions 195-211
print Event logging for monitoring 96-149

πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  Passkey Multisig Wallet                     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                             β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”                    β”‚
β”‚   β”‚ Signer1 β”‚  β”‚ Signer2 β”‚  β”‚ Signer3 β”‚  (Passkey Auth)    β”‚
β”‚   β”‚ πŸ”‘ Face β”‚  β”‚ πŸ”‘ Touchβ”‚  β”‚ πŸ”‘ Face β”‚                    β”‚
β”‚   β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜                    β”‚
β”‚        β”‚            β”‚            β”‚                          β”‚
β”‚        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                          β”‚
β”‚                     β–Ό                                       β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚   β”‚           secp256r1-verify (WebAuthn)               β”‚   β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                     β”‚                                       β”‚
β”‚                     β–Ό                                       β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚   β”‚      Threshold Check (e.g., 2-of-3 required)        β”‚   β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                     β”‚                                       β”‚
β”‚                     β–Ό                                       β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚   β”‚            Execute Transaction                       β”‚   β”‚
β”‚   β”‚         (if threshold met & not expired)            β”‚   β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸš€ Quick Start

Prerequisites

  • Clarinet 3.11.0+ (Clarity 4 support)
  • Deno (for running tests)
  • Node.js 16+ (optional, for development tools)

Installation & Testing

# Navigate to project directory
cd passkey-multisig

# Verify Clarity 4 syntax (Epoch 3.3)
clarinet check

# Run comprehensive test suite (13 test cases)
clarinet test

# Start interactive REPL console
clarinet console

Deployment

# Generate deployment plan for simnet
clarinet deployments generate --simnet

# Generate deployment plan for testnet
clarinet deployments generate --testnet

# Start local devnet for testing
clarinet integrate

# Apply deployment to testnet (after configuration)
clarinet deployments apply --testnet

Console Examples

;; Create a 2-of-3 multisig
(contract-call? .passkey-multisig create-multisig
  0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
  "Family Wallet"
  u2
  (list 0x03pubkey1... 0x03pubkey2... 0x03pubkey3...))

;; Deposit funds
(contract-call? .passkey-multisig deposit
  0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
  u1000000000)

;; Get multisig info
(contract-call? .passkey-multisig get-multisig
  0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef)

πŸ“‹ Contract Functions

Setup Functions

Function Description
create-multisig Create new multisig with signers
deposit Add funds to multisig

Transaction Functions

Function Description
propose-tx Propose a new transaction
approve-tx Sign/approve pending transaction
execute-tx Execute once threshold met

Read-Only Functions

Function Description
get-multisig Get multisig details
get-signer Get signer info by index
get-pending-tx Get transaction details
has-signed Check if signer approved
is-tx-valid Check if tx is still valid
generate-tx-summary Human-readable summary

πŸ’‘ Key Features

  1. πŸ” Biometric Auth: Each signer uses Face ID/Touch ID via WebAuthn passkeys
  2. βš™οΈ Flexible Threshold: M-of-N configuration (e.g., 2-of-3, 3-of-5)
  3. ⏰ Time-Bound Approvals: Transactions expire after 7 days (604,800 seconds)
  4. πŸ“Š Event Logging: Complete audit trail with print statements for all key operations
  5. πŸ“ Human-Readable Descriptions: Using to-ascii? for transaction summaries
  6. πŸ›‘οΈ Security-First Design: Multiple validation layers and anti-replay protection

πŸ”’ Security Features

  • βœ… Passkey Verification: All signatures verified with secp256r1-verify (WebAuthn compatible)
  • βœ… Time-Locked Approvals: Prevents execution of stale transactions using stacks-block-time
  • βœ… Anti-Replay Protection: Nonce tracking and unique transaction IDs
  • βœ… Threshold Enforcement: On-chain validation of M-of-N signatures
  • βœ… Input Validation: Comprehensive checks on all user inputs
  • βœ… Active Signer Management: Only active signers can participate

πŸ“Š Event Monitoring

The contract emits detailed events for monitoring and analytics:

;; Events emitted:
- multisig-created: When a new multisig wallet is created
- deposit: When funds are deposited to the wallet
- tx-proposed: When a new transaction is proposed
- tx-approved: When a signer approves a transaction
- tx-executed: When a transaction is executed

All events include timestamps using stacks-block-time for accurate audit trails.

πŸ§ͺ Test Coverage

13 comprehensive test cases covering:

  • βœ… Multisig creation with various configurations
  • βœ… Signer validation and management
  • βœ… Deposit functionality
  • βœ… Transaction proposal and approval workflow
  • βœ… Invalid threshold handling
  • βœ… Edge cases and error conditions
  • βœ… Read-only function verification

πŸš€ Deployment Guide

Testnet Deployment

  1. Configure settings:

    # Edit settings/Testnet.toml with your mnemonic
    # Ensure you have testnet STX for deployment
  2. Generate deployment plan:

    clarinet deployments generate --testnet
  3. Deploy contract:

    clarinet deployments apply --testnet
  4. Verify deployment:

    • Check contract on Stacks Explorer
    • Test contract functions via API or console

Mainnet Deployment (Production)

⚠️ Important: Thoroughly test on testnet before mainnet deployment!

  1. Configure mainnet settings
  2. Audit contract code
  3. Generate deployment plan
  4. Apply deployment with caution

πŸ† Clarity 4 & Epoch 3.3 Compliance

This contract demonstrates best practices for Clarity 4 development:

  • βœ… Epoch 3.3: Configured in Clarinet.toml
  • βœ… secp256r1-verify: WebAuthn passkey signature verification
  • βœ… stacks-block-time: Time-based transaction expiration
  • βœ… to-ascii?: Human-readable transaction summaries
  • βœ… print: Comprehensive event logging for monitoring
  • βœ… No circular dependencies: Optimized function structure
  • βœ… Production-ready: Syntax validated and tests passing

πŸ“š Additional Resources

πŸ“œ License

MIT License

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published