-
Notifications
You must be signed in to change notification settings - Fork 33
guides_Managing a Multisig Address
A multisig (multi-signature) address requires M signatures from a set of N defined public keys before funds can be spent. This is useful for shared treasuries, escrow, team funds, or any situation where a single key should not be able to move funds unilaterally.
This guide covers setting up a multisig address and the full workflow for spending from it.
- A running, synced
node-daemon -
wallet-cliconnected to the node (one instance per participant, or a coordinator collecting signatures) - The public keys of all participants
M-of-N multisig: A multisig address defined by N public keys where at least M of them must sign a transaction for it to be valid. For example, a 2-of-3 address requires any 2 of the 3 keyholders to sign.
PartiallySignedTransaction (PST): A transaction that has been composed but not yet fully signed. It is passed between participants as a hex string so each can add their signature. Once M signatures are collected the transaction can be broadcast.
Standalone address: Multisig addresses are tracked as standalone addresses in the wallet — they are watched for incoming funds but not derived from the wallet's seed phrase. Each participant must add the same multisig address to their own wallet.
Each participant must reveal the public key for the address they will use to sign. In each participant's wallet:
address-reveal-public-key-as-hex <address>
This returns the raw hex public key for that address. Collect these from all N participants out of band (e.g. shared securely over a messaging channel).
In any wallet (typically the coordinator's), register the multisig address:
standalone-add-multisig <MIN_REQUIRED_SIGNATURES> <pubkey1> <pubkey2> ... <pubkeyN>
Example — a 2-of-3 multisig with an optional label:
standalone-add-multisig --label "Treasury" 2 <pubkey1> <pubkey2> <pubkey3>
The command returns the multisig address. Share this address with all participants.
Every participant who may need to sign transactions must also add the multisig address to their wallet:
standalone-add-multisig --no-rescan true 2 <pubkey1> <pubkey2> <pubkey3>
Using --no-rescan true skips a full blockchain rescan if the address has no existing history yet. Omit it (or use false) if the address may have already received funds.
standalone-address-show
To inspect the full details (participants, required signatures):
standalone-address-details <multisig_address>
Send funds to the multisig address like any other address — the sender just uses address-send or token-send with the multisig address as the destination.
To check the multisig address balance and available UTXOs:
standalone-multisig-utxos
Spending requires M participants to each sign a PartiallySignedTransaction. The typical flow is: compose → sign (round-robin) → broadcast.
The coordinator composes a transaction spending from the multisig UTXO:
transaction-compose --utxos <utxo> transfer(<destination_address>,<amount>)
The UTXO identifier comes from standalone-multisig-utxos output, in the format tx(<txid>,<index>) or block(<block_id>,<index>).
This returns a hex-encoded PartiallySignedTransaction with no signatures yet.
Pass the hex to the first signer's wallet:
account-sign-raw-transaction <hex>
The wallet adds its signature and returns a new hex string with one signature applied. If this wallet holds enough keys to fully sign the transaction (e.g. it controls 2 of 2 keys in a 2-of-2), it is complete after this step.
Pass the updated hex to the next signer:
account-sign-raw-transaction <hex_from_previous_signer>
Repeat until M signatures have been collected. Each signer outputs an updated hex — always pass the latest hex to the next participant.
Once M signatures are present, broadcast from any wallet connected to the node:
node-submit-transaction <fully_signed_hex>
Setup (done once):
# Each participant reveals their public key
address-reveal-public-key-as-hex <my_address>
# → <pubkeyA>, <pubkeyB>, <pubkeyC> collected from each participant
# Coordinator registers the multisig
standalone-add-multisig --label "Treasury 2-of-3" 2 <pubkeyA> <pubkeyB> <pubkeyC>
# → returns: <multisig_address>
# Participants B and C also add it
standalone-add-multisig --no-rescan true 2 <pubkeyA> <pubkeyB> <pubkeyC>
Spending (each time funds need to move):
# Coordinator lists UTXOs and composes a transaction
standalone-multisig-utxos
transaction-compose --utxos tx(<txid>,0) transfer(<destination_address>,500)
# → <pst_hex_v0> (0 signatures)
# Participant A signs
account-sign-raw-transaction <pst_hex_v0>
# → <pst_hex_v1> (1 signature)
# Participant B signs
account-sign-raw-transaction <pst_hex_v1>
# → <pst_hex_v2> (2 signatures — threshold reached)
# Coordinator broadcasts
node-submit-transaction <pst_hex_v2>
# Rename
standalone-address-label-rename --label "New Label" <multisig_address>
# Remove label
standalone-address-label-rename <multisig_address>
| Task | Command |
|---|---|
| Get your public key | address-reveal-public-key-as-hex <address> |
| Create multisig address | standalone-add-multisig <M> <pubkey1> ... <pubkeyN> |
| List standalone addresses | standalone-address-show |
| Inspect multisig details | standalone-address-details <address> |
| View multisig UTXOs | standalone-multisig-utxos |
| Compose spend transaction | transaction-compose --utxos <utxo> transfer(<address>,<amount>) |
| Sign transaction | account-sign-raw-transaction <hex> |
| Broadcast transaction | node-submit-transaction <hex> |
| Rename label | standalone-address-label-rename --label <label> <address> |
- Home
- Installing Mintlayer
- Upgrade Mintlayer
- Node
- Addresses
- Wallet CLI
- Wallet RPC
- API
- Advanced Tools
- Guides
- CHANGELOG