Verifying your transaction on ZERO before signing it is more difficult using MetaMask, which was not primarily developed to be used with offline signing devices. The Metamask screen with the unsigned transaction QR-code does not display the transaction details. So you will need to make a screenshot or a copy of what you intended to transact in order to be able to verify the transaction details that ZERO displays.
But this is not what blind signing is.
What is blind signing?
Blind signing involves authorizing a smart contract interaction without being able to confirm all the details. A smart contract interaction can range from a relatively simple ERC20 token or NFT transfer to a function within a dApp, like a token swap, or even a DAO's governance mechanism.
As the blockchain industry advances, new and intricate smart contracts are deployed. These contracts are often customized, making it challenging for hardware wallets to fully decode their contents and display them for review by the signer.
Blind signing introduces risks, as the transaction requires signing without the ability to verify the terms. This necessitates complete trust in all third parties involved, including the dApp developer and the beneficiary of the transaction.
Why can’t the full transaction details always be displayed?
A transaction contains a reference to the smart contact it is interacting with. But it does not contain the full content of that smart contract. Even simple properties, like the name of a coin or the amount of decimals for a token, are not included in a transaction request.
This means that an offline signing device like the ZERO can’t know these properties, unless this information is present on the device itself.
For example, if ZERO is aware that the contract address of USDT on the Ethereum network is 0xdac17f958d2ee523a2206206994597c13d831ec7. It can recognize this contract in a transaction request and it can show you that you’re signing a USDT transaction. If ZERO didn’t have this information, it would show the contract address instead.
Likewise, if ZERO is aware that USDT on the Ethereum network only uses 6 decimals instead of the default 18, it is able to show you the correct amount of a transaction. If ZERO didn’t have this information, it would show a message ‘Value cannot be decoded’ along with the encoded amount value.
For more intricate smart contracts, ZERO may be unable to decode anything in the transaction request. In this case you will only see the raw data.
What are the risks? How to stay safe?
Even if your private keys are on your ZERO, by signing a malicious transaction you can still lose your funds. As a general rule, it is better never to sign what you can’t verify. But by completely refraining from blind signing you may not be able to do some transactions or web3 activities.
Does this mean you need to use a hot wallet for these? Not necessarily.
There are some things you can do to protect yourself.
- Familiarize yourself with the different blind signing messages on ZERO listed below.
- Simple transactions that can’t be fully decoded are less risky than complex smart contracts.
- You can consult a blockchain explorer to verify the ID and the source of a token or smart contract. And you can verify Chain IDs on chainlist.org to make sure you’re on the correct network.
- Make sure the source of the transaction and third parties are trustworthy.
- Avoid unfamiliar dApps.
- Try to verify the authenticity from multiple sources.
- Refrain from clicking suspicious links. Always be wary of links sent to you via email and social media.
- If you’re going to do something that could be risky, use a separate address or even a separate passphrase wallet.
You can read more tips in the article How to stay safe on Web3? (+link)
Blind signing messages on ZERO
'Decoding' vs 'interpreting'
As explained, blind signing occurs when a transaction, or a part of it, can’t be decoded.
In some cases, a transaction field may be decoded but can’t be interpreted. Then you can verify the decoded data yourself, which is explained in the examples below.
This general warning message is always displayed when a transaction can’t be fully decoded or interpreted.
When a token is unknown on ZERO, it will display the token contract along with this message: "ZERO only knows the contract address of this token."
Because the token contract is unknown, ZERO also doesn’t know how many decimals the contract has. In this situation, ZERO cannot reliably display the correct amount and will display the raw value of the Amount field along with the message "Value cannot be decoded".
Both of these values can be verified by looking up the token on a blockchain explorer (which is explained below the image).
In the example above we created a transaction sending 0.5 Sombra (SMBR) on the BNB Smart Chain (BSC) network. How can we verify that the token contract and the amount are correct?
- To verify that the contract is correct, we can look up the token name or ticker on a blockchain explorer. Because this transaction was sent on the BNB Smart Chain network, we searched for the name Sombra or the ticker SMBR on bscscan.com. This search leads to https://bscscan.com/token/0x16B3E050e9e2f0Ac4f1BEA1b3E4fdc43d7f062Dd.
Under 'Other Info' We can see that the token contract is identical to what is displayed on ZERO.
This confirms that we’re sending the correct token. - To verify the amount, we need to know how many decimals this smart contract has defined. This information can be found on the same contract page on bscscan.com : under 'Other Info'. We can see there are 18 decimals used in the SMBR smart contract.
The encoded value is "500000000000000000". If we start from the end of that value and put the decimals separator 18 positions to the left, we get a value of "0.5".
This confirms that the amount in the transaction is correct.
After verifying these values are correct we can sign the transaction with full peace of mind.
There are 2 possible variations when the network can’t be interpreted:
1/ Sending a token on an unknown network
If you're sending a token on a network that is unknown on ZERO, the token will also be unknown. ZERO will display this message: "ZERO does not recognize this token nor this network. Only the contract address and network ID can be displayed."
Both of these values can be verified by looking up the token on a blockchain explorer (which is explained below the image).
In the example above we created a transaction sending 50 USDT on the Ethereum Sepolia Testnet. How can we verify that the token contract, the network ID and the amount are correct?
- To verify that the contract is correct, we can look up the token name or ticker on a blockchain explorer. Because this transaction was sent on the Ethereum Sepolia Test network, we searched for the name Tether USD or the ticker USDT on sepolia.etherscan.io. This search leads to https://sepolia.etherscan.io/token/0xa1d7f71cbbb361a77820279958bac38fc3667c1a.
Under 'Other Info' We can see that the token contract is identical to what is displayed on ZERO.
This confirms that we’re sending the correct token. - To verify that the Chain ID is correct, we look it up on chainlist.org. The result on https://chainlist.org/chain/11155111 shows that the Chain ID is 11155111(0xaa36a7).
This matches with what ZERO displays, so we know it is correct. - To verify the amount, we need to know how many decimals this smart contract has defined. This information can be found on the same contract page: under 'Other Info', we can see there are 6 decimals used in the USDT smart contract.
The encoded value is "50000000". If we start from the end of that value and put the decimals separator 6 positions to the left, we get a value or “0.5”.
This confirms that the amount in the transaction is correct.
After verifying these values are correct we can sign the transaction with full peace of mind.
2/ Sending the native coin of an unknown network
In case you’re sending the native coin on a network that is unknown on ZERO, there is no token contract that can be displayed. Ethereum on the ETH Sepolia Testnet, for example, simply doesn't have a contract like a token has.
So, if the network is unknown and no token contract is displayed, you know it is a transaction with the native coin on this network.
In this case, ZERO will display this message: "ZERO does not recognize this coin nor network. Only the network ID can be displayed."
- You can verify that the Chain ID is correct by looking up the network on chainlist.org and making sure it matches with the Chain ID displayed on ZERO.
When no transaction data can be decoded at all, ZERO displays the raw transaction data. You cannot verify that this data is correct, so you should be very cautious signing these transactions. Make sure to read the tips mentioned in this article and in How to stay safe on web3?
Disclaimer
The risk of loss in signing smart contract transactions can be substantial. You should understand the possibility of losses associated with such transactions and assume complete responsibility for all associated risks and their outcomes.
NGRAVE, its employees, or representatives do not and will not provide any investment or legal advice regarding your transactions. You acknowledge that you are solely responsible for your decisions and actions performed with NGRAVE’s products. Additionally, you acknowledge that NGRAVE, its employees, or representatives will not make any personal recommendations or provide any advice on your transactions or investment decisions.
Before signing any transaction or contract, you should carefully consider whether it is secure and suitable for you, given your current circumstances and financial resources.
In the event that something goes wrong, you acknowledge that NGRAVE is powerless to intervene and cannot and will not assist in resolving any issues arising from your transactions.