是的,你可以在 PancakeSwap 的流动性合约中实现这种时间相关的代币扣除机制。以下是实现方案: 核心思路在添加流动性时记录用户存款时间戳和数量 在移除流动性时根据时间差计算应扣除比例 执行扣除后将剩余代币转给用户
代码实现建议solidity
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;import "@pancakeswap/v2-core/contracts/interfaces/IPancakePair.sol";import "@pancakeswap/v2-periphery/contracts/interfaces/IPancakeRouter02.sol";contract CustomLiquidity { struct Deposit { uint256 timestamp; uint256 amount; } mapping(address => Deposit) public deposits; IPancakeRouter02 public router; constructor(address _router) { router = IPancakeRouter02(_router); } // 重写添加流动性方法 function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity) { (amountA, amountB, liquidity) = router.addLiquidity( tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin, address(this), deadline ); // 记录存款时间和LP代币数量 deposits[to = Deposit(block.timestamp, liquidity); // 将LP代币转给用户 IPancakePair pair = IPancakePair(pairFor(tokenA, tokenB)); pair.transfer(to, liquidity); } // 重写移除流动性方法 function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB) { Deposit memory deposit = deposits[msg.sender; require(deposit.amount >= liquidity, "Insufficient balance"); uint256 penaltyRate = getPenaltyRate(deposit.timestamp); uint256 penaltyAmount = liquidity * penaltyRate / 100; uint256 remainingLiquidity = liquidity - penaltyAmount; // 转移LP代币到合约 IPancakePair pair = IPancakePair(pairFor(tokenA, tokenB)); pair.transferFrom(msg.sender, address(this), liquidity); // 移除流动性 (amountA, amountB) = router.removeLiquidity( tokenA, tokenB, remainingLiquidity, amountAMin, amountBMin, to, deadline ); // 处理扣除的代币(可以发送到指定地址或销毁) if (penaltyAmount > 0) { router.removeLiquidity( tokenA, tokenB, penaltyAmount, 0, 0, address(0xdead), // 或你的接收地址 deadline ); } // 更新存款记录 deposits[msg.sender.amount -= liquidity; } function getPenaltyRate(uint256 depositTime) internal view returns (uint256) { uint256 duration = block.timestamp - depositTime; if (duration < 30 days) { return 10; // 10% 扣除 } else if (duration < 60 days) { return 5; // 5% 扣除 } return 0; // 无扣除 } // 辅助函数 - 获取配对合约地址 function pairFor(address tokenA, address tokenB) internal view returns (address) { return IPancakeFactory(router.factory()).getPair(tokenA, tokenB); }}
部署注意事项此合约需要部署在 BSC 上,并连接到 PancakeSwap 的路由器合约 用户需要通过你的合约来添加/移除流动性,而不是直接使用 PancakeSwap 的界面 扣除的代币可以发送到指定地址(如项目方钱包)或直接销毁 需要充分测试时间计算逻辑,确保在不同时间点扣除比例正确
安全考虑这种实现方式可以满足你的业务需求,即在不同时间段移除流动性时执行不同的代币扣除比例。
|