verifyMessage
Verify that a message was signed by the provided address.
:::info 💡 Why should I use this over the verifyMessage
util?
This Action supports verifying messages that were signed by either a Smart Contract Account or Externally Owned Account. The verifyMessage
util only supports Externally Owned Accounts. This is getting increasingly important as more wallets implement Account Abstraction.
:::
Usage
import { account, walletClient, publicClient } from './client'
const signature = await walletClient.signMessage({
account,
message: 'hello world',
})
const valid = await publicClient.verifyMessage({
address: account.address,
message: 'hello world',
signature,
})
// true
Returns
boolean
Wheather the signed message is valid for the given address.
Parameters
address
- Type:
Address
The Ethereum address that signed the original message.
const valid = await publicClient.verifyMessage({
address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',
message: 'hello world',
signature:
'0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',
})
message
- Type:
string
The message to be verified.
By default, viem verifies the UTF-8 representation of the message.
const valid = await publicClient.verifyMessage({
address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',
message: 'hello world',
signature:
'0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',
})
To verify the data representation of the message, you can use the raw
attribute.
const valid = await publicClient.verifyMessage({
address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',
message: { raw: '0x68656c6c6f20776f726c64' },
signature:
'0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',
})
signature
- Type:
Hex | ByteArray
The signature that was generated by signing the message with the address's signer.
const valid = await publicClient.verifyMessage({
address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',
message: 'hello world',
signature:
'0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',
})
blockNumber (optional)
- Type:
bigint
Only used when verifying a message that was signed by a Smart Contract Account. The block number to check if the contract was already deployed.
const valid = await publicClient.verifyMessage({
blockNumber: 42069n,
address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',
message: 'hello world',
signature:
'0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',
})
blockTag (optional)
- Type:
'latest' | 'earliest' | 'pending' | 'safe' | 'finalized'
- Default:
'latest'
Only used when verifying a message that was signed by a Smart Contract Account. The block tag to check if the contract was already deployed.
const valid = await publicClient.verifyMessage({
blockTag: 'safe',
address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',
message: 'hello world',
signature:
'0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',
})
JSON-RPC Method
eth_call
to a deployless universal signature validator contract.