[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7ECZ1YA1MACKX7939B3F7N2":3,"skill-same:01M7ECZ1YA1MACKX7939B3F7N2":48},{"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":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":26,"commitSha":27,"skillDirectory":28,"forksCount":29,"repositoryHtmlUrl":30,"repositoryHomepageUrl":6,"ownerHtmlUrl":31,"ownerBlogUrl":6,"ownerDescription":32,"updatedAt":33,"install":34,"resources":47},"01M7ECZ1YA1MACKX7939B3F7N2","nodejs-keccak256",null,"Prevent Ethereum hashing bugs in JavaScript and TypeScript. Node's sha3-256 is NIST SHA3, not Ethereum Keccak-256, and silently breaks selectors, signatures, storage slots, and address derivation.","lza6\u002FArmor-piercing-system-prompts","lza6","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F128880206?v=4","01M7EB3K7WPX5T28EJ2NVHE6EG","Chinese-tingfeng","01M7EB3K97E1KQ16QWKJMFNGX8",11,"MIT","https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F03-逆向工程\u002Fnodejs-keccak256-everything-claude-code-main\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: nodejs-keccak256\ndescription: Prevent Ethereum hashing bugs in JavaScript and TypeScript. Node's sha3-256 is NIST SHA3, not Ethereum Keccak-256, and silently breaks selectors, signatures, storage slots, and address derivation.\norigin: ECC direct-port adaptation\nversion: \"1.0.0\"\n---\n\n# Node.js Keccak-256\n\nEthereum uses Keccak-256, not the NIST-standardized SHA3 variant exposed by Node's `crypto.createHash('sha3-256')`.\n\n## When to Use\n\n- Computing Ethereum function selectors or event topics\n- Building EIP-712, signature, Merkle, or storage-slot helpers in JS\u002FTS\n- Reviewing any code that hashes Ethereum data with Node crypto directly\n\n## How It Works\n\nThe two algorithms produce different outputs for the same input, and Node will not warn you.\n\n```javascript\nimport crypto from 'crypto';\nimport { keccak256, toUtf8Bytes } from 'ethers';\n\nconst data = 'hello';\nconst nistSha3 = crypto.createHash('sha3-256').update(data).digest('hex');\nconst keccak = keccak256(toUtf8Bytes(data)).slice(2);\n\nconsole.log(nistSha3 === keccak); \u002F\u002F false\n```\n\n## Examples\n\n### ethers v6\n\n```typescript\nimport { keccak256, toUtf8Bytes, solidityPackedKeccak256, id } from 'ethers';\n\nconst hash = keccak256(new Uint8Array([0x01, 0x02]));\nconst hash2 = keccak256(toUtf8Bytes('hello'));\nconst topic = id('Transfer(address,address,uint256)');\nconst packed = solidityPackedKeccak256(\n  ['address', 'uint256'],\n  ['0x742d35Cc6634C0532925a3b8D4C9B569890FaC1c', 100n],\n);\n```\n\n### viem\n\n```typescript\nimport { keccak256, toBytes } from 'viem';\n\nconst hash = keccak256(toBytes('hello'));\n```\n\n### web3.js\n\n```javascript\nconst hash = web3.utils.keccak256('hello');\nconst packed = web3.utils.soliditySha3(\n  { type: 'address', value: '0x742d35Cc6634C0532925a3b8D4C9B569890FaC1c' },\n  { type: 'uint256', value: '100' },\n);\n```\n\n### Common patterns\n\n```typescript\nimport { id, keccak256, AbiCoder } from 'ethers';\n\nconst selector = id('transfer(address,uint256)').slice(0, 10);\nconst typeHash = keccak256(toUtf8Bytes('Transfer(address from,address to,uint256 value)'));\n\nfunction getMappingSlot(key: string, mappingSlot: number): string {\n  return keccak256(\n    AbiCoder.defaultAbiCoder().encode(['address', 'uint256'], [key, mappingSlot]),\n  );\n}\n```\n\n### Address from public key\n\n```typescript\nimport { keccak256 } from 'ethers';\n\nfunction pubkeyToAddress(pubkeyBytes: Uint8Array): string {\n  const hash = keccak256(pubkeyBytes.slice(1));\n  return '0x' + hash.slice(-40);\n}\n```\n\n### Audit your codebase\n\n```bash\ngrep -rn \"createHash.*sha3\" --include=\"*.ts\" --include=\"*.js\" --exclude-dir=node_modules .\ngrep -rn \"keccak256\" --include=\"*.ts\" --include=\"*.js\" . | grep -v node_modules\n```\n\n## Rule\n\nFor Ethereum contexts, never use `crypto.createHash('sha3-256')`. Use Keccak-aware helpers from `ethers`, `viem`, `web3`, or another explicit Keccak implementation.\n","# Node.js Keccak-256\n\nEthereum uses Keccak-256, not the NIST-standardized SHA3 variant exposed by Node's `crypto.createHash('sha3-256')`.\n\n## When to Use\n\n- Computing Ethereum function selectors or event topics\n- Building EIP-712, signature, Merkle, or storage-slot helpers in JS\u002FTS\n- Reviewing any code that hashes Ethereum data with Node crypto directly\n\n## How It Works\n\nThe two algorithms produce different outputs for the same input, and Node will not warn you.\n\n```javascript\nimport crypto from 'crypto';\nimport { keccak256, toUtf8Bytes } from 'ethers';\n\nconst data = 'hello';\nconst nistSha3 = crypto.createHash('sha3-256').update(data).digest('hex');\nconst keccak = keccak256(toUtf8Bytes(data)).slice(2);\n\nconsole.log(nistSha3 === keccak); \u002F\u002F false\n```\n\n## Examples\n\n### ethers v6\n\n```typescript\nimport { keccak256, toUtf8Bytes, solidityPackedKeccak256, id } from 'ethers';\n\nconst hash = keccak256(new Uint8Array([0x01, 0x02]));\nconst hash2 = keccak256(toUtf8Bytes('hello'));\nconst topic = id('Transfer(address,address,uint256)');\nconst packed = solidityPackedKeccak256(\n  ['address', 'uint256'],\n  ['0x742d35Cc6634C0532925a3b8D4C9B569890FaC1c', 100n],\n);\n```\n\n### viem\n\n```typescript\nimport { keccak256, toBytes } from 'viem';\n\nconst hash = keccak256(toBytes('hello'));\n```\n\n### web3.js\n\n```javascript\nconst hash = web3.utils.keccak256('hello');\nconst packed = web3.utils.soliditySha3(\n  { type: 'address', value: '0x742d35Cc6634C0532925a3b8D4C9B569890FaC1c' },\n  { type: 'uint256', value: '100' },\n);\n```\n\n### Common patterns\n\n```typescript\nimport { id, keccak256, AbiCoder } from 'ethers';\n\nconst selector = id('transfer(address,uint256)').slice(0, 10);\nconst typeHash = keccak256(toUtf8Bytes('Transfer(address from,address to,uint256 value)'));\n\nfunction getMappingSlot(key: string, mappingSlot: number): string {\n  return keccak256(\n    AbiCoder.defaultAbiCoder().encode(['address', 'uint256'], [key, mappingSlot]),\n  );\n}\n```\n\n### Address from public key\n\n```typescript\nimport { keccak256 } from 'ethers';\n\nfunction pubkeyToAddress(pubkeyBytes: Uint8Array): string {\n  const hash = keccak256(pubkeyBytes.slice(1));\n  return '0x' + hash.slice(-40);\n}\n```\n\n### Audit your codebase\n\n```bash\ngrep -rn \"createHash.*sha3\" --include=\"*.ts\" --include=\"*.js\" --exclude-dir=node_modules .\ngrep -rn \"keccak256\" --include=\"*.ts\" --include=\"*.js\" . | grep -v node_modules\n```\n\n## Rule\n\nFor Ethereum contexts, never use `crypto.createHash('sha3-256')`. Use Keccak-aware helpers from `ethers`, `viem`, `web3`, or another explicit Keccak implementation.\n",{"name":5,"origin":24,"version":25,"description":7},"ECC direct-port adaptation","1.0.0","main","d69096e239f2a89aabc2cd078c47664a9d3b1e11","03-逆向工程\u002Fnodejs-keccak256-everything-claude-code-main",3,"https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts","https:\u002F\u002Fgithub.com\u002Flza6","个人vx：Tf00798\r\n个人✈：@TFGY999","2026-10-08 14:29:22",{"source":8,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add lza6\u002FArmor-piercing-system-prompts --skill nodejs-keccak256",{"tool":40,"command":41},"bunx","bunx skills add lza6\u002FArmor-piercing-system-prompts --skill nodejs-keccak256",{"tool":43,"command":44},"pnpm","pnpm dlx skills add lza6\u002FArmor-piercing-system-prompts --skill nodejs-keccak256","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F03-逆向工程\u002Fnodejs-keccak256-everything-claude-code-main\u002FSKILL.md",true,[],[49,56,63,70,78,85],{"skillNo":50,"name":51,"nameZh":6,"description":52,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":55,"publishedAt":19},"01M7EXRM12046G0GM1WGMMFXCN","ci-cd-and-automation","Automates CI\u002FCD pipeline setup. Use when setting up or modifying build and deployment pipelines. Use when you need to automate quality gates, configure test runners in CI, or establish deployment strategies.","https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F05-技能与代理开发\u002Fci-cd-and-automation\u002FSKILL.md",[],[],{"skillNo":57,"name":58,"nameZh":6,"description":59,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":62,"publishedAt":19},"01M7EXRFYYSJ3Y15AGPDDEWWQD","chrome-devtools","Uses Chrome DevTools via MCP for efficient debugging, troubleshooting and browser automation. Use when debugging web pages, automating browser interactions, analyzing performance, or inspecting network requests. This skill does not apply to `--slim` mode (MCP configuration).","https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F05-技能与代理开发\u002Fchrome-devtools\u002FSKILL.md",[],[],{"skillNo":64,"name":65,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":69,"publishedAt":19},"01M7EXR6EYPE4X5X1BTAE6QJRV","chrome-cdp","Drive a real Chrome via the Chrome DevTools Protocol (CDP). Ensures a\ndebuggable Chrome is running (launching it if needed) so the agent can\nnavigate, read page content, inspect the DOM, run JavaScript, and take\nscreenshots — without the user typing any launch command. Includes a\nfirst-class \"review a live running app\" flow: point Chrome at the app under\ndevelopment and inspect\u002Fscreenshot the REAL page (what a static-artifact tool\ncannot do). Backed by Glimpse and the chrome-devtools MCP server. Use when\nasked to \"use chrome\", \"open chrome\", \"drive my browser\", \"read the page in\nchrome\", \"review the running app\", \"screenshot the app\", or \"\u002Fchrome-cdp\".","https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F05-技能与代理开发\u002Fchrome-cdp\u002FSKILL.md",[],[],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":74,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":19},"01M7EXR1Y7E79KQKG4J798XGH6","check-identity-pack","Run an AFP 100-point or AUSTRAC safe-harbour identity check over a set of documents, and report exactly what's missing. Use when the user asks to check identity documents, verify someone's ID for onboarding, or assess whether a document pack satisfies Australian identity requirements.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F05-技能与代理开发\u002Fcheck-identity-pack\u002FSKILL.md",[],[],{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":19},"01M7EXQXW7C7PGREJW9ZZTZ16H","changelog","Auto-generates a changelog from git commits, sprint data, and design documents. Produces both internal and player-facing versions.","https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F05-技能与代理开发\u002Fchangelog\u002FSKILL.md",[],[],{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":19},"01M7EXQMH2ZME3ANN8Q8MEWPFB","cellxgene-census","Query the CZ CELLxGENE Census programmatically for versioned public single-cell and spatial transcriptomics data. Use when you need population-scale cell metadata, gene expression slices, Census summary counts, source H5AD URIs\u002Fdownloads, embeddings, spatial Census data, or reference atlas comparisons across organisms, tissues, diseases, assays, and cell types. For analyzing your own local single-cell data use scanpy, anndata, or scvi-tools.","https:\u002F\u002Fgithub.com\u002Flza6\u002FArmor-piercing-system-prompts\u002Fblob\u002Fmain\u002F05-技能与代理开发\u002Fcellxgene-census\u002FSKILL.md",[],[]]