Multi-Signature Wallets
RougeChain supports M-of-N multi-signature wallets with PQC-safe ML-DSA-65 aggregate verification.
Overview
A multi-sig wallet requires M out of N co-signers to approve a transaction before it executes. This enables:
- Shared treasury management — DAOs, teams, and organizations
- Secure cold storage — 2-of-3 schemes (e.g. hardware + phone + backup)
- Escrow — Buyer + seller + arbitrator
Transaction Types
Create a Wallet
{
"tx_type": "multisig_create",
"payload": {
"multisig_signers": ["pubkey_hex_1", "pubkey_hex_2", "pubkey_hex_3"],
"multisig_threshold": 2,
"multisig_label": "Team Treasury"
}
}
- Minimum 2 signers
- Threshold must be ≥ 1 and ≤ number of signers
- Wallet ID is auto-generated if not provided
Submit a Proposal
{
"tx_type": "multisig_submit",
"payload": {
"multisig_wallet_id": "ms-abc123...",
"multisig_proposal_tx_type": "transfer",
"multisig_proposal_payload": {
"to_pub_key_hex": "recipient_pubkey_hex",
"amount": 1000
},
"multisig_proposal_fee": 0.1
}
}
- Only signers of the wallet can submit proposals
- The submitter's signature counts as the first approval
Approve a Proposal
{
"tx_type": "multisig_approve",
"payload": {
"multisig_proposal_id": "mp-def456..."
}
}
- Only signers who haven't already approved can approve
- When threshold is reached, the proposal auto-executes
- For
transferproposals: funds move from the wallet creator's balance
API Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/multisig/wallets | List all multi-sig wallets |
| GET | /api/multisig/wallet/:id | Get wallet details |
| GET | /api/multisig/wallet/:id/proposals | List proposals for a wallet |
| GET | /api/multisig/wallets/:pubkey | Find wallets where pubkey is a signer |
Response Format
{
"success": true,
"wallet": {
"wallet_id": "ms-abc123...",
"creator": "pubkey_hex",
"signers": ["pubkey1", "pubkey2", "pubkey3"],
"threshold": 2,
"created_at_height": 500,
"label": "Team Treasury"
}
}
SDK
import { RougeChain } from '@rougechain/sdk';
// The constructor takes the API base URL as a string (note the trailing /api)
const rc = new RougeChain('https://api.rougechain.io/api');
// Query multi-sig wallets and proposals (public reads)
const wallets = await rc.get('/multisig/wallets');
const myWallets = await rc.get(`/multisig/wallets/${myPubKey}`);
const wallet_ = await rc.get(`/multisig/wallet/${walletId}`);
const proposals = await rc.get(`/multisig/wallet/${walletId}/proposals`);
Writes are not yet exposed. The
multisig_create/multisig_submit/multisig_approvetransaction types above document the on-chain payload structure, but the node currently serves only the multi-sig read routes — there is no public submit endpoint and no SDK method (rc.sendTransactiondoes not exist). Multi-sig proposal submission is tracked for a future release. See the SDK reference.