Agent skill

Uniswap V4 Hooks

by ccashwell in ccashwell/evm-cortex

A skill your agent uses when building or reviewing Uniswap V4 hooks, custom AMM logic, dynamic fees, access controls, oracle hooks, return deltas, hook deployment, or hook-specific tests.

MITAuto-check passedBusiness, Finance & HR

Install Uniswap V4 Hooks

skills CLI
$ npx skills add ccashwell/evm-cortex --skill uniswap-v4-hooks -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install ccashwell/evm-cortex uniswap-v4-hooks --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/ccashwell/evm-cortex.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/uniswap-v4-hooks .claude/skills/uniswap-v4-hooks && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
uniswap-v4-hooks
GitHub stars
131
Token cost
~5.2k tokens
SKILL.md length
2,302 words
Files
1
Skills in repo
89
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when building or reviewing Uniswap V4 hooks, custom AMM logic, dynamic fees, access controls, oracle hooks, return deltas, hook deployment, or hook-specific tests.

  • Works in 3 steps: The callbacks implemented by the contract. → The booleans returned by… → The low-bit flags used to mine the…
  • Reviewing Uniswap V4 hooks
  • SKILL.md covers Architecture, Permission Flags, Callback Interface and BaseHook Pattern, plus 9 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Uniswap V4 Hooks is an agent skill from ccashwell/evm-cortex. Use when building or reviewing Uniswap V4 hooks, custom AMM logic, dynamic fees, access controls, oracle hooks, return deltas, hook deployment, or hook-specific tests. Covers the current 14 permission flags, 10 callbacks, BaseHook implementation, delta accounting, address mining, and testing requirements.

Its SKILL.md is about 5.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Business, Finance & HR, covering Authorization and RBAC, Accounting and bookkeeping and Hooks and plugins. It works with Uniswap. The repository describes itself as: Ethereum protocol engineering squad for AI coding assistants. The licence is MIT.

When your agent uses it

  • Reviewing Uniswap V4 hooks
  • Custom AMM logic
  • Access controls
  • Hook deployment

Example prompts

  • “/uniswap-v4-hooks”

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. The callbacks implemented by the contract.
  2. The booleans returned by getHookPermissions().
  3. The low-bit flags used to mine the deployed address.

What it can do on your machine

Read from SKILL.md and the folder at commit f8f3301. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are solidity).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Uniswap V4 Hooks loads about 5.2k tokens when it runs. Until then it costs about 81 tokens; SKILL.md has 2,302 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~81
When it runs · the whole SKILL.md, loaded when a task matches
~5.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from ccashwell/evm-cortex at commit f8f3301, republished under its MIT licence (© ccashwell). 2,302 words, ~5,183 tokens.

