{"id":1233,"date":"2025-12-10T12:45:34","date_gmt":"2025-12-10T10:45:34","guid":{"rendered":"https:\/\/ackee.xyz\/blog\/?p=1233"},"modified":"2026-01-05T14:26:27","modified_gmt":"2026-01-05T12:26:27","slug":"signing-data-in-wake-raw-structured-and-hash-flows","status":"publish","type":"post","link":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/","title":{"rendered":"Signing Data in Wake: Raw, Structured, and Hash Flows"},"content":{"rendered":"<h2 dir=\"auto\" data-line=\"3\">Why Signing Matters in Tests<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"4\">Typed signatures drive permit flows, meta-transactions, and off-chain approvals. Being able to generate them inside tests lets you confirm your verification logic without wiring external wallets. Wake exposes a focused API on <code class=\"codehl\">Account<\/code> that covers the three common cases: raw message signing (<code class=\"codehl\">sign<\/code>), EIP-712 structured signing (<code class=\"codehl\">sign_structured<\/code>), and low-level hash signing (<code class=\"codehl\">sign_hash<\/code>). This guide distills the official <a href=\"https:\/\/ackee.xyz\/wake\/docs\/latest\/testing-framework\/accounts-and-addresses\/\">Accounts and addresses<\/a> documentation into practical examples you can drop directly into your tests.<\/p>\n<h2 dir=\"auto\" data-line=\"8\">Preparing an Account With a Private Key<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"9\">Wake signs only when an account holds a private key. You can import or generate one in a single line:<\/p>\n<pre><code class=\"language-python\">\nfrom wake.testing import Account\n\naccount = Account.from_mnemonic(&quot; &quot;.join([&quot;test&quot;] * 11 + [&quot;junk&quot;]))\n# Other options:\n# Account.from_key(&quot;0x&quot; + &quot;a&quot; * 64)\n# Account.from_alias(&quot;alice&quot;)  # uses the alias from config\n# Account.new()                # fresh random key\n\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"19\">The account is now ready for transactions and all three signing modes.<\/p>\n<h2 dir=\"auto\" data-line=\"21\">Signing Raw Messages (EIP-191)<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"22\">Use <code class=\"codehl\">Account.sign<\/code> for human-readable bytes, such as when you need a <code class=\"codehl\">personal_sign<\/code> style flow in a test:<\/p>\n<pre><code class=\"language-python\">from wake.testing import Account\n\naccount = Account.from_mnemonic(&quot; &quot;.join([&quot;test&quot;] * 11 + [&quot;junk&quot;]))\nsignature = account.sign(b&quot;Hello, world!&quot;)\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"31\">Wake applies the EIP-191 prefix (version <code class=\"codehl\">0x45<\/code>) automatically so the signature matches standard wallet behavior. Use this mode for UX prompts or legacy flows that intentionally avoid typed data.<\/p>\n<h2 dir=\"auto\" data-line=\"33\">Signing Structured Messages (EIP-712)<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"34\">Typed data keeps approvals unambiguous. Wake mirrors the EIP-712 pipeline using dataclasses and an explicit domain:<\/p>\n<pre><code class=\"language-python\">from dataclasses import dataclass\nfrom wake.testing import *\n\n\n@dataclass\nclass Transfer:\n    sender: Address\n    recipient: Address\n    amount: uint256\n\n\naccount = Account.from_mnemonic(&quot; &quot;.join([&quot;test&quot;] * 11 + [&quot;junk&quot;]))\nsignature = account.sign_structured(\n    Transfer(\n        sender=account.address,\n        recipient=Address(1),\n        amount=10,\n    ),\n    domain=Eip712Domain(\n        name=&quot;Test&quot;,\n        chainId=chain.chain_id,\n        verifyingContract=Address(0),  # set to your contract if needed\n    ),\n)\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"63\">Wake builds the type string, hashes each field, and signs the EIP-712 digest. In protocol tests, pair this with a Solidity function such as <code class=\"codehl\">hashTypedData<\/code> to confirm the contract computes the same digest before verifying the signature.<\/p>\n<h2 dir=\"auto\" data-line=\"65\">Signing a Precomputed Hash<\/h2>\n<p class=\"code-line\" dir=\"auto\" data-line=\"66\">Use <code class=\"codehl\">Account.sign_hash<\/code> only when an external API already gives you the digest. This method skips prefixes and signs the bytes as-is:<\/p>\n<pre><code class=\"language-python\">from wake.testing import *\n\naccount = Account.from_mnemonic(&quot; &quot;.join([&quot;test&quot;] * 11 + [&quot;junk&quot;]))\nmessage_hash = keccak256(b&quot;Hello, world!&quot;)\nsignature = account.sign_hash(message_hash)\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"75\">Use this when you must match a known hash, such as a contract&#8217;s <code class=\"codehl\">hashTypedData<\/code> output. If you do not control or understand the preimage, do not sign it.<\/p>\n<h2 dir=\"auto\" data-line=\"78\">Hardening Tips for Signature Tests<\/h2>\n<ul>\n<li class=\"code-line\" dir=\"auto\" data-line=\"79\">Align domains: ensure <code class=\"codehl\">name<\/code>, <code class=\"codehl\">version<\/code>, <code class=\"codehl\">chainId<\/code>, and <code class=\"codehl\">verifyingContract<\/code> match exactly between Wake and contract code.<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"80\">Separate raw and typed flows: use <code class=\"codehl\">sign<\/code> for prefixed personal messages, <code class=\"codehl\">sign_structured<\/code> for typed data, and <code class=\"codehl\">sign_hash<\/code> for deliberate edge cases.<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"81\">Label test actors: <code class=\"codehl\">chain.accounts[i].label = &quot;ALICE&quot;<\/code> improves trace readability without affecting behavior.<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"82\">Capture traces on failure: wrap tests with <code class=\"codehl\">@on_revert<\/code> and print <code class=\"codehl\">e.tx.call_trace<\/code> when debugging signature-related reverts.<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"83\">Assert end-to-end: inside Solidity, recompute the digest and check that <code class=\"codehl\">ecrecover<\/code> returns <code class=\"codehl\">account.address<\/code> to catch encoding errors early.<\/li>\n<\/ul>\n<h3 dir=\"auto\" data-line=\"85\">A Simple Permit-Test Recipe<\/h3>\n<ol>\n<li class=\"code-line\" dir=\"auto\" data-line=\"86\">Define the permit struct as a Wake dataclass mirroring the Solidity struct.<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"87\">Build the domain using the contract\u2019s actual name, version, chain ID, and verifying address.<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"88\">Generate the signature with <code class=\"codehl\">sign_structured<\/code> and call the permit or verification function in your test.<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"89\">Recompute the digest in Solidity and ensure <code class=\"codehl\">ecrecover<\/code> yields your signer.<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"90\">Add fuzzing for amounts and deadlines to confirm that hashing stays stable across inputs.<\/li>\n<\/ol>\n<h2 dir=\"auto\" data-line=\"92\">Conclusion<\/h2>\n<div>\n<div>Wake\u2019s signing helpers put a wallet-like interface inside your tests, so you can exercise permit flows and typed approvals without wiring external tools. Use <code class=\"codehl\">sign_structured<\/code> for EIP-712 paths, keep <code class=\"codehl\">sign<\/code> for legacy prompts, and treat <code class=\"codehl\">sign_hash<\/code> as an intentional edge-case hook. The APIs stay one-liners, letting you focus on asserting contract behavior instead of wrestling with signature plumbing.<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Why Signing Matters in Tests Typed signatures drive permit flows, meta-transactions, and off-chain approvals. Being able to generate them inside tests lets you confirm your verification logic without wiring external wallets. Wake exposes a focused API on Account that covers the three common cases: raw message signing (sign), EIP-712 structured signing (sign_structured), and low-level hash signing (sign_hash). This guide distills the official&hellip;<\/p>\n","protected":false},"author":24,"featured_media":1102,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[61,10],"tags":[96,24,68,104],"class_list":["post-1233","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-education","category-ethereum","tag-educational","tag-ethereum","tag-solidity","tag-wake"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.9 - aioseo.com -->\n\t<meta name=\"description\" content=\"Learn how to sign raw, structured, and hashed messages in Wake tests. Validate EIP-712, EIP-191, and permit flows with clear examples and reliable verification.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Naoki Yoshida\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.9\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Ackee Blockchain - Blog &amp; Research\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Signing Messages in Wake Tests: EIP-712, EIP-191, and Hashes\" \/>\n\t\t<meta property=\"og:description\" content=\"Learn how to sign raw, structured, and hashed messages in Wake tests. Validate EIP-712, EIP-191, and permit flows with clear examples and reliable verification.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/abchprod.wpengine.com\/wp-content\/uploads\/2025\/12\/Signing-Data-in-Wake.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/abchprod.wpengine.com\/wp-content\/uploads\/2025\/12\/Signing-Data-in-Wake.jpg\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2025-12-10T10:45:34+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-01-05T12:26:27+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Signing Messages in Wake Tests: EIP-712, EIP-191, and Hashes\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Learn how to sign raw, structured, and hashed messages in Wake tests. Validate EIP-712, EIP-191, and permit flows with clear examples and reliable verification.\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@meditationduck\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/abchprod.wpengine.com\/wp-content\/uploads\/2025\/12\/Signing-Data-in-Wake.jpg\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/signing-data-in-wake-raw-structured-and-hash-flows\\\/#blogposting\",\"name\":\"Signing Messages in Wake Tests: EIP-712, EIP-191, and Hashes\",\"headline\":\"Signing Data in Wake: Raw, Structured, and Hash Flows\",\"author\":{\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/author\\\/naoki-yoshida\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Read-Only-Reentrancy-Attack.png\",\"width\":986,\"height\":680},\"datePublished\":\"2025-12-10T12:45:34+02:00\",\"dateModified\":\"2026-01-05T14:26:27+02:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/signing-data-in-wake-raw-structured-and-hash-flows\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/signing-data-in-wake-raw-structured-and-hash-flows\\\/#webpage\"},\"articleSection\":\"Education, Ethereum, educational, Ethereum, solidity, Wake\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/signing-data-in-wake-raw-structured-and-hash-flows\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ackee.xyz\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/category\\\/ethereum\\\/#listItem\",\"name\":\"Ethereum\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/category\\\/ethereum\\\/#listItem\",\"position\":2,\"name\":\"Ethereum\",\"item\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/category\\\/ethereum\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/signing-data-in-wake-raw-structured-and-hash-flows\\\/#listItem\",\"name\":\"Signing Data in Wake: Raw, Structured, and Hash Flows\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/signing-data-in-wake-raw-structured-and-hash-flows\\\/#listItem\",\"position\":3,\"name\":\"Signing Data in Wake: Raw, Structured, and Hash Flows\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/category\\\/ethereum\\\/#listItem\",\"name\":\"Ethereum\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/#organization\",\"name\":\"Ackee Blockchain\",\"description\":\"Blog & Research\",\"url\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/cropped-ABCH_Logo_blue-black.png\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/signing-data-in-wake-raw-structured-and-hash-flows\\\/#organizationLogo\",\"width\":5268,\"height\":825},\"image\":{\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/signing-data-in-wake-raw-structured-and-hash-flows\\\/#organizationLogo\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/author\\\/naoki-yoshida\\\/#author\",\"url\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/author\\\/naoki-yoshida\\\/\",\"name\":\"Naoki Yoshida\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/signing-data-in-wake-raw-structured-and-hash-flows\\\/#authorImage\",\"url\":\"https:\\\/\\\/abchprod.wpengine.com\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/Naoki-Yoshida-96x96.png\",\"width\":96,\"height\":96,\"caption\":\"Naoki Yoshida\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/meditationduck\"]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/signing-data-in-wake-raw-structured-and-hash-flows\\\/#webpage\",\"url\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/signing-data-in-wake-raw-structured-and-hash-flows\\\/\",\"name\":\"Signing Messages in Wake Tests: EIP-712, EIP-191, and Hashes\",\"description\":\"Learn how to sign raw, structured, and hashed messages in Wake tests. Validate EIP-712, EIP-191, and permit flows with clear examples and reliable verification.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/signing-data-in-wake-raw-structured-and-hash-flows\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/author\\\/naoki-yoshida\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/author\\\/naoki-yoshida\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Read-Only-Reentrancy-Attack.png\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/signing-data-in-wake-raw-structured-and-hash-flows\\\/#mainImage\",\"width\":986,\"height\":680},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/signing-data-in-wake-raw-structured-and-hash-flows\\\/#mainImage\"},\"datePublished\":\"2025-12-10T12:45:34+02:00\",\"dateModified\":\"2026-01-05T14:26:27+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/\",\"name\":\"Ackee Blockchain\",\"description\":\"Blog & Research\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/ackee.xyz\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Signing Messages in Wake Tests: EIP-712, EIP-191, and Hashes","description":"Learn how to sign raw, structured, and hashed messages in Wake tests. Validate EIP-712, EIP-191, and permit flows with clear examples and reliable verification.","canonical_url":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/#blogposting","name":"Signing Messages in Wake Tests: EIP-712, EIP-191, and Hashes","headline":"Signing Data in Wake: Raw, Structured, and Hash Flows","author":{"@id":"https:\/\/ackee.xyz\/blog\/author\/naoki-yoshida\/#author"},"publisher":{"@id":"https:\/\/ackee.xyz\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/ackee.xyz\/blog\/wp-content\/uploads\/2025\/07\/Read-Only-Reentrancy-Attack.png","width":986,"height":680},"datePublished":"2025-12-10T12:45:34+02:00","dateModified":"2026-01-05T14:26:27+02:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/#webpage"},"isPartOf":{"@id":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/#webpage"},"articleSection":"Education, Ethereum, educational, Ethereum, solidity, Wake"},{"@type":"BreadcrumbList","@id":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/ackee.xyz\/blog#listItem","position":1,"name":"Home","item":"https:\/\/ackee.xyz\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/ackee.xyz\/blog\/category\/ethereum\/#listItem","name":"Ethereum"}},{"@type":"ListItem","@id":"https:\/\/ackee.xyz\/blog\/category\/ethereum\/#listItem","position":2,"name":"Ethereum","item":"https:\/\/ackee.xyz\/blog\/category\/ethereum\/","nextItem":{"@type":"ListItem","@id":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/#listItem","name":"Signing Data in Wake: Raw, Structured, and Hash Flows"},"previousItem":{"@type":"ListItem","@id":"https:\/\/ackee.xyz\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/#listItem","position":3,"name":"Signing Data in Wake: Raw, Structured, and Hash Flows","previousItem":{"@type":"ListItem","@id":"https:\/\/ackee.xyz\/blog\/category\/ethereum\/#listItem","name":"Ethereum"}}]},{"@type":"Organization","@id":"https:\/\/ackee.xyz\/blog\/#organization","name":"Ackee Blockchain","description":"Blog & Research","url":"https:\/\/ackee.xyz\/blog\/","logo":{"@type":"ImageObject","url":"https:\/\/ackee.xyz\/blog\/wp-content\/uploads\/2023\/02\/cropped-ABCH_Logo_blue-black.png","@id":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/#organizationLogo","width":5268,"height":825},"image":{"@id":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/#organizationLogo"}},{"@type":"Person","@id":"https:\/\/ackee.xyz\/blog\/author\/naoki-yoshida\/#author","url":"https:\/\/ackee.xyz\/blog\/author\/naoki-yoshida\/","name":"Naoki Yoshida","image":{"@type":"ImageObject","@id":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/#authorImage","url":"https:\/\/abchprod.wpengine.com\/wp-content\/uploads\/2024\/08\/Naoki-Yoshida-96x96.png","width":96,"height":96,"caption":"Naoki Yoshida"},"sameAs":["https:\/\/x.com\/meditationduck"]},{"@type":"WebPage","@id":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/#webpage","url":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/","name":"Signing Messages in Wake Tests: EIP-712, EIP-191, and Hashes","description":"Learn how to sign raw, structured, and hashed messages in Wake tests. Validate EIP-712, EIP-191, and permit flows with clear examples and reliable verification.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/ackee.xyz\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/#breadcrumblist"},"author":{"@id":"https:\/\/ackee.xyz\/blog\/author\/naoki-yoshida\/#author"},"creator":{"@id":"https:\/\/ackee.xyz\/blog\/author\/naoki-yoshida\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/ackee.xyz\/blog\/wp-content\/uploads\/2025\/07\/Read-Only-Reentrancy-Attack.png","@id":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/#mainImage","width":986,"height":680},"primaryImageOfPage":{"@id":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/#mainImage"},"datePublished":"2025-12-10T12:45:34+02:00","dateModified":"2026-01-05T14:26:27+02:00"},{"@type":"WebSite","@id":"https:\/\/ackee.xyz\/blog\/#website","url":"https:\/\/ackee.xyz\/blog\/","name":"Ackee Blockchain","description":"Blog & Research","inLanguage":"en-US","publisher":{"@id":"https:\/\/ackee.xyz\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Ackee Blockchain - Blog &amp; Research","og:type":"article","og:title":"Signing Messages in Wake Tests: EIP-712, EIP-191, and Hashes","og:description":"Learn how to sign raw, structured, and hashed messages in Wake tests. Validate EIP-712, EIP-191, and permit flows with clear examples and reliable verification.","og:url":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/","og:image":"https:\/\/abchprod.wpengine.com\/wp-content\/uploads\/2025\/12\/Signing-Data-in-Wake.jpg","og:image:secure_url":"https:\/\/abchprod.wpengine.com\/wp-content\/uploads\/2025\/12\/Signing-Data-in-Wake.jpg","article:published_time":"2025-12-10T10:45:34+00:00","article:modified_time":"2026-01-05T12:26:27+00:00","twitter:card":"summary","twitter:title":"Signing Messages in Wake Tests: EIP-712, EIP-191, and Hashes","twitter:description":"Learn how to sign raw, structured, and hashed messages in Wake tests. Validate EIP-712, EIP-191, and permit flows with clear examples and reliable verification.","twitter:creator":"@meditationduck","twitter:image":"https:\/\/abchprod.wpengine.com\/wp-content\/uploads\/2025\/12\/Signing-Data-in-Wake.jpg"},"aioseo_meta_data":{"post_id":"1233","title":"Signing Messages in Wake Tests: EIP-712, EIP-191, and Hashes","description":"Learn how to sign raw, structured, and hashed messages in Wake tests. Validate EIP-712, EIP-191, and permit flows with clear examples and reliable verification.","keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":"Signing Messages in Wake Tests: EIP-712, EIP-191, and Hashes","og_description":"Learn how to sign raw, structured, and hashed messages in Wake tests. Validate EIP-712, EIP-191, and permit flows with clear examples and reliable verification.","og_object_type":"default","og_image_type":"custom_image","og_image_url":"https:\/\/abchprod.wpengine.com\/wp-content\/uploads\/2025\/12\/Signing-Data-in-Wake.jpg","og_image_width":"0","og_image_height":"0","og_image_custom_url":"https:\/\/abchprod.wpengine.com\/wp-content\/uploads\/2025\/12\/Signing-Data-in-Wake.jpg","og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":true,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"BlogPosting","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"titles":[],"descriptions":[],"socialPosts":{"email":[],"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2025-12-09 08:48:53","updated":"2026-01-05 12:33:02","breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/ackee.xyz\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/ackee.xyz\/blog\/category\/ethereum\/\" title=\"Ethereum\">Ethereum<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tSigning Data in Wake: Raw, Structured, and Hash Flows\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/ackee.xyz\/blog"},{"label":"Ethereum","link":"https:\/\/ackee.xyz\/blog\/category\/ethereum\/"},{"label":"Signing Data in Wake: Raw, Structured, and Hash Flows","link":"https:\/\/ackee.xyz\/blog\/signing-data-in-wake-raw-structured-and-hash-flows\/"}],"featured_image_src":"https:\/\/ackee.xyz\/blog\/wp-content\/uploads\/2025\/07\/Read-Only-Reentrancy-Attack-600x400.png","featured_image_src_square":"https:\/\/ackee.xyz\/blog\/wp-content\/uploads\/2025\/07\/Read-Only-Reentrancy-Attack-600x600.png","author_info":{"display_name":"Naoki Yoshida","author_link":"https:\/\/ackee.xyz\/blog\/author\/naoki-yoshida\/"},"_links":{"self":[{"href":"https:\/\/ackee.xyz\/blog\/wp-json\/wp\/v2\/posts\/1233","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ackee.xyz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ackee.xyz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ackee.xyz\/blog\/wp-json\/wp\/v2\/users\/24"}],"replies":[{"embeddable":true,"href":"https:\/\/ackee.xyz\/blog\/wp-json\/wp\/v2\/comments?post=1233"}],"version-history":[{"count":0,"href":"https:\/\/ackee.xyz\/blog\/wp-json\/wp\/v2\/posts\/1233\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ackee.xyz\/blog\/wp-json\/wp\/v2\/media\/1102"}],"wp:attachment":[{"href":"https:\/\/ackee.xyz\/blog\/wp-json\/wp\/v2\/media?parent=1233"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ackee.xyz\/blog\/wp-json\/wp\/v2\/categories?post=1233"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ackee.xyz\/blog\/wp-json\/wp\/v2\/tags?post=1233"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}