Note that a multisig is defined solely by the ordered list of wallets that are parts of it and its threshold - meaning that so long as the input parameter are unchanged, the same multisig address can be instantiated anywhere, including on tools like https://multisig.keplr.app/
1. Add wallets locally
💡 You do not need to own a wallet that is part of the multisig to instantiate it locally - adding only offline ones is
To verify your local setup, list all wallets with
dydxprotocoldkeysshow
As an example, let’s imagine we have a generated wallet A with, e.g.:
You need the names of the wallets, e.g. walletA , walletB and walletC and the threshold. ourMultisig is an arbitrary name, choose one that is meaningful to you
Key order matters and keys are automatically sorted by their public key. At the time of writing, this is how https://multisig.keplr.app/ instantiates multisig wallets. To change the key ordering, use the --nosort flag.
Now let's send some small funds to the multisig address in order to activate the address.
It is important to activate the address by sending a small amount of tokens to the address otherwise the network will not recognise the multisig address.
Goal: send 700000000000000000adydx (0.7 DYDX) from multisig dydx1z79c98w069eugzjme0dkd6quuhm8vfh2a00smh (added as ourMultisig ) to address dydx1h6x6pxkv2fv3jzsx5hc5efaarhue7gpsdmxafk
💡 Transferring tokens to a multisig address does not differ from transferring tokens to other address types
Let’s say that we have
WalletA , dydx18ym0ts7fw40x2qqw73plgg7wgmkljvvd7x8jk0 - the one that we control
WalletB , dydx1n72zp2myk6qzsec954nd6lap7tn5f6mwtr2qne - an offline wallet of one of our counterparties in the multisig
WalletC , dydx1h03ny3j2k4yltt767r3tjw92qs0vj3p2g5w6x3 - an offline wallet of the other counterparty in the multisig
ourMultisig , dydx1z79c98w069eugzjme0dkd6quuhm8vfh2a00smh - a 2/3 multisig, instantiated with WalletA , WalletB , and WalletC
dydx1z79c98w069eugzjme0dkd6quuhm8vfh2a00smh is the address of the multisig from which we send tokens - in case you have instantiated the multisig locally, you can use it’s name, e.g. ourMultisig
dydx1h6x6pxkv2fv3jzsx5hc5efaarhue7gpsdmxafk is the recipient address
700000000000000000adydx is the amount to send - 0.7 DYDX
--fees value 5000000000000000adydx may need adjustment; the transaction will fail only when broadcasted if this amount is not enough
--generate-only will prevent the transaction to be submitted
The result will be stored in the file named unsignedTx.json
💡 Each of the required signers must use their own instances of dydxprotocold CLI and their private keys. The unsignedTx.json file needs to be securely transferred to them.
💡 Each signer should verify the transaction details in unsignedTx.json before signing!
One needs all the files generated until now: unsignedTx.json , walletASignedTx.json and walletBSignedTx.json . ourMultisig cannot be the multisig address The result is a file called multisignedTx.json
You can use the txhash to check MintScan for the transaction status. If nothing is available on MintScan, then the broadcast or signing were unsuccessful.