[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71FQWQ349GHPXMARP8TRJFC":3,"skill-same:01M71FQWQ349GHPXMARP8TRJFC":240},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":57,"install":58,"resources":71},"01M71FQWQ349GHPXMARP8TRJFC","uniswap-v4-lp",null,"Manage Uniswap V4 LP positions on Base. Add, remove, monitor, auto-compound, and harvest fees — including Clanker protocol fee claims.","JSGforever\u002Fskillguard","JSGforever","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F85541948?v=4","01M71FQD3E132VMR5F4TAYX3YS","01M71FQD4DYW0XJ4XQ4YQH75Y9",2,"MIT","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"uniswap v4","lp","uniswap v4 lp","uniswap","base","protocol","harvest","compound","monitor","manage","liquidity","fees","add","positions","clanker","axiom","claims","auto","claim","remove","2026-11-10 10:12:30",false,"---\nname: uniswap-v4-lp\ndescription: Manage Uniswap V4 LP positions on Base. Add, remove, monitor, auto-compound, and harvest fees — including Clanker protocol fee claims.\ntriggers:\n  - uniswap\n  - v4\n  - liquidity\n  - LP position\n  - add liquidity\n  - remove liquidity\n  - clanker\n  - harvest\n  - compound\n  - claim fees\nversion: 0.2.0\nauthor: Axiom (@AxiomBot)\nlicense: MIT\nchain: base\n---\n\n# Uniswap V4 LP Skill\n\nManage concentrated liquidity positions on Uniswap V4 (Base chain).\n\n## Features\n\n- Add liquidity to V4 pools\n- Remove liquidity \u002F collect fees\n- Monitor position health\n- Rebalance when out of range\n- **Auto-compound** fees back into liquidity (set-and-forget)\n\n## Requirements\n\n- Private key in environment (`PRIVATE_KEY` or `NET_PRIVATE_KEY`)\n- Node.js 18+\n- viem package\n\n## Quick Start\n\n```bash\n# Install dependencies\ncd scripts && npm install\n\n# Add liquidity ($20 test position)\nnode add-liquidity.mjs --amount 20 --range 25\n\n# Check position\nnode check-position.mjs --token-id \u003CID>\n\n# Monitor if in range\nnode monitor-position.mjs --token-id \u003CID>\n\n# Collect fees (without removing liquidity)\nnode collect-fees.mjs --token-id \u003CID>\n\n# Auto-compound fees → liquidity\n# Two strategies: DOLLAR (default) or TIME\n\n# Dollar strategy: compound when fees exceed $5 (default)\nnode auto-compound.mjs --token-id \u003CID>\nnode auto-compound.mjs --token-id \u003CID> --min-usd 20       # custom threshold\n\n# Time strategy: compound on schedule (skip only if fees \u003C gas)\nnode auto-compound.mjs --token-id \u003CID> --strategy time\n\n# Loop mode: run continuously\nnode auto-compound.mjs --token-id \u003CID> --strategy dollar --loop --interval 3600 --min-usd 50\nnode auto-compound.mjs --token-id \u003CID> --strategy time --loop --interval 14400\n\n# Preview\nnode auto-compound.mjs --token-id \u003CID> --dry-run\n\n# Compound & Harvest: split fees — compound some, harvest rest as USDC\nnode compound-and-harvest.mjs --token-id \u003CID> \\\n  --harvest-address 0xYOUR_ADDRESS --compound-pct 50\nnode compound-and-harvest.mjs --token-id \u003CID> \\\n  --harvest-address 0xYOUR_ADDRESS --compound-pct 70 --slippage 3\nnode compound-and-harvest.mjs --token-id \u003CID> \\\n  --harvest-address 0xYOUR_ADDRESS --dry-run\n\n# Remove liquidity (partial)\nnode remove-liquidity.mjs --token-id \u003CID> --percent 50\n\n# Burn position (100% removal + burn NFT)\nnode burn-position.mjs --token-id \u003CID>\n\n# Rebalance (remove + re-add at current price)\nnode rebalance.mjs --token-id \u003CID> --range 25\n```\n\n## Base Chain Contracts\n\n| Contract | Address |\n|----------|---------|\n| PoolManager | `0x498581ff718922c3f8e6a244956af099b2652b2b` |\n| PositionManager | `0x7c5f5a4bbd8fd63184577525326123b519429bdc` |\n| StateView | `0xa3c0c9b65bad0b08107aa264b0f3db444b867a71` |\n| Permit2 | `0x000000000022D473030F116dDEE9F6B43aC78BA3` |\n\n## Security Notes\n\n1. **Always use private mempools** (Flashbots\u002FMEV Blocker) for LP operations\n2. **Set reasonable slippage** (1-3% for volatile pairs)\n3. **Monitor positions** - rebalance when 80% to range edge\n4. **Start small** - test with minimal amounts first\n\n## Pool-Specific: AXIOM\u002FWETH\n\n```javascript\nconst AXIOM_WETH_POOL = {\n  poolId: '0x10a0b8eba9d4e0f772c8c47968ee819bb4609ef4454409157961570cdce9a735',\n  token0: '0x4200000000000000000000000000000000000006', \u002F\u002F WETH\n  token1: '0xf3Ce5dDAAb6C133F9875a4a46C55cf0b58111B07', \u002F\u002F AXIOM\n  fee: 0x800000, \u002F\u002F ⚠️ DYNAMIC_FEE_FLAG - Clanker hook controls fee\n  tickSpacing: 200,\n  hooks: '0xb429d62f8f3bffb98cdb9569533ea23bf0ba28cc' \u002F\u002F Clanker hook\n};\n```\n\n## ⚠️ Critical: Dynamic Fee Pools\n\nMany V4 pools (especially Clanker-deployed) use **dynamic fees**. The fee in PoolKey is `0x800000` (bit 23 = DYNAMIC_FEE_FLAG), NOT a percentage.\n\n**How to verify:**\n```javascript\n\u002F\u002F Hash your PoolKey and compare to known poolId\nconst poolId = keccak256(abi.encode(currency0, currency1, fee, tickSpacing, hooks));\n```\n\nIf your hash doesn't match, check if the pool uses `0x800000` as fee.\n\n## Auto-Compound Strategies\n\n### Dollar Strategy (`--strategy dollar`, default)\nAccumulate fees in wallet, only compound when they hit a USD threshold.\nBest for: **low-volume pools**, **expensive chains**, or **patient LPs**.\n\n```bash\n# Compound when fees reach $50\nnode auto-compound.mjs --token-id \u003CID> --strategy dollar --loop --interval 3600 --min-usd 50\n```\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `--min-usd` | 5 | Min USD fee value to trigger compound |\n| `--min-gas-multiple` | 3 | Fees must be ≥ Nx gas cost |\n| `--interval` | 3600 | Seconds between checks in loop mode |\n\n### Time Strategy (`--strategy time`)\nCompound on a fixed schedule. Skips only if fees \u003C gas cost.\nBest for: **high-volume pools** where fees accumulate quickly.\n\n```bash\n# Compound every 4 hours\nnode auto-compound.mjs --token-id \u003CID> --strategy time --loop --interval 14400\n```\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `--min-gas-multiple` | 3 | Fees must be ≥ Nx gas cost (safety floor) |\n| `--interval` | 3600 | Seconds between compounds in loop mode |\n\n### When to Use Which\n\n| Pool Volume | Strategy | Interval | Min USD |\n|-------------|----------|----------|---------|\n| >$1M\u002Fday | time | 4-6h | n\u002Fa |\n| $100K-$1M\u002Fday | dollar | 1h | $10-25 |\n| \u003C$100K\u002Fday | dollar | 4h | $50+ |\n\nBoth strategies always enforce a gas floor — you'll never burn money on gas.\n\n## Compound & Harvest\n\nSplit LP fees: compound a percentage back into the position and harvest the rest as USDC.\n\n### How It Works\n\n1. **Collect** all accrued fees (DECREASE_LIQUIDITY with 0 + CLOSE_CURRENCY)\n2. **Split** fees by compound-pct (default 50\u002F50)\n3. **Compound** the compound portion back into the position (INCREASE_LIQUIDITY + SETTLE_PAIR)\n4. **Swap** the harvest portion of both tokens to USDC via Uniswap V3 SwapRouter02\n   - WETH → USDC direct (0.05% pool)\n   - Meme tokens → WETH → USDC multi-hop (tries 1%, 0.3%, 0.05% fee tiers)\n5. **Transfer** all USDC to the harvest address\n\n### Usage\n\n```bash\n# Preview (dry run)\nnode compound-and-harvest.mjs --token-id 1078751 \\\n  --harvest-address 0xcbC7E8A39A0Ec84d6B0e8e0dd98655F348ECD44F --dry-run\n\n# 50\u002F50 split (default)\nnode compound-and-harvest.mjs --token-id 1078751 \\\n  --harvest-address 0xcbC7E8A39A0Ec84d6B0e8e0dd98655F348ECD44F\n\n# 70% compound, 30% harvest\nnode compound-and-harvest.mjs --token-id 1078751 \\\n  --harvest-address 0xcbC7E8A39A0Ec84d6B0e8e0dd98655F348ECD44F \\\n  --compound-pct 70\n\n# 100% harvest (take all fees as USDC, no compounding)\nnode compound-and-harvest.mjs --token-id 1078751 \\\n  --harvest-address 0xcbC7E8A39A0Ec84d6B0e8e0dd98655F348ECD44F \\\n  --compound-pct 0\n\n# Custom slippage\nnode compound-and-harvest.mjs --token-id 1078751 \\\n  --harvest-address 0xcbC7E8A39A0Ec84d6B0e8e0dd98655F348ECD44F \\\n  --slippage 3\n```\n\n### Flags\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `--token-id` | required | LP NFT token ID |\n| `--harvest-address` | required | Address to receive harvested USDC |\n| `--compound-pct` | 50 | Percentage to compound (0-100) |\n| `--slippage` | 1 | Slippage tolerance for swaps (%) |\n| `--dry-run` | false | Preview without executing |\n| `--rpc` | env\u002Fdefault | Base RPC URL |\n\n### Swap Routing\n\n- Uses **Uniswap V3 SwapRouter02** (`0x2626664c2603336E57B271c5C0b26F421741e481`)\n- WETH → USDC: `exactInputSingle` with 500 (0.05%) fee tier\n- Other tokens → USDC: `exactInput` multi-hop through WETH, auto-tries fee tiers 10000\u002F3000\u002F500\n\n## 🌾 Clanker Harvest — Full Treasury Pipeline\n\nThe killer feature: a complete fee management pipeline for **any Clanker-launched token**.\n\nClanker tokens have two fee sources:\n1. **Clanker protocol fees** — stored in a separate fee contract, must be claimed\n2. **LP position fees** — accrued in the V4 position, collected via DECREASE\n\n`clanker-harvest.mjs` handles both in a single modular pipeline.\n\n### Quick Start\n\n```bash\n# Just claim Clanker protocol fees (no LP, no swap)\nnode clanker-harvest.mjs --token 0xTOKEN\n\n# Claim + compound 100% into LP\nnode clanker-harvest.mjs --token 0xTOKEN --token-id 12345 --compound-pct 100\n\n# Claim + harvest 100% as USDC to vault\nnode clanker-harvest.mjs --token 0xTOKEN --harvest-address 0xVAULT --compound-pct 0\n\n# 50\u002F50 split — compound half, harvest half\nnode clanker-harvest.mjs --token 0xTOKEN --token-id 12345 \\\n  --harvest-address 0xVAULT --compound-pct 50\n\n# 80% compound \u002F 20% harvest, only if fees > $10\nnode clanker-harvest.mjs --token 0xTOKEN --token-id 12345 \\\n  --harvest-address 0xVAULT --compound-pct 80 --min-usd 10\n\n# Use a config file (perfect for cron)\nnode clanker-harvest.mjs --config harvest-config.json\n```\n\n### Pipeline Steps\n\n| Step | What | When |\n|------|------|------|\n| 1. Claim | Claim WETH + token from Clanker fee contract | Always (unless `--skip-claim`) |\n| 2. Collect LP | Collect accrued fees from V4 position | If `--token-id` set (unless `--skip-lp`) |\n| 3. Threshold | Check total USD value against `--min-usd` | If threshold set |\n| 4. Compound | Add X% back into LP position | If `--compound-pct` > 0 and `--token-id` set |\n| 5. Swap | Swap remaining WETH to USDC | If `--compound-pct` \u003C 100 and `--harvest-address` set |\n| 6. Transfer | Send USDC to vault address | If USDC was swapped |\n\n### Flags\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `--token` | required | Clanker token address |\n| `--token-id` | optional | V4 LP position NFT ID (needed for compound\u002FLP) |\n| `--harvest-address` | optional | Vault address for USDC (needed for harvest) |\n| `--compound-pct` | 100 | % to compound back (0 = all harvest, 100 = all compound) |\n| `--min-usd` | 0 | Min USD fee value to act (0 = always) |\n| `--slippage` | 1 | Swap slippage % |\n| `--fee-contract` | 0xf362... | Clanker fee storage contract |\n| `--skip-claim` | false | Skip Clanker fee claim |\n| `--skip-lp` | false | Skip LP fee collection |\n| `--config` | optional | JSON config file path |\n| `--dry-run` | false | Simulate without executing |\n\n### Config File\n\nFor cron jobs, use a JSON config:\n\n```json\n{\n  \"token\": \"0xYOUR_TOKEN\",\n  \"tokenId\": \"12345\",\n  \"harvestAddress\": \"0xYOUR_VAULT\",\n  \"compoundPct\": 50,\n  \"minUsd\": 10,\n  \"slippage\": 1\n}\n```\n\n### Clanker Fee Contract\n\n| Function | Description |\n|----------|-------------|\n| `claim(feeOwner, token)` | Claim fees for a specific token |\n| `availableFees(feeOwner, token)` | Check pending fee balance |\n\nContract: `0xf3622742b1e446d92e45e22923ef11c2fcd55d68`\n\nTwo separate claims needed (WETH + token) — the script handles both automatically.\n\n### Standalone Claim Script\n\nFor simpler use cases, `claim-clanker-fees.mjs` just claims without any LP operations:\n\n```bash\n# Check available fees (dry run)\nnode claim-clanker-fees.mjs --token 0xTOKEN --dry-run\n\n# Claim both WETH and token fees\nnode claim-clanker-fees.mjs --token 0xTOKEN\n```\n\n### Self-Sustaining Agent Economics\n\nThe core idea: agents launched on Clanker can **fund their own infrastructure** from LP yield.\n\n```\nLP Fees + Clanker Fees\n        ↓\n   ┌────┴────┐\n   │         │\nCompound   Harvest\n(grow LP)  (→ USDC → pay for LLM, RPC, hosting)\n```\n\nSet up a cron job with `--min-usd` threshold and the agent only acts when it's profitable to do so.\n\n## LP Range Alert\n\nMonitor your positions and get alerted when price moves near or out of range.\n\n### Quick Start\n\n```bash\n# Check single position\nnode lp-range-alert.mjs --positions 1078751\n\n# Check multiple positions\nnode lp-range-alert.mjs --positions 1078751,1078720,1078695\n\n# Dry run (check without saving state)\nnode lp-range-alert.mjs --positions 1078751 --dry-run\n\n# JSON output (for cron\u002Fautomation)\nnode lp-range-alert.mjs --positions 1078751 --json\n\n# Custom alert threshold (alert at 20% from edge instead of 15%)\nnode lp-range-alert.mjs --positions 1078751 --near-edge-pct 20\n\n# Force alert even if status unchanged\nnode lp-range-alert.mjs --positions 1078751 --force\n```\n\n### Config File\n\nFor cron jobs, use a JSON config (`lp-alert-config.example.json`):\n\n```json\n{\n  \"positions\": [\"1078751\", \"1078720\", \"1078695\"],\n  \"telegramChat\": \"YOUR_CHAT_ID\",\n  \"nearEdgePercent\": 15,\n  \"rpcUrl\": \"https:\u002F\u002Fmainnet.base.org\"\n}\n```\n\nRun with: `node lp-range-alert.mjs --config lp-alert-config.json`\n\n### Alert Statuses\n\n| Status | Meaning | Action |\n|--------|---------|--------|\n| `OK` | In range, healthy | None needed |\n| `NEAR_LOWER_EDGE` | Within 15% of lower bound | Monitor, prepare to rebalance down |\n| `NEAR_UPPER_EDGE` | Within 15% of upper bound | Monitor, prepare to rebalance up |\n| `OUT_OF_RANGE` | Price outside position range | **Rebalance immediately** (not earning fees!) |\n\n### State Persistence\n\nState is saved to `~\u002F.lp-alert-state.json` to prevent duplicate alerts.\n- Only alerts on status **changes** (not on every check)\n- Use `--force` to alert regardless of previous state\n\n### Flags\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `--positions` | required | Comma-separated token IDs |\n| `--config` | optional | JSON config file path |\n| `--telegram-chat` | optional | Chat ID for Telegram alerts |\n| `--near-edge-pct` | 15 | Alert threshold (% from edge) |\n| `--dry-run` | false | Check without saving state |\n| `--json` | false | JSON output |\n| `--force` | false | Alert even if status unchanged |\n| `--rpc` | env\u002Fdefault | Custom RPC URL |\n\n### Recommended Cron Setup\n\n```bash\n# Check every 30 minutes\n*\u002F30 * * * * cd \u002Fpath\u002Fto\u002Fscripts && node lp-range-alert.mjs --config lp-alert-config.json >> \u002Ftmp\u002Flp-alerts.log 2>&1\n```\n\n## Position Strategy Recommendations\n\nFor ~$20-1000 positions:\n- **Range:** ±25% from current price\n- **Rebalance:** When price hits 80% of boundary\n- **Check:** Every 4-6 hours\n- **Expected APR:** 15-30%\n","# Uniswap V4 LP Skill\n\nManage concentrated liquidity positions on Uniswap V4 (Base chain).\n\n## Features\n\n- Add liquidity to V4 pools\n- Remove liquidity \u002F collect fees\n- Monitor position health\n- Rebalance when out of range\n- **Auto-compound** fees back into liquidity (set-and-forget)\n\n## Requirements\n\n- Private key in environment (`PRIVATE_KEY` or `NET_PRIVATE_KEY`)\n- Node.js 18+\n- viem package\n\n## Quick Start\n\n```bash\n# Install dependencies\ncd scripts && npm install\n\n# Add liquidity ($20 test position)\nnode add-liquidity.mjs --amount 20 --range 25\n\n# Check position\nnode check-position.mjs --token-id \u003CID>\n\n# Monitor if in range\nnode monitor-position.mjs --token-id \u003CID>\n\n# Collect fees (without removing liquidity)\nnode collect-fees.mjs --token-id \u003CID>\n\n# Auto-compound fees → liquidity\n# Two strategies: DOLLAR (default) or TIME\n\n# Dollar strategy: compound when fees exceed $5 (default)\nnode auto-compound.mjs --token-id \u003CID>\nnode auto-compound.mjs --token-id \u003CID> --min-usd 20       # custom threshold\n\n# Time strategy: compound on schedule (skip only if fees \u003C gas)\nnode auto-compound.mjs --token-id \u003CID> --strategy time\n\n# Loop mode: run continuously\nnode auto-compound.mjs --token-id \u003CID> --strategy dollar --loop --interval 3600 --min-usd 50\nnode auto-compound.mjs --token-id \u003CID> --strategy time --loop --interval 14400\n\n# Preview\nnode auto-compound.mjs --token-id \u003CID> --dry-run\n\n# Compound & Harvest: split fees — compound some, harvest rest as USDC\nnode compound-and-harvest.mjs --token-id \u003CID> \\\n  --harvest-address 0xYOUR_ADDRESS --compound-pct 50\nnode compound-and-harvest.mjs --token-id \u003CID> \\\n  --harvest-address 0xYOUR_ADDRESS --compound-pct 70 --slippage 3\nnode compound-and-harvest.mjs --token-id \u003CID> \\\n  --harvest-address 0xYOUR_ADDRESS --dry-run\n\n# Remove liquidity (partial)\nnode remove-liquidity.mjs --token-id \u003CID> --percent 50\n\n# Burn position (100% removal + burn NFT)\nnode burn-position.mjs --token-id \u003CID>\n\n# Rebalance (remove + re-add at current price)\nnode rebalance.mjs --token-id \u003CID> --range 25\n```\n\n## Base Chain Contracts\n\n| Contract | Address |\n|----------|---------|\n| PoolManager | `0x498581ff718922c3f8e6a244956af099b2652b2b` |\n| PositionManager | `0x7c5f5a4bbd8fd63184577525326123b519429bdc` |\n| StateView | `0xa3c0c9b65bad0b08107aa264b0f3db444b867a71` |\n| Permit2 | `0x000000000022D473030F116dDEE9F6B43aC78BA3` |\n\n## Security Notes\n\n1. **Always use private mempools** (Flashbots\u002FMEV Blocker) for LP operations\n2. **Set reasonable slippage** (1-3% for volatile pairs)\n3. **Monitor positions** - rebalance when 80% to range edge\n4. **Start small** - test with minimal amounts first\n\n## Pool-Specific: AXIOM\u002FWETH\n\n```javascript\nconst AXIOM_WETH_POOL = {\n  poolId: '0x10a0b8eba9d4e0f772c8c47968ee819bb4609ef4454409157961570cdce9a735',\n  token0: '0x4200000000000000000000000000000000000006', \u002F\u002F WETH\n  token1: '0xf3Ce5dDAAb6C133F9875a4a46C55cf0b58111B07', \u002F\u002F AXIOM\n  fee: 0x800000, \u002F\u002F ⚠️ DYNAMIC_FEE_FLAG - Clanker hook controls fee\n  tickSpacing: 200,\n  hooks: '0xb429d62f8f3bffb98cdb9569533ea23bf0ba28cc' \u002F\u002F Clanker hook\n};\n```\n\n## ⚠️ Critical: Dynamic Fee Pools\n\nMany V4 pools (especially Clanker-deployed) use **dynamic fees**. The fee in PoolKey is `0x800000` (bit 23 = DYNAMIC_FEE_FLAG), NOT a percentage.\n\n**How to verify:**\n```javascript\n\u002F\u002F Hash your PoolKey and compare to known poolId\nconst poolId = keccak256(abi.encode(currency0, currency1, fee, tickSpacing, hooks));\n```\n\nIf your hash doesn't match, check if the pool uses `0x800000` as fee.\n\n## Auto-Compound Strategies\n\n### Dollar Strategy (`--strategy dollar`, default)\nAccumulate fees in wallet, only compound when they hit a USD threshold.\nBest for: **low-volume pools**, **expensive chains**, or **patient LPs**.\n\n```bash\n# Compound when fees reach $50\nnode auto-compound.mjs --token-id \u003CID> --strategy dollar --loop --interval 3600 --min-usd 50\n```\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `--min-usd` | 5 | Min USD fee value to trigger compound |\n| `--min-gas-multiple` | 3 | Fees must be ≥ Nx gas cost |\n| `--interval` | 3600 | Seconds between checks in loop mode |\n\n### Time Strategy (`--strategy time`)\nCompound on a fixed schedule. Skips only if fees \u003C gas cost.\nBest for: **high-volume pools** where fees accumulate quickly.\n\n```bash\n# Compound every 4 hours\nnode auto-compound.mjs --token-id \u003CID> --strategy time --loop --interval 14400\n```\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `--min-gas-multiple` | 3 | Fees must be ≥ Nx gas cost (safety floor) |\n| `--interval` | 3600 | Seconds between compounds in loop mode |\n\n### When to Use Which\n\n| Pool Volume | Strategy | Interval | Min USD |\n|-------------|----------|----------|---------|\n| >$1M\u002Fday | time | 4-6h | n\u002Fa |\n| $100K-$1M\u002Fday | dollar | 1h | $10-25 |\n| \u003C$100K\u002Fday | dollar | 4h | $50+ |\n\nBoth strategies always enforce a gas floor — you'll never burn money on gas.\n\n## Compound & Harvest\n\nSplit LP fees: compound a percentage back into the position and harvest the rest as USDC.\n\n### How It Works\n\n1. **Collect** all accrued fees (DECREASE_LIQUIDITY with 0 + CLOSE_CURRENCY)\n2. **Split** fees by compound-pct (default 50\u002F50)\n3. **Compound** the compound portion back into the position (INCREASE_LIQUIDITY + SETTLE_PAIR)\n4. **Swap** the harvest portion of both tokens to USDC via Uniswap V3 SwapRouter02\n   - WETH → USDC direct (0.05% pool)\n   - Meme tokens → WETH → USDC multi-hop (tries 1%, 0.3%, 0.05% fee tiers)\n5. **Transfer** all USDC to the harvest address\n\n### Usage\n\n```bash\n# Preview (dry run)\nnode compound-and-harvest.mjs --token-id 1078751 \\\n  --harvest-address 0xcbC7E8A39A0Ec84d6B0e8e0dd98655F348ECD44F --dry-run\n\n# 50\u002F50 split (default)\nnode compound-and-harvest.mjs --token-id 1078751 \\\n  --harvest-address 0xcbC7E8A39A0Ec84d6B0e8e0dd98655F348ECD44F\n\n# 70% compound, 30% harvest\nnode compound-and-harvest.mjs --token-id 1078751 \\\n  --harvest-address 0xcbC7E8A39A0Ec84d6B0e8e0dd98655F348ECD44F \\\n  --compound-pct 70\n\n# 100% harvest (take all fees as USDC, no compounding)\nnode compound-and-harvest.mjs --token-id 1078751 \\\n  --harvest-address 0xcbC7E8A39A0Ec84d6B0e8e0dd98655F348ECD44F \\\n  --compound-pct 0\n\n# Custom slippage\nnode compound-and-harvest.mjs --token-id 1078751 \\\n  --harvest-address 0xcbC7E8A39A0Ec84d6B0e8e0dd98655F348ECD44F \\\n  --slippage 3\n```\n\n### Flags\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `--token-id` | required | LP NFT token ID |\n| `--harvest-address` | required | Address to receive harvested USDC |\n| `--compound-pct` | 50 | Percentage to compound (0-100) |\n| `--slippage` | 1 | Slippage tolerance for swaps (%) |\n| `--dry-run` | false | Preview without executing |\n| `--rpc` | env\u002Fdefault | Base RPC URL |\n\n### Swap Routing\n\n- Uses **Uniswap V3 SwapRouter02** (`0x2626664c2603336E57B271c5C0b26F421741e481`)\n- WETH → USDC: `exactInputSingle` with 500 (0.05%) fee tier\n- Other tokens → USDC: `exactInput` multi-hop through WETH, auto-tries fee tiers 10000\u002F3000\u002F500\n\n## 🌾 Clanker Harvest — Full Treasury Pipeline\n\nThe killer feature: a complete fee management pipeline for **any Clanker-launched token**.\n\nClanker tokens have two fee sources:\n1. **Clanker protocol fees** — stored in a separate fee contract, must be claimed\n2. **LP position fees** — accrued in the V4 position, collected via DECREASE\n\n`clanker-harvest.mjs` handles both in a single modular pipeline.\n\n### Quick Start\n\n```bash\n# Just claim Clanker protocol fees (no LP, no swap)\nnode clanker-harvest.mjs --token 0xTOKEN\n\n# Claim + compound 100% into LP\nnode clanker-harvest.mjs --token 0xTOKEN --token-id 12345 --compound-pct 100\n\n# Claim + harvest 100% as USDC to vault\nnode clanker-harvest.mjs --token 0xTOKEN --harvest-address 0xVAULT --compound-pct 0\n\n# 50\u002F50 split — compound half, harvest half\nnode clanker-harvest.mjs --token 0xTOKEN --token-id 12345 \\\n  --harvest-address 0xVAULT --compound-pct 50\n\n# 80% compound \u002F 20% harvest, only if fees > $10\nnode clanker-harvest.mjs --token 0xTOKEN --token-id 12345 \\\n  --harvest-address 0xVAULT --compound-pct 80 --min-usd 10\n\n# Use a config file (perfect for cron)\nnode clanker-harvest.mjs --config harvest-config.json\n```\n\n### Pipeline Steps\n\n| Step | What | When |\n|------|------|------|\n| 1. Claim | Claim WETH + token from Clanker fee contract | Always (unless `--skip-claim`) |\n| 2. Collect LP | Collect accrued fees from V4 position | If `--token-id` set (unless `--skip-lp`) |\n| 3. Threshold | Check total USD value against `--min-usd` | If threshold set |\n| 4. Compound | Add X% back into LP position | If `--compound-pct` > 0 and `--token-id` set |\n| 5. Swap | Swap remaining WETH to USDC | If `--compound-pct` \u003C 100 and `--harvest-address` set |\n| 6. Transfer | Send USDC to vault address | If USDC was swapped |\n\n### Flags\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `--token` | required | Clanker token address |\n| `--token-id` | optional | V4 LP position NFT ID (needed for compound\u002FLP) |\n| `--harvest-address` | optional | Vault address for USDC (needed for harvest) |\n| `--compound-pct` | 100 | % to compound back (0 = all harvest, 100 = all compound) |\n| `--min-usd` | 0 | Min USD fee value to act (0 = always) |\n| `--slippage` | 1 | Swap slippage % |\n| `--fee-contract` | 0xf362... | Clanker fee storage contract |\n| `--skip-claim` | false | Skip Clanker fee claim |\n| `--skip-lp` | false | Skip LP fee collection |\n| `--config` | optional | JSON config file path |\n| `--dry-run` | false | Simulate without executing |\n\n### Config File\n\nFor cron jobs, use a JSON config:\n\n```json\n{\n  \"token\": \"0xYOUR_TOKEN\",\n  \"tokenId\": \"12345\",\n  \"harvestAddress\": \"0xYOUR_VAULT\",\n  \"compoundPct\": 50,\n  \"minUsd\": 10,\n  \"slippage\": 1\n}\n```\n\n### Clanker Fee Contract\n\n| Function | Description |\n|----------|-------------|\n| `claim(feeOwner, token)` | Claim fees for a specific token |\n| `availableFees(feeOwner, token)` | Check pending fee balance |\n\nContract: `0xf3622742b1e446d92e45e22923ef11c2fcd55d68`\n\nTwo separate claims needed (WETH + token) — the script handles both automatically.\n\n### Standalone Claim Script\n\nFor simpler use cases, `claim-clanker-fees.mjs` just claims without any LP operations:\n\n```bash\n# Check available fees (dry run)\nnode claim-clanker-fees.mjs --token 0xTOKEN --dry-run\n\n# Claim both WETH and token fees\nnode claim-clanker-fees.mjs --token 0xTOKEN\n```\n\n### Self-Sustaining Agent Economics\n\nThe core idea: agents launched on Clanker can **fund their own infrastructure** from LP yield.\n\n```\nLP Fees + Clanker Fees\n        ↓\n   ┌────┴────┐\n   │         │\nCompound   Harvest\n(grow LP)  (→ USDC → pay for LLM, RPC, hosting)\n```\n\nSet up a cron job with `--min-usd` threshold and the agent only acts when it's profitable to do so.\n\n## LP Range Alert\n\nMonitor your positions and get alerted when price moves near or out of range.\n\n### Quick Start\n\n```bash\n# Check single position\nnode lp-range-alert.mjs --positions 1078751\n\n# Check multiple positions\nnode lp-range-alert.mjs --positions 1078751,1078720,1078695\n\n# Dry run (check without saving state)\nnode lp-range-alert.mjs --positions 1078751 --dry-run\n\n# JSON output (for cron\u002Fautomation)\nnode lp-range-alert.mjs --positions 1078751 --json\n\n# Custom alert threshold (alert at 20% from edge instead of 15%)\nnode lp-range-alert.mjs --positions 1078751 --near-edge-pct 20\n\n# Force alert even if status unchanged\nnode lp-range-alert.mjs --positions 1078751 --force\n```\n\n### Config File\n\nFor cron jobs, use a JSON config (`lp-alert-config.example.json`):\n\n```json\n{\n  \"positions\": [\"1078751\", \"1078720\", \"1078695\"],\n  \"telegramChat\": \"YOUR_CHAT_ID\",\n  \"nearEdgePercent\": 15,\n  \"rpcUrl\": \"https:\u002F\u002Fmainnet.base.org\"\n}\n```\n\nRun with: `node lp-range-alert.mjs --config lp-alert-config.json`\n\n### Alert Statuses\n\n| Status | Meaning | Action |\n|--------|---------|--------|\n| `OK` | In range, healthy | None needed |\n| `NEAR_LOWER_EDGE` | Within 15% of lower bound | Monitor, prepare to rebalance down |\n| `NEAR_UPPER_EDGE` | Within 15% of upper bound | Monitor, prepare to rebalance up |\n| `OUT_OF_RANGE` | Price outside position range | **Rebalance immediately** (not earning fees!) |\n\n### State Persistence\n\nState is saved to `~\u002F.lp-alert-state.json` to prevent duplicate alerts.\n- Only alerts on status **changes** (not on every check)\n- Use `--force` to alert regardless of previous state\n\n### Flags\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `--positions` | required | Comma-separated token IDs |\n| `--config` | optional | JSON config file path |\n| `--telegram-chat` | optional | Chat ID for Telegram alerts |\n| `--near-edge-pct` | 15 | Alert threshold (% from edge) |\n| `--dry-run` | false | Check without saving state |\n| `--json` | false | JSON output |\n| `--force` | false | Alert even if status unchanged |\n| `--rpc` | env\u002Fdefault | Custom RPC URL |\n\n### Recommended Cron Setup\n\n```bash\n# Check every 30 minutes\n*\u002F30 * * * * cd \u002Fpath\u002Fto\u002Fscripts && node lp-range-alert.mjs --config lp-alert-config.json >> \u002Ftmp\u002Flp-alerts.log 2>&1\n```\n\n## Position Strategy Recommendations\n\nFor ~$20-1000 positions:\n- **Range:** ±25% from current price\n- **Rebalance:** When price hits 80% of boundary\n- **Check:** Every 4-6 hours\n- **Expected APR:** 15-30%\n",{"name":5,"chain":22,"author":43,"license":14,"version":44,"triggers":45,"description":7},"Axiom (@AxiomBot)","0.2.0",[21,46,28,47,48,49,32,24,25,50],"v4","LP position","add liquidity","remove liquidity","claim fees","main","f2ec4b3b9133d34eeaf9b38e4b0a97e8e5705a7f","benchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp",0,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard","https:\u002F\u002Fgithub.com\u002FJSGforever","2026-08-29 18:27:56",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add JSGforever\u002Fskillguard --skill uniswap-v4-lp",{"tool":64,"command":65},"bunx","bunx skills add JSGforever\u002Fskillguard --skill uniswap-v4-lp",{"tool":67,"command":68},"pnpm","pnpm dlx skills add JSGforever\u002Fskillguard --skill uniswap-v4-lp","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002FSKILL.md",true,[72,78,82,86,90,94,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236],{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"data\u002Fbuy-burn-log.json","REFERENCE","参考文档",650,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fdata\u002Fbuy-burn-log.json",{"path":79,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":80,"sourceHtmlUrl":81},"package-lock.json",25329,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fpackage-lock.json",{"path":83,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":84,"sourceHtmlUrl":85},"package.json",224,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fpackage.json",{"path":87,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":88,"sourceHtmlUrl":89},"README.md",7768,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002FREADME.md",{"path":91,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":92,"sourceHtmlUrl":93},"references\u002Fv4-architecture.md",3790,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Freferences\u002Fv4-architecture.md",{"path":95,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":98,"sourceHtmlUrl":99},"scripts\u002Fadd-liquidity-v2.mjs","SCRIPT","脚本",9571,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fadd-liquidity-v2.mjs",{"path":101,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":102,"sourceHtmlUrl":103},"scripts\u002Fadd-liquidity.mjs",15392,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fadd-liquidity.mjs",{"path":105,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":106,"sourceHtmlUrl":107},"scripts\u002Fadd-to-position.mjs",7162,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fadd-to-position.mjs",{"path":109,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":110,"sourceHtmlUrl":111},"scripts\u002Fadd-weth-to-lp.mjs",17582,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fadd-weth-to-lp.mjs",{"path":113,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":114,"sourceHtmlUrl":115},"scripts\u002Fairdrop-disperse.mjs",1986,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fairdrop-disperse.mjs",{"path":117,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":118,"sourceHtmlUrl":119},"scripts\u002Fairdrop.mjs",17091,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fairdrop.mjs",{"path":121,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":122,"sourceHtmlUrl":123},"scripts\u002Fauto-compound.mjs",23444,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fauto-compound.mjs",{"path":125,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":126,"sourceHtmlUrl":127},"scripts\u002Fauto-rebalance.mjs",53326,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fauto-rebalance.mjs",{"path":129,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":130,"sourceHtmlUrl":131},"scripts\u002Fburn-position.mjs",7911,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fburn-position.mjs",{"path":133,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":134,"sourceHtmlUrl":135},"scripts\u002Fbuy-burn.mjs",19361,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fbuy-burn.mjs",{"path":137,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":138,"sourceHtmlUrl":139},"scripts\u002Fcheck-all-fees.mjs",4775,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fcheck-all-fees.mjs",{"path":141,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":142,"sourceHtmlUrl":143},"scripts\u002Fcheck-position.mjs",3833,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fcheck-position.mjs",{"path":145,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":146,"sourceHtmlUrl":147},"scripts\u002Fclaim-clanker-fees.mjs",6063,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fclaim-clanker-fees.mjs",{"path":149,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":150,"sourceHtmlUrl":151},"scripts\u002Fclanker-harvest.mjs",49002,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fclanker-harvest.mjs",{"path":153,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":154,"sourceHtmlUrl":155},"scripts\u002Fcollect-fees.mjs",5376,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fcollect-fees.mjs",{"path":157,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":158,"sourceHtmlUrl":159},"scripts\u002Fcompound-and-harvest.mjs",34486,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fcompound-and-harvest.mjs",{"path":161,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":162,"sourceHtmlUrl":163},"scripts\u002Fdisperse-airdrop.mjs",1428,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fdisperse-airdrop.mjs",{"path":165,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":166,"sourceHtmlUrl":167},"scripts\u002Fdisperse-axiom.mjs",5250,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fdisperse-axiom.mjs",{"path":169,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":170,"sourceHtmlUrl":171},"scripts\u002Fdisperse-batch5.mjs",2760,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fdisperse-batch5.mjs",{"path":173,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":174,"sourceHtmlUrl":175},"scripts\u002Fharvest-config.example.json",267,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fharvest-config.example.json",{"path":177,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":178,"sourceHtmlUrl":179},"scripts\u002Fharvest-lp-fees.mjs",16927,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fharvest-lp-fees.mjs",{"path":181,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":182,"sourceHtmlUrl":183},"scripts\u002Flp-alert-config.example.json",152,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Flp-alert-config.example.json",{"path":185,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":186,"sourceHtmlUrl":187},"scripts\u002Flp-calculator.mjs",14400,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Flp-calculator.mjs",{"path":189,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":190,"sourceHtmlUrl":191},"scripts\u002Flp-range-alert.mjs",12119,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Flp-range-alert.mjs",{"path":193,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":194,"sourceHtmlUrl":195},"scripts\u002Fmonitor-position.mjs",4960,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fmonitor-position.mjs",{"path":197,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":198,"sourceHtmlUrl":199},"scripts\u002Fpackage-lock.json",129782,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fpackage-lock.json",{"path":201,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":202,"sourceHtmlUrl":203},"scripts\u002Fpackage.json",421,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fpackage.json",{"path":205,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":206,"sourceHtmlUrl":207},"scripts\u002Fpostera-register.mjs",4512,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fpostera-register.mjs",{"path":209,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":210,"sourceHtmlUrl":211},"scripts\u002Fquick-health-check.mjs",4812,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fquick-health-check.mjs",{"path":213,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":214,"sourceHtmlUrl":215},"scripts\u002Frebalance.mjs",11664,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Frebalance.mjs",{"path":217,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":218,"sourceHtmlUrl":219},"scripts\u002Frecover-position.mjs",18349,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Frecover-position.mjs",{"path":221,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":222,"sourceHtmlUrl":223},"scripts\u002Fremove-liquidity.mjs",6591,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fremove-liquidity.mjs",{"path":225,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":226,"sourceHtmlUrl":227},"scripts\u002Fsingle-sided-lp.mjs",15492,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fsingle-sided-lp.mjs",{"path":229,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":230,"sourceHtmlUrl":231},"scripts\u002Ftest-compound-fix.mjs",8355,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Ftest-compound-fix.mjs",{"path":233,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":234,"sourceHtmlUrl":235},"scripts\u002Fv4-swap.mjs",21401,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fv4-swap.mjs",{"path":237,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":238,"sourceHtmlUrl":239},"scripts\u002Fx402-register.mjs",3568,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__0xaxiom--uniswap-v4-lp\u002Fscripts\u002Fx402-register.mjs",[241,274,289,316,338,359],{"skillNo":242,"name":243,"nameZh":6,"description":244,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":245,"licenseFileUrl":6,"sourceHtmlUrl":246,"categories":247,"keywords":253,"publishedAt":38},"01M71HY2SNXBA9Q00WZDTZQ31Z","skillguard-codex-scanner","Hybrid deterministic+LLM agent-skill security scanner. Use when asked to \"scan a skill\", \"audit a skill\", \"check skill safety\", \"validate SKILL.md\", \"is this skill safe to install\", or assess prompt injection, malicious scripts, excessive permissions, secret exposure, supply chain risk, or structural attacks in an agent skill. Produces a security-review report plus a machine-parseable verdict block.","GPL-3.0","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fsrc\u002Fskillguard\u002Fstatic_scanner\u002Fskillguard-codex-scanner\u002FSKILL.md",[248],{"categoryNo":249,"categoryName":250,"taxonomyType":251,"taxonomyTypeDesc":252},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273],"scanner","skillguard codex scanner","skillguard","codex","chain","skill security","security-review","review report","structural","secret","prompt injection","security scanner","when","review","malicious","permissions","exposure","audit","scripts","safe",{"skillNo":275,"name":276,"nameZh":6,"description":277,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":278,"categories":279,"keywords":285,"publishedAt":38},"01M71HY0SPKTT3S27BC2HPAC5M","data-exfiltrator","Analyzes data files","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Fsmoke-one-skill\u002Fasset1__cisco-ai-defense--data-exfiltrator\u002FSKILL.md",[280],{"categoryNo":281,"categoryName":282,"taxonomyType":283,"taxonomyTypeDesc":284},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[286,287,288],"data","data exfiltrator","files",{"skillNo":290,"name":291,"nameZh":6,"description":292,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":245,"licenseFileUrl":6,"sourceHtmlUrl":293,"categories":294,"keywords":295,"publishedAt":38},"01M71HXVS9EMN44BGDW215FZ72","real-time-collaboration-engine","Build real-time collaborative editing with WebSockets, OT\u002FCRDT conflict resolution, and presence awareness. Implements cursor tracking, optimistic updates, and offline sync. Use for collaborative editors, whiteboards, video editing. Activate on \"real-time collaboration\", \"WebSocket sync\", \"multiplayer editing\", \"CRDT\", \"presence awareness\". NOT for simple chat, request-response APIs, or single-user apps.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--real-time-collaboration-engine\u002FSKILL.md",[],[296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315],"time","real time collaboration engine","real time collaboration","collaboration","engine","real time","Video","reliability","video editing","performance","conflict resolution","presence","access","apps","updates","Bash","activate","optimizer","react","streaming",{"skillNo":317,"name":318,"nameZh":6,"description":319,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":245,"licenseFileUrl":6,"sourceHtmlUrl":320,"categories":321,"keywords":325,"publishedAt":38},"01M71HXP6CTY4KFN0QVMMN0V7J","react-performance-optimizer","Optimize React apps for 60fps performance. Implements memoization, virtualization, code splitting, bundle optimization. Use for slow renders, large lists, bundle bloat. Activate on \"React performance\", \"slow render\", \"useMemo\", \"bundle size\", \"virtualization\". NOT for backend optimization, non-React frameworks, or premature optimization.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--react-performance-optimizer\u002FSKILL.md",[322],{"categoryNo":323,"categoryName":324,"taxonomyType":251,"taxonomyTypeDesc":252},"01JBSEEDCAT000000000000009","前端开发",[305,326,313,314,327,328,329,330,331,332,296,333,334,309,311,335,312,315,336,337],"react performance optimizer","react performance","performance optimizer","app","nextjs","expert","re","render","2025","code","router","strategies",{"skillNo":339,"name":340,"nameZh":6,"description":341,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":245,"licenseFileUrl":6,"sourceHtmlUrl":342,"categories":343,"keywords":345,"publishedAt":38},"01M71HXH7QXSQB4QTDZ7SP7YXQ","llm-streaming-response-handler","Build production LLM streaming UIs with Server-Sent Events, real-time token display, cancellation, error recovery. Handles OpenAI\u002FAnthropic\u002FClaude streaming APIs. Use for chatbots, AI assistants, real-time text generation. Activate on \"LLM streaming\", \"SSE\", \"token stream\", \"chat UI\", \"real-time AI\". NOT for batch processing, non-streaming APIs, or WebSocket bidirectional chat.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--llm-streaming-response-handler\u002FSKILL.md",[344],{"categoryNo":323,"categoryName":324,"taxonomyType":251,"taxonomyTypeDesc":252},[346,315,347,348,349,350,305,296,351,352,353,311,312,313,354,314,355,356,357,358],"llm streaming response handler","handler","error","processing","retry","chat ui","error recovery","critical","batch","display","text","server","read",{"skillNo":360,"name":361,"nameZh":6,"description":362,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":245,"licenseFileUrl":6,"sourceHtmlUrl":363,"categories":364,"keywords":372,"publishedAt":38},"01M71HXCB0E1YRKYW1Y8T0Y106","github-actions-pipeline-builder","Build production CI\u002FCD pipelines with GitHub Actions. Implements matrix builds, caching, deployments, testing, security scanning. Use for automated testing, deployments, release workflows. Activate on \"GitHub Actions\", \"CI\u002FCD\", \"workflow\", \"deployment pipeline\", \"automated testing\". NOT for Jenkins\u002FCircleCI, manual deployments, or non-GitHub repositories.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--github-actions-pipeline-builder\u002FSKILL.md",[365,368,371],{"categoryNo":366,"categoryName":367,"taxonomyType":251,"taxonomyTypeDesc":252},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":369,"categoryName":370,"taxonomyType":251,"taxonomyTypeDesc":252},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":249,"categoryName":250,"taxonomyType":251,"taxonomyTypeDesc":252},[373,374,375,376,377,378,379,303,331,380,381,382,312,337,383,358,384,385,386,387],"github actions pipeline builder","actions","github actions","pipeline builder","github","builder","pipeline","testing","ci","workflows","run","release","write","edit","git"]