Skip to content

MSIG Proposals

Making proposals on-chain requires both Ultra and Block Producers to approve a proposal. A proposal is a series of actions and/or changes that are meant to be executed at the time of approval. Once Ultra and Block Producers approve of these changes then the code gets executed.

Important steps before resignation to eosio.msigs

We need to do setpriv on the eosio.msig contract to allow it to be handled by other Block Producers. The following line will solve the issue, and allow other Block Producers to control the eosio.prods account properly.

cleos push action eosio setpriv '["eosio.msig", 1]' -p eosio@active

Creating a Proposal

Proposals use the multisig option inside of the built-in cleos interface. It can be done through the following action.

cleos multisig propose <proposal_name> <requested_permissions> <trx_permissions> <contract> <action> <data> <proposer> <proposal_exp_in_hours>
  • Proposal_Name

    • The name of the proposal.

    • Needs to be less than or equal to 12 characters.

    • Needs to follow standard EOS name rules.

  • Requested_Permissions

    • A JSON String or filename defining requested permissions.
  • Trx_Permission

    • A JSON string or filename defining transaction permissions.
  • Contract

    • The contract in which the deferred transaction should go to.
  • Action

    • The action for the deferred transaction.
  • Data

    • A JSON string or filename defining the action to propose.
  • Proposer

    • An account proposing the transaction.
  • Proposal_Expiration

    • The time in hours until this transaction becomes expired.

    • Optional


cleos multisig propose proposalname '[{"actor": "producacnt11", "permission": "active"}, {"actor": "producacnt12", "permission": "active"}, {"actor": "producacnt13", "permission": "active"}, {"actor": "ultra", "permission": "active"}]' '[{"actor": "eosio.prods", "permission": "active"}]' eosio setacctram '{"account":"producacnt11", "ram_bytes":"5000"}' -p ultra

An alternative to the above proposal is propose_trx which is a more flexible version of the above code.

cleos multisig propose_trx <name> <requested_perms> <json string or file> <proposer>

Reviewing a Proposal

You can always review the current proposal by reviewing who originally published it and then seeing what permissions are required under

cleos multisig review <proposer_name> <proposal_name>


cleos multisig review ultra setacctrm

Approving a Proposal

Proposals must be approved by both Ultra and a handful of producers on the chain. This can be done with the following action. Note that Ultra is required for EVERY proposal. Otherwise, it will not be approved.

cleos multisig approve <proposer> <proposal_name> <permissions> <proposal_hash>

Canceling a Proposal

Proposals can only be canceled by the original owner or Ultra. Ultra reserves special veto rights over proposals.

cleos multisig cancel <proposer> <proposal_name>


cleos multisig cancel ultra setacctram


When a proposal is changed then it is often appropriate to invalidate all signatures on the contract. This can be done through the invalidate action.

cleos multisig invalidate <invalidator_name>


cleos multisig cancel ultra setacctram