[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GXT9CYXTQ70DK152DBVTHM":3,"skill-same:01M6GXT9CYXTQ70DK152DBVTHM":73},{"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":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":36,"commitSha":37,"skillDirectory":38,"forksCount":39,"repositoryHtmlUrl":40,"repositoryHomepageUrl":6,"ownerHtmlUrl":41,"ownerBlogUrl":42,"ownerDescription":43,"updatedAt":44,"install":45,"resources":58},"01M6GXT9CYXTQ70DK152DBVTHM","cap-balances-in-a-hot-wallet",null,"Use when an operational key signs autonomously and sits online. Sets a float ceiling, keeps the rest cold, and funds the hot wallet on a schedule instead of letting it accumulate.","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-cap-balances-in-a-hot-wallet\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-cap-balances-in-a-hot-wallet\u002FSKILL.md",[],[20,21,22,23,24,25,26,27,28,29,30],"Wallet","cap","cap balances in a hot wallet","balances","REST","schedule","use","cold","it","float","when","2026-11-10 10:12:30",false,"---\nname: cap-balances-in-a-hot-wallet\ndescription: Use when an operational key signs autonomously and sits online. Sets a float ceiling, keeps the rest cold, and funds the hot wallet on a schedule instead of letting it accumulate.\n---\n\n# Cap the balance a hot wallet may hold\n\nAn online signing key must be assumed leakable, so the point of a hot wallet is to hold only what the next few hours of operations need. This skill fixes a hard ceiling per hot wallet and sweeps surplus to cold storage on a schedule.\n\n## Procedure\n\n1. Measure real outflow. Pull the last 30 days of outbound value from the hot address and take the 99th-percentile daily figure:\n   `cast logs --address $TOKEN --from-block $START --to-block $LATEST --json | jq -r '.[].data'`\n   or query an indexer for daily outbound totals.\n2. Set the ceiling to that 99th-percentile amount rounded up — commonly 2–5% of the treasury per hot wallet. The ceiling is never \"everything\".\n3. Sweep surplus to cold whenever the balance exceeds the ceiling, with an idempotent sweeper on a cron:\n   `cast send $TOKEN \"transfer(address,uint256)\" $COLD $SURPLUS --account sweeper --rpc-url $RPC`\n4. Fund the hot wallet on a schedule from cold rather than letting deposits rest there. Inbound customer funds route to a cold receiving address, not the operational key.\n5. Alert when the balance is within 20% of the ceiling so a human reviews before the sweeper fires.\n6. Re-derive the ceiling quarterly and after any volume change; a stale ceiling either starves operations or over-exposes funds.\n\n## Pitfalls\n\n- A sweeper holding an unlimited allowance from the cold wallet makes the sweeper key the new best target; cap its allowance to a single sweep amount.\n- On high-fee chains the sweeper needs native balance for gas; a drained gas balance strands the tokens it was sent to move.\n- Round-number ceilings (\"keep 10 ETH\") rot fast; derive from measured volume.\n- If surplus moves only when a human clicks, the ceiling is aspirational, not enforced.\n- A hot wallet that also holds the deployer key conflates roles; the sweeper should not be able to upgrade contracts.\n- A hot wallet refilled by an automated payout job keeps restoring itself after a sweep; cap the job's per-run amount or the ceiling is fiction.\n- A multisig hot wallet is still hot: the convenience of an API signer does not change the online-exposure assumption.\n- Track the ceiling in the same units you measure volume; mixing a token float with a native gas float hides the real exposure.\n- If the sweeper and the signer share one key, an attacker who takes that key both sweeps and drains with it.\n\n## Verification\n\n    cast balance $HOT --rpc-url $RPC && echo \"ceiling=$CEILING\"\n    # expect balance \u003C= ceiling; a value above it means a sweep is overdue\n\nReport the measured ceiling, the current balance, and the sweeper's last run, with the commands behind them.\n","# Cap the balance a hot wallet may hold\n\nAn online signing key must be assumed leakable, so the point of a hot wallet is to hold only what the next few hours of operations need. This skill fixes a hard ceiling per hot wallet and sweeps surplus to cold storage on a schedule.\n\n## Procedure\n\n1. Measure real outflow. Pull the last 30 days of outbound value from the hot address and take the 99th-percentile daily figure:\n   `cast logs --address $TOKEN --from-block $START --to-block $LATEST --json | jq -r '.[].data'`\n   or query an indexer for daily outbound totals.\n2. Set the ceiling to that 99th-percentile amount rounded up — commonly 2–5% of the treasury per hot wallet. The ceiling is never \"everything\".\n3. Sweep surplus to cold whenever the balance exceeds the ceiling, with an idempotent sweeper on a cron:\n   `cast send $TOKEN \"transfer(address,uint256)\" $COLD $SURPLUS --account sweeper --rpc-url $RPC`\n4. Fund the hot wallet on a schedule from cold rather than letting deposits rest there. Inbound customer funds route to a cold receiving address, not the operational key.\n5. Alert when the balance is within 20% of the ceiling so a human reviews before the sweeper fires.\n6. Re-derive the ceiling quarterly and after any volume change; a stale ceiling either starves operations or over-exposes funds.\n\n## Pitfalls\n\n- A sweeper holding an unlimited allowance from the cold wallet makes the sweeper key the new best target; cap its allowance to a single sweep amount.\n- On high-fee chains the sweeper needs native balance for gas; a drained gas balance strands the tokens it was sent to move.\n- Round-number ceilings (\"keep 10 ETH\") rot fast; derive from measured volume.\n- If surplus moves only when a human clicks, the ceiling is aspirational, not enforced.\n- A hot wallet that also holds the deployer key conflates roles; the sweeper should not be able to upgrade contracts.\n- A hot wallet refilled by an automated payout job keeps restoring itself after a sweep; cap the job's per-run amount or the ceiling is fiction.\n- A multisig hot wallet is still hot: the convenience of an API signer does not change the online-exposure assumption.\n- Track the ceiling in the same units you measure volume; mixing a token float with a native gas float hides the real exposure.\n- If the sweeper and the signer share one key, an attacker who takes that key both sweeps and drains with it.\n\n## Verification\n\n    cast balance $HOT --rpc-url $RPC && echo \"ceiling=$CEILING\"\n    # expect balance \u003C= ceiling; a value above it means a sweep is overdue\n\nReport the measured ceiling, the current balance, and the sweeper's last run, with the commands behind them.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-cap-balances-in-a-hot-wallet",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":46,"prompt":56,"zipAvailable":57},[47,50,53],{"tool":48,"command":49},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill cap-balances-in-a-hot-wallet",{"tool":51,"command":52},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill cap-balances-in-a-hot-wallet",{"tool":54,"command":55},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill cap-balances-in-a-hot-wallet","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-cap-balances-in-a-hot-wallet\u002FSKILL.md",true,[59,63,69],{"path":60,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":62,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":64,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":68},"SOURCE.md","REFERENCE","参考文档",354,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-cap-balances-in-a-hot-wallet\u002FSOURCE.md",{"path":70,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":71,"sourceHtmlUrl":72},"TRUST.auto.yaml",2170,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-cap-balances-in-a-hot-wallet\u002FTRUST.auto.yaml",[74,101,124,140,153,163],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":78,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":31},"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",[],[82,83,84,85,86,87,88,89,90,91,27,92,93,94,95,96,97,98,99,100],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":105,"licenseFileUrl":106,"sourceHtmlUrl":107,"categories":108,"keywords":109,"publishedAt":31},"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",[],[110,111,112,113,114,115,116,117,118,119,120,121,122,123],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":105,"licenseFileUrl":128,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":31},"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",[],[132,111,24,133,134,20,135,121,120,119,136,137,138,115,139,114,113],"mexc spot rest","admin","signing","requests","actions","secure","data","orders",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":105,"licenseFileUrl":144,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":31},"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",[],[148,149,112,150,151,122,120,152,118,117,115,114],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":154,"name":155,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":156,"sourceHtmlUrl":157,"categories":158,"keywords":159,"publishedAt":31},"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",[],[160,161,162],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":164,"name":165,"nameZh":6,"description":166,"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":31},"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",[],[171,172,173,174,175,176,177,26,178,179,180],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","code","share"]