evmSignTypedData
Ethereum: Sign Typed Data
Asks device to sign an EIP-712 typed data message using the private key derived by given BIP32 path.
User is asked to confirm all signing details on OneKey device.
Supports EIP-712 (v3 and v4)
Use
evmSignTypedDatafor signing typed structured dataNot for EIP-191 typed data signing
Use evmSignMessage to signing EIP-191(personal_sign)
const result = await HardwareSDK.evmSignTypedData(connectId, deviceId, params);Params
path— requiredstring | Array<number>minimum length is3. read moredata- requiredObjecttype ofEthereumSignTypedDataMessage`. A JSON Schema definition can be found in the EIP-712 spec.metamaskV4Compat- requiredbooleanset totruefor compatibility with MetaMask's signTypedData_v4.chainId- optionalnumberThe ChainId in ETH is a unique identifier for a specific Ethereum network, used to distinguish different versions of the blockchain. Reference.
Blind signing
You may also wish to contruct your own hashes using a different library.
domainHash- requiredstringhex-encoded 32-byte hash of the EIP-712 domain.messageHash- optionalstringhex-encoded 32-byte hash of the EIP-712 message. This is optional for the domain-only hashes whereprimaryTypeisEIP712Domain.
When is the blind signing
Use Mini or Classic.
There are arrays nested in data.
Firmware version is less than 4.4.0, and the data size is greater than 1KB.
Firmware version is greater than or equal to 4.4.0 and the data size is greater than 1.5KB.
Example
const eip712Data = {
    types: {
        EIP712Domain: [
            {
                name: 'name',
                type: 'string',
            },
        ],
        Message: [
            {
                name: "Best Wallet",
                type: "string"
            },
            {
                name: "Number",
                type: "uint64"
            }
        ]
    },
    primaryType: 'Message',
    domain: {
        name: 'example.onekey.io',
    },
    message: {
        "Best Wallet": "OneKey Wallet",
        // be careful with JavaScript numbers: MAX_SAFE_INTEGER is quite low
        "Number": `${2n ** 55n}`,
    },
};
const {domainHash, messageHash} = transformTypedDataPlugin(eip712Data, true);
HardwareSDK.evmSignTypedData(connectId, deviceId, {
    path: "m/44'/60'/0'",
    data: eip712Data,
    metamaskV4Compat: true,
    domainHash,
    messageHash,
    chainId: 1
});Result
{
    success: true,
    payload: {
        address: string,
        signature: string, // hexadecimal string with "0x" prefix
    }
}Error
{
    success: false,
    payload: {
        error: string, // error message
        code: number // error code
    }
}Last updated
Was this helpful?