[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GYQ2HD7RGW69D42FE2MSSB":3,"skill-same:01M6GYQ2HD7RGW69D42FE2MSSB":82},{"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":24,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":51,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M6GYQ2HD7RGW69D42FE2MSSB","fork-test-wallet-policy-changes",null,"Use when changing an allowlist, spending cap, or guard on a live wallet. Replays the change and a representative transfer against a mainnet fork so the policy is proven before real signers approve.","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-fork-test-wallet-policy-changes\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-fork-test-wallet-policy-changes\u002FSKILL.md",[19],{"categoryNo":20,"categoryName":21,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"policy","test","Wallet","fork test wallet policy changes","changes","fork","change","transfer","guard","use","cap","live","spending","approve","when","2026-11-10 10:12:30",false,"---\nname: fork-test-wallet-policy-changes\ndescription: Use when changing an allowlist, spending cap, or guard on a live wallet. Replays the change and a representative transfer against a mainnet fork so the policy is proven before real signers approve.\n---\n\n# Fork-test wallet policy changes\n\nPolicy changes on a live wallet are hard to undo and easy to get subtly wrong — an off-by-one on a cap, a linked-list error in an allowlist, a guard that reverts legitimate spends. This skill proves the change on a fork first.\n\n## Procedure\n\n1. Snapshot the exact state the change will run against: fork at the current block so token balances, allowances, and the owner set match mainnet.\n   `anvil --fork-url $RPC --fork-block-number $LATEST`\n2. Apply the pending policy change on the fork with the same calldata you intend to sign (allowlist add, `setGuard`, cap update).\n3. Run a representative transaction that should pass — a normal spend to an allowlisted destination within the cap — and confirm it succeeds on the fork.\n4. Run the negative cases: over-cap amount, non-allowlisted destination, a below-assumed-decimal token amount, and a transfer during the cool-down. Each must revert with the expected reason.\n5. For an allowlist change, exercise the linked-list boundary: add at the head, add at the tail, remove the head, remove the tail. Off-by-one in `prevModule`\u002F`prevOwner` ordering shows up only here.\n6. Confirm the change itself is reversible on the fork (a guard can be removed, an allowlist entry deleted) before signing the real one.\n7. Record the fork block number and the calldata hashes so the mainnet transaction is provably the tested one.\n\n## Pitfalls\n\n- Forking at a stale block lets your balance assumptions drift; fork at `latest` and state the block number.\n- A fork has no mempool competition; success on a fork does not prove gas or MEV outcomes, only that the policy logic holds.\n- Testing only the happy path misses the whole point; the revert cases are the test.\n- An allowlist implemented as a sorted linked list returns a different `prev` after insertions; copy the exact ordering from the fork state, never from memory.\n- Rebuilding the calldata by hand after the fork test means you signed something untested; hash and compare.\n- If the guard reads a price oracle, fork at a block where the oracle value is representative; a manipulated block gives false confidence.\n- Anvil's default tip may exclude your recent deployment; pin it with `--fork-block-number`.\n- A policy that passes on a fork can still fail on mainnet under a different `tx.origin`; test with the real sender.\n- Rerun the whole suite after any change to the policy contract; a one-line fix invalidates prior results.\n\n## Verification\n\n    # on the fork: happy path succeeds, and each negative case reverts\n    cast send $TOKEN \"transfer(address,uint256)\" $ALLOWED $SMALL --from $SENDER --rpc-url http:\u002F\u002F127.0.0.1:8545\n    cast send $TOKEN \"transfer(address,uint256)\" $BLOCKED $SMALL --from $SENDER --rpc-url http:\u002F\u002F127.0.0.1:8545\n    # expect the first to succeed and the second to revert with the policy reason\n\nReport the fork block, the calldata hash tested, and the pass\u002Frevert results, quoting the outputs.\n","# Fork-test wallet policy changes\n\nPolicy changes on a live wallet are hard to undo and easy to get subtly wrong — an off-by-one on a cap, a linked-list error in an allowlist, a guard that reverts legitimate spends. This skill proves the change on a fork first.\n\n## Procedure\n\n1. Snapshot the exact state the change will run against: fork at the current block so token balances, allowances, and the owner set match mainnet.\n   `anvil --fork-url $RPC --fork-block-number $LATEST`\n2. Apply the pending policy change on the fork with the same calldata you intend to sign (allowlist add, `setGuard`, cap update).\n3. Run a representative transaction that should pass — a normal spend to an allowlisted destination within the cap — and confirm it succeeds on the fork.\n4. Run the negative cases: over-cap amount, non-allowlisted destination, a below-assumed-decimal token amount, and a transfer during the cool-down. Each must revert with the expected reason.\n5. For an allowlist change, exercise the linked-list boundary: add at the head, add at the tail, remove the head, remove the tail. Off-by-one in `prevModule`\u002F`prevOwner` ordering shows up only here.\n6. Confirm the change itself is reversible on the fork (a guard can be removed, an allowlist entry deleted) before signing the real one.\n7. Record the fork block number and the calldata hashes so the mainnet transaction is provably the tested one.\n\n## Pitfalls\n\n- Forking at a stale block lets your balance assumptions drift; fork at `latest` and state the block number.\n- A fork has no mempool competition; success on a fork does not prove gas or MEV outcomes, only that the policy logic holds.\n- Testing only the happy path misses the whole point; the revert cases are the test.\n- An allowlist implemented as a sorted linked list returns a different `prev` after insertions; copy the exact ordering from the fork state, never from memory.\n- Rebuilding the calldata by hand after the fork test means you signed something untested; hash and compare.\n- If the guard reads a price oracle, fork at a block where the oracle value is representative; a manipulated block gives false confidence.\n- Anvil's default tip may exclude your recent deployment; pin it with `--fork-block-number`.\n- A policy that passes on a fork can still fail on mainnet under a different `tx.origin`; test with the real sender.\n- Rerun the whole suite after any change to the policy contract; a one-line fix invalidates prior results.\n\n## Verification\n\n    # on the fork: happy path succeeds, and each negative case reverts\n    cast send $TOKEN \"transfer(address,uint256)\" $ALLOWED $SMALL --from $SENDER --rpc-url http:\u002F\u002F127.0.0.1:8545\n    cast send $TOKEN \"transfer(address,uint256)\" $BLOCKED $SMALL --from $SENDER --rpc-url http:\u002F\u002F127.0.0.1:8545\n    # expect the first to succeed and the second to revert with the policy reason\n\nReport the fork block, the calldata hash tested, and the pass\u002Frevert results, quoting the outputs.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-fork-test-wallet-policy-changes",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-13 02:31:19",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill fork-test-wallet-policy-changes",{"tool":60,"command":61},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill fork-test-wallet-policy-changes",{"tool":63,"command":64},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill fork-test-wallet-policy-changes","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-fork-test-wallet-policy-changes\u002FSKILL.md",true,[68,72,78],{"path":69,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"SOURCE.md","REFERENCE","参考文档",357,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-fork-test-wallet-policy-changes\u002FSOURCE.md",{"path":79,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":80,"sourceHtmlUrl":81},"TRUST.auto.yaml",2201,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-fork-test-wallet-policy-changes\u002FTRUST.auto.yaml",[83,111,134,151,164,174],{"skillNo":84,"name":85,"nameZh":6,"description":86,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":87,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":40},"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",[],[91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":115,"licenseFileUrl":116,"sourceHtmlUrl":117,"categories":118,"keywords":119,"publishedAt":40},"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",[],[120,121,122,123,124,125,126,127,128,129,130,131,132,133],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":115,"licenseFileUrl":138,"sourceHtmlUrl":139,"categories":140,"keywords":141,"publishedAt":40},"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",[],[142,121,143,144,145,27,146,131,130,129,147,148,149,125,150,124,123],"mexc spot rest","REST","admin","signing","requests","actions","secure","data","orders",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":115,"licenseFileUrl":155,"sourceHtmlUrl":156,"categories":157,"keywords":158,"publishedAt":40},"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",[],[159,160,122,161,162,132,130,163,128,127,125,124],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":165,"name":166,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":167,"sourceHtmlUrl":168,"categories":169,"keywords":170,"publishedAt":40},"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",[],[171,172,173],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":175,"name":176,"nameZh":6,"description":177,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":178,"sourceHtmlUrl":179,"categories":180,"keywords":181,"publishedAt":40},"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",[],[182,183,184,185,186,187,188,34,189,190,191],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","code","share"]