[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GXW82HZARAV9B6QRY1SAMJ":3,"skill-same:01M6GXW82HZARAV9B6QRY1SAMJ":76},{"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":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":39,"commitSha":40,"skillDirectory":41,"forksCount":42,"repositoryHtmlUrl":43,"repositoryHomepageUrl":6,"ownerHtmlUrl":44,"ownerBlogUrl":45,"ownerDescription":46,"updatedAt":47,"install":48,"resources":61},"01M6GXW82HZARAV9B6QRY1SAMJ","check-testnet-mainnet-parity",null,"Use when a protocol works on a testnet and you must decide whether it will behave identically on mainnet, or when porting addresses and config between networks.","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-check-testnet-mainnet-parity\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-check-testnet-mainnet-parity\u002FSKILL.md",[],[20,21,22,23,24,25,26,27,28,29,30,31,32,33],"check","check testnet mainnet parity","parity","config","protocol","networks","decide","use","behave","it","you","addresses","porting","when","2026-11-10 10:12:30",false,"---\nname: check-testnet-mainnet-parity\ndescription: Use when a protocol works on a testnet and you must decide whether it will behave identically on mainnet, or when porting addresses and config between networks.\n---\n\n# Check testnet\u002Fmainnet parity\n\nTestnet success is not mainnet success. Gas, block time, reorg depth, available opcodes,\noracle and token addresses, and contract bytecode all differ. Verify each axis instead of\nassuming the networks are interchangeable.\n\n## Procedure\n\n1. Compare the deployed bytecode of the same \"address\" on both networks. Identical code means a\n   deterministic (CREATE2) deploy; different code means you are looking at two contracts.\n\n       cast code $ADDR --rpc-url $SEPOLIA_RPC | cast keccak\n       cast code $ADDR --rpc-url $MAINNET_RPC  | cast keccak\n\n2. Verify chain-specific constants. WETH, USDC, Chainlink feeds and multicall are *not* the same\n   address across chains. Read them from a config keyed by chain id, never hardcode.\n\n       cast call $WETH \"symbol()(string)\" --rpc-url $MAINNET_RPC\n       # WETH9 mainnet 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\n       # WETH9 sepolia 0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14\n\n3. Compare execution economics: block time, base fee, gas limits, and EIP-1559 status.\n\n       cast block latest --json --rpc-url $MAINNET_RPC | jq -r '.timestamp, .gasLimit, .baseFeePerGas'\n       cast block latest --json --rpc-url $SEPOLIA_RPC | jq -r '.timestamp, .gasLimit, .baseFeePerGas'\n\n4. Check opcode\u002Ffeature availability on the target chain (L2s and older testnets lag): `PUSH0`\n   (Shanghai), transient storage (`TSTORE`\u002F`TLOAD`, Cancun), and blob transactions differ.\n   Deploying bytecode compiled for a newer EVM to an older chain reverts on the first `PUSH0`.\n5. Run the project's own tests against a mainnet fork, then against the testnet, and diff the\n   outcomes:\n\n       forge test --fork-url $MAINNET_RPC -vvv\n       forge test --fork-url $SEPOLIA_RPC -vvv --no-match-test \"MainnetOnly\"\n\n6. Confirm deployment addresses match your expected list by reading them back, not by trusting\n   a shared `deployments.json` (which frequently mixes networks).\n\n## Pitfalls\n\n- Testnet reorgs are far more frequent and deeper than mainnet; a tx confirmed on Sepolia can\n  still be reorged out minutes later. Wait more confirmations on testnets, not fewer.\n- Faucet\u002Fsandbox testnets reset; addresses and state vanish without notice. Never treat testnet\n  state as persistent.\n- Chainlink feeds exist at different addresses per network and some testnets run different\n  heartbeat intervals — an oracle that updates hourly on mainnet may go stale for days on a\n  testnet.\n- Gas price assumptions ported from testnet (often ~0) break on mainnet; always estimate on the\n  target chain.\n- Same-nonce deployments produce the same address only if both the deployer and nonce match;\n  reusing a nonce value across chains with different prior txs yields different addresses.\n\n## Verification\n\n    cast code $ADDR --rpc-url $MAINNET_RPC | cast keccak\n    cast code $ADDR --rpc-url $SEPOLIA_RPC | cast keccak\n    # equal hashes -> deterministic deploy; unequal -> different contract\n\nReport each parity axis (bytecode hash, chain constants, gas params, EVM feature set) and mark\nany divergence that could change behaviour.\n","# Check testnet\u002Fmainnet parity\n\nTestnet success is not mainnet success. Gas, block time, reorg depth, available opcodes,\noracle and token addresses, and contract bytecode all differ. Verify each axis instead of\nassuming the networks are interchangeable.\n\n## Procedure\n\n1. Compare the deployed bytecode of the same \"address\" on both networks. Identical code means a\n   deterministic (CREATE2) deploy; different code means you are looking at two contracts.\n\n       cast code $ADDR --rpc-url $SEPOLIA_RPC | cast keccak\n       cast code $ADDR --rpc-url $MAINNET_RPC  | cast keccak\n\n2. Verify chain-specific constants. WETH, USDC, Chainlink feeds and multicall are *not* the same\n   address across chains. Read them from a config keyed by chain id, never hardcode.\n\n       cast call $WETH \"symbol()(string)\" --rpc-url $MAINNET_RPC\n       # WETH9 mainnet 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\n       # WETH9 sepolia 0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14\n\n3. Compare execution economics: block time, base fee, gas limits, and EIP-1559 status.\n\n       cast block latest --json --rpc-url $MAINNET_RPC | jq -r '.timestamp, .gasLimit, .baseFeePerGas'\n       cast block latest --json --rpc-url $SEPOLIA_RPC | jq -r '.timestamp, .gasLimit, .baseFeePerGas'\n\n4. Check opcode\u002Ffeature availability on the target chain (L2s and older testnets lag): `PUSH0`\n   (Shanghai), transient storage (`TSTORE`\u002F`TLOAD`, Cancun), and blob transactions differ.\n   Deploying bytecode compiled for a newer EVM to an older chain reverts on the first `PUSH0`.\n5. Run the project's own tests against a mainnet fork, then against the testnet, and diff the\n   outcomes:\n\n       forge test --fork-url $MAINNET_RPC -vvv\n       forge test --fork-url $SEPOLIA_RPC -vvv --no-match-test \"MainnetOnly\"\n\n6. Confirm deployment addresses match your expected list by reading them back, not by trusting\n   a shared `deployments.json` (which frequently mixes networks).\n\n## Pitfalls\n\n- Testnet reorgs are far more frequent and deeper than mainnet; a tx confirmed on Sepolia can\n  still be reorged out minutes later. Wait more confirmations on testnets, not fewer.\n- Faucet\u002Fsandbox testnets reset; addresses and state vanish without notice. Never treat testnet\n  state as persistent.\n- Chainlink feeds exist at different addresses per network and some testnets run different\n  heartbeat intervals — an oracle that updates hourly on mainnet may go stale for days on a\n  testnet.\n- Gas price assumptions ported from testnet (often ~0) break on mainnet; always estimate on the\n  target chain.\n- Same-nonce deployments produce the same address only if both the deployer and nonce match;\n  reusing a nonce value across chains with different prior txs yields different addresses.\n\n## Verification\n\n    cast code $ADDR --rpc-url $MAINNET_RPC | cast keccak\n    cast code $ADDR --rpc-url $SEPOLIA_RPC | cast keccak\n    # equal hashes -> deterministic deploy; unequal -> different contract\n\nReport each parity axis (bytecode hash, chain constants, gas params, EVM feature set) and mark\nany divergence that could change behaviour.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-check-testnet-mainnet-parity",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":49,"prompt":59,"zipAvailable":60},[50,53,56],{"tool":51,"command":52},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill check-testnet-mainnet-parity",{"tool":54,"command":55},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill check-testnet-mainnet-parity",{"tool":57,"command":58},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill check-testnet-mainnet-parity","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-check-testnet-mainnet-parity\u002FSKILL.md",true,[62,66,72],{"path":63,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":65,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":67,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":70,"sourceHtmlUrl":71},"SOURCE.md","REFERENCE","参考文档",354,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-check-testnet-mainnet-parity\u002FSOURCE.md",{"path":73,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":74,"sourceHtmlUrl":75},"TRUST.auto.yaml",2217,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-check-testnet-mainnet-parity\u002FTRUST.auto.yaml",[77,105,128,146,159,169],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":81,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":34},"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",[],[85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":106,"name":107,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":109,"licenseFileUrl":110,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":34},"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",[],[114,115,116,117,118,119,120,121,122,123,124,125,126,127],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":109,"licenseFileUrl":132,"sourceHtmlUrl":133,"categories":134,"keywords":135,"publishedAt":34},"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",[],[136,115,137,138,139,140,141,125,124,123,142,143,144,119,145,118,117],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","data","orders",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":109,"licenseFileUrl":150,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":34},"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",[],[154,155,116,156,157,126,124,158,122,121,119,118],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":160,"name":161,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":162,"sourceHtmlUrl":163,"categories":164,"keywords":165,"publishedAt":34},"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",[],[166,167,168],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":173,"sourceHtmlUrl":174,"categories":175,"keywords":176,"publishedAt":34},"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",[],[177,178,179,180,181,182,183,27,184,185,186],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","code","share"]