Hi @Nzupp and welcome to the forum!
I’ve not seen the multisig program from Serum before, but it looks very cool and useful so thanks for pointing it out!
Anyway, after looking deeper into it, I think I know what your issue is.
Note: Before I go any further I want to make clear that you don’t need the
multisig program, if you are able to get the signatures from multiple users at the same time through some off-chain mechanism.
For instance, if your web-app had all the users who needed to sign the transaction online at the same time or connected to some server app, then you could have that app collect signatures for all the users before submitting the transaction to the chain, all without requiring the special
The multisig program is only needed if you want to be able to have multiple users sign a transaction fully on-chain, with no other coordination mechanism.
First, let’s make sure we’re on the same page on the general workflow for using the
- You have some kind of operation that needs multiple signatures to be approved.
- Any of your users creates a new multisig address.
- This requires submitting a
create_multisig transaction to the
multisig program to create the address.
- When creating the multisig address we specify the owners of the address and how many must sign transactions for approval
- Now any of the owners can create a multisig transaction by sending the
create_transaction instruction to the
- After the transaction has been created, the specified numbers of users must then submit an
approve transaction to the
multisig program, specifying the multisig transaction that was previously created in step 3.
- One of the owners of the multisig account must then send the
execute_transaction command to the
multisig program, specifying the transaction created in step 3.
I think you are getting stuck at step 2, where you try to pass in the multisig account, right?
The account that you pass in as an argument to the
create_multisig instruction must be uninitialized. You create the account address by generating a keypair, getting the public address, passing that address into the program. You should not initialize the account with any data. Also you need to use the account’s keypair to sign the
That’s not quite right. It’s the other way around. The
multisig program needs to own the account passed in. That is why we pass in an uninitialized account. Then the
create_multisig instruction will take that un-initialized account and transfer ownership of the account to the
multisig program. This ensures that nobody can now use that multisig account to sign transactions, other than the
multisig program itself.
I hope that helps explain things a little bit. If you have any questions let me know!
Also, I haven’t used this program specifically before, so I may not have gotten everything right either.
If this post helped you I’d really appreciate a tip, no matter how small, in whatever tokens you prefer. It will help me spend time helping people on this forum and learning more about crypto.
My Solana/SPL token wallet address is
My Ethereum/BSC/ERC-20/BEP-20 wallet address is