[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H0FYRKQ7KC960PDRX3Q2SX":3,"skill-same:01M6H0FYRKQ7KC960PDRX3Q2SX":79},{"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":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":42,"commitSha":43,"skillDirectory":44,"forksCount":45,"repositoryHtmlUrl":46,"repositoryHomepageUrl":6,"ownerHtmlUrl":47,"ownerBlogUrl":48,"ownerDescription":49,"updatedAt":50,"install":51,"resources":64},"01M6H0FYRKQ7KC960PDRX3Q2SX","spot-drainer-signature-phishing",null,"Use when a wallet, site or dapp asks you to sign a message or transaction and you must decide whether it is a legitimate request or a drainer trying to take assets.","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-spot-drainer-signature-phishing\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-spot-drainer-signature-phishing\u002FSKILL.md",[],[20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],"spot drainer signature phishing","phishing","spot","transaction","when","request","dapp","you","it","sign","message","Wallet","take","use","decide","assets","site","2026-11-10 10:12:30",false,"---\nname: spot-drainer-signature-phishing\ndescription: Use when a wallet, site or dapp asks you to sign a message or transaction and you must decide whether it is a legitimate request or a drainer trying to take assets.\n---\n\n# Spot drainer and signature-phishing requests\n\nThe most common wallet drain is not a contract exploit: it is a signature the user is talked\ninto giving. Decode what is actually being requested before approving anything, and refuse\nblind-signing outright.\n\n## Procedure\n\n1. Classify the request before signing:\n\n   - `eth_sign` \u002F `personal_sign` over opaque bytes: the wallet shows only a hex blob. This is\n     the highest-risk class — refuse unless you can decode the payload to plain, non-authorising\n     text. A legitimate login (SIWE) shows a readable message with a `Nonce` and `domain`.\n   - `eth_signTypedData_v4` (EIP-712): decode the domain and message; check `domain.chainId`,\n     `domain.verifyingContract`, and every field for an approval.\n   - A transaction: decode with `cast calldata-decode` (see `decode-calldata-and-events`).\n\n2. For EIP-712, inspect the spender\u002Foperator and amount. An approval-style message names a\n   `spender` you have never seen, or grants `uint256` max, or has a far-future `deadline`.\n\n       # In a wallet, read the \"spender\"\u002F\"operator\"\u002F\"amount\"\u002F\"deadline\" fields directly.\n       # Permit2 (0x000000000022D473030F116dDEE9F6B43aC78BA3) requests can move any approved token.\n\n3. For a transaction, print the target and decoded call:\n\n       cast tx $HASH --rpc-url $RPC --json | jq -r '.to, .input' | head\n       cast calldata-decode \"setApprovalForAll(address,bool)\" 0xa22cb465...\n\n   `setApprovalForAll(0xATTACKER, true)` hands over your entire NFT collection.\n\n4. Check existing allowances before signing more. Revoke unknown operators from a wallet you\n   trust, not from the site that asked.\n\n       curl -s \"https:\u002F\u002Fapi.etherscan.io\u002Fv2\u002Fapi?chainid=1&module=account&action=tokennfttx\\\n&address=$YOU&apikey=$ETHERSCAN_API_KEY\" | jq -r '.result[0]'\n\n5. Hard refuses: `eth_sign` on raw hashes, any signature over a message you cannot read, approvals\n   to addresses not in the project's verified docs, and any request from a link in a DM.\n\n## Pitfalls\n\n- EIP-712 payloads look legitimate — the domain name can be spoofed to mimic a real project, and\n  the `verifyingContract` may be an attacker's contract that merely shares the name.\n- \"Sign to verify you are human \u002F to claim an airdrop\" is the standard drainer pretext; signing\n  a permit grants spend rights, it does not prove identity.\n- Permit vs Permit2 have different structures; a Permit2 `permitTransferFrom` lets the attacker\n  move tokens you previously approved to the Permit2 contract.\n- Revoke sites can themselves be malicious. Verify the revoke contract address before interacting.\n- A signature that grants a session key (e.g. a 4337 session) can be replayed for its whole\n  validity window; treat validity windows as spend limits.\n- Hardware wallets show the message verbatim — if the text is a blob, that is the sign to stop.\n\n## Verification\n\n    cast calldata-decode \"setApprovalForAll(address,bool)\" $INPUT\n    # prints (operator, approved); approved==true for an unknown operator is a drainer\n\nReport the request type (personal_sign \u002F EIP-712 \u002F transaction), the spender or operator address,\nthe amount and expiry, and whether you decoded it to a readable intent. If it is `eth_sign` or an\nunknown spender, report \"refuse\" with the reason.\n","# Spot drainer and signature-phishing requests\n\nThe most common wallet drain is not a contract exploit: it is a signature the user is talked\ninto giving. Decode what is actually being requested before approving anything, and refuse\nblind-signing outright.\n\n## Procedure\n\n1. Classify the request before signing:\n\n   - `eth_sign` \u002F `personal_sign` over opaque bytes: the wallet shows only a hex blob. This is\n     the highest-risk class — refuse unless you can decode the payload to plain, non-authorising\n     text. A legitimate login (SIWE) shows a readable message with a `Nonce` and `domain`.\n   - `eth_signTypedData_v4` (EIP-712): decode the domain and message; check `domain.chainId`,\n     `domain.verifyingContract`, and every field for an approval.\n   - A transaction: decode with `cast calldata-decode` (see `decode-calldata-and-events`).\n\n2. For EIP-712, inspect the spender\u002Foperator and amount. An approval-style message names a\n   `spender` you have never seen, or grants `uint256` max, or has a far-future `deadline`.\n\n       # In a wallet, read the \"spender\"\u002F\"operator\"\u002F\"amount\"\u002F\"deadline\" fields directly.\n       # Permit2 (0x000000000022D473030F116dDEE9F6B43aC78BA3) requests can move any approved token.\n\n3. For a transaction, print the target and decoded call:\n\n       cast tx $HASH --rpc-url $RPC --json | jq -r '.to, .input' | head\n       cast calldata-decode \"setApprovalForAll(address,bool)\" 0xa22cb465...\n\n   `setApprovalForAll(0xATTACKER, true)` hands over your entire NFT collection.\n\n4. Check existing allowances before signing more. Revoke unknown operators from a wallet you\n   trust, not from the site that asked.\n\n       curl -s \"https:\u002F\u002Fapi.etherscan.io\u002Fv2\u002Fapi?chainid=1&module=account&action=tokennfttx\\\n&address=$YOU&apikey=$ETHERSCAN_API_KEY\" | jq -r '.result[0]'\n\n5. Hard refuses: `eth_sign` on raw hashes, any signature over a message you cannot read, approvals\n   to addresses not in the project's verified docs, and any request from a link in a DM.\n\n## Pitfalls\n\n- EIP-712 payloads look legitimate — the domain name can be spoofed to mimic a real project, and\n  the `verifyingContract` may be an attacker's contract that merely shares the name.\n- \"Sign to verify you are human \u002F to claim an airdrop\" is the standard drainer pretext; signing\n  a permit grants spend rights, it does not prove identity.\n- Permit vs Permit2 have different structures; a Permit2 `permitTransferFrom` lets the attacker\n  move tokens you previously approved to the Permit2 contract.\n- Revoke sites can themselves be malicious. Verify the revoke contract address before interacting.\n- A signature that grants a session key (e.g. a 4337 session) can be replayed for its whole\n  validity window; treat validity windows as spend limits.\n- Hardware wallets show the message verbatim — if the text is a blob, that is the sign to stop.\n\n## Verification\n\n    cast calldata-decode \"setApprovalForAll(address,bool)\" $INPUT\n    # prints (operator, approved); approved==true for an unknown operator is a drainer\n\nReport the request type (personal_sign \u002F EIP-712 \u002F transaction), the spender or operator address,\nthe amount and expiry, and whether you decoded it to a readable intent. If it is `eth_sign` or an\nunknown spender, report \"refuse\" with the reason.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-spot-drainer-signature-phishing",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-15 02:28:10",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill spot-drainer-signature-phishing",{"tool":57,"command":58},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill spot-drainer-signature-phishing",{"tool":60,"command":61},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill spot-drainer-signature-phishing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-spot-drainer-signature-phishing\u002FSKILL.md",true,[65,69,75],{"path":66,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":68,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":70,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":73,"sourceHtmlUrl":74},"SOURCE.md","REFERENCE","参考文档",357,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-spot-drainer-signature-phishing\u002FSOURCE.md",{"path":76,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":77,"sourceHtmlUrl":78},"TRUST.auto.yaml",2270,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-spot-drainer-signature-phishing\u002FTRUST.auto.yaml",[80,108,130,147,160,170],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":84,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":37},"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",[],[88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":112,"licenseFileUrl":113,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":37},"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",[],[117,22,118,119,120,121,122,123,124,125,126,127,128,129],"mexc spot websocket","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":112,"licenseFileUrl":134,"sourceHtmlUrl":135,"categories":136,"keywords":137,"publishedAt":37},"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,22,139,140,141,31,142,127,126,125,143,144,145,121,146,120,119],"mexc spot rest","REST","admin","signing","requests","actions","secure","data","orders",{"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":112,"licenseFileUrl":151,"sourceHtmlUrl":152,"categories":153,"keywords":154,"publishedAt":37},"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":37},"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":37},"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,33,185,186,187],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","code","share"]