[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-uniswap-dca-bot":3,"mdc-wqette-key":36,"related-org-uniswap-dca-bot":861,"related-repo-uniswap-dca-bot":1007},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":34,"mdContent":35},"dca-bot","automate dollar cost average token purchases","This skill should be used when the user wants to \"dca into\" a token, \"buy X every day\", set up a \"recurring buy\", \"dollar cost average\" into an asset, \"schedule a buy\", or \"auto-buy on a dip\". Buys a fixed amount into a token on a schedule, optionally only when a condition holds (for example only when ETH is below a price threshold). The host agent's scheduler wakes the skill on a cadence; each wake is one self-contained run.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"uniswap","Uniswap","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Funiswap.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Automation","automation","tag",{"name":17,"slug":18,"type":15},"Web3","web3",{"name":20,"slug":21,"type":15},"DeFi","defi",{"name":23,"slug":24,"type":15},"Trading","trading",215,"https:\u002F\u002Fgithub.com\u002FUniswap\u002Funiswap-ai","2026-07-17T06:05:37.160647","MIT",35,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":33},[],"AI tools for building on Uniswap — skills, plugins, and agents for any coding agent.","https:\u002F\u002Fgithub.com\u002FUniswap\u002Funiswap-ai\u002Ftree\u002FHEAD\u002Fpackages\u002Fplugins\u002Funiswap-trading-tools\u002Fskills\u002Fdca-bot","---\nname: dca-bot\ndescription: This skill should be used when the user wants to \"dca into\" a token, \"buy X every day\", set up a \"recurring buy\", \"dollar cost average\" into an asset, \"schedule a buy\", or \"auto-buy on a dip\". Buys a fixed amount into a token on a schedule, optionally only when a condition holds (for example only when ETH is below a price threshold). The host agent's scheduler wakes the skill on a cadence; each wake is one self-contained run.\nallowed-tools: Read, Write, Edit, Glob, Grep, Bash(npm:*), Bash(npx:*), Bash(curl:*), WebFetch, AskUserQuestion\nmodel: sonnet\nlicense: MIT\nmetadata:\n  author: uniswap\n  version: '0.2.0'\nprerequisites:\n  - swap-integration\n  - viem-integration\n---\n\n# DCA Bot\n\nDollar-cost-average a fixed amount into a token on a schedule on the operator's target chain, optionally gated on a price condition such as \"only buy when ETH is below a threshold\".\n\n> **Runtime Compatibility:** This skill uses `AskUserQuestion` for interactive prompts (mode selection, per-transaction confirmation). If `AskUserQuestion` is not available in your runtime, collect the same parameters and confirmations through natural language conversation instead.\n\n## Overview\n\nThis is a thin strategy layer. It owns cadence, idempotency, the optional condition check, and guardrails. It does NOT own execution. Every quote, approval, swap, and signature is delegated to `swap-integration` and `viem-integration`. The skill never builds quote, approval, swap, or signing logic itself.\n\nThe skill does not run a scheduler. The host agent's scheduler (a cron entry or the runtime's wake mechanism) invokes the skill on a cadence. Each invocation is a single, self-contained run that reads state, decides whether to act, optionally acts, and writes state.\n\n## Prerequisites\n\n- **swap-integration** (uniswap-trading): the only execution path. All swaps go through its Trading API flow (`check_approval` then `quote` then `swap`, then sign and broadcast). Do not reimplement any of it.\n- **viem-integration** (uniswap-viem): accounts, clients, signing, transaction broadcast, and receipt waiting.\n\nRead these plugin references before acting and treat them as ground truth:\n\n- selected target-chain template: chainId, chain name, contract addresses, tradable token source, funding constraints, market-data availability, and template-specific caveats. For the reference Robinhood Chain template, see `..\u002F..\u002Freferences\u002Frobinhood-chain.md`.\n- `..\u002F..\u002Freferences\u002Fexecution-model.md`: the Trading API requirement, execution modes, restrictions, and disclaimer rules.\n- `..\u002F..\u002Freferences\u002Fstrategy-state.md`: the shared state file and scheduler pattern.\n\n## Template inputs\n\nThe selected target-chain template must provide:\n\n- chain id, chain name, native gas token, and RPC \u002F read path.\n- deployed Uniswap router, Permit2, and quoter \u002F state-reader addresses needed by delegated execution.\n- tradable token resolution rules, including any token list or allowlist source.\n- funding constraints and market-data availability.\n- transfer-restriction caveats and market-hours guidance.\n\n## Workflow\n\n### Step 1: Read state\n\nRead the bot's JSON state file (see [State](#state)). If it does not exist, treat this as the first run.\n\n### Step 2: Check cadence and idempotency\n\nCompute the current period from the configured cadence (for example the UTC day for a daily DCA). If the state file shows a successful buy already recorded for the current period, skip and exit. This makes repeated wakes within one period safe (no double buys).\n\n### Step 3: Resolve token and amount\n\nResolve the target token to an address by reading the selected target-chain template and its token source. Resolve the fixed buy amount from config. Validate both before use (see [Input validation](#input-validation)). Do not maintain a local token registry; reuse the template-provided token list or resolver.\n\n### Step 4: Collect guardrails\n\nRead the configured guardrails. If the per-run spend cap or per-period spend cap is missing, ask the operator for those caps using `AskUserQuestion` (or natural language if unavailable); include the funding token or denomination used for comparison. If either cap remains unset, do not enter `autonomous` mode. In `confirm` mode, proceed only with the per-transaction confirmation gate and report that autonomous mode remains unavailable.\n\n### Step 5: Optional condition check\n\nIf a condition is configured (for example \"only when the last daily candle is red\"), evaluate it before buying:\n\n- Fetch the price needed for the condition from Uniswap: the Trading API `\u002Fquote` (via `swap-integration`). Do not use venue-specific APIs or non-Uniswap price feeds for execution data; see `..\u002F..\u002Freferences\u002Fexecution-model.md` (Data and pricing). If the condition needs market data Uniswap does not expose, treat that data source as unavailable rather than adding an external dependency.\n- Evaluate the predicate (for example `price \u003C 3000 USDC`).\n- If the condition is not met, record the evaluation, skip the buy, and exit. Skipping for an unmet condition is a normal outcome, not an error.\n\nBe honest about what is satisfiable today. A price-threshold condition (for example \"only buy when ETH is below X\") works out of the box, because the current price comes from the Trading API `\u002Fquote`.\n\n### Step 6: Guardrails\n\nBefore any spend, enforce the guardrails for the active execution mode (see [Execution mode](#execution-mode)): spend cap per run and per period, token allowlist, and the kill switch. If any guardrail blocks the buy, stop and report why.\n\nAlso check the wallet can cover the buy: it must hold enough of the funding token (`tokenIn`) for the buy amount and enough native gas to broadcast. If either is short, skip the buy and report it. Follow the selected template's funding constraints; the skill does not auto-fund, bridge, or top up unless that behavior is explicitly provided outside the skill.\n\n### Step 7: Delegate the swap\n\nHand execution to the `swap-integration` Trading API flow. Pass the target chain id and that chain's router \u002F token addresses from the selected template. The skill MUST NOT build quote, approval, swap, or signing logic of its own; it only supplies parameters (swapper, tokenIn, tokenOut, amount, chain id) and reads back the result.\n\nIf the selected template has RPC or raw-transaction constraints, treat them as template caveats. Skills always execute through the Trading API \u002F router path regardless of chain, so router-compatible constraints should not block them.\n\n### Step 8: Update state\n\nOn a successful broadcast, write the current period, timestamp, and the resulting transaction hash to the state file so the next wake is idempotent. On failure, record the error and leave the period unmarked so a later wake can retry.\n\n## Execution mode\n\nThe operator who runs the agent chooses an execution mode. See `..\u002F..\u002Freferences\u002Fexecution-model.md` for the full model.\n\n| Mode                | Behavior                                                                                                                                                                   |\n| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `confirm` (default) | Ask the user to approve the transaction before broadcast via `AskUserQuestion`, showing token, amount, chain, and estimated gas. Reuses the `swap-integration` spend gate. |\n| `autonomous`        | Execute without per-transaction prompts, only within guardrails.                                                                                                           |\n\nDefault to `confirm`. `autonomous` mode requires all of: a spend cap (per run and per period), a token allowlist, a dry-run first, and a kill switch. Without all four, fall back to `confirm`.\n\n## State\n\nFollow the shared pattern in `..\u002F..\u002Freferences\u002Fstrategy-state.md`. The dca-bot keeps a small JSON state file so a run knows what previous runs did. Suggested shape:\n\n- `lastBuyPeriod` is the idempotency key: a run buys at most once per period. Compare the current period against `lastBuyPeriod` before acting, and update it only after a confirmed broadcast.\n- `lastAction` is the last action taken: a swap, or a skip due to a guardrail or condition. Record the action type, transaction hash, and amount.\n\n## Restrictions and Disclaimers\n\nRWA gating is template-specific and may be enforced at the token level (transfer-restricted ERC-20s), so a swap can revert at transfer time even when the router accepts it. See `..\u002F..\u002Freferences\u002Fexecution-model.md`. The skill must:\n\n1. Handle transfer-restriction reverts gracefully, record them, and report them rather than retrying blindly.\n2. Respect the selected template's equity market-hours guidance; some RWAs may have off-hours liquidity limits, so a buy may be skipped or deferred outside hours.\n3. Surface the financial disclaimers in the repo root `DISCLAIMER.md` to the operator.\n\n## Input validation\n\nBefore interpolating ANY user-provided or config value into a command, API call, or generated code:\n\n- **Token \u002F wallet addresses**: MUST match `^0x[a-fA-F0-9]{40}$`; reject otherwise.\n- **Amounts**: MUST be non-negative numeric values matching `^[0-9]+\\.?[0-9]*$`.\n- **Chain id**: MUST be the operator-configured target chain id, read from the selected template rather than hardcoded.\n- **API keys**: MUST come from environment variables, never hardcoded.\n- **REJECT** any input containing shell metacharacters: `;`, `|`, `&`, `$`, `` ` ``, `(`, `)`, `>`, `\u003C`, `\\`, `'`, `\"`, or newlines.\n",{"data":37,"body":45},{"name":4,"description":6,"allowed-tools":38,"model":39,"license":28,"metadata":40,"prerequisites":42},"Read, Write, Edit, Glob, Grep, Bash(npm:*), Bash(npx:*), Bash(curl:*), WebFetch, AskUserQuestion","sonnet",{"author":8,"version":41},"0.2.0",[43,44],"swap-integration","viem-integration",{"type":46,"children":47},"root",[48,56,62,93,100,119,124,130,176,181,219,225,230,258,264,271,285,291,296,302,315,321,349,355,360,408,419,425,438,451,457,469,474,480,485,490,502,578,603,608,620,652,658,670,697,702,707],{"type":49,"tag":50,"props":51,"children":52},"element","h1",{"id":4},[53],{"type":54,"value":55},"text","DCA Bot",{"type":49,"tag":57,"props":58,"children":59},"p",{},[60],{"type":54,"value":61},"Dollar-cost-average a fixed amount into a token on a schedule on the operator's target chain, optionally gated on a price condition such as \"only buy when ETH is below a threshold\".",{"type":49,"tag":63,"props":64,"children":65},"blockquote",{},[66],{"type":49,"tag":57,"props":67,"children":68},{},[69,75,77,84,86,91],{"type":49,"tag":70,"props":71,"children":72},"strong",{},[73],{"type":54,"value":74},"Runtime Compatibility:",{"type":54,"value":76}," This skill uses ",{"type":49,"tag":78,"props":79,"children":81},"code",{"className":80},[],[82],{"type":54,"value":83},"AskUserQuestion",{"type":54,"value":85}," for interactive prompts (mode selection, per-transaction confirmation). If ",{"type":49,"tag":78,"props":87,"children":89},{"className":88},[],[90],{"type":54,"value":83},{"type":54,"value":92}," is not available in your runtime, collect the same parameters and confirmations through natural language conversation instead.",{"type":49,"tag":94,"props":95,"children":97},"h2",{"id":96},"overview",[98],{"type":54,"value":99},"Overview",{"type":49,"tag":57,"props":101,"children":102},{},[103,105,110,112,117],{"type":54,"value":104},"This is a thin strategy layer. It owns cadence, idempotency, the optional condition check, and guardrails. It does NOT own execution. Every quote, approval, swap, and signature is delegated to ",{"type":49,"tag":78,"props":106,"children":108},{"className":107},[],[109],{"type":54,"value":43},{"type":54,"value":111}," and ",{"type":49,"tag":78,"props":113,"children":115},{"className":114},[],[116],{"type":54,"value":44},{"type":54,"value":118},". The skill never builds quote, approval, swap, or signing logic itself.",{"type":49,"tag":57,"props":120,"children":121},{},[122],{"type":54,"value":123},"The skill does not run a scheduler. The host agent's scheduler (a cron entry or the runtime's wake mechanism) invokes the skill on a cadence. Each invocation is a single, self-contained run that reads state, decides whether to act, optionally acts, and writes state.",{"type":49,"tag":94,"props":125,"children":127},{"id":126},"prerequisites",[128],{"type":54,"value":129},"Prerequisites",{"type":49,"tag":131,"props":132,"children":133},"ul",{},[134,167],{"type":49,"tag":135,"props":136,"children":137},"li",{},[138,142,144,150,152,158,159,165],{"type":49,"tag":70,"props":139,"children":140},{},[141],{"type":54,"value":43},{"type":54,"value":143}," (uniswap-trading): the only execution path. All swaps go through its Trading API flow (",{"type":49,"tag":78,"props":145,"children":147},{"className":146},[],[148],{"type":54,"value":149},"check_approval",{"type":54,"value":151}," then ",{"type":49,"tag":78,"props":153,"children":155},{"className":154},[],[156],{"type":54,"value":157},"quote",{"type":54,"value":151},{"type":49,"tag":78,"props":160,"children":162},{"className":161},[],[163],{"type":54,"value":164},"swap",{"type":54,"value":166},", then sign and broadcast). Do not reimplement any of it.",{"type":49,"tag":135,"props":168,"children":169},{},[170,174],{"type":49,"tag":70,"props":171,"children":172},{},[173],{"type":54,"value":44},{"type":54,"value":175}," (uniswap-viem): accounts, clients, signing, transaction broadcast, and receipt waiting.",{"type":49,"tag":57,"props":177,"children":178},{},[179],{"type":54,"value":180},"Read these plugin references before acting and treat them as ground truth:",{"type":49,"tag":131,"props":182,"children":183},{},[184,197,208],{"type":49,"tag":135,"props":185,"children":186},{},[187,189,195],{"type":54,"value":188},"selected target-chain template: chainId, chain name, contract addresses, tradable token source, funding constraints, market-data availability, and template-specific caveats. For the reference Robinhood Chain template, see ",{"type":49,"tag":78,"props":190,"children":192},{"className":191},[],[193],{"type":54,"value":194},"..\u002F..\u002Freferences\u002Frobinhood-chain.md",{"type":54,"value":196},".",{"type":49,"tag":135,"props":198,"children":199},{},[200,206],{"type":49,"tag":78,"props":201,"children":203},{"className":202},[],[204],{"type":54,"value":205},"..\u002F..\u002Freferences\u002Fexecution-model.md",{"type":54,"value":207},": the Trading API requirement, execution modes, restrictions, and disclaimer rules.",{"type":49,"tag":135,"props":209,"children":210},{},[211,217],{"type":49,"tag":78,"props":212,"children":214},{"className":213},[],[215],{"type":54,"value":216},"..\u002F..\u002Freferences\u002Fstrategy-state.md",{"type":54,"value":218},": the shared state file and scheduler pattern.",{"type":49,"tag":94,"props":220,"children":222},{"id":221},"template-inputs",[223],{"type":54,"value":224},"Template inputs",{"type":49,"tag":57,"props":226,"children":227},{},[228],{"type":54,"value":229},"The selected target-chain template must provide:",{"type":49,"tag":131,"props":231,"children":232},{},[233,238,243,248,253],{"type":49,"tag":135,"props":234,"children":235},{},[236],{"type":54,"value":237},"chain id, chain name, native gas token, and RPC \u002F read path.",{"type":49,"tag":135,"props":239,"children":240},{},[241],{"type":54,"value":242},"deployed Uniswap router, Permit2, and quoter \u002F state-reader addresses needed by delegated execution.",{"type":49,"tag":135,"props":244,"children":245},{},[246],{"type":54,"value":247},"tradable token resolution rules, including any token list or allowlist source.",{"type":49,"tag":135,"props":249,"children":250},{},[251],{"type":54,"value":252},"funding constraints and market-data availability.",{"type":49,"tag":135,"props":254,"children":255},{},[256],{"type":54,"value":257},"transfer-restriction caveats and market-hours guidance.",{"type":49,"tag":94,"props":259,"children":261},{"id":260},"workflow",[262],{"type":54,"value":263},"Workflow",{"type":49,"tag":265,"props":266,"children":268},"h3",{"id":267},"step-1-read-state",[269],{"type":54,"value":270},"Step 1: Read state",{"type":49,"tag":57,"props":272,"children":273},{},[274,276,283],{"type":54,"value":275},"Read the bot's JSON state file (see ",{"type":49,"tag":277,"props":278,"children":280},"a",{"href":279},"#state",[281],{"type":54,"value":282},"State",{"type":54,"value":284},"). If it does not exist, treat this as the first run.",{"type":49,"tag":265,"props":286,"children":288},{"id":287},"step-2-check-cadence-and-idempotency",[289],{"type":54,"value":290},"Step 2: Check cadence and idempotency",{"type":49,"tag":57,"props":292,"children":293},{},[294],{"type":54,"value":295},"Compute the current period from the configured cadence (for example the UTC day for a daily DCA). If the state file shows a successful buy already recorded for the current period, skip and exit. This makes repeated wakes within one period safe (no double buys).",{"type":49,"tag":265,"props":297,"children":299},{"id":298},"step-3-resolve-token-and-amount",[300],{"type":54,"value":301},"Step 3: Resolve token and amount",{"type":49,"tag":57,"props":303,"children":304},{},[305,307,313],{"type":54,"value":306},"Resolve the target token to an address by reading the selected target-chain template and its token source. Resolve the fixed buy amount from config. Validate both before use (see ",{"type":49,"tag":277,"props":308,"children":310},{"href":309},"#input-validation",[311],{"type":54,"value":312},"Input validation",{"type":54,"value":314},"). Do not maintain a local token registry; reuse the template-provided token list or resolver.",{"type":49,"tag":265,"props":316,"children":318},{"id":317},"step-4-collect-guardrails",[319],{"type":54,"value":320},"Step 4: Collect guardrails",{"type":49,"tag":57,"props":322,"children":323},{},[324,326,331,333,339,341,347],{"type":54,"value":325},"Read the configured guardrails. If the per-run spend cap or per-period spend cap is missing, ask the operator for those caps using ",{"type":49,"tag":78,"props":327,"children":329},{"className":328},[],[330],{"type":54,"value":83},{"type":54,"value":332}," (or natural language if unavailable); include the funding token or denomination used for comparison. If either cap remains unset, do not enter ",{"type":49,"tag":78,"props":334,"children":336},{"className":335},[],[337],{"type":54,"value":338},"autonomous",{"type":54,"value":340}," mode. In ",{"type":49,"tag":78,"props":342,"children":344},{"className":343},[],[345],{"type":54,"value":346},"confirm",{"type":54,"value":348}," mode, proceed only with the per-transaction confirmation gate and report that autonomous mode remains unavailable.",{"type":49,"tag":265,"props":350,"children":352},{"id":351},"step-5-optional-condition-check",[353],{"type":54,"value":354},"Step 5: Optional condition check",{"type":49,"tag":57,"props":356,"children":357},{},[358],{"type":54,"value":359},"If a condition is configured (for example \"only when the last daily candle is red\"), evaluate it before buying:",{"type":49,"tag":131,"props":361,"children":362},{},[363,390,403],{"type":49,"tag":135,"props":364,"children":365},{},[366,368,374,376,381,383,388],{"type":54,"value":367},"Fetch the price needed for the condition from Uniswap: the Trading API ",{"type":49,"tag":78,"props":369,"children":371},{"className":370},[],[372],{"type":54,"value":373},"\u002Fquote",{"type":54,"value":375}," (via ",{"type":49,"tag":78,"props":377,"children":379},{"className":378},[],[380],{"type":54,"value":43},{"type":54,"value":382},"). Do not use venue-specific APIs or non-Uniswap price feeds for execution data; see ",{"type":49,"tag":78,"props":384,"children":386},{"className":385},[],[387],{"type":54,"value":205},{"type":54,"value":389}," (Data and pricing). If the condition needs market data Uniswap does not expose, treat that data source as unavailable rather than adding an external dependency.",{"type":49,"tag":135,"props":391,"children":392},{},[393,395,401],{"type":54,"value":394},"Evaluate the predicate (for example ",{"type":49,"tag":78,"props":396,"children":398},{"className":397},[],[399],{"type":54,"value":400},"price \u003C 3000 USDC",{"type":54,"value":402},").",{"type":49,"tag":135,"props":404,"children":405},{},[406],{"type":54,"value":407},"If the condition is not met, record the evaluation, skip the buy, and exit. Skipping for an unmet condition is a normal outcome, not an error.",{"type":49,"tag":57,"props":409,"children":410},{},[411,413,418],{"type":54,"value":412},"Be honest about what is satisfiable today. A price-threshold condition (for example \"only buy when ETH is below X\") works out of the box, because the current price comes from the Trading API ",{"type":49,"tag":78,"props":414,"children":416},{"className":415},[],[417],{"type":54,"value":373},{"type":54,"value":196},{"type":49,"tag":265,"props":420,"children":422},{"id":421},"step-6-guardrails",[423],{"type":54,"value":424},"Step 6: Guardrails",{"type":49,"tag":57,"props":426,"children":427},{},[428,430,436],{"type":54,"value":429},"Before any spend, enforce the guardrails for the active execution mode (see ",{"type":49,"tag":277,"props":431,"children":433},{"href":432},"#execution-mode",[434],{"type":54,"value":435},"Execution mode",{"type":54,"value":437},"): spend cap per run and per period, token allowlist, and the kill switch. If any guardrail blocks the buy, stop and report why.",{"type":49,"tag":57,"props":439,"children":440},{},[441,443,449],{"type":54,"value":442},"Also check the wallet can cover the buy: it must hold enough of the funding token (",{"type":49,"tag":78,"props":444,"children":446},{"className":445},[],[447],{"type":54,"value":448},"tokenIn",{"type":54,"value":450},") for the buy amount and enough native gas to broadcast. If either is short, skip the buy and report it. Follow the selected template's funding constraints; the skill does not auto-fund, bridge, or top up unless that behavior is explicitly provided outside the skill.",{"type":49,"tag":265,"props":452,"children":454},{"id":453},"step-7-delegate-the-swap",[455],{"type":54,"value":456},"Step 7: Delegate the swap",{"type":49,"tag":57,"props":458,"children":459},{},[460,462,467],{"type":54,"value":461},"Hand execution to the ",{"type":49,"tag":78,"props":463,"children":465},{"className":464},[],[466],{"type":54,"value":43},{"type":54,"value":468}," Trading API flow. Pass the target chain id and that chain's router \u002F token addresses from the selected template. The skill MUST NOT build quote, approval, swap, or signing logic of its own; it only supplies parameters (swapper, tokenIn, tokenOut, amount, chain id) and reads back the result.",{"type":49,"tag":57,"props":470,"children":471},{},[472],{"type":54,"value":473},"If the selected template has RPC or raw-transaction constraints, treat them as template caveats. Skills always execute through the Trading API \u002F router path regardless of chain, so router-compatible constraints should not block them.",{"type":49,"tag":265,"props":475,"children":477},{"id":476},"step-8-update-state",[478],{"type":54,"value":479},"Step 8: Update state",{"type":49,"tag":57,"props":481,"children":482},{},[483],{"type":54,"value":484},"On a successful broadcast, write the current period, timestamp, and the resulting transaction hash to the state file so the next wake is idempotent. On failure, record the error and leave the period unmarked so a later wake can retry.",{"type":49,"tag":94,"props":486,"children":488},{"id":487},"execution-mode",[489],{"type":54,"value":435},{"type":49,"tag":57,"props":491,"children":492},{},[493,495,500],{"type":54,"value":494},"The operator who runs the agent chooses an execution mode. See ",{"type":49,"tag":78,"props":496,"children":498},{"className":497},[],[499],{"type":54,"value":205},{"type":54,"value":501}," for the full model.",{"type":49,"tag":503,"props":504,"children":505},"table",{},[506,525],{"type":49,"tag":507,"props":508,"children":509},"thead",{},[510],{"type":49,"tag":511,"props":512,"children":513},"tr",{},[514,520],{"type":49,"tag":515,"props":516,"children":517},"th",{},[518],{"type":54,"value":519},"Mode",{"type":49,"tag":515,"props":521,"children":522},{},[523],{"type":54,"value":524},"Behavior",{"type":49,"tag":526,"props":527,"children":528},"tbody",{},[529,562],{"type":49,"tag":511,"props":530,"children":531},{},[532,543],{"type":49,"tag":533,"props":534,"children":535},"td",{},[536,541],{"type":49,"tag":78,"props":537,"children":539},{"className":538},[],[540],{"type":54,"value":346},{"type":54,"value":542}," (default)",{"type":49,"tag":533,"props":544,"children":545},{},[546,548,553,555,560],{"type":54,"value":547},"Ask the user to approve the transaction before broadcast via ",{"type":49,"tag":78,"props":549,"children":551},{"className":550},[],[552],{"type":54,"value":83},{"type":54,"value":554},", showing token, amount, chain, and estimated gas. Reuses the ",{"type":49,"tag":78,"props":556,"children":558},{"className":557},[],[559],{"type":54,"value":43},{"type":54,"value":561}," spend gate.",{"type":49,"tag":511,"props":563,"children":564},{},[565,573],{"type":49,"tag":533,"props":566,"children":567},{},[568],{"type":49,"tag":78,"props":569,"children":571},{"className":570},[],[572],{"type":54,"value":338},{"type":49,"tag":533,"props":574,"children":575},{},[576],{"type":54,"value":577},"Execute without per-transaction prompts, only within guardrails.",{"type":49,"tag":57,"props":579,"children":580},{},[581,583,588,590,595,597,602],{"type":54,"value":582},"Default to ",{"type":49,"tag":78,"props":584,"children":586},{"className":585},[],[587],{"type":54,"value":346},{"type":54,"value":589},". ",{"type":49,"tag":78,"props":591,"children":593},{"className":592},[],[594],{"type":54,"value":338},{"type":54,"value":596}," mode requires all of: a spend cap (per run and per period), a token allowlist, a dry-run first, and a kill switch. Without all four, fall back to ",{"type":49,"tag":78,"props":598,"children":600},{"className":599},[],[601],{"type":54,"value":346},{"type":54,"value":196},{"type":49,"tag":94,"props":604,"children":606},{"id":605},"state",[607],{"type":54,"value":282},{"type":49,"tag":57,"props":609,"children":610},{},[611,613,618],{"type":54,"value":612},"Follow the shared pattern in ",{"type":49,"tag":78,"props":614,"children":616},{"className":615},[],[617],{"type":54,"value":216},{"type":54,"value":619},". The dca-bot keeps a small JSON state file so a run knows what previous runs did. Suggested shape:",{"type":49,"tag":131,"props":621,"children":622},{},[623,641],{"type":49,"tag":135,"props":624,"children":625},{},[626,632,634,639],{"type":49,"tag":78,"props":627,"children":629},{"className":628},[],[630],{"type":54,"value":631},"lastBuyPeriod",{"type":54,"value":633}," is the idempotency key: a run buys at most once per period. Compare the current period against ",{"type":49,"tag":78,"props":635,"children":637},{"className":636},[],[638],{"type":54,"value":631},{"type":54,"value":640}," before acting, and update it only after a confirmed broadcast.",{"type":49,"tag":135,"props":642,"children":643},{},[644,650],{"type":49,"tag":78,"props":645,"children":647},{"className":646},[],[648],{"type":54,"value":649},"lastAction",{"type":54,"value":651}," is the last action taken: a swap, or a skip due to a guardrail or condition. Record the action type, transaction hash, and amount.",{"type":49,"tag":94,"props":653,"children":655},{"id":654},"restrictions-and-disclaimers",[656],{"type":54,"value":657},"Restrictions and Disclaimers",{"type":49,"tag":57,"props":659,"children":660},{},[661,663,668],{"type":54,"value":662},"RWA gating is template-specific and may be enforced at the token level (transfer-restricted ERC-20s), so a swap can revert at transfer time even when the router accepts it. See ",{"type":49,"tag":78,"props":664,"children":666},{"className":665},[],[667],{"type":54,"value":205},{"type":54,"value":669},". The skill must:",{"type":49,"tag":671,"props":672,"children":673},"ol",{},[674,679,684],{"type":49,"tag":135,"props":675,"children":676},{},[677],{"type":54,"value":678},"Handle transfer-restriction reverts gracefully, record them, and report them rather than retrying blindly.",{"type":49,"tag":135,"props":680,"children":681},{},[682],{"type":54,"value":683},"Respect the selected template's equity market-hours guidance; some RWAs may have off-hours liquidity limits, so a buy may be skipped or deferred outside hours.",{"type":49,"tag":135,"props":685,"children":686},{},[687,689,695],{"type":54,"value":688},"Surface the financial disclaimers in the repo root ",{"type":49,"tag":78,"props":690,"children":692},{"className":691},[],[693],{"type":54,"value":694},"DISCLAIMER.md",{"type":54,"value":696}," to the operator.",{"type":49,"tag":94,"props":698,"children":700},{"id":699},"input-validation",[701],{"type":54,"value":312},{"type":49,"tag":57,"props":703,"children":704},{},[705],{"type":54,"value":706},"Before interpolating ANY user-provided or config value into a command, API call, or generated code:",{"type":49,"tag":131,"props":708,"children":709},{},[710,728,745,755,765],{"type":49,"tag":135,"props":711,"children":712},{},[713,718,720,726],{"type":49,"tag":70,"props":714,"children":715},{},[716],{"type":54,"value":717},"Token \u002F wallet addresses",{"type":54,"value":719},": MUST match ",{"type":49,"tag":78,"props":721,"children":723},{"className":722},[],[724],{"type":54,"value":725},"^0x[a-fA-F0-9]{40}$",{"type":54,"value":727},"; reject otherwise.",{"type":49,"tag":135,"props":729,"children":730},{},[731,736,738,744],{"type":49,"tag":70,"props":732,"children":733},{},[734],{"type":54,"value":735},"Amounts",{"type":54,"value":737},": MUST be non-negative numeric values matching ",{"type":49,"tag":78,"props":739,"children":741},{"className":740},[],[742],{"type":54,"value":743},"^[0-9]+\\.?[0-9]*$",{"type":54,"value":196},{"type":49,"tag":135,"props":746,"children":747},{},[748,753],{"type":49,"tag":70,"props":749,"children":750},{},[751],{"type":54,"value":752},"Chain id",{"type":54,"value":754},": MUST be the operator-configured target chain id, read from the selected template rather than hardcoded.",{"type":49,"tag":135,"props":756,"children":757},{},[758,763],{"type":49,"tag":70,"props":759,"children":760},{},[761],{"type":54,"value":762},"API keys",{"type":54,"value":764},": MUST come from environment variables, never hardcoded.",{"type":49,"tag":135,"props":766,"children":767},{},[768,773,775,781,783,789,790,796,797,803,804,810,811,817,818,824,825,831,832,838,839,845,846,852,853,859],{"type":49,"tag":70,"props":769,"children":770},{},[771],{"type":54,"value":772},"REJECT",{"type":54,"value":774}," any input containing shell metacharacters: ",{"type":49,"tag":78,"props":776,"children":778},{"className":777},[],[779],{"type":54,"value":780},";",{"type":54,"value":782},", ",{"type":49,"tag":78,"props":784,"children":786},{"className":785},[],[787],{"type":54,"value":788},"|",{"type":54,"value":782},{"type":49,"tag":78,"props":791,"children":793},{"className":792},[],[794],{"type":54,"value":795},"&",{"type":54,"value":782},{"type":49,"tag":78,"props":798,"children":800},{"className":799},[],[801],{"type":54,"value":802},"$",{"type":54,"value":782},{"type":49,"tag":78,"props":805,"children":807},{"className":806},[],[808],{"type":54,"value":809},"`",{"type":54,"value":782},{"type":49,"tag":78,"props":812,"children":814},{"className":813},[],[815],{"type":54,"value":816},"(",{"type":54,"value":782},{"type":49,"tag":78,"props":819,"children":821},{"className":820},[],[822],{"type":54,"value":823},")",{"type":54,"value":782},{"type":49,"tag":78,"props":826,"children":828},{"className":827},[],[829],{"type":54,"value":830},">",{"type":54,"value":782},{"type":49,"tag":78,"props":833,"children":835},{"className":834},[],[836],{"type":54,"value":837},"\u003C",{"type":54,"value":782},{"type":49,"tag":78,"props":840,"children":842},{"className":841},[],[843],{"type":54,"value":844},"\\",{"type":54,"value":782},{"type":49,"tag":78,"props":847,"children":849},{"className":848},[],[850],{"type":54,"value":851},"'",{"type":54,"value":782},{"type":49,"tag":78,"props":854,"children":856},{"className":855},[],[857],{"type":54,"value":858},"\"",{"type":54,"value":860},", or newlines.",{"items":862,"total":1006},[863,880,891,898,911,924,937,950,964,975,985,996],{"slug":864,"name":864,"fn":865,"description":866,"org":867,"tags":868,"stars":25,"repoUrl":26,"updatedAt":879},"configurator","configure auction smart contract parameters","Configure CCA (Continuous Clearing Auction) smart contract parameters through an interactive bulk form flow. Use when user says \"configure auction\", \"cca auction\", \"setup token auction\", \"auction configuration\", \"continuous auction\", or mentions CCA contracts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[869,872,875,878],{"name":870,"slug":871,"type":15},"Configuration","configuration",{"name":873,"slug":874,"type":15},"Ethereum","ethereum",{"name":876,"slug":877,"type":15},"Smart Contracts","smart-contracts",{"name":17,"slug":18,"type":15},"2026-07-17T06:08:08.974641",{"slug":881,"name":881,"fn":882,"description":883,"org":884,"tags":885,"stars":25,"repoUrl":26,"updatedAt":890},"copy-trade","copy trades from crypto wallets","This skill should be used when the user asks to \"copy trades from\" a wallet, \"mirror a wallet\", \"follow this address\", set up \"copy trading\", \"track and replicate a trader\", or mirror another account's swaps bounded by guardrails. Watches a target wallet and mirrors its trades, filtered by chain, asset match, position size, and the follower's own portfolio state.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[886,887,888,889],{"name":13,"slug":14,"type":15},{"name":873,"slug":874,"type":15},{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},"2026-07-17T06:04:21.974052",{"slug":4,"name":4,"fn":5,"description":6,"org":892,"tags":893,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[894,895,896,897],{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},{"slug":899,"name":899,"fn":900,"description":901,"org":902,"tags":903,"stars":25,"repoUrl":26,"updatedAt":910},"deployer","deploy Uniswap CCA smart contracts","Deploy CCA (Continuous Clearing Auction) smart contracts using the Factory pattern. Use when user says \"deploy auction\", \"deploy cca\", \"factory deployment\", or wants to deploy a configured auction.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[904,907,908,909],{"name":905,"slug":906,"type":15},"Deployment","deployment",{"name":873,"slug":874,"type":15},{"name":876,"slug":877,"type":15},{"name":17,"slug":18,"type":15},"2026-07-17T06:08:09.661977",{"slug":912,"name":912,"fn":913,"description":914,"org":915,"tags":916,"stars":25,"repoUrl":26,"updatedAt":923},"index-bot","create and rebalance asset portfolios","This skill should be used when the user asks to \"create an index\", \"build a basket of top assets\", \"buy a weighted basket\", \"make a portfolio of assets\", \"equal-weight basket\", \"rebalance my portfolio\", \"track the top N tokens\", or wants an automated, weighted multi-asset basket that buys in one pass and rebalances on a cadence. Builds the basket spec, delegates each buy and rebalance swap to the swap-integration Trading API flow, and records target weights in state.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[917,918,921,922],{"name":873,"slug":874,"type":15},{"name":919,"slug":920,"type":15},"Portfolio Management","portfolio-management",{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},"2026-07-17T06:04:22.328253",{"slug":925,"name":925,"fn":926,"description":927,"org":928,"tags":929,"stars":25,"repoUrl":26,"updatedAt":936},"liquidity-planner","plan and create liquidity positions","This skill should be used when the user asks to \"provide liquidity\", \"create LP position\", \"add liquidity to pool\", \"become a liquidity provider\", \"create v3 position\", \"create v4 position\", \"concentrated liquidity\", \"set price range\", or mentions providing liquidity, LP positions, or liquidity pools on Uniswap. Generates deep links to create positions in the Uniswap interface.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[930,931,932,935],{"name":20,"slug":21,"type":15},{"name":873,"slug":874,"type":15},{"name":933,"slug":934,"type":15},"Liquidity","liquidity",{"name":17,"slug":18,"type":15},"2026-07-17T06:08:09.315325",{"slug":938,"name":938,"fn":939,"description":940,"org":941,"tags":942,"stars":25,"repoUrl":26,"updatedAt":949},"lp-integration","integrate Uniswap liquidity provisioning","Integrate Uniswap liquidity provisioning (LP) into applications via the LP REST API. Use when the user says \"LP API\", \"liquidity provisioning API\", \"provide liquidity programmatically\", \"create LP position via API\", \"add liquidity via API\", \"increase liquidity\", \"decrease liquidity\", \"remove liquidity\", \"claim LP fees\", \"collect LP fees\", \"manage LP positions in code\", or mentions building a backend, bot, or frontend that creates or manages Uniswap v2\u002Fv3\u002Fv4 liquidity positions through an API. Also use when debugging LP API calls (e.g. \u002Flp\u002Fcreate, \u002Flp\u002Fcheck_approval, \u002Flp\u002Fincrease, \u002Flp\u002Fdecrease, \u002Flp\u002Fclaim_fees), unexpected response fields, the approval or EIP-712 permit flow, or transaction-building errors for liquidity positions. For generating deep links to the Uniswap web app instead of calling the API, use the liquidity-planner skill; for using the Uniswap v4 SDK directly rather than the REST API, use the v4-sdk-integration skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[943,946,947,948],{"name":944,"slug":945,"type":15},"API Development","api-development",{"name":20,"slug":21,"type":15},{"name":933,"slug":934,"type":15},{"name":17,"slug":18,"type":15},"2026-07-17T06:08:13.704465",{"slug":951,"name":951,"fn":952,"description":953,"org":954,"tags":955,"stars":25,"repoUrl":26,"updatedAt":963},"pay-with-any-token","pay HTTP 402 challenges with Uniswap","Pay HTTP 402 payment challenges using tokens via the Tempo CLI and Uniswap Trading API. Use when the user encounters a 402 Payment Required response, needs to fulfill a machine payment, mentions \"MPP\", \"Tempo payment\", \"pay for API access\", \"HTTP 402\", \"x402\", \"machine payment protocol\", \"pay-with-any-token\", \"use tempo\", \"tempo request\", or \"tempo wallet\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[956,957,960,961],{"name":20,"slug":21,"type":15},{"name":958,"slug":959,"type":15},"Payments","payments",{"name":23,"slug":24,"type":15},{"name":962,"slug":962,"type":15},"x402","2026-07-17T06:04:29.756086",{"slug":965,"name":965,"fn":966,"description":967,"org":968,"tags":969,"stars":25,"repoUrl":26,"updatedAt":974},"pay-with-app","pay 402 payment challenges","Pay HTTP 402 payment challenges issued by OKX's Agent Payments Protocol (APP) on X Layer using tokens from any chain via the Uniswap Trading API. Use this skill whenever the user encounters a 402 challenge whose network resolves to X Layer (chain 196), mentions \"APP\", \"Agent Payments Protocol\", \"OKX agent payment\", \"OKX Onchain OS\", \"OKX agentic wallet\", \"x402 on X Layer\", \"USDT0\", \"x42\", \"Instant Payment\", \"Batch Payment\", \"pay for X Layer API\", or wants to pay an OKX-backed merchant. Even when the user does not explicitly say APP, prefer this skill for any 402 challenge whose network resolves to X Layer (chain 196). For 402 challenges on other chains (Ethereum, Base, Arbitrum, Tempo) use pay-with-any-token instead.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[970,971,972,973],{"name":944,"slug":945,"type":15},{"name":958,"slug":959,"type":15},{"name":17,"slug":18,"type":15},{"name":962,"slug":962,"type":15},"2026-07-17T06:07:38.795043",{"slug":43,"name":43,"fn":976,"description":977,"org":978,"tags":979,"stars":25,"repoUrl":26,"updatedAt":984},"integrate Uniswap swap functionality","Integrate Uniswap swaps into applications. Use when user says \"integrate swaps\", \"uniswap\", \"trading api\", \"add swap functionality\", \"build a swap frontend\", \"create a swap script\", \"smart contract swap integration\", \"use Universal Router\", \"Trading API\", or mentions swapping tokens via Uniswap.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[980,981,982,983],{"name":944,"slug":945,"type":15},{"name":20,"slug":21,"type":15},{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},"2026-07-17T06:08:10.354222",{"slug":986,"name":986,"fn":987,"description":988,"org":989,"tags":990,"stars":25,"repoUrl":26,"updatedAt":995},"swap-planner","plan and execute token swaps","This skill should be used when the user asks to \"swap tokens\", \"trade ETH for USDC\", \"exchange tokens on Uniswap\", \"buy tokens\", \"sell tokens\", \"convert ETH to stablecoins\", \"find memecoins\", \"discover tokens\", \"research tokens\", \"tokens to buy\", \"find tokens to swap\", \"what should I buy\", or mentions swapping, trading, researching, discovering, buying, or exchanging tokens on any Uniswap-supported chain. Supports both known token swaps and token discovery workflows (discovery uses keyword search and web search — there is no live \"trending\" feed). Generates deep links to execute swaps in the Uniswap interface.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[991,992,993,994],{"name":20,"slug":21,"type":15},{"name":933,"slug":934,"type":15},{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},"2026-07-17T06:08:10.008152",{"slug":997,"name":997,"fn":998,"description":999,"org":1000,"tags":1001,"stars":25,"repoUrl":26,"updatedAt":1005},"v4-hook-generator","generate Uniswap v4 hook contracts","Generate Uniswap v4 hook contracts via OpenZeppelin MCP. Use when building custom swap logic, async swaps, hook-owned liquidity, custom curves, dynamic fees, MEV protection, limit orders, or oracle hooks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1002,1003,1004],{"name":873,"slug":874,"type":15},{"name":876,"slug":877,"type":15},{"name":17,"slug":18,"type":15},"2026-07-17T06:04:19.17669",19,{"items":1008,"total":1058},[1009,1016,1023,1030,1037,1044,1051],{"slug":864,"name":864,"fn":865,"description":866,"org":1010,"tags":1011,"stars":25,"repoUrl":26,"updatedAt":879},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1012,1013,1014,1015],{"name":870,"slug":871,"type":15},{"name":873,"slug":874,"type":15},{"name":876,"slug":877,"type":15},{"name":17,"slug":18,"type":15},{"slug":881,"name":881,"fn":882,"description":883,"org":1017,"tags":1018,"stars":25,"repoUrl":26,"updatedAt":890},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1019,1020,1021,1022],{"name":13,"slug":14,"type":15},{"name":873,"slug":874,"type":15},{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":1024,"tags":1025,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1026,1027,1028,1029],{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},{"slug":899,"name":899,"fn":900,"description":901,"org":1031,"tags":1032,"stars":25,"repoUrl":26,"updatedAt":910},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1033,1034,1035,1036],{"name":905,"slug":906,"type":15},{"name":873,"slug":874,"type":15},{"name":876,"slug":877,"type":15},{"name":17,"slug":18,"type":15},{"slug":912,"name":912,"fn":913,"description":914,"org":1038,"tags":1039,"stars":25,"repoUrl":26,"updatedAt":923},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1040,1041,1042,1043],{"name":873,"slug":874,"type":15},{"name":919,"slug":920,"type":15},{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},{"slug":925,"name":925,"fn":926,"description":927,"org":1045,"tags":1046,"stars":25,"repoUrl":26,"updatedAt":936},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1047,1048,1049,1050],{"name":20,"slug":21,"type":15},{"name":873,"slug":874,"type":15},{"name":933,"slug":934,"type":15},{"name":17,"slug":18,"type":15},{"slug":938,"name":938,"fn":939,"description":940,"org":1052,"tags":1053,"stars":25,"repoUrl":26,"updatedAt":949},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1054,1055,1056,1057],{"name":944,"slug":945,"type":15},{"name":20,"slug":21,"type":15},{"name":933,"slug":934,"type":15},{"name":17,"slug":18,"type":15},15]