How Does a Multisig Work?

All actions taking place with a multisig follow the same flow:
- Propose a transaction
- Achieve a passing level threshold of confirmations
- Execute the proposed transaction to the destination contract
Submitting a transaction
Everything starts with a multisig member submitting a transaction for consideration for execution by the other members of a multisig. The output of a successful submission would be the resulting transaction ID.
⚠️ NOTE: Take care to record this returned Endowment ID! It will be important for all members to interact with and sign a transaction and to lookup the status of a transaction.
This message and args would look something like:
submitTransaction("A short title", "description of the proposed transaction", "0x..1003", 0, <withdraw msg as binary>)
Confirming a transaction
In order to confirm a pending multisig transaction members of the multisig must confirm the transaction. Members have several options available to them with regards to exercising their voting powers on a multisig contract for which they must submit the following messages, each time passing the transaction ID along as the sole argument:
Confirm a Transaction (approval vote for execution)
confirmTransaction(uint256 transactionId)
Revoke a confirmation (rescind a confirmation previously submitted for a transaction)
revokeConfirmation(uint256 transactionId)
Once a transaction has acquired enough confirmations to meet the passing threshold level set it is ready for the final step: Execution!
Executing a passing transaction
The hard work of gathering consensus among multisig members for a proposed transaction has been carried out. Now the time has come to execute the transaction. This requires a single submission, which can be submitted by any valid EOA wallet, and will pass so long as:
- The threshold for a transaction has been met
- The data payload is valid and does not cause downstream errors that would cause the transaction to fail.
The execution message is very simple and looks like this:
executeTransaction(uint256 transactionId)