Interactive CLI tool for building and managing multi-signature transactions with visual progress tracking.
β Interactive multi-sig builder - Step-by-step workflow β Visual progress tracking - See signature collection status β Transaction export/import - Share proposals as JSON β Signature verification - Validate signatures β Pre-built templates - Common scenarios (escrow, DAO, vault) β Notification system - Alert signers via email/Slack/Discord
starforge multisig create \
--threshold 2 \
--signers "alice,bob,charlie" \
--network testnetstarforge multisig sign proposal_123.json --wallet alicestarforge multisig status proposal_123.jsonOutput:
βββ SIGNATURE STATUS βββ
Progress: 1/2
[ββββββββββ] 50%
β³ Waiting for: bob
starforge multisig submit proposal_123.json --network testnetstarforge multisig create \
--threshold 2 \
--signers "pubkey1,pubkey2,pubkey3" \
--network testnetCreates JSON proposal file with:
- Unique proposal ID
- Threshold & signer list
- Empty signatures array
- Metadata fields
starforge multisig add-signer proposal.json pubkey4Adds new signer to pending approval list.
starforge multisig sign proposal.json --wallet aliceSigns with wallet, adds signature to proposal, updates progress.
starforge multisig view proposal.jsonShows:
βββ PROPOSAL βββ
ID: abc-123-def
Network: testnet
Threshold: 2/3
Status: pending (1/2)
Created: 2024-01-15T10:30:00Z
βββ SIGNERS βββ
β 1. alice
β 2. bob
β 3. charlie
βββ SIGNATURES βββ
β alice: abc123def456...
starforge multisig status proposal.jsonShows visual progress bar + pending signers.
starforge multisig submit proposal.json --network testnetValidates all signatures and submits transaction.
starforge multisig export proposal.json --output proposal_backup.jsonExports proposal for sharing or archival.
starforge multisig import proposal_backup.json --output proposal_restored.jsonImports exported proposal.
starforge multisig templatesShows available pre-built templates:
βββ MULTI-SIG TEMPLATES βββ
escrow - 2-of-3 Escrow (buyer, seller, arbiter)
company - 3-of-5 Company Signers
dao - 5-of-9 DAO Treasury
vault - 2-of-2 Cold Storage Vault
payment - 1-of-2 Payment Authorization
starforge multisig from-template escrow --output escrow_proposal.jsonCreates proposal pre-configured with template signers/threshold.
# 1. Create from template
starforge multisig from-template escrow -o escrow.json
# 2. Buyer signs
starforge multisig sign escrow.json --wallet buyer
# 3. Check progress
starforge multisig status escrow.json
# 4. Arbiter signs
starforge multisig sign escrow.json --wallet arbiter
# 5. Submit
starforge multisig submit escrow.json# Create with company signers
starforge multisig create \
--threshold 3 \
--signers "ceo,cfo,board1,board2,board3"
# CEO signs
starforge multisig sign proposal.json --wallet ceo
# CFO signs
starforge multisig sign proposal.json --wallet cfo
# Board member signs
starforge multisig sign proposal.json --wallet board1
# Submit
starforge multisig submit proposal.jsonstarforge multisig from-template dao -o dao_proposal.json
# Each DAO member signs
for member in member1 member2 member3 member4 member5; do
starforge multisig sign dao_proposal.json --wallet $member
done
# Check final status
starforge multisig status dao_proposal.json
# Submit
starforge multisig submit dao_proposal.json{
"id": "abc-123-def",
"threshold": 2,
"signers": ["alice", "bob", "charlie"],
"signatures": [
{
"signer": "alice",
"signature": "abc123def456...",
"signed_at": "2024-01-15T10:30:00Z"
}
],
"network": "testnet",
"created_at": "2024-01-15T10:00:00Z",
"metadata": {
"title": "Escrow Payment",
"description": "Payment for service",
"transaction_type": "payment",
"amount": 100.0,
"recipient": "GDEF456..."
}
}# Email
starforge multisig notify proposal.json --channel email
# Slack
starforge multisig notify proposal.json --channel slack \
--webhook https://hooks.slack.com/...
# Discord
starforge multisig notify proposal.json --channel discord \
--webhook https://discord.com/api/webhooks/...use starforge::utils::multisig_builder::{Proposal, generate_signature};
let mut proposal = Proposal::new(2, vec!["alice".into(), "bob".into()], "testnet".into());
let sig = generate_signature("alice")?;
proposal.add_signature("alice".into(), sig);
let progress = format!("{}/{}", proposal.signatures.len(), proposal.threshold);- Buyer, Seller, Arbiter
- Use: Service/product payment protection
- Release: Any 2 signers approve
- CEO, CFO, 3 Board Members
- Use: Corporate treasury access
- Release: Any 3 signers approve
- 9 DAO members
- Use: Treasury proposals
- Release: Minimum 5 members approve
- Cold storage key holder 1, 2
- Use: Maximum security
- Release: Both signers required
- Approver 1, Approver 2
- Use: Flexible payment authorization
- Release: Any 1 approver needed
Pending: β³ Waiting for signatures
Partial: π Some signatures collected
Ready: β All signatures collected
Submitted: β
On-chain
Failed: β Submission failed
Expired: β° Signature window closed
s- Sign with selected walletv- View full proposalp- Check progressn- Send notificationse- Export proposalc- Copy proposal IDq- Quit
| Operation | Time |
|---|---|
| Create proposal | <10ms |
| Add signature | <50ms |
| Export JSON | <100ms |
| Status check | <5ms |
- β Ed25519 signature verification
- β Threshold validation
- β Signer authentication
- β Tamper detection
- β Expiration support
"Not enough signatures"
- Check status:
starforge multisig status proposal.json - Ensure all required signers have signed
"Invalid signature"
- Verify signer credentials
- Re-sign proposal
"File not found"
- Check proposal file exists
- Use full path if needed
- name: Sign Multi-Sig Proposal
run: |
starforge multisig sign proposal.json --wallet github_signer
starforge multisig status proposal.json#!/bin/bash
starforge multisig create \
--threshold 2 \
--signers "$SIGNER1,$SIGNER2,$SIGNER3"
# Wait for signatures
while [ ! $(starforge multisig is-ready proposal.json) ]; do
sleep 10
done
# Submit
starforge multisig submit proposal.json