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

 
 
 

Contributors