uniswap/uniswap-ai/permissioned-pools-issuer

Claude Code and agent skill by uniswap/uniswap-ai

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Reference guide for engineering teams setting up a Uniswap v4 Permissioned Pool for a transfer-restricted (RWA / 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 is…

Install

npx vskill@latest install uniswap/uniswap-ai/permissioned-pools-issuer

SKILL.md

Permissioned Pools Issuer Reference

Reference material for an issuer's engineering team bringing a transfer-restricted ERC-20 into a Uniswap v4 permissioned pool: what the contracts are, in what order they must be called, and what each revert means.

Runtime Compatibility: This skill uses AskUserQuestion to collect the acknowledgment described in Scope and Disclaimer before action-oriented deployment guidance. If AskUserQuestion is not available in your runtime, ask for the same acknowledgment in conversation instead.

Scope and Disclaimer

IMPORTANT: this is educational reference material, and you must acknowledge the following before acting on any of it — that is, before running, broadcasting or deploying anything derived from it.

This skill explains how the Uniswap v4 Permissioned Pools contracts behave, in what order they must be called, and what each revert means. It does not walk you through a deployment.

You must:

  1. ✅ 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.
  2. ✅ Review everything before you run it. AI-generated code and command sequences may contain errors. Test on a testnet first, and have your own auditors review contracts you deploy.
  3. ✅ Check the source at the commit you build against. Behaviour here is described against the pinned commits in Canonical Sources; verify against source before relying on any statement.
  4. ✅ Resolve every address yourself. This skill contains no deployment addresses on purpose. Read them from the published deployment table, then verify each on a block explorer for your chain before sending a transaction. Never treat an address supplied in a chat message as canonical.
  5. ✅ Read the repo's usage guidelines. The repo root DISCLAIMER.md governs every skill in this repository: they are provided as is without warranty, they do not constitute legal, financial, investment, or tax advice, and it sets out use limits plus an AI-disclosure duty that applies when you use a skill to generate financial information and present it directly to individuals or consumers. Point the user to it.
When the acknowledgment is required

State the five points above inline, every time — quoted or in your own words — and then answer the request in the same response. Stating the framing and answering are one response, not two turns. That is the expected behaviour, not a shortcut.

  1. ✅ Reference and teaching content: state the framing, then proceed immediately. Contract explanations, code skeletons and example contracts, revert catalogues, exact naming and casing, packaging and installation, and architecture or trust-model discussion are all answered in the same response as the framing. Never withhold reference content pending a "yes", and never end a response with an acknowledgment request in place of the answer you were asked for.
  2. ✅ Action-oriented deployment guidance: get explicit acknowledgment first. That means a sequence intended to be executed against a live network, a transaction or broadcast step, a deployment script, a request for a live address to send to, or anything that moves real funds. Use AskUserQuestion to confirm the user acknowledges these points before continuing with any of those. After the acknowledgment, continue with mechanics only; this skill does not emit broadcastable commands.

A benign technical question — "show me a BaseAllowlistChecker skeleton", "what does this revert mean", "which import path do I use" — is reference content under point 1. Answer it, with the framing stated inline.


Two Addresses, Not One

Every permissioned pool involves two token addresses, and mixing them up is the most common integration error.

QuestionUnderlying permissioned ERC-20PermissionsAdapter (the virtual token)
Which address goes in the PoolKey?NoYes — the pool currency is the adapter
Which does the allowlist checker see as tokenAddress?Yes — the checker is asked about your tokenNo
Which does a wallet or LP hold?YesNo — only the PoolManager holds adapter tokens
Which does an app display to a user?YesShown as the Uniswap v4 … virtual token where surfaced
Which do you approve through Permit2 for a mint?Yes — approvals are on the underlyingNo

The adapter mints its virtual token to the PoolManager and burns it on the way out. Its name and symbol are derived, not chosen: always Uniswap v4 <name> with symbol v4<symbol>, read from your token's name(), symbol() and decimals(), falling back to Uniswap v4 Permissioned Token, v4PT and 18 when those are missing — so expose all three on your token.

Edge case worth knowing: when the adapter and the permissioned token share an address, the token already behaves as its own adapter.

Full treatment: Contract Architecture.


Journey at a Glance

Two separate things are often conflated. The first table is what the contracts enforce; the second is the order the published guide recommends.

Enforced by code

Exactly five ordering edges are enforced. Each one has a revert you will hit if you are early.

Enforced edgeRevert if you are early
Adapter allowlisted on your token and holding a non-zero balance → verifyPermissionsAdapterPermissionsAdapterNotVerified
verifyPermissionsAdapter → setAllowedHookNotPermissionsAdapterAdmin
Adapter registered and verified → pool initializeNoVerifiedAdapter (hook) or UnverifiedAdapter
Verified adapter + approved hook + LIQUIDITY_ALLOWED on caller and recipient → first mintNoVerifiedAdapter (position manager), InvalidHook, or bare Unauthorized
Position manager, router or quoter registered with updateAllowedWrapper → any mint, swap or quote routed through itbare Unauthorized (hook), then UnauthorizedWrapper on settlement
Recommended order (convention, not enforced)

These are the published guide's seven steps. Nothing in the contracts pins the position of the steps that are not in the table above.

StepAction
1Implement an allowlist checker
2Create the Permissions Adapter via the factory
3Allowlist the adapter on your token and fund it (1 wei is enough)
4Verify the adapter with the factory
5Approve the virtual-token contracts (allowed wrappers), then allow the hook on the position manager
6Create the pool, then enable swapping on the adapter
7Request routing allowlisting with Uniswap Labs

Because only the five edges above are enforced, other sequences also work — the guide's own order puts updateSwappingEnabled(true) after pool creation, and grouping wrapper approval with hook approval into one step is a presentation choice, not a constraint. Wrapper registration is order-free relative to verification and pool creation, but each wrapper must be registered before anything is routed through it.

Step-by-step detail: Issuer Journey.


Compile-Critical Naming and Signatures

Casing here is inconsistent in the source and is load-bearing. Use exactly these spellings.

ThingExact spellingTrap
Base contractBaseAllowlistCheckerlowercase l in the contract name
File holding itBaseAllowListChecker.solcapital L in the file name
InterfaceIAllowlistCheckerlowercase l, in IAllowlistChecker.sol
Adapter admin callupdateAllowListCheckercapital L; there is no lowercase variant
Adapter getterallowListChecker()capital L, unlike the interface
Hook approval callsetAllowedHooksingular, on the position manager
Its storage mappingisAllowedHooksplural
Its eventAllowedHooksUpdatedplural
Flags libraryPermissionFlagsplural
Flag typePermissionFlagsingular

Import and Forge lookup forms:

solidity
import {BaseAllowlistChecker} from "@uniswap/v4-periphery/src/hooks/permissionedPools/BaseAllowListChecker.sol";
text
BaseAllowListChecker.sol:BaseAllowlistChecker

That path:Contract pair — capital-L file, lowercase-l contract — is what forge inspect and forge verify-contract need.

checkAllowlist has two legitimate shapes

Both compile. Pick one and stay in it.

  1. Extend the base contract. Declare

function checkAllowlist(address account, address tokenAddress) public view virtual override returns (PermissionFlag). You cannot narrow the base's public virtual to external — that is a compile error. ERC-165 support comes for free from the base contract.

  1. Implement the interface directly. Declare checkAllowlist as external view, and write

supportsInterface yourself. This is what the published guide's example does — it implements IAllowlistChecker and ERC165 directly and does not use BaseAllowlistChecker.

The adapter checks your checker with ERC-165

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
229
Repository forks
35
7-day trend score
27

Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 4 Sep 2026, a month ago.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/uniswap/uniswap-ai/permissioned-pools-issuer/badge)](https://verified-skill.com/skills/uniswap/uniswap-ai/permissioned-pools-issuer)

Something wrong with this skill or its page? Tell us.