[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6Q47HPSD54KB8FFDNYF78F7":3,"skill-same:01M6Q47HPSD54KB8FFDNYF78F7":65},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":46,"repositoryHtmlUrl":47,"repositoryHomepageUrl":6,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":49,"updatedAt":50,"install":51,"resources":64},"01M6Q47HPSD54KB8FFDNYF78F7","jb-pay-hook",null,"Generate custom Juicebox V5 pay hooks from natural language specifications. Creates Solidity contracts implementing IJBPayHook and\u002For IJBRulesetDataHook with Foundry tests. First evaluates if off-the-shelf solutions (buyback hook, 721 hook, Revnet) fit the use case.","Kernel8901\u002Fai-agent-skills-classification","Kernel8901","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F72647553?v=4","01M6KV388J2H5PNC8D8P940BJD","01M6KV38CS5B3AY63RKZB410YM",7,"MIT","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F视觉与设计\u002Fjuicy\u002Fjb-pay-hook\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"jb pay hook","pay","hook","fit","custom","implementing","juicebox v5","specifications","with","case","foundry","tests","natural language","language","contracts","hooks","use","first","solidity","generate","2026-11-10 10:12:30",false,"---\nname: jb-pay-hook\ndescription: Generate custom Juicebox V5 pay hooks from natural language specifications. Creates Solidity contracts implementing IJBPayHook and\u002For IJBRulesetDataHook with Foundry tests. First evaluates if off-the-shelf solutions (buyback hook, 721 hook, Revnet) fit the use case.\n---\n\n# Juicebox V5 Pay Hook Generator\n\nGenerate custom pay hooks for Juicebox V5 projects based on natural language specifications.\n\n## Before Writing Custom Code\n\n**Always evaluate if an off-the-shelf solution fits the user's needs:**\n\n| User Need | Recommended Solution |\n|-----------|---------------------|\n| Token buybacks via Uniswap | Deploy **nana-buyback-hook-v5** directly |\n| Tiered NFT rewards on payment | Deploy **nana-721-hook-v5** directly |\n| Autonomous tokenized treasury | Deploy a **Revnet** via revnet-core-v5 |\n| Revnet with NFT tiers | Use **Tiered721RevnetDeployer** |\n| Revnet with custom pay hooks | Use **PayHookRevnetDeployer** |\n\nIf off-the-shelf solutions fit, guide the user to deploy them instead of generating custom code.\n\n## V5 Pay Hook Architecture\n\nPay hooks in V5 follow a two-stage pattern:\n\n### Stage 1: Data Hook (beforePayRecordedWith)\n- Receives payment info before recording\n- Returns adjusted weight and hook specifications\n- Implements `IJBRulesetDataHook`\n\n### Stage 2: Pay Hook (afterPayRecordedWith)\n- Executes after payment is recorded\n- Receives forwarded funds and context\n- Implements `IJBPayHook`\n\nA contract can implement both interfaces (like the buyback hook) or just the pay hook.\n\n## JBAfterPayRecordedContext Fields\n\n```solidity\nstruct JBAfterPayRecordedContext {\n    address payer;                  \u002F\u002F Payment originator\n    uint256 projectId;              \u002F\u002F Project being paid\n    uint256 rulesetId;              \u002F\u002F Current ruleset ID\n    JBTokenAmount amount;           \u002F\u002F Payment amount\n    JBTokenAmount forwardedAmount;  \u002F\u002F Amount forwarded to hook\n    uint256 weight;                 \u002F\u002F Token minting weight\n    uint256 newlyIssuedTokenCount;  \u002F\u002F Tokens minted\n    address beneficiary;            \u002F\u002F Token recipient\n    bytes hookMetadata;             \u002F\u002F Data from data hook\n    bytes payerMetadata;            \u002F\u002F Data from payer\n}\n```\n\n## Design Patterns\n\n### Simple Pay Hook (afterPayRecordedWith only)\nUse when you only need to execute logic after payment without modifying minting behavior.\n\n```solidity\ncontract SimplePayHook is IJBPayHook, ERC165 {\n    function afterPayRecordedWith(JBAfterPayRecordedContext calldata context) external payable {\n        \u002F\u002F Validate caller is a project terminal\n        \u002F\u002F Execute custom logic\n    }\n\n    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {\n        return interfaceId == type(IJBPayHook).interfaceId || super.supportsInterface(interfaceId);\n    }\n}\n```\n\n### Data Hook + Pay Hook (full control)\nUse when you need to modify weight, intercept funds, or control hook routing.\n\n```solidity\ncontract FullPayHook is IJBRulesetDataHook, IJBPayHook, ERC165 {\n    function beforePayRecordedWith(JBBeforePayRecordedContext calldata context)\n        external view returns (uint256 weight, JBPayHookSpecification[] memory hookSpecifications)\n    {\n        \u002F\u002F Analyze payment, determine routing\n        \u002F\u002F Return weight and hook specs\n    }\n\n    function afterPayRecordedWith(JBAfterPayRecordedContext calldata context) external payable {\n        \u002F\u002F Execute with forwarded funds\n    }\n\n    function beforeCashOutRecordedWith(JBBeforeCashOutRecordedContext calldata context)\n        external view returns (uint256, uint256, uint256, JBCashOutHookSpecification[] memory)\n    {\n        \u002F\u002F Pass through if not handling cash outs\n        return (context.ruleset.cashOutTaxRate, context.cashOutCount, context.totalSupply, new JBCashOutHookSpecification[](0));\n    }\n\n    function hasMintPermissionFor(uint256) external pure returns (bool) {\n        return false; \u002F\u002F Only true if hook needs to mint\n    }\n}\n```\n\n### Contract-as-Owner Pattern\nUse when the project needs to be autonomous with structured rules and delegated permissions.\n\nReference: **revnet-core-v5** (REVDeployer)\n- Contract owns the Juicebox project NFT\n- Implements hooks and controls project configuration\n- Delegates authority via JBPermissions\n\n## Generation Guidelines\n\n1. **Ask clarifying questions** about the desired behavior\n2. **Evaluate off-the-shelf options** first\n3. **Choose the simplest pattern** that meets requirements\n4. **Include terminal validation** in afterPayRecordedWith\n5. **Generate Foundry tests** with fork testing against deployed contracts\n6. **Use correct V5 terminology** (ruleset, cash out, weight, reserved rate)\n\n## Example Prompts\n\n- \"Create a pay hook that mints a custom ERC20 token proportional to payments\"\n- \"I want to reward payers with points based on payment amount\"\n- \"Build a hook that routes 10% of payments to a charity address\"\n- \"Create an autonomous project that caps individual payment amounts\"\n\n## Reference Implementations\n\n- **nana-buyback-hook-v5**: https:\u002F\u002Fgithub.com\u002FBananapus\u002Fnana-buyback-hook-v5\n- **nana-721-hook-v5**: https:\u002F\u002Fgithub.com\u002FBananapus\u002Fnana-721-hook-v5\n- **revnet-core-v5**: https:\u002F\u002Fgithub.com\u002Frev-net\u002Frevnet-core-v5\n\n## Output Format\n\nGenerate:\n1. Main contract in `src\u002F`\n2. Interface in `src\u002Finterfaces\u002F` if needed\n3. Test file in `test\u002F`\n4. Deployment script in `script\u002F` if requested\n\nUse Foundry project structure with forge-std.\n","# Juicebox V5 Pay Hook Generator\n\nGenerate custom pay hooks for Juicebox V5 projects based on natural language specifications.\n\n## Before Writing Custom Code\n\n**Always evaluate if an off-the-shelf solution fits the user's needs:**\n\n| User Need | Recommended Solution |\n|-----------|---------------------|\n| Token buybacks via Uniswap | Deploy **nana-buyback-hook-v5** directly |\n| Tiered NFT rewards on payment | Deploy **nana-721-hook-v5** directly |\n| Autonomous tokenized treasury | Deploy a **Revnet** via revnet-core-v5 |\n| Revnet with NFT tiers | Use **Tiered721RevnetDeployer** |\n| Revnet with custom pay hooks | Use **PayHookRevnetDeployer** |\n\nIf off-the-shelf solutions fit, guide the user to deploy them instead of generating custom code.\n\n## V5 Pay Hook Architecture\n\nPay hooks in V5 follow a two-stage pattern:\n\n### Stage 1: Data Hook (beforePayRecordedWith)\n- Receives payment info before recording\n- Returns adjusted weight and hook specifications\n- Implements `IJBRulesetDataHook`\n\n### Stage 2: Pay Hook (afterPayRecordedWith)\n- Executes after payment is recorded\n- Receives forwarded funds and context\n- Implements `IJBPayHook`\n\nA contract can implement both interfaces (like the buyback hook) or just the pay hook.\n\n## JBAfterPayRecordedContext Fields\n\n```solidity\nstruct JBAfterPayRecordedContext {\n    address payer;                  \u002F\u002F Payment originator\n    uint256 projectId;              \u002F\u002F Project being paid\n    uint256 rulesetId;              \u002F\u002F Current ruleset ID\n    JBTokenAmount amount;           \u002F\u002F Payment amount\n    JBTokenAmount forwardedAmount;  \u002F\u002F Amount forwarded to hook\n    uint256 weight;                 \u002F\u002F Token minting weight\n    uint256 newlyIssuedTokenCount;  \u002F\u002F Tokens minted\n    address beneficiary;            \u002F\u002F Token recipient\n    bytes hookMetadata;             \u002F\u002F Data from data hook\n    bytes payerMetadata;            \u002F\u002F Data from payer\n}\n```\n\n## Design Patterns\n\n### Simple Pay Hook (afterPayRecordedWith only)\nUse when you only need to execute logic after payment without modifying minting behavior.\n\n```solidity\ncontract SimplePayHook is IJBPayHook, ERC165 {\n    function afterPayRecordedWith(JBAfterPayRecordedContext calldata context) external payable {\n        \u002F\u002F Validate caller is a project terminal\n        \u002F\u002F Execute custom logic\n    }\n\n    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {\n        return interfaceId == type(IJBPayHook).interfaceId || super.supportsInterface(interfaceId);\n    }\n}\n```\n\n### Data Hook + Pay Hook (full control)\nUse when you need to modify weight, intercept funds, or control hook routing.\n\n```solidity\ncontract FullPayHook is IJBRulesetDataHook, IJBPayHook, ERC165 {\n    function beforePayRecordedWith(JBBeforePayRecordedContext calldata context)\n        external view returns (uint256 weight, JBPayHookSpecification[] memory hookSpecifications)\n    {\n        \u002F\u002F Analyze payment, determine routing\n        \u002F\u002F Return weight and hook specs\n    }\n\n    function afterPayRecordedWith(JBAfterPayRecordedContext calldata context) external payable {\n        \u002F\u002F Execute with forwarded funds\n    }\n\n    function beforeCashOutRecordedWith(JBBeforeCashOutRecordedContext calldata context)\n        external view returns (uint256, uint256, uint256, JBCashOutHookSpecification[] memory)\n    {\n        \u002F\u002F Pass through if not handling cash outs\n        return (context.ruleset.cashOutTaxRate, context.cashOutCount, context.totalSupply, new JBCashOutHookSpecification[](0));\n    }\n\n    function hasMintPermissionFor(uint256) external pure returns (bool) {\n        return false; \u002F\u002F Only true if hook needs to mint\n    }\n}\n```\n\n### Contract-as-Owner Pattern\nUse when the project needs to be autonomous with structured rules and delegated permissions.\n\nReference: **revnet-core-v5** (REVDeployer)\n- Contract owns the Juicebox project NFT\n- Implements hooks and controls project configuration\n- Delegates authority via JBPermissions\n\n## Generation Guidelines\n\n1. **Ask clarifying questions** about the desired behavior\n2. **Evaluate off-the-shelf options** first\n3. **Choose the simplest pattern** that meets requirements\n4. **Include terminal validation** in afterPayRecordedWith\n5. **Generate Foundry tests** with fork testing against deployed contracts\n6. **Use correct V5 terminology** (ruleset, cash out, weight, reserved rate)\n\n## Example Prompts\n\n- \"Create a pay hook that mints a custom ERC20 token proportional to payments\"\n- \"I want to reward payers with points based on payment amount\"\n- \"Build a hook that routes 10% of payments to a charity address\"\n- \"Create an autonomous project that caps individual payment amounts\"\n\n## Reference Implementations\n\n- **nana-buyback-hook-v5**: https:\u002F\u002Fgithub.com\u002FBananapus\u002Fnana-buyback-hook-v5\n- **nana-721-hook-v5**: https:\u002F\u002Fgithub.com\u002FBananapus\u002Fnana-721-hook-v5\n- **revnet-core-v5**: https:\u002F\u002Fgithub.com\u002Frev-net\u002Frevnet-core-v5\n\n## Output Format\n\nGenerate:\n1. Main contract in `src\u002F`\n2. Interface in `src\u002Finterfaces\u002F` if needed\n3. Test file in `test\u002F`\n4. Deployment script in `script\u002F` if requested\n\nUse Foundry project structure with forge-std.\n",{"name":5,"description":7},"main","f4cb2d49f7667e79ef7804f50396d5aaffdf1f56","视觉与设计\u002Fjuicy\u002Fjb-pay-hook",1,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification","https:\u002F\u002Fgithub.com\u002FKernel8901","a little little little dobe in life but science geek","2026-04-05 16:43:56",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add Kernel8901\u002Fai-agent-skills-classification --skill jb-pay-hook",{"tool":57,"command":58},"bunx","bunx skills add Kernel8901\u002Fai-agent-skills-classification --skill jb-pay-hook",{"tool":60,"command":61},"pnpm","pnpm dlx skills add Kernel8901\u002Fai-agent-skills-classification --skill jb-pay-hook","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F视觉与设计\u002Fjuicy\u002Fjb-pay-hook\u002FSKILL.md",true,[],[66,89,125,136,146,176],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":38},"01M6Q5R6WZ06RRB9RQTW54B34B","zyfai","Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount (Safe) linked to their EOA, enables automated yield optimization, and lets them deposit\u002Fwithdraw anytime.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzyfai-sdk\u002FSKILL.md",[],[68,73,74,75,76,77,34,78,79,80,81,82,83,84,85,86,87,88],"safe","ethereum","defi","Optimization","user","Wallet","base","deposit","withdraw","yield","arbitrum","non-custodial","passive","defi yield","earn","yield optimization",{"skillNo":90,"name":91,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":107,"publishedAt":38},"01M6Q5R337B5JSNER4P4YS03TN","zerion-api","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api\u002FSKILL.md",[94,99,102],{"categoryNo":95,"categoryName":96,"taxonomyType":97,"taxonomyTypeDesc":98},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":100,"categoryName":101,"taxonomyType":97,"taxonomyTypeDesc":98},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":103,"categoryName":104,"taxonomyType":105,"taxonomyTypeDesc":106},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[108,109,110,111,112,113,114,75,115,78,116,117,118,119,120,121,122,123,124],"api","zerion api","zerion","MCP","mcp server","server","blockchain","transactions","crypto wallet","crypto","evm","solana","query","across","positions","token","prices",{"skillNo":126,"name":127,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":133,"publishedAt":38},"01M6Q5QZFYTDAZMZ27BN5VZXAR","zerion-api-skill","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-skill\u002FSKILL.md",[130,131,132],{"categoryNo":95,"categoryName":96,"taxonomyType":97,"taxonomyTypeDesc":98},{"categoryNo":100,"categoryName":101,"taxonomyType":97,"taxonomyTypeDesc":98},{"categoryNo":103,"categoryName":104,"taxonomyType":105,"taxonomyTypeDesc":106},[108,134,135,109,110,111,112,113,114,75,115,78,117,118,119,120,121,122,123,124],"api skill","zerion api skill",{"skillNo":137,"name":138,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":144,"publishedAt":38},"01M6Q5QW17QW98RA3FE45E4RD8","zerion-api-mcp","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-mcp\u002FSKILL.md",[141,142,143],{"categoryNo":95,"categoryName":96,"taxonomyType":97,"taxonomyTypeDesc":98},{"categoryNo":100,"categoryName":101,"taxonomyType":97,"taxonomyTypeDesc":98},{"categoryNo":103,"categoryName":104,"taxonomyType":105,"taxonomyTypeDesc":106},[111,108,145,109,110,112,113,75,115,78,116,117,118,119,120,121,122,123,124],"zerion api mcp",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":155,"publishedAt":38},"01M6Q5QQYZB7A501BDEQWKGSJT","yahoo-finance-forex","Fetches real-time FOREX news and market data from Yahoo Finance for major currency pairs (EUR\u002FUSD, GBP\u002FUSD, USD\u002FJPY, etc.). Analyzes sentiment and provides trading context.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-forex\u002FSKILL.md",[152],{"categoryNo":153,"categoryName":154,"taxonomyType":105,"taxonomyTypeDesc":106},"01JBSEEDCAT000000000000040","财务",[156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175],"finance","yahoo finance","forex","yahoo","yahoo finance forex","github","https","sentiment","real-time","python3","install","Market","usd","news","time","currency","gbp","pip","market data","for",{"skillNo":177,"name":178,"nameZh":6,"description":179,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":183,"publishedAt":38},"01M6Q5QM6VS84WZVM7BKXXPF32","yahoo-finance","This skill should be used when the user asks to \"get stock prices\", \"check stock quotes\", \"look up earnings\", \"get financial data\", \"find trending stocks\", or needs stock market data from Yahoo Finance.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-cli\u002FSKILL.md",[182],{"categoryNo":153,"categoryName":154,"taxonomyType":105,"taxonomyTypeDesc":106},[156,157,159,184,185,186,187,188,189,167,190,191,192,193,194,195,196,197,124,174],"cli","homebrew","find","check","brew","up","local","get","stock","link","trending","sf","quotes","ln"]