Skip to content

Multisignature Accounts

Multisignature accounts are a powerful, natively-supported security and governance feature on Algorand that require multiple parties to approve transactions. Think of a multisignature account as a secure vault with multiple keyholes, where a predetermined number of keys must be used together to open it.

For example, a multisignature account might be configured so that any 2 out of 3 designated signers must approve before funds can be transferred. This creates a balance between security and operational flexibility that’s valuable in many scenarios:

  • Treasury management for organizations where multiple board members must approve expenditures
  • Shared accounts between business partners who want mutual consent for transactions
  • Enhanced security for high-value accounts by distributing signing authority across different devices or locations
  • Recovery options where backup signers can help regain access if a primary key is lost

What is a Multisignature Account?

Technically, a multisignature account on Algorand is a logical representation of an ordered set of addresses with a threshold and version. The threshold determines how many signatures are required to authorize any transaction from this account (such as 2-of-3 or 3-of-5), while the version specifies the multisignature protocol being used. multisignature accounts can perform the same operations as standard accounts, including sending transactions and participating in consensus. The address for a multisignature account is derived from the ordered list of participant accounts, the threshold, and version values.

Some important characteristics to understand:

  • The order of addresses matters when creating the multisignature account (Address A, B, C creates a different multisignature address than B, A, C)
  • However, the order of signatures doesn’t matter when signing a transaction
  • Multisignature accounts cannot nest other multisignature accounts
  • You must send Algos to the multisignature address to initialize its state on the blockchain, just like with any other account

Benefits & Implications of Using Multisig Accounts

When to UseWhen Not to Use
Enhanced Security: Requires multiple signatures for transactions, adding an extra layer of protection against compromise of a single keyAdded Complexity: Requires coordination among multiple signers for every transaction
Customizable Authorization: The number of required signatures can be adjusted to fit different security models (e.g., 2-of-3, 3-of-5, etc.)Key Management: All signers must securely manage their private keys to maintain the security of the multisig account
Distributed Key Storage: Signing keys can be stored separately and generated through different methods (kmd, standalone accounts, or a mix)Transaction Size: Multisig transactions are larger than single-signature transactions, resulting in slightly higher transaction fees
Governance Mechanisms: Enables cryptographically secure governance structures where a subset of authorized users must approve actionsNot Always Necessary: For simple use cases where security and governance are not critical concerns, a single-signature account may be more practical
Integration with Smart Contracts: Can be paired with Algorand Smart Contracts for complex governance models requiring specific signature subsets

How to Generate a Multisignature Account

There are different ways to generate a multisignature account. The examples below demonstrate how to create a multisignature account that requires 2 signatures from 3 possible signers to authorize transaction:

// Initialize an Algorand client instance and get funded accounts
const { algorand, dispenser, randomAccountA, randomAccountB, randomAccountC } = await setupLocalnetEnvironment()
// Create a 2-of-3 multisig account that requires
// only 2 signatures from the 3 possible signers to authorize transactions
const multisigAccountA = algorand.account.multisig(
{ version: 1, threshold: 2, addrs: [randomAccountA, randomAccountB, randomAccountC] },
[randomAccountA.account, randomAccountB.account, randomAccountC.account],
)
// Fund the multisig account
await algorand.account.ensureFunded(multisigAccountA, dispenser, (10).algo())
// Send a payment transaction from the multisig account
// which will automatically collect the required number of signatures
// from the signing accounts provided when creating the multisig account
await algorand.send.payment({
sender: multisigAccountA,
receiver: randomAccountA,
amount: algo(1),
})