Download SKILL.mdSave it as .claude/skills/uniswap-v4-hooks/SKILL.md (or your agent's skills folder).
name
uniswap-v4-hooks
description
Use when building or reviewing Uniswap V4 hooks, custom AMM logic, dynamic fees, access controls, oracle hooks, return deltas, hook deployment, or hook-specific tests. Covers the current 14 permission flags, 10 callbacks, BaseHook implementation, delta accounting, address mining, and testing requirements.

Uniswap V4 Hook Development

Build against one pinned, compatible dependency graph. Start from a pinned revision of the Uniswap V4 template or pin v4-core, v4-periphery, and the hook library to known-compatible revisions. Do not combine examples from different releases.

As of 2026-02-06 v4-periphery no longer contains BaseHook or HookMiner (PR #510). Use @openzeppelin/uniswap-hooks (what Uniswap/v4-template pins) or Uniswap/v4-hooks-public; both expose the same _before*/_after* internal-override API. HookMiner also remains at v4-periphery/test/shared/HookMiner.sol.

Before editing, inspect the project's foundry.lock, .gitmodules, and remappings. Read Hooks.sol, IHooks.sol, PoolOperation.sol, BaseHook.sol, and HookMiner.sol at those installed revisions. The links at the end are for discovery; the project's pinned dependency graph is the source of truth.

Architecture

Uniswap V4 keeps pools in a singleton PoolManager. A PoolKey selects one hook contract or no hook. The same hook contract can serve multiple pools.

The least significant 14 bits of the hook address encode callback permissions. PoolManager.initialize rejects an invalid hook address, and a maintained BaseHook validates the deployed address against getHookPermissions() in its constructor. Deploy a production hook with CREATE2 and a salt mined for the required low-bit pattern.

In a callback:

  • msg.sender is PoolManager.
  • The callback's sender argument is the immediate caller of the PoolManager operation. It is commonly a router, not the end user.
  • hookData is caller-controlled unless a trusted integration authenticates and binds it to the operation.

An authentic PoolManager callback does not prove that the pool is authorized. Anyone can attempt to initialize a PoolKey that names the hook. A hook must either support permissionless pool creation or validate the complete intended PoolKey or PoolId. Initialization-sensitive hooks must also validate the initial price and every other required pool parameter.

Permission Flags

The constants below are defined by v4-core/src/libraries/Hooks.sol.

BitPermissionCallback effect
13BEFORE_INITIALIZE_FLAGCalls beforeInitialize
12AFTER_INITIALIZE_FLAGCalls afterInitialize
11BEFORE_ADD_LIQUIDITY_FLAGCalls beforeAddLiquidity
10AFTER_ADD_LIQUIDITY_FLAGCalls afterAddLiquidity
9BEFORE_REMOVE_LIQUIDITY_FLAGCalls beforeRemoveLiquidity
8AFTER_REMOVE_LIQUIDITY_FLAGCalls afterRemoveLiquidity
7BEFORE_SWAP_FLAGCalls beforeSwap
6AFTER_SWAP_FLAGCalls afterSwap
5BEFORE_DONATE_FLAGCalls beforeDonate
4AFTER_DONATE_FLAGCalls afterDonate
3BEFORE_SWAP_RETURNS_DELTA_FLAGApplies the BeforeSwapDelta returned by beforeSwap
2AFTER_SWAP_RETURNS_DELTA_FLAGApplies the int128 returned by afterSwap
1AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAGApplies the BalanceDelta returned by afterAddLiquidity
0AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAGApplies the BalanceDelta returned by afterRemoveLiquidity

The four return-delta flags do not enable callbacks by themselves. Each one requires its corresponding callback flag.

solidity
uint160 flags = Hooks.BEFORE_SWAP_FLAG
    | Hooks.AFTER_SWAP_FLAG
    | Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG;

Callback Interface

Import ModifyLiquidityParams and SwapParams from v4-core/src/types/PoolOperation.sol. They are top-level types, not members of IPoolManager.

CallbackParameters after sender, keyReturn value
beforeInitializeuint160 sqrtPriceX96bytes4
afterInitializeuint160 sqrtPriceX96, int24 tickbytes4
beforeAddLiquidityModifyLiquidityParams params, bytes hookDatabytes4
afterAddLiquidityModifyLiquidityParams params, BalanceDelta delta, BalanceDelta feesAccrued, bytes hookData(bytes4, BalanceDelta)
beforeRemoveLiquidityModifyLiquidityParams params, bytes hookDatabytes4
afterRemoveLiquidityModifyLiquidityParams params, BalanceDelta delta, BalanceDelta feesAccrued, bytes hookData(bytes4, BalanceDelta)
beforeSwapSwapParams params, bytes hookData(bytes4, BeforeSwapDelta, uint24)
afterSwapSwapParams params, BalanceDelta delta, bytes hookData(bytes4, int128)
beforeDonateuint256 amount0, uint256 amount1, bytes hookDatabytes4
afterDonateuint256 amount0, uint256 amount1, bytes hookDatabytes4

For liquidity callbacks, liquidityDelta > 0 selects the add path and liquidityDelta <= 0 selects the remove path. A zero-liquidity modification can therefore invoke remove callbacks to collect fees without withdrawing principal.

Every callback must return its external callback selector. Non-delta callback responses must contain at least the 32-byte selector word. beforeSwap must return exactly 96 bytes. When an after-callback return delta is enabled, its response must be exactly 64 bytes.

BaseHook Pattern

When the project's pinned dependency graph uses OpenZeppelin's hook library, override the internal _before* and _after* functions of its BaseHook. The inherited external entry points already enforce onlyPoolManager.

The import path below assumes the Uniswap/v4-template remapping @openzeppelin/uniswap-hooks/=lib/uniswap-hooks/. OpenZeppelin's own README recommends @openzeppelin/uniswap-hooks/=lib/uniswap-hooks/src/, under which the same file is @openzeppelin/uniswap-hooks/base/BaseHook.sol. The path depends on your remapping; check it before treating a "file not found" as a missing dependency.

solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

import {BaseHook} from "@openzeppelin/uniswap-hooks/src/base/BaseHook.sol";
import {Hooks} from "@uniswap/v4-core/src/libraries/Hooks.sol";
import {IPoolManager} from "@uniswap/v4-core/src/interfaces/IPoolManager.sol";
import {PoolKey} from "@uniswap/v4-core/src/types/PoolKey.sol";
import {PoolId, PoolIdLibrary} from "@uniswap/v4-core/src/types/PoolId.sol";
import {BalanceDelta} from "@uniswap/v4-core/src/types/BalanceDelta.sol";
import {BeforeSwapDelta, BeforeSwapDeltaLibrary} from "@uniswap/v4-core/src/types/BeforeSwapDelta.sol";
import {SwapParams} from "@uniswap/v4-core/src/types/PoolOperation.sol";

contract MyHook is BaseHook {
    using PoolIdLibrary for PoolKey;

    mapping(PoolId poolId => uint256 count) public swapCount;

    constructor(IPoolManager manager) BaseHook(manager) {}

    function getHookPermissions() public pure override returns (Hooks.Permissions memory) {
        return Hooks.Permissions({
            beforeInitialize: false,
            afterInitialize: false,
            beforeAddLiquidity: false,
            afterAddLiquidity: false,
            beforeRemoveLiquidity: false,
            afterRemoveLiquidity: false,
            beforeSwap: true,
            afterSwap: true,
            beforeDonate: false,
            afterDonate: false,
            beforeSwapReturnDelta: false,
            afterSwapReturnDelta: false,
            afterAddLiquidityReturnDelta: false,
            afterRemoveLiquidityReturnDelta: false
        });
    }

    function _beforeSwap(address, PoolKey calldata, SwapParams calldata, bytes calldata)
        internal
        pure
        override
        returns (bytes4, BeforeSwapDelta, uint24)
    {
        return (BaseHook.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, 0);
    }

    function _afterSwap(address, PoolKey calldata key, SwapParams calldata, BalanceDelta, bytes calldata)
        internal
        override
        returns (bytes4, int128)
    {
        swapCount[key.toId()]++;
        return (BaseHook.afterSwap.selector, 0);
    }
}

Keep these three things in exact agreement:

  1. The callbacks implemented by the contract.
  2. The booleans returned by getHookPermissions().
  3. The low-bit flags used to mine the deployed address.

Dynamic LP Fees

A beforeSwap callback can override the LP fee only when the pool's PoolKey uses LPFeeLibrary.DYNAMIC_FEE_FLAG. Return the desired fee combined with LPFeeLibrary.OVERRIDE_FEE_FLAG. The fee component must be at most LPFeeLibrary.MAX_LP_FEE, where 1_000_000 represents 100%. A total swap fee of 100% is valid only for exact input when the post-hook native-pool amount is nonzero. Exact output at that boundary reverts while its post-hook native-pool amount remains positive. If a specified return delta reduces that amount exactly to zero, core skips the native curve and the hook must deliver and settle the complete exchange. A dynamic-fee policy that uses the native curve for exact output must remain below the boundary after protocol and LP fees are combined. Returning a value without a valid override flag leaves the pool's current dynamic fee in effect.

Bound every input used to calculate a fee. Test the zero fee, maximum fee, and both exact-input and exact-output paths.

Access Control

Do not treat the callback sender as the end user. For standard router flows it identifies the router. An allowlist on sender is therefore a router allowlist, not a user allowlist.

If the hook needs end-user authorization, use a router that enforces the authorization and passes authenticated context, or verify authorization carried in hookData. Bind that authorization to the chain, hook, pool, operation, payer, recipient, economic limits, nonce, and deadline. Trusting a router address or decoded user address alone does not authenticate its caller.

Oracle and TWAP Hooks

The current pool tick can be manipulated within a transaction. A production TWAP needs a complete observation design: bounded storage, correct cumulative tick growth between writes, interpolation, wraparound handling, and defined behavior when history is insufficient.

Do not ship an afterSwap array append plus an unfinished consult function. Use a tested observation implementation compatible with the project's pinned dependency graph, or test the complete implementation as a separate accounting system.

For external price sources, verify units, decimals, freshness, observation windows, manipulation resistance, invalid-value behavior, and sequencer or cross-chain liveness when applicable. Test stale, reverted, delayed, and out-of-order updates.

Return Deltas and Custom Accounting

Return deltas are denominated from the hook's perspective:

  • Positive means the hook is owed or takes currency.
  • Negative means the hook owes or sends currency.
  • BeforeSwapDelta contains specified and unspecified currency amounts. These are not fixed to currency0 and currency1.
  • afterSwap returns only the hook delta for the unspecified currency.
  • Liquidity return deltas contain currency0 and currency1 amounts.

For both afterAddLiquidity and afterRemoveLiquidity, including zero-liquidity fee collection, trace principal, feesAccrued, the returned hook delta, the resulting caller delta, hook inventory, and settlement in both currencies. Core subtracts the returned hook delta from the caller's aggregate delta and accounts it to the hook.

For a swap, the specified currency depends on both zeroForOne and whether amountSpecified is exact input (negative) or exact output (positive):

SwapSpecifiedUnspecified
Exact input, zeroForOnecurrency0 (in)currency1 (out)
Exact input, oneForZerocurrency1 (in)currency0 (out)
Exact output, zeroForOnecurrency1 (out)currency0 (in)
Exact output, oneForZerocurrency0 (out)currency1 (in)

Derive the leg (currency0Specified = (amountSpecified < 0) == zeroForOne); selecting it by direction alone is correct only for exact input. A nonzero specified delta may reduce the amount executed by the native pool, but it cannot cross zero and change the swap from exact input to exact output or the reverse. Reaching exactly zero is allowed. At that boundary the native swap is skipped and the hook acts as the complete exchange, so it must provide and settle the output while enforcing pricing and slippage.

Returning a delta changes PoolManager accounting; it does not transfer tokens or prove that output inventory exists. A positive returned delta credits the hook inside the PoolManager; the hook must take() that credit in the same callback, or the currency's delta stays nonzero and the operation reverts with CurrencyNotSettled(). Every address/currency delta opened during the unlock must be zero before the unlock returns. For ERC-20 payment, call sync(currency), transfer the tokens, then call settle() or settleFor(). For native payment, sync the native currency before calling settle{value: amount}() or settleFor{value: amount}() by first calling poolManager.sync(Currency.wrap(address(0))); this prevents a stale ERC-20 sync from misclassifying settlement. Use take and claims deliberately.

Trace clear and direct transfers or donations before settlement. Do not use an absolute token balance as proof of per-pool reserves or settlement.

Do not model a replacement curve as two return values alone. Use a maintained custom-accounting or custom-curve base, then prove pricing, inventory, settlement, slippage, rounding, and solvency for every path.

Show full SKILL.md (913 more words)Show less

Complex Hook Architectures

The following designs are protocols, not single-callback snippets:

  • TWAMM: Bound virtual-order work per call, define keeper progress and cancellation, execute swaps within the active unlock, and settle every resulting delta.
  • Limit orders: Track ownership and partial fills, process tick crossings with bounded work, and define cancellation and claim behavior.
  • Auto-compounding: Track the hook's actual positions and fee ownership, settle liquidity modifications, enforce user share accounting, and bound compounding work.

Start from a maintained implementation when possible. Do not invent helpers such as _getAccruedFees, _fillCrossedOrders, or _reinvestFees without defining their accounting and settlement behavior.

Address Mining and Deployment

Use the HookMiner that belongs to the dependency set pinned by the project. Follow the production deployment flow documented by that pinned HookMiner revision:

  1. Combine the required Hooks.*_FLAG constants.
  2. Encode the exact constructor arguments.
  3. Mine using the address that will execute CREATE2.
  4. Deploy with the returned salt.
  5. Require that the deployed address equals the predicted address.

In a Foundry script using the deterministic deployment proxy, mine with the proxy address used by the script. In a test using new Hook{salt: salt}, mine with the address of the contract that actually executes CREATE2, normally address(this). Do not substitute a callback caller or a pranked msg.sender without confirming the creator used by the deployment path.

Hooks.validateHookPermissions returns nothing and reverts on a mismatch. It cannot be used as a boolean condition in a mining loop. If implementing a miner instead of using the maintained library, compare uint160(predicted) & Hooks.ALL_HOOK_MASK with the desired flags and test the full init-code and deployer calculation.

Hook-Specific Test Requirements

Use test helpers from the same dependency graph pinned by the project. When starting a new project, use a pinned revision of the Uniswap V4 template. Do not copy Deployers or HookMiner snippets from another revision. In tests, either mine and deploy with the actual deployer or use deployCodeTo at an address with the exact permission bits.

Test behavior, not only callback counters:

  • Every enabled and disabled callback.
  • Exact-input and exact-output swaps in both directions.
  • Zero, boundary, and maximum valid amounts and fees.
  • Multiple pools sharing one hook.
  • Return-delta settlement for each currency and native currency.
  • Invalid selectors, flag mismatches, malformed hookData, and unauthorized routers.
  • Direct PoolManager and attacker-controlled unlock paths, including donate, fee-only collection, repeated initialization, and partial or full removal.
  • Hostile pools with attacker-selected counterpart currencies that place a supported or protocol-issued token in either canonical currency slot, plus alternate fees or tick spacing; test every supported nonstandard token behavior.
  • For time-dependent fees or penalties, sequences involving fee updates, minimal adds, fee-only collection, donations, direction changes, and multiple swaps in one transaction.
  • For range, vault, or custom-curve hooks, mixed decimals and fixed-point scales, cast and rounding bounds, boundary ticks, empty ranges, first deposits, and repeated minimum withdrawals.
  • Malformed or selectively reverting dependencies during swaps, liquidity changes, and user exits.
  • Bounded gas as state and order counts grow.
  • Fork behavior against the intended deployed PoolManager.

Security Rules

  • Report a security finding only when a reachable attacker path produces a concrete effect on value, authorization, accounting, solvency, pricing, or liveness. Record design assumptions separately.
  • Trace every privileged path that can change the implementation, trusted routers, accepted pools, pricing dependencies, fees, or exit behavior. For an upgrade, verify storage layout, callback ABI, and address permission bits against the deployed configuration.
  • Use the external callback guards supplied by a maintained BaseHook. If implementing IHooks directly, reject every callback caller except the configured PoolManager.
  • If implementing IUnlockCallback, reject every unlockCallback caller except the configured PoolManager before decoding or trusting callback data.
  • Key state by its complete economic domain. Include PoolId and any owner, operator, ticks, position salt, market, vault, epoch, or order identity that distinguishes assets or liabilities. Global state is valid only when intentionally shared across every pool served by the hook.
  • Treat callback-time external calls as reentrancy and denial-of-service surfaces. Validate return data and test selective reverts and token or receiver callbacks. Do not start a new unlock from an active callback. A hook can call unlocked PoolManager operations directly, but core suppresses that hook's callbacks when the hook is the immediate caller. An external callee that invokes PoolManager can trigger the callbacks again. Test both nested paths, and do not let an optional integration block a safe exit.
  • Measure gas on realistic and adversarial state sizes. There is no universal 50,000-gas safety threshold.
  • Treat spot prices and same-transaction state as manipulable.
  • Conserve value and settle every per-address/per-currency delta on each non-reverting unlock path. Reverting paths must unwind atomically.

Checklist

  • Core, periphery, hook library, and template revisions are compatible and pinned
  • getHookPermissions() matches the least significant 14 address bits
  • Each return-delta flag has its parent callback flag
  • Internal BaseHook overrides return the correct external selector
  • Direct IHooks implementations restrict callbacks to PoolManager
  • The hook supports permissionless pools or validates its complete pool domain
  • Router identity is not confused with end-user identity
  • State is keyed by its complete economic domain, including PoolId where pool-specific
  • Dynamic fees are enabled on the pool and bounded to MAX_LP_FEE
  • Return-delta signs are correct for exact input/output and both directions
  • Zero-liquidity removal callbacks and zero native-swap amounts are tested
  • Every per-address/per-currency delta is settled on each non-reverting unlock path
  • External calls and loops cannot create unbounded callback gas
  • Native currency and nonstandard-token assumptions are tested
  • hookData is treated as untrusted unless authenticated
  • Production mining uses the real CREATE2 deployer and exact init code
  • Tests cover multiple pools, boundary amounts, malformed input, and failure paths

© ccashwell, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/uniswap-v4-hooks of ccashwell/evm-cortex.

Open the folder on GitHubat commit f8f3301

Compare with similar skills

Uniswap V4 Hooks next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Uniswap V4 Hooks compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Uniswap V4 Hooks this skillccashwell/evm-cortex131—~5.2kAutomated safety check: PassMIT
Marketplace Devdaymade/claude-code-skills1.4k—~5.3kAutomated safety check: PassMIT
Sync Upstreamnyaruka/phonenumbers1.6k—~2.8kAutomated safety check: PassMIT
Radiology Tablehuang-sir1/radiology-skills1.9k—~1.3kAutomated safety check: PassCustom licence
ERPClaw ERP Controlleravansaber/erpclaw116—~18kAutomated safety check: PassGPL-3.0
Odoo Agency Fleet Reviewerpipe-org/mcp-odoo421—~699Automated safety check: PassMIT

Similar skills

  • Marketplace Dev

    daymade/claude-code-skills

    Builds and maintains Claude Code plugin marketplaces: converts a skills repo to spec-valid marketplace.json, adds/updates plugin entries, and migrates skills into or between suites.

    1.4k GitHub stars~5.3k tokensUpdated yesterday
    Business, Finance & HRAuto-check passed
  • Sync Upstream

    nyaruka/phonenumbers

    Sync this Go port with a new upstream google/libphonenumber release — regenerate the embedded metadata and reconcile the ported Java logic.

    1.6k GitHub stars~2.8k tokensUpdated 8 days ago
    Business, Finance & HRAuto-check passed
  • Radiology Table

    huang-sir1/radiology-skills

    Create/audit editable publication tables with source reconciliation; not figures or statistical inference.

    1.9k GitHub stars~1.3k tokensUpdated 20 days ago
    Business, Finance & HRAuto-check passed
  • ERPClaw ERP Controller

    avansaber/erpclaw

    Operates the ERPClaw self-hosted ERP in plain language: accounting, invoicing, inventory, purchasing, tax, HR, payroll and reports, treating the ERP as the single source of truth.

    116 GitHub stars~18k tokensUpdated yesterday
    Business, Finance & HRAuto-check passed
  • Odoo Agency Fleet Review

    erpipe-org/mcp-odoo

    Review many client Odoo databases at once through odoo-mcp's cross-instance tools — fleet-wide accounting health, per-client aging, partial-failure triage — for agencies and partners managing 5–50…

    421 GitHub stars~699 tokensUpdated 1 mo ago
    Business, Finance & HRAuto-check passed
  • Beancount Close

    bex-co/beancount-io

    Close an accounting period in a Beancount ledger by reconciling each active account through beancount-reconcile, checking assertions and recurring gaps, reviewing flags, then proposing a commit with…

    297 GitHub stars~1.4k tokensUpdated today
    Business, Finance & HRAuto-check passed

More from ccashwell/evm-cortex

All 89 skills in this repo
  • Xray Pre Audit

    ccashwell/evm-cortex

    A skill your agent uses when preparing for a security audit, performing reconnaissance on a new codebase, or creating a protocol overview.

    131 GitHub stars~25k tokensUpdated 11 days ago
    Auto-check passed
  • Aave Integration

    ccashwell/evm-cortex

    A skill your agent uses when integrating with Aave V3 for lending, borrowing, flash loans, or building on top of Aave markets.

    131 GitHub stars~1.3k tokensUpdated 11 days ago
    Auto-check passed
  • Access Control Patterns

    ccashwell/evm-cortex

    Access control design patterns for Solidity protocols. An agent skill from ccashwell/evm-cortex.

    131 GitHub stars~1.8k tokensUpdated 11 days ago
    Auto-check passed
  • Anvil Patterns

    ccashwell/evm-cortex

    A skill your agent uses when running a local Ethereum node with Anvil.

    131 GitHub stars~1.3k tokensUpdated 11 days ago
    Auto-check passed
  • Audit Breadth Scan

    ccashwell/evm-cortex

    A skill your agent uses when performing systematic breadth-first review of all contracts during a security audit.

    131 GitHub stars~1.4k tokensUpdated 11 days ago
    Auto-check passed
  • Audit Depth Analysis

    ccashwell/evm-cortex

    A skill your agent uses when performing deep analysis of specific findings or high-risk areas during a security audit.

    131 GitHub stars~1.6k tokensUpdated 11 days ago
    Auto-check passed

Works with

Questions about Uniswap V4 Hooks

What does Uniswap V4 Hooks do?

A skill your agent uses when building or reviewing Uniswap V4 hooks, custom AMM logic, dynamic fees, access controls, oracle hooks, return deltas, hook deployment, or hook-specific tests. Uniswap V4 Hooks is an agent skill from ccashwell/evm-cortex. Use when building or reviewing Uniswap V4 hooks, custom AMM logic, dynamic fees, access controls, oracle hooks, return deltas, hook deployment, or hook-specific tests.

When should I use Uniswap V4 Hooks?

Uniswap V4 Hooks fits situations like: reviewing Uniswap V4 hooks; custom AMM logic; access controls; hook deployment.

How do I install Uniswap V4 Hooks in Claude Code?

Run `npx skills add ccashwell/evm-cortex --skill uniswap-v4-hooks -a claude-code`. Or copy the skill folder (skills/uniswap-v4-hooks in ccashwell/evm-cortex) into .claude/skills/uniswap-v4-hooks in your project. Claude Code loads it when a task matches its description.

How do I install Uniswap V4 Hooks in Codex?

Run `npx skills add ccashwell/evm-cortex --skill uniswap-v4-hooks -a codex`. Or copy the skill folder (skills/uniswap-v4-hooks in ccashwell/evm-cortex) into .agents/skills/uniswap-v4-hooks in your project. Codex loads it when a task matches its description.

Can I use Uniswap V4 Hooks in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ccashwell/evm-cortex --skill uniswap-v4-hooks -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/uniswap-v4-hooks, .gemini/skills/uniswap-v4-hooks, .github/skills/uniswap-v4-hooks and .opencode/skills/uniswap-v4-hooks in your project.

What does Uniswap V4 Hooks need to run?

SKILL.md names no scripts, command-line tools or credentials: Uniswap V4 Hooks is instructions for the agent only.

Does Uniswap V4 Hooks access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Uniswap V4 Hooks safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Uniswap V4 Hooks use?

Uniswap V4 Hooks is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Uniswap V4 Hooks use?

About 5.2k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Uniswap V4 Hooks?

Skills that share tags, products or a category with Uniswap V4 Hooks: Marketplace Dev (daymade/claude-code-skills, 1.4k stars), Sync Upstream (nyaruka/phonenumbers, 1.6k stars), Radiology Table (huang-sir1/radiology-skills, 1.9k stars) and ERPClaw ERP Controller (avansaber/erpclaw, 116 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Uniswap V4 Hooks?

ccashwell (a GitHub user) maintains it in ccashwell/evm-cortex, which has 131 GitHub stars. The repository holds 89 skills in this directory. The repository was last updated on September 30, 2026.

Source: ccashwell/evm-cortex on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.