ASD

Defi Protocol Templates

Implementa protocolos DeFi con plantillas listas para producción de staking, AMMs, gobernanza y flash loans. Úsalo al construir aplicaciones de finanzas descentralizadas o contratos inteligentes.

Estrellas
38.8k

en todo el repo

Actividad
53

0–100, la ruta de este skill

Actualizado
el mes pasado

último commit aquí

Commits
2

últimos 90 días

Contexto
1.9k tok

47 tok en reposo

Paquete
2 archivos

13 KB

Instalar

Funciona con cualquier agente que lea SKILL.md

npx -y skills add wshobson/agents --skill defi-protocol-templates --agent claude-code

Se instala solo en este repositorio.

Qué hace

  • Proporciona plantillas Solidity listas para producción de contratos de staking con distribución de recompensas
  • Incluye una plantilla de AMM (Automated Market Maker) con liquidez, swaps y comisión del 0.3%
  • Ofrece patrones para sistemas de gobernanza y flash loans mediante referencias adicionales

Úsalo cuando

  • Construir plataformas de staking con distribución de recompensas
  • Implementar protocolos AMM (Automated Market Maker)
  • Crear sistemas de tokens de gobernanza
  • Integrar funcionalidad de flash loans

No lo uses cuando

    Qué lo activa

    Di cualquiera de estas frases y el agente debería cargar este skill.

    • Necesito un contrato de staking con recompensas en Solidity
    • Crea un AMM simple con pools de liquidez y swaps
    • Quiero implementar un sistema de gobernanza con tokens

    SKILL.md

    En inglés

    DeFi Protocol Templates

    Production-ready templates for common DeFi protocols including staking, AMMs, governance, and flash loans.

    When to Use This Skill

    • Building staking platforms with reward distribution
    • Implementing AMM (Automated Market Maker) protocols
    • Creating governance token systems
    • Integrating flash loan functionality

    Staking Contract

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
    import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
    import "@openzeppelin/contracts/access/Ownable.sol";
    
    contract StakingRewards is ReentrancyGuard, Ownable {
        IERC20 public stakingToken;
        IERC20 public rewardsToken;
    
        uint256 public rewardRate = 100; // Rewards per second
        uint256 public lastUpdateTime;
        uint256 public rewardPerTokenStored;
    
        mapping(address => uint256) public userRewardPerTokenPaid;
        mapping(address => uint256) public rewards;
        mapping(address => uint256) public balances;
    
        uint256 private _totalSupply;
    
        event Staked(address indexed user, uint256 amount);
        event Withdrawn(address indexed user, uint256 amount);
        event RewardPaid(address indexed user, uint256 reward);
    
        constructor(address _stakingToken, address _rewardsToken) {
            stakingToken = IERC20(_stakingToken);
            rewardsToken = IERC20(_rewardsToken);
        }
    
        modifier updateReward(address account) {
            rewardPerTokenStored = rewardPerToken();
            lastUpdateTime = block.timestamp;
    
            if (account != address(0)) {
                rewards[account] = earned(account);
                userRewardPerTokenPaid[account] = rewardPerTokenStored;
            }
            _;
        }
    
        function rewardPerToken() public view returns (uint256) {
            if (_totalSupply == 0) {
                return rewardPerTokenStored;
            }
            return rewardPerTokenStored +
                ((block.timestamp - lastUpdateTime) * rewardRate * 1e18) / _totalSupply;
        }
    
        function earned(address account) public view returns (uint256) {
            return (balances[account] *
                (rewardPerToken() - userRewardPerTokenPaid[account])) / 1e18 +
                rewards[account];
        }
    
        function stake(uint256 amount) external nonReentrant updateReward(msg.sender) {
            require(amount > 0, "Cannot stake 0");
            _totalSupply += amount;
            balances[msg.sender] += amount;
            stakingToken.transferFrom(msg.sender, address(this), amount);
            emit Staked(msg.sender, amount);
        }
    
        function withdraw(uint256 amount) public nonReentrant updateReward(msg.sender) {
            require(amount > 0, "Cannot withdraw 0");
            _totalSupply -= amount;
            balances[msg.sender] -= amount;
            stakingToken.transfer(msg.sender, amount);
            emit Withdrawn(msg.sender, amount);
        }
    
        function getReward() public nonReentrant updateReward(msg.sender) {
            uint256 reward = rewards[msg.sender];
            if (reward > 0) {
                rewards[msg.sender] = 0;
                rewardsToken.transfer(msg.sender, reward);
                emit RewardPaid(msg.sender, reward);
            }
        }
    
        function exit() external {
            withdraw(balances[msg.sender]);
            getReward();
        }
    }
    

    AMM (Automated Market Maker)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
    
    contract SimpleAMM {
        IERC20 public token0;
        IERC20 public token1;
    
        uint256 public reserve0;
        uint256 public reserve1;
    
        uint256 public totalSupply;
        mapping(address => uint256) public balanceOf;
    
        event Mint(address indexed to, uint256 amount);
        event Burn(address indexed from, uint256 amount);
        event Swap(address indexed trader, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out);
    
        constructor(address _token0, address _token1) {
            token0 = IERC20(_token0);
            token1 = IERC20(_token1);
        }
    
        function addLiquidity(uint256 amount0, uint256 amount1) external returns (uint256 shares) {
            token0.transferFrom(msg.sender, address(this), amount0);
            token1.transferFrom(msg.sender, address(this), amount1);
    
            if (totalSupply == 0) {
                shares = sqrt(amount0 * amount1);
            } else {
                shares = min(
                    (amount0 * totalSupply) / reserve0,
                    (amount1 * totalSupply) / reserve1
                );
            }
    
            require(shares > 0, "Shares = 0");
            _mint(msg.sender, shares);
            _update(
                token0.balanceOf(address(this)),
                token1.balanceOf(address(this))
            );
    
            emit Mint(msg.sender, shares);
        }
    
        function removeLiquidity(uint256 shares) external returns (uint256 amount0, uint256 amount1) {
            uint256 bal0 = token0.balanceOf(address(this));
            uint256 bal1 = token1.balanceOf(address(this));
    
            amount0 = (shares * bal0) / totalSupply;
            amount1 = (shares * bal1) / totalSupply;
    
            require(amount0 > 0 && amount1 > 0, "Amount0 or amount1 = 0");
    
            _burn(msg.sender, shares);
            _update(bal0 - amount0, bal1 - amount1);
    
            token0.transfer(msg.sender, amount0);
            token1.transfer(msg.sender, amount1);
    
            emit Burn(msg.sender, shares);
        }
    
        function swap(address tokenIn, uint256 amountIn) external returns (uint256 amountOut) {
            require(tokenIn == address(token0) || tokenIn == address(token1), "Invalid token");
    
            bool isToken0 = tokenIn == address(token0);
            (IERC20 tokenIn_, IERC20 tokenOut, uint256 resIn, uint256 resOut) = isToken0
                ? (token0, token1, reserve0, reserve1)
                : (token1, token0, reserve1, reserve0);
    
            tokenIn_.transferFrom(msg.sender, address(this), amountIn);
    
            // 0.3% fee
            uint256 amountInWithFee = (amountIn * 997) / 1000;
            amountOut = (resOut * amountInWithFee) / (resIn + amountInWithFee);
    
            tokenOut.transfer(msg.sender, amountOut);
    
            _update(
                token0.balanceOf(address(this)),
                token1.balanceOf(address(this))
            );
    
            emit Swap(msg.sender, isToken0 ? amountIn : 0, isToken0 ? 0 : amountIn, isToken0 ? 0 : amountOut, isToken0 ? amountOut : 0);
        }
    
        function _mint(address to, uint256 amount) private {
            balanceOf[to] += amount;
            totalSupply += amount;
        }
    
        function _burn(address from, uint256 amount) private {
            balanceOf[from] -= amount;
            totalSupply -= amount;
        }
    
        function _update(uint256 res0, uint256 res1) private {
            reserve0 = res0;
            reserve1 = res1;
        }
    
        function sqrt(uint256 y) private pure returns (uint256 z) {
            if (y > 3) {
                z = y;
                uint256 x = y / 2 + 1;
                while (x < z) {
                    z = x;
                    x = (y / x + x) / 2;
                }
            } else if (y != 0) {
                z = 1;
            }
        }
    
        function min(uint256 x, uint256 y) private pure returns (uint256) {
            return x <= y ? x : y;
        }
    }
    

    Additional patterns and templates

    More detailed templates and worked examples live in references/details.md. Read that file for the full pattern library.

    Reproducido de wshobson/agents bajo licencia MIT. Leer esta página en markdown.

    Archivos

    2 archivos en el paquete. Solo se lee SKILL.md al activarse — las referencias se cargan si el skill decide que las necesita.

    Antes de instalar

    Usa librerías de OpenZeppelin (IERC20, ReentrancyGuard, Ownable) y patrones más detallados están en references/details.md.

    Detalles

    Creador
    wshobson
    Licencia
    MIT
    Recursos incluidos
    referencias
    Repositorio
    wshobson/agents
    Código fuente
    Ver SKILL.md

    Etiquetas

    Más de wshobson/agents

    Este repo incluye 180 skills. Si instalas uno, normalmente ya tienes los demás.

    Úsalo al seleccionar y colocar iconos, imágenes, SVGs, diagramas o infografías de apoyo aprobados en un PPTX editable.

    Costo de contexto al activarse
    344 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo cuando pidan optimizar un prompt, mejorar su rendimiento, diseñar una plantilla, aplicar chain-of-thought, few-shot prompting o técnicas avanzadas de prompt engineering para producción.

    Costo de contexto al activarse
    1.3k tok
    Tamaño del paquete
    10 archivos
    Última actualización
    el mes pasado
    herramientas desarrollo

    Úsalo al redactar o reparar una especificación JSON con coordenadas explícitas para un PPTX editable.

    Costo de contexto al activarse
    489 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo para validar o reparar un PPTX editable en cuanto a geometría, accesibilidad, editabilidad nativa, linaje de fuente e integridad del paquete OOXML.

    Costo de contexto al activarse
    409 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo para analizar un PPTX de referencia en modo solo lectura: estructura, tema, tipografía, ritmo de layout, diagnósticos, catálogos de plantillas derivados o inspección segura del paquete OOXML.

    Costo de contexto al activarse
    689 tok
    Tamaño del paquete
    8 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo al preparar la narrativa, las fuentes y el contexto de diseño para un nuevo deck PPTX editable.

    Costo de contexto al activarse
    415 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Skills relacionados

    Integra el procesamiento de pagos de PayPal, con soporte para express checkout, suscripciones y gestión de reembolsos en flujos de comercio electrónico.

    Costo de contexto al activarse
    1k tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 2 meses
    desarrollo apis

    Construye sistemas RAG (Retrieval-Augmented Generation) para aplicaciones LLM con bases de datos vectoriales y búsqueda semántica, integrando conocimiento externo.

    Costo de contexto al activarse
    1.1k tok
    Tamaño del paquete
    2 archivos
    Última actualización
    el mes pasado
    desarrollo apis

    Construye servicios backend de Node.js listos para producción con Express/Fastify, cubriendo middleware, manejo de errores, autenticación, bases de datos y diseño de APIs.

    Costo de contexto al activarse
    499 tok
    Tamaño del paquete
    3 archivos
    Última actualización
    hace 2 meses
    desarrollo apis