import type { SIGNATURE } from '../../types/components.js' import type { Client } from '../../clients/createClient.js' import type { Transport } from '../../clients/transports/createTransport.js' import type { ErrorType } from '../../errors/utils.js' import { getMessageHash } from '../../strk-utils/typedData.js' import type { HashTypedDataErrorType } from '../../utils/signature/hashTypedData.js' import { accountABI } from '../../utils/siws/account-contract-abi.js' import { readContract } from './readContract.js' export type VerifyMessageParameters = { /** The address to verify the typed data for. */ address: string statement: string uri: string nonce: string version: string chainId: string domain: string /** The signature to verify */ signature: SIGNATURE } export type VerifyMessageReturnType = boolean export type VerifyMessageErrorType = HashTypedDataErrorType | ErrorType /** * Verify that typed data was signed by the provided address. * * - Docs {@link https://viem.sh/docs/actions/public/verifyTypedData} * * @param client - Client to use. * @param parameters - {@link VerifyTypedDataParameters} * @returns Whether or not the signature is valid. {@link VerifyTypedDataReturnType} */ export async function verifyMessage( client: Client, parameters: VerifyMessageParameters, ): Promise { const { address: sn_address, statement: sn_statement, uri: sn_uri, nonce: sn_nonce, version: sn_version, chainId: sn_chainId, domain: sn_domain, signature: sn_signature, } = parameters const siwsData = { types: { StarknetDomain: [ { name: 'name', type: 'string' }, { name: 'version', type: 'felt' }, { name: 'chainId', type: 'felt' }, ], Message: [ { name: 'address', type: 'felt' }, { name: 'statement', type: 'string' }, { name: 'uri', type: 'string' }, { name: 'nonce', type: 'string' }, ], }, primaryType: 'Message', domain: { name: sn_domain, version: sn_version, chainId: sn_chainId, revision: '1', }, message: { address: sn_address, statement: sn_statement, uri: sn_uri, nonce: sn_nonce, }, } const account = siwsData.message.address const hash = getMessageHash(siwsData, account) const verifyParams = { abi: accountABI, address: account[0], args: [hash, sn_signature], functionName: 'is_valid_signature', } const result = await readContract(client, verifyParams) if ( Array.isArray(result) && result.length === 1 && result[0] === '0x56414c4944' ) { return true } return false }