Simple MultiSig — Step by Step
hand-holding guide to the Simple MultiSig Wallet, with plenty of screenshots
A multi-party transaction is a classic example of something you can do more easily with Ethereum than with fiat currencies. Yet many people don’t realize how easy it is to use MultiSig Wallets for multi-party transactions.
In this article I’m going to introduce a typical use-case for a MultiSig wallet, and then walk you through how to execute multisig transactions using Christian Lundkvist’s Simple MultiSig Wallet. I’ll be using the user interface for the Simple MultiSig Wallet that I wrote — it’s completely free to use and available on IPFS:
The walk through will have lots of screenshots. I know that format can be tedious for some people — but if you’re setting up a MutiSig Wallet with large sums of ETH it can be re-assuring to actually see how the screens will look.
My two business partners and I each have personal stores of Ether that we own, independent of our business together. We know we’re going to need to sell some to finance our business, but we don’t know how much or when. So we agree that we’ll fund a MultiSig Wallet with 300 ETH and we’ll sell the ETH as needed to pay our business expenses. Each of us will deposit 100 from our personal holdings; and any two of us will sign to make a withdrawal from the group wallet. This is akin to the 3 us opening a business bank account that requires at least 2 signatures to write a check or to make a withdrawal.
Note: I’m going to run this example on the Mainnet — just because it’s more exciting with real Ether. But since I don’t have 300 ETH lying around I’ll be using 300 Finney :)
Creating the Wallet
First of all, point your browser at https://ipfs.io/ipns/simplemultisig.io/wallet, and log into MetaMask. Note that whenever you change MetaMask accounts you’ll need to reload the page.
After logging in to MetaMask, and selecting the desired MetaMask account, and reloading the page, I click on the “New Wallet” button:
Now I enter a name for the new wallet — I chose “Biz Expenses”, and I enter the Ethereum address of each of the partners. My own address is pre-populated, so all I need to do is modify the owner-label from its default value, “My Account”, to my name Alex Diaz. Then I click “Add Owner.”
Next I enter the (public) Ethereum addresses of my partners. The User Interface accepts ENS names, and my first partner’s ens name is “imontoya.eth”, so I enter that, and leave the label field blank (since it will be auto-populated), and again I click add-owner. The third partner doesn’t have an ens name, so I simply enter his Ethereum address, 0x3B66…FeCf, and I set the owner label to his nickname, “Grasshopper”, and again click add-owner. Before moving on, I set the “Threshold” from the drop-down to 2. This indicates than any transaction from this wallet will require 2 of our signatures. Here’s how the screen looks:
Everything looks good, so I’m going to click “Deploy contract”; I confirm
the transaction in the MetaMask dialog, and then wait for the transaction
to be confirmed on the blockchain:
The wallet is now deployed on the blockchain. But in order to sign transactions each of my partners will need to be able to access it. So I click on the “View Wallet” button, and select the “Biz Expenses” wallet from the wallet-selector:
Now I copy the wallet data out of the text-box that says JSON. And I send that by email to each of my partners. Now, for a moment we’re going to switch to Grasshopper’s computer, where he has clicked on the “Import Wallet” button.
He copies the data into the text-box that says JSON, clicks “Load wallet from JSON”, and then clicks “Save this wallet locally” — and now he has a copy of the wallet:
My other partner, imontoya will do the same.
Funding the Wallet
Now it’s time to fund the wallet. Click on the “view Wallet” button and select the “Biz Expenses” wallet from the wallet-selector. The wallet address is shown just beneath the wallet selector. It’s 0xc7013…c972
Each of us sends 100 Finney to the wallet address. So the total balance of the
wallet is 300 Finney. When I reload the page the new balance is shown:
Making a transaction
Here we are, a few days later, and Grasshopper and I have decided that we need to withdraw 10 Finney to make a business purchase (recall that only two of the partners need to sign off on any transaction). We have an employee who’s in charge of selling the ETH for cash, and actually making the purchase — sort of a CFO; so we’ll send the 10 Finney to his account. btw, his ens name is “bobthebuilder.eth.”
To get started I click on the “Transaction” button. In the wallet-selector
drop-down I select the “Biz Expenses” wallet. The screen looks like this:
Now I enter the transaction details. In the “To Address” field I enter, “bobthebuilder.eth”. As soon as I press the tab key his ethereum address is filled-in. Then I enter the value, 10 Finney, and the executor address. The executor address is the address of the person that is allowed to actually execute this transaction (after the required number of signatures have been collected). You can enter 0x0 to allow anyone to execute the transaction —
but in our case our CFO, bobthebuilder, will do it, so I enter “bobthebuilder.eth” in that field. For a simple Ether transaction you can leave the data text-box empty, and the nonce and gas limit at their default values. So now my screen looks like this:
After I click the “Sign this transaction” button, MetaMask presents me with the EIP-712 signature dialog. This is one of the new features of this multisig wallet — namely it shows what you are signing.
Note that my signature is also included in the JSON that is displayed in the JSON text-box. At this time I copy the JSON from that text-box and send it (by email) to Grasshopper.
For a moment we’re going to switch to Grasshopper’s computer, where he has clicked on the “Transaction” button and selected the “Biz Expenses” wallet:
He pastes the JSON that I sent to him, and clicks “Load transaction from JSON”
After he verifies that the transaction looks right, he clicks the “Sign this transaction” button and signs the MetaMask dialog (check the MetaMask icon, because the dialog might not pop up) — and now his signature is also added to the JSON.
So now Grasshopper copies the new JSON data out of the JSON text box and sends it (by email) to our executor, AKA bobthebuilder. The executor also needs to load the wallet JSON, since transactions only work in their own specific wallet. In the image below the executor has loaded the wallet and also loaded the transaction JSON data that he received from grasshopper, which included two signatures. You can see that now the “Execute this transaction” button is enabled.
After the executor clicks the “Execute this transaction” button, he needs to confirms the transaction in MetaMask:
While the transaction is pending confirmation on the blockchain, a link is provided to view it on etherscan.io:
Clicking on the “View this transaction” link opens the etherscan.io page, where (after the transaction is confirmed) you can see that 10 Finney has been transferred to bobthebuilder’s account.
In this article I’ve tried to show almost every step of creating a MultiSig Wallet and sending a typical MultiSig transaction. Thanks to Christian Lundkvist for writing the Simple MultiSig contract; and I’m pretty proud of the User Interface, which I added.
Use them for good!