How to send USDT with Electrum
Abstract
In this article, I will show you how to send Tether (USDT) with Electrum.
While Electrum has no support for Omni tokens like Tether, it supports
sending to OP_RETURN
, which is all one needs to send Tether.
Only a little technical knowledge is needed to create these transactions.
This article will try to explain this and guide you step-by-step through
the process of sending a transaction.
The main audience of this are people who sent Omni tokens to their hardware wallet or their segwit address. The Omni client cannot send from segwit addresses and it does not support hardware wallets. These instructions should help you to unlock your Tether.
Disclaimer: Follow the instructions at your own risk. The author tried his best to ensure that these instructions are accurate, but he will not be responsible for any financial or other loss you incur by following them. This is also not an investment advice.
The anatomy of an Omni transaction
Let's have a look at an Omni transaction before we create our own. An Omni transaction is a bitcoin transaction that has some extra data attached to it. Take your favorite block explorer and search for 50f8ef01e6fa06ef28bb3a7e36df9c01eab25ff65edf4d091bac341e6bf0112e. You may need to show more details, e.g., by clicking the plus icon.
In bitcoin, each transactions spends outputs of previous transactions and creates new outputs. In this case the transaction spends 0.07230124 BTC from a previous transaction sent to the address 3Gy… and creates three new outputs. The first output is the change output that goes back to the sender, the second output is the recipient 3KW…. At the first glance this transaction sends only 0.0000273 BTC (around 18 cents) to the recipient. However, the last output to the “OP_RETURN” address is what makes this transaction an Omni transaction that actually sends 7.291 USDT to the recipient.
The third output script is an OP_RETURN
script.
It serves two purposes. Firstly, it
marks the output as unspendable, which allows the bitcoin nodes to
forget it. Secondly, it also allows to attach some data to a transaction that
can be used for other protocols, in this case the Omni protocol.
The attached data is the hex number
6f6d6e69000000000000001f000000002b752ee0
. The first
part 6f6d6e69
is ASCII for “omni” and
marks this as a transaction following the Omni protocol. Then
comes the type of transaction 00000000
which stands for
“simple send”. There are other transaction types to create
new currencies, mint new coins, trade coins, etc, which we will not
look into. The next part
0000001f
is hex for 31, which is the code
for TetherUS.
The final part 000000002b752ee0
is hex for 729100000, which is the amount of Tether (measured in microcents), so it stands for 7.29100000 USDT.
You may now wonder, what happens if the sender does not have the right amount of Tether. The answer is, the Omni network marks this transaction as invalid and ignores it. It is still a valid Bitcoin transaction. The fees are paid but no Tether are transferred.
It is recommended that all inputs spend from the same address, that there is at most one recipient, and that the change is send back to the input address. If you ignore these recommendations, bad things may happen: the Tether are sent to the change address, or the transaction fails because the network tries to book them from the wrong input address.
Using Electrum to send Omni transactions
Once you have a rough understanding, you can send Tether with other bitcoin wallets, in particular Electrum. Lets open our Electrum wallet. This wallet received the Omni transaction from the previous section. You need to send some bitcoin to the same address to pay for transaction fees. Since Omni tokens live on the bitcoin blockchain, you need bitcoin to pay for fees. And since the Omni protocol will look at the bitcoin addresses to determine the account that sent the tokens, it is important that you pay the fees from the same address. In the example below, we already have enough BTC to pay the fee.
An Omni transaction must send the change back to the sender, but Electrum uses separate change addresses by default to increase privacy. Luckily there is an option to turn it off. Open the “Preferences” dialog from the “Tools” menu. Switch to the “Transactions” tab, and uncheck the option “Use change addresses”.
We have enabled the tab for addresses in the “View” menu. This allows us to select the address from which we want to spend. This is important if you have multiple bitcoin in different addresses in your wallet.
After right-clicking on an address, we choose “Spend from” in the menu. This transfers us to the send tab. The field “From” is already filled out. Now we fill in the recipient (“Pay to”). You can put several recipients in one transaction, just put each recipient on a separate line. Put the amount to send to this recipient after a comma, like in the image below.
The first recipient attaches the omni data to the transaction.
It is the same OP_RETURN
command that we have seen in
the previous transaction. This is not a coincidence. We want to
send the same amount of 7.291 USDT to a new recipient. You should
always send 0 to the OP_RETURN
address. The
second recipient will receive the Tether. We need to send him a
small amount of bitcoin, too. The smallest amount you can send without
problems is 0.00000546 BTC. Note that the recipient must be a
1… or a 3… address, bech32 addresses starting with “bc1”
are not supported by the Omni protocol.
To check that everything is correct, click preview. Check the fee,
check that there are exactly three recipients, one of them starts
with SCRIPT 6a14
(6a
stands for OP_RETURN
, 0x14
= 20 is the
number of bytes that follow). Check that the change address is
identical to the input addresses and check that all input addresses are
identical. If this is not the case, check that you followed all
steps above correctly. The order of the outputs does not matter.
If anything is wrong, abort.
If you want to send a different amount, you can use your favorite
calculator to convert the amount in hex and change the
OP_RETURN
address accordingly. First multiply the USDT amount
with 100 million, e.g., 5.50 USDT becomes 550 000 000.
550000000 in
hex is 0x20C85580. Remove 0x (which just indicates hex) and add enough
0 to the beginning to get it to exactly 16 digits. The resulting
OP_RETURN
address is:
OP_RETURN 6f6d6e69000000000000001f0000000020c85580
Of course, you cannot send more USDT than you have in your account. You can check your balance by searching for your address on an Omni explorer.
Summary
This page shows that it is possible to send USDT and other Omni tokens with Electrum. It should also work with hardware wallets.
If these instructions helped you, consider donating to bc1qs5q679tac0uvfunt0gdwuymves5re7v7q8fntv or see the bottom of my mempool page for more donation options.