[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-uniswap-permissioned-pools-deployer":3,"mdc--jf8xtx-key":36,"related-repo-uniswap-permissioned-pools-deployer":1463,"related-org-uniswap-permissioned-pools-deployer":1557},{"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},"permissioned-pools-deployer","deploy Uniswap v4 permissioned pools","Guided walkthrough for executing the on-chain setup sequence for a Uniswap v4 Permissioned Pool from a permissioned-pools-configurator JSON config - allowlist checker deployment, createPermissionsAdapter, allowlisting and funding the adapter, verification, wrapper and hook registration, pool initialization, swap enablement, liquidity seeding, and the routing-allowlist request. Use when the user says \"deploy a permissioned pool\", \"run the permissioned pool setup\", \"execute the permissioned pools journey\", \"createPermissionsAdapter\", \"verify my permissions adapter\", \"walk me through the permissioned pool deployment\", or asks to execute the on-chain steps after generating a permissioned-pools-configurator config. Covers contract mechanics only - does not constitute legal, financial, investment, tax, or compliance advice, and is not a compliance review - and never emits a broadcastable command before an explicit acknowledgment.",{"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},"DeFi","defi","tag",{"name":17,"slug":18,"type":15},"Deployment","deployment",{"name":20,"slug":21,"type":15},"Smart Contracts","smart-contracts",{"name":23,"slug":24,"type":15},"Ethereum","ethereum",215,"https:\u002F\u002Fgithub.com\u002FUniswap\u002Funiswap-ai","2026-08-14T04:52:10.10212","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-permissioned-pools\u002Fskills\u002Fpermissioned-pools-deployer","---\nname: permissioned-pools-deployer\ndescription: Guided walkthrough for executing the on-chain setup sequence for a Uniswap v4 Permissioned Pool from a permissioned-pools-configurator JSON config - allowlist checker deployment, createPermissionsAdapter, allowlisting and funding the adapter, verification, wrapper and hook registration, pool initialization, swap enablement, liquidity seeding, and the routing-allowlist request. Use when the user says \"deploy a permissioned pool\", \"run the permissioned pool setup\", \"execute the permissioned pools journey\", \"createPermissionsAdapter\", \"verify my permissions adapter\", \"walk me through the permissioned pool deployment\", or asks to execute the on-chain steps after generating a permissioned-pools-configurator config. Covers contract mechanics only - does not constitute legal, financial, investment, tax, or compliance advice, and is not a compliance review - and never emits a broadcastable command before an explicit acknowledgment.\nallowed-tools: Read, Glob, Grep, Bash(forge:*), Bash(cast:*), AskUserQuestion\nmodel: opus\nlicense: MIT\nmetadata:\n  author: uniswap\n  version: '0.1.0'\n---\n\n# Permissioned Pools Deployer\n\nGuided, step-by-step execution of the on-chain setup sequence for a Uniswap v4 Permissioned\nPool, starting from the JSON configuration `permissioned-pools-configurator` produces. This\nskill is the half of the milestone that turns a validated config into command sequences that\nspend real gas against real contracts — treat every safety section below as load-bearing, not\nas boilerplate.\n\nFor the contract mechanics behind any step, see\n[`permissioned-pools-issuer`](..\u002Fpermissioned-pools-issuer\u002FSKILL.md), specifically its\n[Issuer Journey](..\u002Fpermissioned-pools-issuer\u002Freferences\u002Fissuer-journey.md) and\n[Enforced Ordering and Reverts](..\u002Fpermissioned-pools-issuer\u002Freferences\u002Fenforced-ordering-and-reverts.md).\nThis skill does not repeat the contract-level explanation of _why_ each step behaves the way it\ndoes — it walks the same journey as ordered command sequences and never contradicts that\nreference.\n\n> **Runtime Compatibility:** This skill uses `AskUserQuestion` for the acknowledgment gate and\n> for confirming irreversible choices. If `AskUserQuestion` is not available in your runtime,\n> ask the same yes\u002Fno question in plain text and require an explicit affirmative reply before\n> continuing — silence or a generic \"continue\" does not count.\n\n## Scope and Disclaimer\n\n**This is educational deployment guidance, not a compliance review, and not a substitute for\nyour own review of every command before you run it.**\n\nThis skill explains, in order, the commands that bring a permissioned pool up, using the\nconfiguration `permissioned-pools-configurator` produced. It does not call any contract itself —\nyou run every command it shows you, after reviewing it.\n\n**You must:**\n\n1. ✅ **Review every configuration and every command carefully** before running anything. AI-generated\n   command sequences may contain errors.\n2. ✅ **Verify every address** — this skill contains no deployment addresses and resolves none for\n   you; see [Address Resolution](.\u002Freferences\u002Fpreflight-and-validation.md#address-resolution).\n3. ✅ **Test on a testnet first.** Run the entire sequence on Sepolia (or another testnet with the\n   permissioned-pools contracts deployed) before touching mainnet.\n4. ✅ **Have your own auditors review any contract you deploy** — most importantly your allowlist\n   checker, which this skill can show you a skeleton for but does not audit.\n5. ✅ **Treat this as contract mechanics only.** This skill does not constitute legal, financial, investment, or tax advice, and it is **not** a compliance review of your token, your allowlist, your KYC or AML program, or your configuration.\n6. ✅ **Read the repo's usage guidelines.** The repo root `DISCLAIMER.md` governs every skill in\n   this repository: they are provided as is without warranty, they do not constitute legal,\n   financial, investment, or tax advice, and it sets out use limits plus an AI-disclosure duty\n   that applies when you use a skill to generate financial information and present it directly\n   to individuals or consumers. Point the user to it.\n\n### The acknowledgment gate\n\n**Before showing, generating, or explaining any action-oriented step** — anything that produces\na command intended to broadcast a transaction, or any address-resolution step that leads\ndirectly into one — get an explicit, affirmative acknowledgment. This gate must never be\nsatisfiable implicitly.\n\nUse `AskUserQuestion` with a single question and exactly two options, and do not proceed past\nthis gate until the first option is chosen:\n\n- **Question:** \"This walkthrough produces commands that spend gas and permanently change\n  on-chain state for your token once you run them. Do you acknowledge the six points above and\n  want to continue?\"\n- **Option A — \"Yes, I have reviewed the points above and want to continue.\"** → proceed to the\n  preflight checks.\n- **Option B — \"No, stop here.\"** → end the walkthrough immediately. Do not display, generate,\n  or explain any command below this point.\n\nSilence, a plain \"continue,\" moving on to the next question in the same turn, or any answer\nother than the explicit affirmative option does **not** satisfy this gate. If the runtime lacks\n`AskUserQuestion`, ask the same yes\u002Fno question in plain text and require an explicit\naffirmative reply — \"ok,\" \"sure,\" a thumbs-up emoji, or no reply at all does not count.\n\nReference and teaching content that does not produce a runnable command — explaining what a step\ndoes in prose, decoding a revert the user already hit, discussing an allowlist-checker shape in\nthe abstract — is answered immediately with the framing stated inline, the same way\n`permissioned-pools-issuer` treats reference content. This carve-out does **not** cover this\nskill's own command templates and Solidity script skeletons (for example the pool-initialization\nscript in [Step Walkthrough](.\u002Freferences\u002Fstep-walkthrough.md#step-6a-initialize-the-pool)):\nthose are runnable broadcast material, and showing them is exactly the action-oriented content the\ngate exists to hold back — never display one before the gate is satisfied.\n\n---\n\n## Input Validation Rules\n\nState these before generating or displaying any command that interpolates a user-supplied or\nconfig-supplied value. Every value below is validated **before** it reaches a `Bash(forge:*)` or\n`Bash(cast:*)` command, a file path, or a Solidity script argument — no exceptions for a value\nthat \"looks fine.\"\n\n- **Ethereum addresses** — MUST match `^0x[a-fA-F0-9]{40}$`. Reject anything else, including the\n  literal string `\"RESOLVE\"` — a field still marked `\"RESOLVE\"` is not ready for a command and\n  must go through [address resolution](.\u002Freferences\u002Fpreflight-and-validation.md#address-resolution)\n  first, never be interpolated as-is. One field is an explicit, documented exception to this\n  regex, not a violation of it: `pool.pairedCurrency`'s `\"native\"` sentinel, covered in\n  [What This Skill Consumes](#what-this-skill-consumes) below — every other address-shaped field\n  in the config has no such carve-out.\n- **Chain ID** — MUST be a positive integer (`^[1-9][0-9]*$`). Ethereum Mainnet (`1`) and Sepolia\n  (`11155111`) are the allowlisted defaults — the only two chains verified to carry the full\n  permissioned set. Unichain (`130`) is named by the configurator's network question but is\n  **not** deployable: it carries `V4Quoter` only, so stop rather than trying to resolve the\n  missing addresses (see\n  [Preflight and Validation](.\u002Freferences\u002Fpreflight-and-validation.md#input-validation-rules-in-full)).\n  Any other chain ID is accepted only after confirming the\n  deploy guide's `#deployment-addresses` table actually has a row for it; if it does not, every\n  wrapper and hook field will end up unresolvable, which is the signal to stop, not to guess.\n- **Numeric fields** (`verificationDepositAmount`, `pool.feeTier`, `pool.tickSpacing`,\n  `pool.startingPriceRatio`) — MUST match `^[0-9]+$` for integer-only fields or\n  `^[0-9]+(\\.[0-9]+)?$` for the starting price ratio, and MUST be strictly greater than zero.\n- **Values supplied during the walkthrough, not by the config, are validated identically** — the\n  RPC endpoint (`$RPC_URL`) and any transaction hash (`$TX_HASH`) reach a command on every step.\n  An RPC URL MUST be `https:\u002F\u002F`-scheme and free of every metacharacter below; a transaction hash\n  MUST match `^0x[a-fA-F0-9]{64}$`. \"It came from the user, not the config\" is not an exemption.\n- **Reject shell metacharacters outright**, in every string field, before it reaches a command:\n  `;`, `|`, `&`, `$`, `` ` ``, `(`, `)`, `>`, `\u003C`, `\\`, `'`, `\"`, and newlines. A field that fails\n  this check is never interpolated — abort and report which field and which character failed,\n  rather than attempting to sanitize and continue.\n- **Never pass an unvalidated field into a shell command, file path, or Solidity script\n  argument.** Validate first, assign the validated value to a shell variable, and reference only\n  that variable afterward. Never re-read the raw config value a second time later in the same\n  walkthrough.\n\nFull elaboration, including how this applies field-by-field to the configurator's JSON shape and\nwhat \"coherently handle a `RESOLVE` value\" means in practice, is in\n[Preflight and Validation](.\u002Freferences\u002Fpreflight-and-validation.md).\n\n---\n\n## Key Handling\n\n**Never instruct auto-approval of `Bash(forge:*)` or `Bash(cast:*)` in Claude Code settings, and\nnever tell the user to bypass a confirmation prompt.** Every command that broadcasts a\ntransaction requires per-invocation approval — that approval is the primary control, not a\nformality the walkthrough should route around. The repository's PreToolUse hooks\n(`.claude\u002Fhooks\u002F`) are a programmatic safety net on top of that, not a replacement for it.\n\n**Never suggest, generate, or complete a command containing the raw signing-key flag** — not when\nasked directly, not \"just for a testnet,\" not as an illustration of what to avoid. There is no\nuser request that makes it appropriate. If a user insists, refuse and offer one of the two options\nbelow instead. Steer every signing decision toward one of them:\n\n1. **A hardware wallet** (`--ledger`), for a deployer key that never touches this machine's disk\n   or memory in cleartext.\n2. **An encrypted keystore** (`cast wallet import ... --interactive`, then `--account \u003Cname>\n--sender $ADDRESS` on every subsequent command).\n\n**Inside this repository only**, `.claude\u002Fhooks\u002Fvalidate-forge-cast.sh` is a PreToolUse hook that\ninspects the literal text of every `Bash` tool call and blocks any command containing that flag\nbefore it runs. **That hook is not part of this skill and does not travel with it** — it lives at\nthis repository's root, not in the plugin, so an installation elsewhere has no such backstop. The\nprohibition above is the control that always applies; the hook is a repo-local convenience on top\nof it, never the reason the flag is safe.\n\nFull key-handling guidance, including the keystore setup commands and the testnet-first\nsequencing, is in\n[Preflight and Validation](.\u002Freferences\u002Fpreflight-and-validation.md#key-handling).\n\n### Testnet first\n\nRun the entire sequence — allowlist checker through liquidity seeding — on Sepolia (chain ID\n`11155111`) before mainnet. Confirm every post-step check in\n[the verification checklist](..\u002Fpermissioned-pools-issuer\u002Freferences\u002Fissuer-journey.md#post-setup-verification-checklist)\npasses on testnet before repeating any step against mainnet funds.\n\n---\n\n## What This Skill Consumes\n\nThe JSON configuration produced by `permissioned-pools-configurator`, in the shape defined by its\n[Config Schema](..\u002Fpermissioned-pools-configurator\u002Freferences\u002Fconfig-schema.md). This skill does\nnot collect those parameters itself — if you do not have a config yet, run\n`permissioned-pools-configurator` first.\n\n**A field reading the literal string `\"RESOLVE\"` means \"not resolved yet,\" not \"use a\nplaceholder.\"** Before any command that needs that field, stop and walk through\n[address resolution](.\u002Freferences\u002Fpreflight-and-validation.md#address-resolution) — the deploy\nguide's `#deployment-addresses` table, then `Uniswap\u002Fcontracts`\n`deployments\u002Fjson\u002F\u003CchainId>.json`, then a block explorer for your chain — and only continue once\nthe field holds a real, explorer-verified address. Never guess a value for a `\"RESOLVE\"` field\nand never carry the literal string itself into a command; both are validation failures, not\nvalues to work around.\n\n`pool.pairedCurrency`'s `\"native\"` sentinel is different: it resolves to `address(0)`, Uniswap\nv4's own convention for a native `PoolKey` currency, at the point the `PoolKey` is actually built\nin [Step 6a](.\u002Freferences\u002Fstep-walkthrough.md#step-6a-initialize-the-pool) — never earlier, and\nnever written into any other field.\n\n---\n\n## The Deployment Journey\n\nThe published guide's seven steps, in the order it recommends. Only five ordering edges are\nenforced by the contracts (see\n[Enforced Ordering and Reverts](..\u002Fpermissioned-pools-issuer\u002Freferences\u002Fenforced-ordering-and-reverts.md));\nthis walkthrough follows the guide's order and states, at each step, whether that order is\nenforced or convention.\n\n| Step | Covered where                                                                                              | Summary                                                                |\n| ---- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |\n| 1    | [Preflight and Validation](.\u002Freferences\u002Fpreflight-and-validation.md#step-1-allowlist-checker)              | Confirm or deploy the allowlist checker                                |\n| 2    | [Step Walkthrough](.\u002Freferences\u002Fstep-walkthrough.md#step-2-createpermissionsadapter)                       | `createPermissionsAdapter`                                             |\n| 3    | [Step Walkthrough](.\u002Freferences\u002Fstep-walkthrough.md#step-3-allowlist-and-fund-the-adapter)                 | Allowlist the adapter on your token, approve, `depositForVerification` |\n| 4    | [Step Walkthrough](.\u002Freferences\u002Fstep-walkthrough.md#step-4-verifypermissionsadapter)                       | `verifyPermissionsAdapter`                                             |\n| 5    | [Step Walkthrough](.\u002Freferences\u002Fstep-walkthrough.md#step-5-register-wrappers-and-the-hook)                 | The four `updateAllowedWrapper` registrations, then `setAllowedHook`   |\n| 6    | [Step Walkthrough](.\u002Freferences\u002Fstep-walkthrough.md#step-6-create-the-pool-enable-swapping-seed-liquidity) | Pool `initialize`, `updateSwappingEnabled`, liquidity seeding          |\n| 7    | [Step Walkthrough](.\u002Freferences\u002Fstep-walkthrough.md#step-7-request-routing-allowlisting)                   | The routing-allowlist request                                          |\n\nEvery step in [Step Walkthrough](.\u002Freferences\u002Fstep-walkthrough.md) names its precondition and,\nwhere the contracts enforce one, the exact revert selector you get if you are early — matching\n[Enforced Ordering and Reverts](..\u002Fpermissioned-pools-issuer\u002Freferences\u002Fenforced-ordering-and-reverts.md)\nselector-for-selector. Where a step is unenforced, the walkthrough says so rather than inventing\na revert for it.\n\n---\n\n## Post-Deployment Verification\n\nAfter the sequence completes (or after any individual step, to confirm it landed), run the\nread-only checks in\n[Post-Setup Verification Checklist](..\u002Fpermissioned-pools-issuer\u002Freferences\u002Fissuer-journey.md#post-setup-verification-checklist).\nEvery check there is a `cast call` against public getters — none of it spends gas, and none of it\nneeds the acknowledgment gate above.\n\n---\n\n## Notes for Implementers of This Flow\n\n- **The acknowledgment gate is once per session, not once per step.** Once acknowledged, continue\n  through the rest of the steps in that same session without re-asking — but re-ask if the user\n  starts a new session, switches chains, or switches configs.\n- **Never hardcode a contract address.** Every address this skill uses comes from the loaded\n  config, from a value the user supplies during the walkthrough, or from a read (`cast call`)\n  against a contract whose address itself came from one of those two sources. See\n  [Preflight and Validation](.\u002Freferences\u002Fpreflight-and-validation.md#address-resolution) for why\n  this skill ships no address table.\n- **Decode an unexpected revert by call site, not by name.** Three selectors in this journey\n  (`NoVerifiedAdapter`, `Unauthorized`, `SwappingDisabled`) are declared more than once across\n  different contracts with different meanings — see\n  [Enforced Ordering and Reverts](..\u002Fpermissioned-pools-issuer\u002Freferences\u002Fenforced-ordering-and-reverts.md#how-to-decode-an-unexpected-revert).\n- **This skill does not fetch RPC state on its own initiative.** Every `cast call` it suggests is\n  something you choose to run; the skill does not poll a chain in the background.\n",{"data":37,"body":42},{"name":4,"description":6,"allowed-tools":38,"model":39,"license":28,"metadata":40},"Read, Glob, Grep, Bash(forge:*), Bash(cast:*), AskUserQuestion","opus",{"author":8,"version":41},"0.1.0",{"type":43,"children":44},"root",[45,53,68,110,140,147,155,167,175,270,277,287,299,333,351,377,381,387,415,758,777,780,786,818,828,873,905,916,922,942,945,950,977,1028,1074,1077,1083,1094,1316,1334,1337,1343,1363,1366,1372],{"type":46,"tag":47,"props":48,"children":49},"element","h1",{"id":4},[50],{"type":51,"value":52},"text","Permissioned Pools Deployer",{"type":46,"tag":54,"props":55,"children":56},"p",{},[57,59,66],{"type":51,"value":58},"Guided, step-by-step execution of the on-chain setup sequence for a Uniswap v4 Permissioned\nPool, starting from the JSON configuration ",{"type":46,"tag":60,"props":61,"children":63},"code",{"className":62},[],[64],{"type":51,"value":65},"permissioned-pools-configurator",{"type":51,"value":67}," produces. This\nskill is the half of the milestone that turns a validated config into command sequences that\nspend real gas against real contracts — treat every safety section below as load-bearing, not\nas boilerplate.",{"type":46,"tag":54,"props":69,"children":70},{},[71,73,84,86,92,94,100,102,108],{"type":51,"value":72},"For the contract mechanics behind any step, see\n",{"type":46,"tag":74,"props":75,"children":77},"a",{"href":76},"..\u002Fpermissioned-pools-issuer\u002FSKILL.md",[78],{"type":46,"tag":60,"props":79,"children":81},{"className":80},[],[82],{"type":51,"value":83},"permissioned-pools-issuer",{"type":51,"value":85},", specifically its\n",{"type":46,"tag":74,"props":87,"children":89},{"href":88},"..\u002Fpermissioned-pools-issuer\u002Freferences\u002Fissuer-journey.md",[90],{"type":51,"value":91},"Issuer Journey",{"type":51,"value":93}," and\n",{"type":46,"tag":74,"props":95,"children":97},{"href":96},"..\u002Fpermissioned-pools-issuer\u002Freferences\u002Fenforced-ordering-and-reverts.md",[98],{"type":51,"value":99},"Enforced Ordering and Reverts",{"type":51,"value":101},".\nThis skill does not repeat the contract-level explanation of ",{"type":46,"tag":103,"props":104,"children":105},"em",{},[106],{"type":51,"value":107},"why",{"type":51,"value":109}," each step behaves the way it\ndoes — it walks the same journey as ordered command sequences and never contradicts that\nreference.",{"type":46,"tag":111,"props":112,"children":113},"blockquote",{},[114],{"type":46,"tag":54,"props":115,"children":116},{},[117,123,125,131,133,138],{"type":46,"tag":118,"props":119,"children":120},"strong",{},[121],{"type":51,"value":122},"Runtime Compatibility:",{"type":51,"value":124}," This skill uses ",{"type":46,"tag":60,"props":126,"children":128},{"className":127},[],[129],{"type":51,"value":130},"AskUserQuestion",{"type":51,"value":132}," for the acknowledgment gate and\nfor confirming irreversible choices. If ",{"type":46,"tag":60,"props":134,"children":136},{"className":135},[],[137],{"type":51,"value":130},{"type":51,"value":139}," is not available in your runtime,\nask the same yes\u002Fno question in plain text and require an explicit affirmative reply before\ncontinuing — silence or a generic \"continue\" does not count.",{"type":46,"tag":141,"props":142,"children":144},"h2",{"id":143},"scope-and-disclaimer",[145],{"type":51,"value":146},"Scope and Disclaimer",{"type":46,"tag":54,"props":148,"children":149},{},[150],{"type":46,"tag":118,"props":151,"children":152},{},[153],{"type":51,"value":154},"This is educational deployment guidance, not a compliance review, and not a substitute for\nyour own review of every command before you run it.",{"type":46,"tag":54,"props":156,"children":157},{},[158,160,165],{"type":51,"value":159},"This skill explains, in order, the commands that bring a permissioned pool up, using the\nconfiguration ",{"type":46,"tag":60,"props":161,"children":163},{"className":162},[],[164],{"type":51,"value":65},{"type":51,"value":166}," produced. It does not call any contract itself —\nyou run every command it shows you, after reviewing it.",{"type":46,"tag":54,"props":168,"children":169},{},[170],{"type":46,"tag":118,"props":171,"children":172},{},[173],{"type":51,"value":174},"You must:",{"type":46,"tag":176,"props":177,"children":178},"ol",{},[179,192,211,222,233,251],{"type":46,"tag":180,"props":181,"children":182},"li",{},[183,185,190],{"type":51,"value":184},"✅ ",{"type":46,"tag":118,"props":186,"children":187},{},[188],{"type":51,"value":189},"Review every configuration and every command carefully",{"type":51,"value":191}," before running anything. AI-generated\ncommand sequences may contain errors.",{"type":46,"tag":180,"props":193,"children":194},{},[195,196,201,203,209],{"type":51,"value":184},{"type":46,"tag":118,"props":197,"children":198},{},[199],{"type":51,"value":200},"Verify every address",{"type":51,"value":202}," — this skill contains no deployment addresses and resolves none for\nyou; see ",{"type":46,"tag":74,"props":204,"children":206},{"href":205},".\u002Freferences\u002Fpreflight-and-validation.md#address-resolution",[207],{"type":51,"value":208},"Address Resolution",{"type":51,"value":210},".",{"type":46,"tag":180,"props":212,"children":213},{},[214,215,220],{"type":51,"value":184},{"type":46,"tag":118,"props":216,"children":217},{},[218],{"type":51,"value":219},"Test on a testnet first.",{"type":51,"value":221}," Run the entire sequence on Sepolia (or another testnet with the\npermissioned-pools contracts deployed) before touching mainnet.",{"type":46,"tag":180,"props":223,"children":224},{},[225,226,231],{"type":51,"value":184},{"type":46,"tag":118,"props":227,"children":228},{},[229],{"type":51,"value":230},"Have your own auditors review any contract you deploy",{"type":51,"value":232}," — most importantly your allowlist\nchecker, which this skill can show you a skeleton for but does not audit.",{"type":46,"tag":180,"props":234,"children":235},{},[236,237,242,244,249],{"type":51,"value":184},{"type":46,"tag":118,"props":238,"children":239},{},[240],{"type":51,"value":241},"Treat this as contract mechanics only.",{"type":51,"value":243}," This skill does not constitute legal, financial, investment, or tax advice, and it is ",{"type":46,"tag":118,"props":245,"children":246},{},[247],{"type":51,"value":248},"not",{"type":51,"value":250}," a compliance review of your token, your allowlist, your KYC or AML program, or your configuration.",{"type":46,"tag":180,"props":252,"children":253},{},[254,255,260,262,268],{"type":51,"value":184},{"type":46,"tag":118,"props":256,"children":257},{},[258],{"type":51,"value":259},"Read the repo's usage guidelines.",{"type":51,"value":261}," The repo root ",{"type":46,"tag":60,"props":263,"children":265},{"className":264},[],[266],{"type":51,"value":267},"DISCLAIMER.md",{"type":51,"value":269}," governs every skill in\nthis repository: they are provided as is without warranty, they do not constitute legal,\nfinancial, investment, or tax advice, and it sets out use limits plus an AI-disclosure duty\nthat applies when you use a skill to generate financial information and present it directly\nto individuals or consumers. Point the user to it.",{"type":46,"tag":271,"props":272,"children":274},"h3",{"id":273},"the-acknowledgment-gate",[275],{"type":51,"value":276},"The acknowledgment gate",{"type":46,"tag":54,"props":278,"children":279},{},[280,285],{"type":46,"tag":118,"props":281,"children":282},{},[283],{"type":51,"value":284},"Before showing, generating, or explaining any action-oriented step",{"type":51,"value":286}," — anything that produces\na command intended to broadcast a transaction, or any address-resolution step that leads\ndirectly into one — get an explicit, affirmative acknowledgment. This gate must never be\nsatisfiable implicitly.",{"type":46,"tag":54,"props":288,"children":289},{},[290,292,297],{"type":51,"value":291},"Use ",{"type":46,"tag":60,"props":293,"children":295},{"className":294},[],[296],{"type":51,"value":130},{"type":51,"value":298}," with a single question and exactly two options, and do not proceed past\nthis gate until the first option is chosen:",{"type":46,"tag":300,"props":301,"children":302},"ul",{},[303,313,323],{"type":46,"tag":180,"props":304,"children":305},{},[306,311],{"type":46,"tag":118,"props":307,"children":308},{},[309],{"type":51,"value":310},"Question:",{"type":51,"value":312}," \"This walkthrough produces commands that spend gas and permanently change\non-chain state for your token once you run them. Do you acknowledge the six points above and\nwant to continue?\"",{"type":46,"tag":180,"props":314,"children":315},{},[316,321],{"type":46,"tag":118,"props":317,"children":318},{},[319],{"type":51,"value":320},"Option A — \"Yes, I have reviewed the points above and want to continue.\"",{"type":51,"value":322}," → proceed to the\npreflight checks.",{"type":46,"tag":180,"props":324,"children":325},{},[326,331],{"type":46,"tag":118,"props":327,"children":328},{},[329],{"type":51,"value":330},"Option B — \"No, stop here.\"",{"type":51,"value":332}," → end the walkthrough immediately. Do not display, generate,\nor explain any command below this point.",{"type":46,"tag":54,"props":334,"children":335},{},[336,338,342,344,349],{"type":51,"value":337},"Silence, a plain \"continue,\" moving on to the next question in the same turn, or any answer\nother than the explicit affirmative option does ",{"type":46,"tag":118,"props":339,"children":340},{},[341],{"type":51,"value":248},{"type":51,"value":343}," satisfy this gate. If the runtime lacks\n",{"type":46,"tag":60,"props":345,"children":347},{"className":346},[],[348],{"type":51,"value":130},{"type":51,"value":350},", ask the same yes\u002Fno question in plain text and require an explicit\naffirmative reply — \"ok,\" \"sure,\" a thumbs-up emoji, or no reply at all does not count.",{"type":46,"tag":54,"props":352,"children":353},{},[354,356,361,363,367,369,375],{"type":51,"value":355},"Reference and teaching content that does not produce a runnable command — explaining what a step\ndoes in prose, decoding a revert the user already hit, discussing an allowlist-checker shape in\nthe abstract — is answered immediately with the framing stated inline, the same way\n",{"type":46,"tag":60,"props":357,"children":359},{"className":358},[],[360],{"type":51,"value":83},{"type":51,"value":362}," treats reference content. This carve-out does ",{"type":46,"tag":118,"props":364,"children":365},{},[366],{"type":51,"value":248},{"type":51,"value":368}," cover this\nskill's own command templates and Solidity script skeletons (for example the pool-initialization\nscript in ",{"type":46,"tag":74,"props":370,"children":372},{"href":371},".\u002Freferences\u002Fstep-walkthrough.md#step-6a-initialize-the-pool",[373],{"type":51,"value":374},"Step Walkthrough",{"type":51,"value":376},"):\nthose are runnable broadcast material, and showing them is exactly the action-oriented content the\ngate exists to hold back — never display one before the gate is satisfied.",{"type":46,"tag":378,"props":379,"children":380},"hr",{},[],{"type":46,"tag":141,"props":382,"children":384},{"id":383},"input-validation-rules",[385],{"type":51,"value":386},"Input Validation Rules",{"type":46,"tag":54,"props":388,"children":389},{},[390,392,397,399,405,407,413],{"type":51,"value":391},"State these before generating or displaying any command that interpolates a user-supplied or\nconfig-supplied value. Every value below is validated ",{"type":46,"tag":118,"props":393,"children":394},{},[395],{"type":51,"value":396},"before",{"type":51,"value":398}," it reaches a ",{"type":46,"tag":60,"props":400,"children":402},{"className":401},[],[403],{"type":51,"value":404},"Bash(forge:*)",{"type":51,"value":406}," or\n",{"type":46,"tag":60,"props":408,"children":410},{"className":409},[],[411],{"type":51,"value":412},"Bash(cast:*)",{"type":51,"value":414}," command, a file path, or a Solidity script argument — no exceptions for a value\nthat \"looks fine.\"",{"type":46,"tag":300,"props":416,"children":417},{},[418,482,554,611,653,748],{"type":46,"tag":180,"props":419,"children":420},{},[421,426,428,434,436,442,444,449,451,456,458,464,466,472,474,480],{"type":46,"tag":118,"props":422,"children":423},{},[424],{"type":51,"value":425},"Ethereum addresses",{"type":51,"value":427}," — MUST match ",{"type":46,"tag":60,"props":429,"children":431},{"className":430},[],[432],{"type":51,"value":433},"^0x[a-fA-F0-9]{40}$",{"type":51,"value":435},". Reject anything else, including the\nliteral string ",{"type":46,"tag":60,"props":437,"children":439},{"className":438},[],[440],{"type":51,"value":441},"\"RESOLVE\"",{"type":51,"value":443}," — a field still marked ",{"type":46,"tag":60,"props":445,"children":447},{"className":446},[],[448],{"type":51,"value":441},{"type":51,"value":450}," is not ready for a command and\nmust go through ",{"type":46,"tag":74,"props":452,"children":453},{"href":205},[454],{"type":51,"value":455},"address resolution",{"type":51,"value":457},"\nfirst, never be interpolated as-is. One field is an explicit, documented exception to this\nregex, not a violation of it: ",{"type":46,"tag":60,"props":459,"children":461},{"className":460},[],[462],{"type":51,"value":463},"pool.pairedCurrency",{"type":51,"value":465},"'s ",{"type":46,"tag":60,"props":467,"children":469},{"className":468},[],[470],{"type":51,"value":471},"\"native\"",{"type":51,"value":473}," sentinel, covered in\n",{"type":46,"tag":74,"props":475,"children":477},{"href":476},"#what-this-skill-consumes",[478],{"type":51,"value":479},"What This Skill Consumes",{"type":51,"value":481}," below — every other address-shaped field\nin the config has no such carve-out.",{"type":46,"tag":180,"props":483,"children":484},{},[485,490,492,498,500,506,508,514,516,522,524,528,530,536,538,544,546,552],{"type":46,"tag":118,"props":486,"children":487},{},[488],{"type":51,"value":489},"Chain ID",{"type":51,"value":491}," — MUST be a positive integer (",{"type":46,"tag":60,"props":493,"children":495},{"className":494},[],[496],{"type":51,"value":497},"^[1-9][0-9]*$",{"type":51,"value":499},"). Ethereum Mainnet (",{"type":46,"tag":60,"props":501,"children":503},{"className":502},[],[504],{"type":51,"value":505},"1",{"type":51,"value":507},") and Sepolia\n(",{"type":46,"tag":60,"props":509,"children":511},{"className":510},[],[512],{"type":51,"value":513},"11155111",{"type":51,"value":515},") are the allowlisted defaults — the only two chains verified to carry the full\npermissioned set. Unichain (",{"type":46,"tag":60,"props":517,"children":519},{"className":518},[],[520],{"type":51,"value":521},"130",{"type":51,"value":523},") is named by the configurator's network question but is\n",{"type":46,"tag":118,"props":525,"children":526},{},[527],{"type":51,"value":248},{"type":51,"value":529}," deployable: it carries ",{"type":46,"tag":60,"props":531,"children":533},{"className":532},[],[534],{"type":51,"value":535},"V4Quoter",{"type":51,"value":537}," only, so stop rather than trying to resolve the\nmissing addresses (see\n",{"type":46,"tag":74,"props":539,"children":541},{"href":540},".\u002Freferences\u002Fpreflight-and-validation.md#input-validation-rules-in-full",[542],{"type":51,"value":543},"Preflight and Validation",{"type":51,"value":545},").\nAny other chain ID is accepted only after confirming the\ndeploy guide's ",{"type":46,"tag":60,"props":547,"children":549},{"className":548},[],[550],{"type":51,"value":551},"#deployment-addresses",{"type":51,"value":553}," table actually has a row for it; if it does not, every\nwrapper and hook field will end up unresolvable, which is the signal to stop, not to guess.",{"type":46,"tag":180,"props":555,"children":556},{},[557,562,564,570,572,578,579,585,587,593,595,601,603,609],{"type":46,"tag":118,"props":558,"children":559},{},[560],{"type":51,"value":561},"Numeric fields",{"type":51,"value":563}," (",{"type":46,"tag":60,"props":565,"children":567},{"className":566},[],[568],{"type":51,"value":569},"verificationDepositAmount",{"type":51,"value":571},", ",{"type":46,"tag":60,"props":573,"children":575},{"className":574},[],[576],{"type":51,"value":577},"pool.feeTier",{"type":51,"value":571},{"type":46,"tag":60,"props":580,"children":582},{"className":581},[],[583],{"type":51,"value":584},"pool.tickSpacing",{"type":51,"value":586},",\n",{"type":46,"tag":60,"props":588,"children":590},{"className":589},[],[591],{"type":51,"value":592},"pool.startingPriceRatio",{"type":51,"value":594},") — MUST match ",{"type":46,"tag":60,"props":596,"children":598},{"className":597},[],[599],{"type":51,"value":600},"^[0-9]+$",{"type":51,"value":602}," for integer-only fields or\n",{"type":46,"tag":60,"props":604,"children":606},{"className":605},[],[607],{"type":51,"value":608},"^[0-9]+(\\.[0-9]+)?$",{"type":51,"value":610}," for the starting price ratio, and MUST be strictly greater than zero.",{"type":46,"tag":180,"props":612,"children":613},{},[614,619,621,627,629,635,637,643,645,651],{"type":46,"tag":118,"props":615,"children":616},{},[617],{"type":51,"value":618},"Values supplied during the walkthrough, not by the config, are validated identically",{"type":51,"value":620}," — the\nRPC endpoint (",{"type":46,"tag":60,"props":622,"children":624},{"className":623},[],[625],{"type":51,"value":626},"$RPC_URL",{"type":51,"value":628},") and any transaction hash (",{"type":46,"tag":60,"props":630,"children":632},{"className":631},[],[633],{"type":51,"value":634},"$TX_HASH",{"type":51,"value":636},") reach a command on every step.\nAn RPC URL MUST be ",{"type":46,"tag":60,"props":638,"children":640},{"className":639},[],[641],{"type":51,"value":642},"https:\u002F\u002F",{"type":51,"value":644},"-scheme and free of every metacharacter below; a transaction hash\nMUST match ",{"type":46,"tag":60,"props":646,"children":648},{"className":647},[],[649],{"type":51,"value":650},"^0x[a-fA-F0-9]{64}$",{"type":51,"value":652},". \"It came from the user, not the config\" is not an exemption.",{"type":46,"tag":180,"props":654,"children":655},{},[656,661,663,669,670,676,677,683,684,690,691,697,698,704,705,711,712,718,719,725,726,732,733,739,740,746],{"type":46,"tag":118,"props":657,"children":658},{},[659],{"type":51,"value":660},"Reject shell metacharacters outright",{"type":51,"value":662},", in every string field, before it reaches a command:\n",{"type":46,"tag":60,"props":664,"children":666},{"className":665},[],[667],{"type":51,"value":668},";",{"type":51,"value":571},{"type":46,"tag":60,"props":671,"children":673},{"className":672},[],[674],{"type":51,"value":675},"|",{"type":51,"value":571},{"type":46,"tag":60,"props":678,"children":680},{"className":679},[],[681],{"type":51,"value":682},"&",{"type":51,"value":571},{"type":46,"tag":60,"props":685,"children":687},{"className":686},[],[688],{"type":51,"value":689},"$",{"type":51,"value":571},{"type":46,"tag":60,"props":692,"children":694},{"className":693},[],[695],{"type":51,"value":696},"`",{"type":51,"value":571},{"type":46,"tag":60,"props":699,"children":701},{"className":700},[],[702],{"type":51,"value":703},"(",{"type":51,"value":571},{"type":46,"tag":60,"props":706,"children":708},{"className":707},[],[709],{"type":51,"value":710},")",{"type":51,"value":571},{"type":46,"tag":60,"props":713,"children":715},{"className":714},[],[716],{"type":51,"value":717},">",{"type":51,"value":571},{"type":46,"tag":60,"props":720,"children":722},{"className":721},[],[723],{"type":51,"value":724},"\u003C",{"type":51,"value":571},{"type":46,"tag":60,"props":727,"children":729},{"className":728},[],[730],{"type":51,"value":731},"\\",{"type":51,"value":571},{"type":46,"tag":60,"props":734,"children":736},{"className":735},[],[737],{"type":51,"value":738},"'",{"type":51,"value":571},{"type":46,"tag":60,"props":741,"children":743},{"className":742},[],[744],{"type":51,"value":745},"\"",{"type":51,"value":747},", and newlines. A field that fails\nthis check is never interpolated — abort and report which field and which character failed,\nrather than attempting to sanitize and continue.",{"type":46,"tag":180,"props":749,"children":750},{},[751,756],{"type":46,"tag":118,"props":752,"children":753},{},[754],{"type":51,"value":755},"Never pass an unvalidated field into a shell command, file path, or Solidity script\nargument.",{"type":51,"value":757}," Validate first, assign the validated value to a shell variable, and reference only\nthat variable afterward. Never re-read the raw config value a second time later in the same\nwalkthrough.",{"type":46,"tag":54,"props":759,"children":760},{},[761,763,769,771,776],{"type":51,"value":762},"Full elaboration, including how this applies field-by-field to the configurator's JSON shape and\nwhat \"coherently handle a ",{"type":46,"tag":60,"props":764,"children":766},{"className":765},[],[767],{"type":51,"value":768},"RESOLVE",{"type":51,"value":770}," value\" means in practice, is in\n",{"type":46,"tag":74,"props":772,"children":774},{"href":773},".\u002Freferences\u002Fpreflight-and-validation.md",[775],{"type":51,"value":543},{"type":51,"value":210},{"type":46,"tag":378,"props":778,"children":779},{},[],{"type":46,"tag":141,"props":781,"children":783},{"id":782},"key-handling",[784],{"type":51,"value":785},"Key Handling",{"type":46,"tag":54,"props":787,"children":788},{},[789,808,810,816],{"type":46,"tag":118,"props":790,"children":791},{},[792,794,799,801,806],{"type":51,"value":793},"Never instruct auto-approval of ",{"type":46,"tag":60,"props":795,"children":797},{"className":796},[],[798],{"type":51,"value":404},{"type":51,"value":800}," or ",{"type":46,"tag":60,"props":802,"children":804},{"className":803},[],[805],{"type":51,"value":412},{"type":51,"value":807}," in Claude Code settings, and\nnever tell the user to bypass a confirmation prompt.",{"type":51,"value":809}," Every command that broadcasts a\ntransaction requires per-invocation approval — that approval is the primary control, not a\nformality the walkthrough should route around. The repository's PreToolUse hooks\n(",{"type":46,"tag":60,"props":811,"children":813},{"className":812},[],[814],{"type":51,"value":815},".claude\u002Fhooks\u002F",{"type":51,"value":817},") are a programmatic safety net on top of that, not a replacement for it.",{"type":46,"tag":54,"props":819,"children":820},{},[821,826],{"type":46,"tag":118,"props":822,"children":823},{},[824],{"type":51,"value":825},"Never suggest, generate, or complete a command containing the raw signing-key flag",{"type":51,"value":827}," — not when\nasked directly, not \"just for a testnet,\" not as an illustration of what to avoid. There is no\nuser request that makes it appropriate. If a user insists, refuse and offer one of the two options\nbelow instead. Steer every signing decision toward one of them:",{"type":46,"tag":176,"props":829,"children":830},{},[831,848],{"type":46,"tag":180,"props":832,"children":833},{},[834,839,840,846],{"type":46,"tag":118,"props":835,"children":836},{},[837],{"type":51,"value":838},"A hardware wallet",{"type":51,"value":563},{"type":46,"tag":60,"props":841,"children":843},{"className":842},[],[844],{"type":51,"value":845},"--ledger",{"type":51,"value":847},"), for a deployer key that never touches this machine's disk\nor memory in cleartext.",{"type":46,"tag":180,"props":849,"children":850},{},[851,856,857,863,865,871],{"type":46,"tag":118,"props":852,"children":853},{},[854],{"type":51,"value":855},"An encrypted keystore",{"type":51,"value":563},{"type":46,"tag":60,"props":858,"children":860},{"className":859},[],[861],{"type":51,"value":862},"cast wallet import ... --interactive",{"type":51,"value":864},", then ",{"type":46,"tag":60,"props":866,"children":868},{"className":867},[],[869],{"type":51,"value":870},"--account \u003Cname> --sender $ADDRESS",{"type":51,"value":872}," on every subsequent command).",{"type":46,"tag":54,"props":874,"children":875},{},[876,881,882,888,890,896,898,903],{"type":46,"tag":118,"props":877,"children":878},{},[879],{"type":51,"value":880},"Inside this repository only",{"type":51,"value":571},{"type":46,"tag":60,"props":883,"children":885},{"className":884},[],[886],{"type":51,"value":887},".claude\u002Fhooks\u002Fvalidate-forge-cast.sh",{"type":51,"value":889}," is a PreToolUse hook that\ninspects the literal text of every ",{"type":46,"tag":60,"props":891,"children":893},{"className":892},[],[894],{"type":51,"value":895},"Bash",{"type":51,"value":897}," tool call and blocks any command containing that flag\nbefore it runs. ",{"type":46,"tag":118,"props":899,"children":900},{},[901],{"type":51,"value":902},"That hook is not part of this skill and does not travel with it",{"type":51,"value":904}," — it lives at\nthis repository's root, not in the plugin, so an installation elsewhere has no such backstop. The\nprohibition above is the control that always applies; the hook is a repo-local convenience on top\nof it, never the reason the flag is safe.",{"type":46,"tag":54,"props":906,"children":907},{},[908,910,915],{"type":51,"value":909},"Full key-handling guidance, including the keystore setup commands and the testnet-first\nsequencing, is in\n",{"type":46,"tag":74,"props":911,"children":913},{"href":912},".\u002Freferences\u002Fpreflight-and-validation.md#key-handling",[914],{"type":51,"value":543},{"type":51,"value":210},{"type":46,"tag":271,"props":917,"children":919},{"id":918},"testnet-first",[920],{"type":51,"value":921},"Testnet first",{"type":46,"tag":54,"props":923,"children":924},{},[925,927,932,934,940],{"type":51,"value":926},"Run the entire sequence — allowlist checker through liquidity seeding — on Sepolia (chain ID\n",{"type":46,"tag":60,"props":928,"children":930},{"className":929},[],[931],{"type":51,"value":513},{"type":51,"value":933},") before mainnet. Confirm every post-step check in\n",{"type":46,"tag":74,"props":935,"children":937},{"href":936},"..\u002Fpermissioned-pools-issuer\u002Freferences\u002Fissuer-journey.md#post-setup-verification-checklist",[938],{"type":51,"value":939},"the verification checklist",{"type":51,"value":941},"\npasses on testnet before repeating any step against mainnet funds.",{"type":46,"tag":378,"props":943,"children":944},{},[],{"type":46,"tag":141,"props":946,"children":948},{"id":947},"what-this-skill-consumes",[949],{"type":51,"value":479},{"type":46,"tag":54,"props":951,"children":952},{},[953,955,960,962,968,970,975],{"type":51,"value":954},"The JSON configuration produced by ",{"type":46,"tag":60,"props":956,"children":958},{"className":957},[],[959],{"type":51,"value":65},{"type":51,"value":961},", in the shape defined by its\n",{"type":46,"tag":74,"props":963,"children":965},{"href":964},"..\u002Fpermissioned-pools-configurator\u002Freferences\u002Fconfig-schema.md",[966],{"type":51,"value":967},"Config Schema",{"type":51,"value":969},". This skill does\nnot collect those parameters itself — if you do not have a config yet, run\n",{"type":46,"tag":60,"props":971,"children":973},{"className":972},[],[974],{"type":51,"value":65},{"type":51,"value":976}," first.",{"type":46,"tag":54,"props":978,"children":979},{},[980,992,994,998,1000,1005,1007,1013,1019,1021,1026],{"type":46,"tag":118,"props":981,"children":982},{},[983,985,990],{"type":51,"value":984},"A field reading the literal string ",{"type":46,"tag":60,"props":986,"children":988},{"className":987},[],[989],{"type":51,"value":441},{"type":51,"value":991}," means \"not resolved yet,\" not \"use a\nplaceholder.\"",{"type":51,"value":993}," Before any command that needs that field, stop and walk through\n",{"type":46,"tag":74,"props":995,"children":996},{"href":205},[997],{"type":51,"value":455},{"type":51,"value":999}," — the deploy\nguide's ",{"type":46,"tag":60,"props":1001,"children":1003},{"className":1002},[],[1004],{"type":51,"value":551},{"type":51,"value":1006}," table, then ",{"type":46,"tag":60,"props":1008,"children":1010},{"className":1009},[],[1011],{"type":51,"value":1012},"Uniswap\u002Fcontracts",{"type":46,"tag":60,"props":1014,"children":1016},{"className":1015},[],[1017],{"type":51,"value":1018},"deployments\u002Fjson\u002F\u003CchainId>.json",{"type":51,"value":1020},", then a block explorer for your chain — and only continue once\nthe field holds a real, explorer-verified address. Never guess a value for a ",{"type":46,"tag":60,"props":1022,"children":1024},{"className":1023},[],[1025],{"type":51,"value":441},{"type":51,"value":1027}," field\nand never carry the literal string itself into a command; both are validation failures, not\nvalues to work around.",{"type":46,"tag":54,"props":1029,"children":1030},{},[1031,1036,1037,1042,1044,1050,1052,1058,1060,1065,1067,1072],{"type":46,"tag":60,"props":1032,"children":1034},{"className":1033},[],[1035],{"type":51,"value":463},{"type":51,"value":465},{"type":46,"tag":60,"props":1038,"children":1040},{"className":1039},[],[1041],{"type":51,"value":471},{"type":51,"value":1043}," sentinel is different: it resolves to ",{"type":46,"tag":60,"props":1045,"children":1047},{"className":1046},[],[1048],{"type":51,"value":1049},"address(0)",{"type":51,"value":1051},", Uniswap\nv4's own convention for a native ",{"type":46,"tag":60,"props":1053,"children":1055},{"className":1054},[],[1056],{"type":51,"value":1057},"PoolKey",{"type":51,"value":1059}," currency, at the point the ",{"type":46,"tag":60,"props":1061,"children":1063},{"className":1062},[],[1064],{"type":51,"value":1057},{"type":51,"value":1066}," is actually built\nin ",{"type":46,"tag":74,"props":1068,"children":1069},{"href":371},[1070],{"type":51,"value":1071},"Step 6a",{"type":51,"value":1073}," — never earlier, and\nnever written into any other field.",{"type":46,"tag":378,"props":1075,"children":1076},{},[],{"type":46,"tag":141,"props":1078,"children":1080},{"id":1079},"the-deployment-journey",[1081],{"type":51,"value":1082},"The Deployment Journey",{"type":46,"tag":54,"props":1084,"children":1085},{},[1086,1088,1092],{"type":51,"value":1087},"The published guide's seven steps, in the order it recommends. Only five ordering edges are\nenforced by the contracts (see\n",{"type":46,"tag":74,"props":1089,"children":1090},{"href":96},[1091],{"type":51,"value":99},{"type":51,"value":1093},");\nthis walkthrough follows the guide's order and states, at each step, whether that order is\nenforced or convention.",{"type":46,"tag":1095,"props":1096,"children":1097},"table",{},[1098,1122],{"type":46,"tag":1099,"props":1100,"children":1101},"thead",{},[1102],{"type":46,"tag":1103,"props":1104,"children":1105},"tr",{},[1106,1112,1117],{"type":46,"tag":1107,"props":1108,"children":1109},"th",{},[1110],{"type":51,"value":1111},"Step",{"type":46,"tag":1107,"props":1113,"children":1114},{},[1115],{"type":51,"value":1116},"Covered where",{"type":46,"tag":1107,"props":1118,"children":1119},{},[1120],{"type":51,"value":1121},"Summary",{"type":46,"tag":1123,"props":1124,"children":1125},"tbody",{},[1126,1147,1172,1199,1224,1259,1295],{"type":46,"tag":1103,"props":1127,"children":1128},{},[1129,1134,1142],{"type":46,"tag":1130,"props":1131,"children":1132},"td",{},[1133],{"type":51,"value":505},{"type":46,"tag":1130,"props":1135,"children":1136},{},[1137],{"type":46,"tag":74,"props":1138,"children":1140},{"href":1139},".\u002Freferences\u002Fpreflight-and-validation.md#step-1-allowlist-checker",[1141],{"type":51,"value":543},{"type":46,"tag":1130,"props":1143,"children":1144},{},[1145],{"type":51,"value":1146},"Confirm or deploy the allowlist checker",{"type":46,"tag":1103,"props":1148,"children":1149},{},[1150,1155,1163],{"type":46,"tag":1130,"props":1151,"children":1152},{},[1153],{"type":51,"value":1154},"2",{"type":46,"tag":1130,"props":1156,"children":1157},{},[1158],{"type":46,"tag":74,"props":1159,"children":1161},{"href":1160},".\u002Freferences\u002Fstep-walkthrough.md#step-2-createpermissionsadapter",[1162],{"type":51,"value":374},{"type":46,"tag":1130,"props":1164,"children":1165},{},[1166],{"type":46,"tag":60,"props":1167,"children":1169},{"className":1168},[],[1170],{"type":51,"value":1171},"createPermissionsAdapter",{"type":46,"tag":1103,"props":1173,"children":1174},{},[1175,1180,1188],{"type":46,"tag":1130,"props":1176,"children":1177},{},[1178],{"type":51,"value":1179},"3",{"type":46,"tag":1130,"props":1181,"children":1182},{},[1183],{"type":46,"tag":74,"props":1184,"children":1186},{"href":1185},".\u002Freferences\u002Fstep-walkthrough.md#step-3-allowlist-and-fund-the-adapter",[1187],{"type":51,"value":374},{"type":46,"tag":1130,"props":1189,"children":1190},{},[1191,1193],{"type":51,"value":1192},"Allowlist the adapter on your token, approve, ",{"type":46,"tag":60,"props":1194,"children":1196},{"className":1195},[],[1197],{"type":51,"value":1198},"depositForVerification",{"type":46,"tag":1103,"props":1200,"children":1201},{},[1202,1207,1215],{"type":46,"tag":1130,"props":1203,"children":1204},{},[1205],{"type":51,"value":1206},"4",{"type":46,"tag":1130,"props":1208,"children":1209},{},[1210],{"type":46,"tag":74,"props":1211,"children":1213},{"href":1212},".\u002Freferences\u002Fstep-walkthrough.md#step-4-verifypermissionsadapter",[1214],{"type":51,"value":374},{"type":46,"tag":1130,"props":1216,"children":1217},{},[1218],{"type":46,"tag":60,"props":1219,"children":1221},{"className":1220},[],[1222],{"type":51,"value":1223},"verifyPermissionsAdapter",{"type":46,"tag":1103,"props":1225,"children":1226},{},[1227,1232,1240],{"type":46,"tag":1130,"props":1228,"children":1229},{},[1230],{"type":51,"value":1231},"5",{"type":46,"tag":1130,"props":1233,"children":1234},{},[1235],{"type":46,"tag":74,"props":1236,"children":1238},{"href":1237},".\u002Freferences\u002Fstep-walkthrough.md#step-5-register-wrappers-and-the-hook",[1239],{"type":51,"value":374},{"type":46,"tag":1130,"props":1241,"children":1242},{},[1243,1245,1251,1253],{"type":51,"value":1244},"The four ",{"type":46,"tag":60,"props":1246,"children":1248},{"className":1247},[],[1249],{"type":51,"value":1250},"updateAllowedWrapper",{"type":51,"value":1252}," registrations, then ",{"type":46,"tag":60,"props":1254,"children":1256},{"className":1255},[],[1257],{"type":51,"value":1258},"setAllowedHook",{"type":46,"tag":1103,"props":1260,"children":1261},{},[1262,1267,1275],{"type":46,"tag":1130,"props":1263,"children":1264},{},[1265],{"type":51,"value":1266},"6",{"type":46,"tag":1130,"props":1268,"children":1269},{},[1270],{"type":46,"tag":74,"props":1271,"children":1273},{"href":1272},".\u002Freferences\u002Fstep-walkthrough.md#step-6-create-the-pool-enable-swapping-seed-liquidity",[1274],{"type":51,"value":374},{"type":46,"tag":1130,"props":1276,"children":1277},{},[1278,1280,1286,1287,1293],{"type":51,"value":1279},"Pool ",{"type":46,"tag":60,"props":1281,"children":1283},{"className":1282},[],[1284],{"type":51,"value":1285},"initialize",{"type":51,"value":571},{"type":46,"tag":60,"props":1288,"children":1290},{"className":1289},[],[1291],{"type":51,"value":1292},"updateSwappingEnabled",{"type":51,"value":1294},", liquidity seeding",{"type":46,"tag":1103,"props":1296,"children":1297},{},[1298,1303,1311],{"type":46,"tag":1130,"props":1299,"children":1300},{},[1301],{"type":51,"value":1302},"7",{"type":46,"tag":1130,"props":1304,"children":1305},{},[1306],{"type":46,"tag":74,"props":1307,"children":1309},{"href":1308},".\u002Freferences\u002Fstep-walkthrough.md#step-7-request-routing-allowlisting",[1310],{"type":51,"value":374},{"type":46,"tag":1130,"props":1312,"children":1313},{},[1314],{"type":51,"value":1315},"The routing-allowlist request",{"type":46,"tag":54,"props":1317,"children":1318},{},[1319,1321,1326,1328,1332],{"type":51,"value":1320},"Every step in ",{"type":46,"tag":74,"props":1322,"children":1324},{"href":1323},".\u002Freferences\u002Fstep-walkthrough.md",[1325],{"type":51,"value":374},{"type":51,"value":1327}," names its precondition and,\nwhere the contracts enforce one, the exact revert selector you get if you are early — matching\n",{"type":46,"tag":74,"props":1329,"children":1330},{"href":96},[1331],{"type":51,"value":99},{"type":51,"value":1333},"\nselector-for-selector. Where a step is unenforced, the walkthrough says so rather than inventing\na revert for it.",{"type":46,"tag":378,"props":1335,"children":1336},{},[],{"type":46,"tag":141,"props":1338,"children":1340},{"id":1339},"post-deployment-verification",[1341],{"type":51,"value":1342},"Post-Deployment Verification",{"type":46,"tag":54,"props":1344,"children":1345},{},[1346,1348,1353,1355,1361],{"type":51,"value":1347},"After the sequence completes (or after any individual step, to confirm it landed), run the\nread-only checks in\n",{"type":46,"tag":74,"props":1349,"children":1350},{"href":936},[1351],{"type":51,"value":1352},"Post-Setup Verification Checklist",{"type":51,"value":1354},".\nEvery check there is a ",{"type":46,"tag":60,"props":1356,"children":1358},{"className":1357},[],[1359],{"type":51,"value":1360},"cast call",{"type":51,"value":1362}," against public getters — none of it spends gas, and none of it\nneeds the acknowledgment gate above.",{"type":46,"tag":378,"props":1364,"children":1365},{},[],{"type":46,"tag":141,"props":1367,"children":1369},{"id":1368},"notes-for-implementers-of-this-flow",[1370],{"type":51,"value":1371},"Notes for Implementers of This Flow",{"type":46,"tag":300,"props":1373,"children":1374},{},[1375,1385,1408,1446],{"type":46,"tag":180,"props":1376,"children":1377},{},[1378,1383],{"type":46,"tag":118,"props":1379,"children":1380},{},[1381],{"type":51,"value":1382},"The acknowledgment gate is once per session, not once per step.",{"type":51,"value":1384}," Once acknowledged, continue\nthrough the rest of the steps in that same session without re-asking — but re-ask if the user\nstarts a new session, switches chains, or switches configs.",{"type":46,"tag":180,"props":1386,"children":1387},{},[1388,1393,1395,1400,1402,1406],{"type":46,"tag":118,"props":1389,"children":1390},{},[1391],{"type":51,"value":1392},"Never hardcode a contract address.",{"type":51,"value":1394}," Every address this skill uses comes from the loaded\nconfig, from a value the user supplies during the walkthrough, or from a read (",{"type":46,"tag":60,"props":1396,"children":1398},{"className":1397},[],[1399],{"type":51,"value":1360},{"type":51,"value":1401},")\nagainst a contract whose address itself came from one of those two sources. See\n",{"type":46,"tag":74,"props":1403,"children":1404},{"href":205},[1405],{"type":51,"value":543},{"type":51,"value":1407}," for why\nthis skill ships no address table.",{"type":46,"tag":180,"props":1409,"children":1410},{},[1411,1416,1418,1424,1425,1431,1432,1438,1440,1445],{"type":46,"tag":118,"props":1412,"children":1413},{},[1414],{"type":51,"value":1415},"Decode an unexpected revert by call site, not by name.",{"type":51,"value":1417}," Three selectors in this journey\n(",{"type":46,"tag":60,"props":1419,"children":1421},{"className":1420},[],[1422],{"type":51,"value":1423},"NoVerifiedAdapter",{"type":51,"value":571},{"type":46,"tag":60,"props":1426,"children":1428},{"className":1427},[],[1429],{"type":51,"value":1430},"Unauthorized",{"type":51,"value":571},{"type":46,"tag":60,"props":1433,"children":1435},{"className":1434},[],[1436],{"type":51,"value":1437},"SwappingDisabled",{"type":51,"value":1439},") are declared more than once across\ndifferent contracts with different meanings — see\n",{"type":46,"tag":74,"props":1441,"children":1443},{"href":1442},"..\u002Fpermissioned-pools-issuer\u002Freferences\u002Fenforced-ordering-and-reverts.md#how-to-decode-an-unexpected-revert",[1444],{"type":51,"value":99},{"type":51,"value":210},{"type":46,"tag":180,"props":1447,"children":1448},{},[1449,1454,1456,1461],{"type":46,"tag":118,"props":1450,"children":1451},{},[1452],{"type":51,"value":1453},"This skill does not fetch RPC state on its own initiative.",{"type":51,"value":1455}," Every ",{"type":46,"tag":60,"props":1457,"children":1459},{"className":1458},[],[1460],{"type":51,"value":1360},{"type":51,"value":1462}," it suggests is\nsomething you choose to run; the skill does not poll a chain in the background.",{"items":1464,"total":1556},[1465,1480,1495,1506,1517,1530,1543],{"slug":1466,"name":1466,"fn":1467,"description":1468,"org":1469,"tags":1470,"stars":25,"repoUrl":26,"updatedAt":1479},"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},[1471,1474,1475,1476],{"name":1472,"slug":1473,"type":15},"Configuration","configuration",{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"name":1477,"slug":1478,"type":15},"Web3","web3","2026-07-17T06:08:08.974641",{"slug":1481,"name":1481,"fn":1482,"description":1483,"org":1484,"tags":1485,"stars":25,"repoUrl":26,"updatedAt":1494},"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},[1486,1489,1490,1493],{"name":1487,"slug":1488,"type":15},"Automation","automation",{"name":23,"slug":24,"type":15},{"name":1491,"slug":1492,"type":15},"Trading","trading",{"name":1477,"slug":1478,"type":15},"2026-07-17T06:04:21.974052",{"slug":1496,"name":1496,"fn":1497,"description":1498,"org":1499,"tags":1500,"stars":25,"repoUrl":26,"updatedAt":1505},"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},[1501,1502,1503,1504],{"name":1487,"slug":1488,"type":15},{"name":13,"slug":14,"type":15},{"name":1491,"slug":1492,"type":15},{"name":1477,"slug":1478,"type":15},"2026-07-17T06:05:37.160647",{"slug":1507,"name":1507,"fn":1508,"description":1509,"org":1510,"tags":1511,"stars":25,"repoUrl":26,"updatedAt":1516},"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},[1512,1513,1514,1515],{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"name":1477,"slug":1478,"type":15},"2026-07-17T06:08:09.661977",{"slug":1518,"name":1518,"fn":1519,"description":1520,"org":1521,"tags":1522,"stars":25,"repoUrl":26,"updatedAt":1529},"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},[1523,1524,1527,1528],{"name":23,"slug":24,"type":15},{"name":1525,"slug":1526,"type":15},"Portfolio Management","portfolio-management",{"name":1491,"slug":1492,"type":15},{"name":1477,"slug":1478,"type":15},"2026-07-17T06:04:22.328253",{"slug":1531,"name":1531,"fn":1532,"description":1533,"org":1534,"tags":1535,"stars":25,"repoUrl":26,"updatedAt":1542},"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},[1536,1537,1538,1541],{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":1539,"slug":1540,"type":15},"Liquidity","liquidity",{"name":1477,"slug":1478,"type":15},"2026-08-08T03:55:37.214112",{"slug":1544,"name":1544,"fn":1545,"description":1546,"org":1547,"tags":1548,"stars":25,"repoUrl":26,"updatedAt":1555},"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},[1549,1552,1553,1554],{"name":1550,"slug":1551,"type":15},"API Development","api-development",{"name":13,"slug":14,"type":15},{"name":1539,"slug":1540,"type":15},{"name":1477,"slug":1478,"type":15},"2026-08-08T03:55:34.112025",18,{"items":1558,"total":1664},[1559,1566,1573,1580,1587,1594,1601,1608,1622,1633,1643,1650],{"slug":1466,"name":1466,"fn":1467,"description":1468,"org":1560,"tags":1561,"stars":25,"repoUrl":26,"updatedAt":1479},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1562,1563,1564,1565],{"name":1472,"slug":1473,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"name":1477,"slug":1478,"type":15},{"slug":1481,"name":1481,"fn":1482,"description":1483,"org":1567,"tags":1568,"stars":25,"repoUrl":26,"updatedAt":1494},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1569,1570,1571,1572],{"name":1487,"slug":1488,"type":15},{"name":23,"slug":24,"type":15},{"name":1491,"slug":1492,"type":15},{"name":1477,"slug":1478,"type":15},{"slug":1496,"name":1496,"fn":1497,"description":1498,"org":1574,"tags":1575,"stars":25,"repoUrl":26,"updatedAt":1505},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1576,1577,1578,1579],{"name":1487,"slug":1488,"type":15},{"name":13,"slug":14,"type":15},{"name":1491,"slug":1492,"type":15},{"name":1477,"slug":1478,"type":15},{"slug":1507,"name":1507,"fn":1508,"description":1509,"org":1581,"tags":1582,"stars":25,"repoUrl":26,"updatedAt":1516},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1583,1584,1585,1586],{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"name":1477,"slug":1478,"type":15},{"slug":1518,"name":1518,"fn":1519,"description":1520,"org":1588,"tags":1589,"stars":25,"repoUrl":26,"updatedAt":1529},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1590,1591,1592,1593],{"name":23,"slug":24,"type":15},{"name":1525,"slug":1526,"type":15},{"name":1491,"slug":1492,"type":15},{"name":1477,"slug":1478,"type":15},{"slug":1531,"name":1531,"fn":1532,"description":1533,"org":1595,"tags":1596,"stars":25,"repoUrl":26,"updatedAt":1542},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1597,1598,1599,1600],{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":1539,"slug":1540,"type":15},{"name":1477,"slug":1478,"type":15},{"slug":1544,"name":1544,"fn":1545,"description":1546,"org":1602,"tags":1603,"stars":25,"repoUrl":26,"updatedAt":1555},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1604,1605,1606,1607],{"name":1550,"slug":1551,"type":15},{"name":13,"slug":14,"type":15},{"name":1539,"slug":1540,"type":15},{"name":1477,"slug":1478,"type":15},{"slug":1609,"name":1609,"fn":1610,"description":1611,"org":1612,"tags":1613,"stars":25,"repoUrl":26,"updatedAt":1621},"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},[1614,1615,1618,1619],{"name":13,"slug":14,"type":15},{"name":1616,"slug":1617,"type":15},"Payments","payments",{"name":1491,"slug":1492,"type":15},{"name":1620,"slug":1620,"type":15},"x402","2026-08-08T03:55:36.210847",{"slug":1623,"name":1623,"fn":1624,"description":1625,"org":1626,"tags":1627,"stars":25,"repoUrl":26,"updatedAt":1632},"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},[1628,1629,1630,1631],{"name":1550,"slug":1551,"type":15},{"name":1616,"slug":1617,"type":15},{"name":1477,"slug":1478,"type":15},{"name":1620,"slug":1620,"type":15},"2026-08-08T03:55:32.164995",{"slug":65,"name":65,"fn":1634,"description":1635,"org":1636,"tags":1637,"stars":25,"repoUrl":26,"updatedAt":1642},"configure Uniswap v4 permissioned pools","Interactively collect and validate the parameters for a Uniswap v4 Permissioned Pool setup - chain, underlying token, allowlist checker, adapter owner, verification deposit, the four wrapper registrations, hook, and pool pricing - and emit the JSON config the deployer skill consumes. Use when the user says \"configure a permissioned pool\", \"permissioned pool config\", \"adapter parameters\", \"permissioned pool setup parameters\", \"PermissionsAdapter configuration\", or asks to set up parameters for a permissioned pool before deploying. Covers contract mechanics only - does not constitute legal, financial, investment, tax, or compliance advice, and is not a compliance review.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1638,1639,1640,1641],{"name":1472,"slug":1473,"type":15},{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},"2026-08-14T04:52:02.764143",{"slug":4,"name":4,"fn":5,"description":6,"org":1644,"tags":1645,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1646,1647,1648,1649],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"slug":83,"name":83,"fn":1651,"description":1652,"org":1653,"tags":1654,"stars":25,"repoUrl":26,"updatedAt":1663},"set up Uniswap v4 permissioned pools","Reference guide for engineering teams setting up a Uniswap v4 Permissioned Pool for a transfer-restricted (RWA \u002F tokenized-asset) ERC-20. Use when the user says \"permissioned pool\", \"PermissionsAdapter\", \"PermissionsAdapterFactory\", \"PermissionedPositionManager\", \"PermissionedHooks\", \"allowlist checker\", \"BaseAllowlistChecker\", \"adapter verification\", \"verifyPermissionsAdapter\", \"updateAllowedWrapper\", \"setAllowedHook\", \"unwindPosition\", \"wrap a permissioned token for v4\", or asks how an RWA issuer lists a restricted token on Uniswap v4. Explains the contract architecture, the ordered setup journey, the code-enforced ordering, and the trust model. Covers contract mechanics only - does not constitute legal, financial, investment, tax, or compliance advice, and is not a compliance review.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1655,1658,1659,1662],{"name":1656,"slug":1657,"type":15},"Engineering","engineering",{"name":23,"slug":24,"type":15},{"name":1660,"slug":1661,"type":15},"Permissions","permissions",{"name":1477,"slug":1478,"type":15},"2026-08-14T04:26:06.815467",24]