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.
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.
$ npx skills add ccashwell/evm-cortex --skill uniswap-v4-hooks -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ccashwell/evm-cortex uniswap-v4-hooks --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "uniswap-v4-hooks" agent skill from https://github.com/ccashwell/evm-cortex/tree/main/skills/uniswap-v4-hooks into .claude/skills/uniswap-v4-hooks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uniswap-v4-hooks", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ccashwell/evm-cortex/tree/main/skills/uniswap-v4-hooksType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ccashwell/evm-cortex --skill uniswap-v4-hooks -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ccashwell/evm-cortex uniswap-v4-hooks --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ccashwell/evm-cortex.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/uniswap-v4-hooks .agents/skills/uniswap-v4-hooks && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "uniswap-v4-hooks" agent skill from https://github.com/ccashwell/evm-cortex/tree/main/skills/uniswap-v4-hooks into .agents/skills/uniswap-v4-hooks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uniswap-v4-hooks", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ccashwell/evm-cortex --skill uniswap-v4-hooks -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ccashwell/evm-cortex uniswap-v4-hooks --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ccashwell/evm-cortex.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/uniswap-v4-hooks .cursor/skills/uniswap-v4-hooks && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "uniswap-v4-hooks" agent skill from https://github.com/ccashwell/evm-cortex/tree/main/skills/uniswap-v4-hooks into .cursor/skills/uniswap-v4-hooks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uniswap-v4-hooks", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ccashwell/evm-cortex.git --path skills/uniswap-v4-hooks--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ccashwell/evm-cortex --skill uniswap-v4-hooks -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ccashwell/evm-cortex uniswap-v4-hooks --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ccashwell/evm-cortex.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/uniswap-v4-hooks .gemini/skills/uniswap-v4-hooks && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "uniswap-v4-hooks" agent skill from https://github.com/ccashwell/evm-cortex/tree/main/skills/uniswap-v4-hooks into .gemini/skills/uniswap-v4-hooks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uniswap-v4-hooks", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ccashwell/evm-cortex uniswap-v4-hooksInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ccashwell/evm-cortex --skill uniswap-v4-hooks -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ccashwell/evm-cortex.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/uniswap-v4-hooks .github/skills/uniswap-v4-hooks && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "uniswap-v4-hooks" agent skill from https://github.com/ccashwell/evm-cortex/tree/main/skills/uniswap-v4-hooks into .github/skills/uniswap-v4-hooks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uniswap-v4-hooks", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ccashwell/evm-cortex --skill uniswap-v4-hooks -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ccashwell/evm-cortex uniswap-v4-hooks --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ccashwell/evm-cortex.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/uniswap-v4-hooks .opencode/skills/uniswap-v4-hooks && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "uniswap-v4-hooks" agent skill from https://github.com/ccashwell/evm-cortex/tree/main/skills/uniswap-v4-hooks into .opencode/skills/uniswap-v4-hooks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uniswap-v4-hooks", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
uniswap-v4-hooksA 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. 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.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit f8f3301. It shows what the files ask for, not the result of running them.
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.
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.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
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.
The full file from ccashwell/evm-cortex at commit f8f3301, republished under its MIT licence (© ccashwell). 2,302 words, ~5,183 tokens.
.claude/skills/uniswap-v4-hooks/SKILL.md (or your agent's skills folder).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.
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.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.
The constants below are defined by v4-core/src/libraries/Hooks.sol.
| Bit | Permission | Callback effect |
|---|---|---|
| 13 | BEFORE_INITIALIZE_FLAG | Calls beforeInitialize |
| 12 | AFTER_INITIALIZE_FLAG | Calls afterInitialize |
| 11 | BEFORE_ADD_LIQUIDITY_FLAG | Calls beforeAddLiquidity |
| 10 | AFTER_ADD_LIQUIDITY_FLAG | Calls afterAddLiquidity |
| 9 | BEFORE_REMOVE_LIQUIDITY_FLAG | Calls beforeRemoveLiquidity |
| 8 | AFTER_REMOVE_LIQUIDITY_FLAG | Calls afterRemoveLiquidity |
| 7 | BEFORE_SWAP_FLAG | Calls beforeSwap |
| 6 | AFTER_SWAP_FLAG | Calls afterSwap |
| 5 | BEFORE_DONATE_FLAG | Calls beforeDonate |
| 4 | AFTER_DONATE_FLAG | Calls afterDonate |
| 3 | BEFORE_SWAP_RETURNS_DELTA_FLAG | Applies the BeforeSwapDelta returned by beforeSwap |
| 2 | AFTER_SWAP_RETURNS_DELTA_FLAG | Applies the int128 returned by afterSwap |
| 1 | AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG | Applies the BalanceDelta returned by afterAddLiquidity |
| 0 | AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG | Applies the BalanceDelta returned by afterRemoveLiquidity |
The four return-delta flags do not enable callbacks by themselves. Each one requires its corresponding callback flag.
uint160 flags = Hooks.BEFORE_SWAP_FLAG
| Hooks.AFTER_SWAP_FLAG
| Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG;Import ModifyLiquidityParams and SwapParams from
v4-core/src/types/PoolOperation.sol. They are top-level types, not members of
IPoolManager.
| Callback | Parameters after sender, key | Return value |
|---|---|---|
beforeInitialize | uint160 sqrtPriceX96 | bytes4 |
afterInitialize | uint160 sqrtPriceX96, int24 tick | bytes4 |
beforeAddLiquidity | ModifyLiquidityParams params, bytes hookData | bytes4 |
afterAddLiquidity | ModifyLiquidityParams params, BalanceDelta delta, BalanceDelta feesAccrued, bytes hookData | (bytes4, BalanceDelta) |
beforeRemoveLiquidity | ModifyLiquidityParams params, bytes hookData | bytes4 |
afterRemoveLiquidity | ModifyLiquidityParams params, BalanceDelta delta, BalanceDelta feesAccrued, bytes hookData | (bytes4, BalanceDelta) |
beforeSwap | SwapParams params, bytes hookData | (bytes4, BeforeSwapDelta, uint24) |
afterSwap | SwapParams params, BalanceDelta delta, bytes hookData | (bytes4, int128) |
beforeDonate | uint256 amount0, uint256 amount1, bytes hookData | bytes4 |
afterDonate | uint256 amount0, uint256 amount1, bytes hookData | bytes4 |
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.
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.
// 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:
getHookPermissions().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.
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.
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 are denominated from the hook's perspective:
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.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):
| Swap | Specified | Unspecified |
|---|---|---|
| Exact input, zeroForOne | currency0 (in) | currency1 (out) |
| Exact input, oneForZero | currency1 (in) | currency0 (out) |
| Exact output, zeroForOne | currency1 (out) | currency0 (in) |
| Exact output, oneForZero | currency0 (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.
The following designs are protocols, not single-callback snippets:
Start from a maintained implementation when possible. Do not invent helpers
such as _getAccruedFees, _fillCrossedOrders, or _reinvestFees without
defining their accounting and settlement behavior.
Use the HookMiner that belongs to the dependency set pinned by the project.
Follow the production deployment flow documented by that pinned HookMiner
revision:
Hooks.*_FLAG constants.CREATE2.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.
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:
hookData, and unauthorized
routers.donate,
fee-only collection, repeated initialization, and partial or full removal.BaseHook. If
implementing IHooks directly, reject every callback caller except the
configured PoolManager.IUnlockCallback, reject every unlockCallback caller except
the configured PoolManager before decoding or trusting callback data.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.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.getHookPermissions() matches the least significant 14 address bitsIHooks implementations restrict callbacks to PoolManagerPoolId where pool-specificMAX_LP_FEEhookData is treated as untrusted unless authenticated© ccashwell, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/uniswap-v4-hooks of ccashwell/evm-cortex.
Open the folder on GitHubat commit f8f3301
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Uniswap V4 Hooks this skillccashwell/evm-cortex | 131 | — | ~5.2k | Automated safety check: Pass | MIT | |
| Marketplace Devdaymade/claude-code-skills | 1.4k | — | ~5.3k | Automated safety check: Pass | MIT | |
| Sync Upstreamnyaruka/phonenumbers | 1.6k | — | ~2.8k | Automated safety check: Pass | MIT | |
| Radiology Tablehuang-sir1/radiology-skills | 1.9k | — | ~1.3k | Automated safety check: Pass | Custom licence | |
| ERPClaw ERP Controlleravansaber/erpclaw | 116 | — | ~18k | Automated safety check: Pass | GPL-3.0 | |
| Odoo Agency Fleet Reviewerpipe-org/mcp-odoo | 421 | — | ~699 | Automated safety check: Pass | MIT |
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.
nyaruka/phonenumbers
Sync this Go port with a new upstream google/libphonenumber release — regenerate the embedded metadata and reconcile the ported Java logic.
huang-sir1/radiology-skills
Create/audit editable publication tables with source reconciliation; not figures or statistical inference.
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.
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…
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…
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.
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.
ccashwell/evm-cortex
Access control design patterns for Solidity protocols. An agent skill from ccashwell/evm-cortex.
ccashwell/evm-cortex
A skill your agent uses when running a local Ethereum node with Anvil.
ccashwell/evm-cortex
A skill your agent uses when performing systematic breadth-first review of all contracts during a security audit.
ccashwell/evm-cortex
A skill your agent uses when performing deep analysis of specific findings or high-risk areas during a security audit.
Works with
Categories
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.
Uniswap V4 Hooks fits situations like: reviewing Uniswap V4 hooks; custom AMM logic; access controls; hook deployment.
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.
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.
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.
SKILL.md names no scripts, command-line tools or credentials: Uniswap V4 Hooks is instructions for the agent only.
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.
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.
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.
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.
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.
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.