[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H0CW2DFJ8Y18BNXA557PRM":3,"skill-same:01M6H0CW2DFJ8Y18BNXA557PRM":78},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":16,"sourceHtmlUrl":17,"categories":18,"keywords":19,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":44,"repositoryHtmlUrl":45,"repositoryHomepageUrl":6,"ownerHtmlUrl":46,"ownerBlogUrl":47,"ownerDescription":48,"updatedAt":49,"install":50,"resources":63},"01M6H0CW2DFJ8Y18BNXA557PRM","sign-message-phishing-review",null,"Use when asked to sign a plain message or an unknown typed payload. Detects Seaport\u002FOpenSea orders, permit-like permits, and hashed transactions, and refuses eth_sign and anything you cannot render.","jiayaoqijia\u002Fcryptoskill","jiayaoqijia","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1453879?v=4","01M6GMYTX7Q7S504VC6E756ENR","YQ","01M6GMYV1QKJ1CC75MTTGT9PR0",81,"MIT","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-sign-message-phishing-review\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-sign-message-phishing-review\u002FSKILL.md",[],[20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"review","phishing","message","sign","sign message phishing review","transactions","use","payload","orders","opensea","eth","render","you","unknown","plain","when","2026-11-10 10:12:30",false,"---\nname: sign-message-phishing-review\ndescription: Use when asked to sign a plain message or an unknown typed payload. Detects Seaport\u002FOpenSea orders, permit-like permits, and hashed transactions, and refuses eth_sign and anything you cannot render.\n---\n\n# Review a message-signing request\n\nMessage signatures have no gas cost and no on-chain record, which is why drainers ask for them. This skill classifies the payload, decodes anything structured, and refuses blind signatures.\n\n## Procedure\n\n1. Classify the prefix. `personal_sign` uses `0x19` + `\"Ethereum Signed Message:\\n\"` + length + message; EIP-712 uses `0x1901` + domain separator + struct hash. Decode the first bytes:\n   `python3 -c \"print(open('payload.hex').read()[:10])\"` → `0x19457468...` is personal_sign, `0x1901` is typed data.\n2. Refuse `eth_sign` outright. Its `0x19` + raw-hash prefix signs an arbitrary hash, which is equivalent to signing a transaction you never saw.\n3. If it is EIP-712, print the domain and the full struct and confirm the wallet shows the same fields. Check for a Seaport `OrderComponents` or an OpenSea order — signing one lets the recipient transfer your listed assets.\n4. If it is permit-shaped (`permit`, `Permit`, `PermitSingle`), treat it as an approval: check spender, value, and deadline as you would for an on-chain approval.\n5. Compare the signing site's domain to the project's real domain; a signature request from a lookalike host is the phish.\n6. Use a dedicated signer address that holds no assets for logins and off-chain proofs, so a leaked signature cannot move funds.\n7. If any field is unreadable, do not sign.\n8. Record the exact payload hash and the domain you saw, so a disputed signature can be audited later.\n\n## Pitfalls\n\n- A drainer can craft a typed message that grants an approval with a far-future deadline and no visible token; the wallet renders the struct but users skim it.\n- `signTypedData` with a domain that omits `verifyingContract` can be replayed on any contract that accepts it.\n- Lookalike domains (extra hyphen, different TLD) render identically to a skimming eye; compare the full hostname.\n- A message that is actually a serialized transaction hash signed with `eth_sign` is indistinguishable from a harmless login string to a user; only refusing `eth_sign` prevents it.\n- Approving a signature on a site you reached from a DM or an ad is the common path; navigate to the project yourself.\n\n- A login that produces a `permit` payload is not a login; the label on the page is not the payload.\n- Wallet pop-ups truncate long messages; expand the raw view before deciding.\n- A signature requested on a testnet can be replayed on mainnet if the domain lacks a chain id.\n- A drainer can ask for two signatures in sequence; the second completes what the first prepared.\n\n## Verification\n\n    python3 -c \"print(open('payload.hex').read()[:10])\" && cast to-dec \u003Cv>\n    # expect 0x19457468 or 0x1901 (never a bare 0x19), and a legitimate chain id\n\nReport the payload prefix, the decoded domain, and the exact fields signed, with the commands behind them.\n","# Review a message-signing request\n\nMessage signatures have no gas cost and no on-chain record, which is why drainers ask for them. This skill classifies the payload, decodes anything structured, and refuses blind signatures.\n\n## Procedure\n\n1. Classify the prefix. `personal_sign` uses `0x19` + `\"Ethereum Signed Message:\\n\"` + length + message; EIP-712 uses `0x1901` + domain separator + struct hash. Decode the first bytes:\n   `python3 -c \"print(open('payload.hex').read()[:10])\"` → `0x19457468...` is personal_sign, `0x1901` is typed data.\n2. Refuse `eth_sign` outright. Its `0x19` + raw-hash prefix signs an arbitrary hash, which is equivalent to signing a transaction you never saw.\n3. If it is EIP-712, print the domain and the full struct and confirm the wallet shows the same fields. Check for a Seaport `OrderComponents` or an OpenSea order — signing one lets the recipient transfer your listed assets.\n4. If it is permit-shaped (`permit`, `Permit`, `PermitSingle`), treat it as an approval: check spender, value, and deadline as you would for an on-chain approval.\n5. Compare the signing site's domain to the project's real domain; a signature request from a lookalike host is the phish.\n6. Use a dedicated signer address that holds no assets for logins and off-chain proofs, so a leaked signature cannot move funds.\n7. If any field is unreadable, do not sign.\n8. Record the exact payload hash and the domain you saw, so a disputed signature can be audited later.\n\n## Pitfalls\n\n- A drainer can craft a typed message that grants an approval with a far-future deadline and no visible token; the wallet renders the struct but users skim it.\n- `signTypedData` with a domain that omits `verifyingContract` can be replayed on any contract that accepts it.\n- Lookalike domains (extra hyphen, different TLD) render identically to a skimming eye; compare the full hostname.\n- A message that is actually a serialized transaction hash signed with `eth_sign` is indistinguishable from a harmless login string to a user; only refusing `eth_sign` prevents it.\n- Approving a signature on a site you reached from a DM or an ad is the common path; navigate to the project yourself.\n\n- A login that produces a `permit` payload is not a login; the label on the page is not the payload.\n- Wallet pop-ups truncate long messages; expand the raw view before deciding.\n- A signature requested on a testnet can be replayed on mainnet if the domain lacks a chain id.\n- A drainer can ask for two signatures in sequence; the second completes what the first prepared.\n\n## Verification\n\n    python3 -c \"print(open('payload.hex').read()[:10])\" && cast to-dec \u003Cv>\n    # expect 0x19457468 or 0x1901 (never a bare 0x19), and a legitimate chain id\n\nReport the payload prefix, the decoded domain, and the exact fields signed, with the commands behind them.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-sign-message-phishing-review",17,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia","https:\u002F\u002Feth2030.com","Hardcore infra. Building @alt-research and applied cryptography.","2026-11-14 02:27:51",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill sign-message-phishing-review",{"tool":56,"command":57},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill sign-message-phishing-review",{"tool":59,"command":60},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill sign-message-phishing-review","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-sign-message-phishing-review\u002FSKILL.md",true,[64,68,74],{"path":65,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"SOURCE.md","REFERENCE","参考文档",354,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-sign-message-phishing-review\u002FSOURCE.md",{"path":75,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":76,"sourceHtmlUrl":77},"TRUST.auto.yaml",2191,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-sign-message-phishing-review\u002FTRUST.auto.yaml",[79,107,130,147,160,170],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":83,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":36},"01M712C436EQYE43342Q4E7GG1","recipe-performance","Diagnose a specific MetaMask user flow's real-app performance and Sentry critical-user-flow telemetry with deterministic mm-harness recipes. Use for CUF boundaries, cold\u002Fwarm\u002Fbackground-resume behavior, latency regressions, lifecycle tags, duplicate or blocking network requests, long tasks, layout\u002Fpaint cost, screen redraws, React rerenders, or browser trace analysis where tests alone cannot prove the real app.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FSKILL.md",[],[87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":111,"licenseFileUrl":112,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":36},"01M70XT2F8A5CQZ81JBP98KSW3","mexc-spot-websocket","MEXC Spot WebSocket workflows for public streams, protobuf handling, depth maintenance, listen keys, and private streams without exposing API keys.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FSKILL.md",[],[116,117,118,119,120,121,122,123,124,125,126,127,128,129],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":111,"licenseFileUrl":134,"sourceHtmlUrl":135,"categories":136,"keywords":137,"publishedAt":36},"01M70XT0MBXN3WZY1BKN0CPNKR","mexc-spot-rest","MEXC Spot REST workflows for public data, signed account requests, orders, wallet\u002Fadmin actions, and secure signing without exposing API keys.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FSKILL.md",[],[138,117,139,140,141,142,143,127,126,125,144,145,146,121,28,120,119],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","data",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":111,"licenseFileUrl":151,"sourceHtmlUrl":152,"categories":153,"keywords":154,"publishedAt":36},"01M70XSYSVZ2N0N91XCAR2CAK0","mexc-futures-websocket","MEXC Futures WebSocket workflows for public streams, private account\u002Forder\u002Fposition streams, ping\u002Fpong, subscriptions, and depth maintenance.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FSKILL.md",[],[155,156,118,157,158,128,126,159,124,123,121,120],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":161,"name":162,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":163,"sourceHtmlUrl":164,"categories":165,"keywords":166,"publishedAt":36},"01M6H0ZWHVE5W04WG2DKQE2SQC","0xklen-version-and-refresh-sanctions-lists","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FSKILL.md",[],[167,168,169],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":174,"sourceHtmlUrl":175,"categories":176,"keywords":177,"publishedAt":36},"01M6H0Z28Q3R8J0S799GJQWXM3","verify-tests-cover-changed-lines","Use when a PR adds code that the existing suite may not exercise. Measures patch coverage — the share of newly changed lines hit by tests — before approving.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FSKILL.md",[],[178,179,180,181,182,183,184,26,185,186,187],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","code","share"]