目前toriadocash的取款都需要通过中继者;中继者可以收取取款者一定比例的手续费,同时被扣除一定数量的质押代币,被扣除的代币按比例分配给治理质押者。我的提案是,中继者被扣除的代币,80%打入黑洞燃烧销毁,剩下的20%按比例分配。请问这样的提案,按你之前的回答,该如何编写程序提案?
GROK回复:
前提条件
- 假设:
- 中继者扣除的代币来自其质押的 $TORN。
- 当前分配逻辑可能直接将扣除的代币全部分配给治理质押者(或有其他用途),需要修改为 80% 燃烧 + 20% 分配。
- Tornado Cash 的治理合约(Governance.sol)和中继者相关逻辑(可能在 TornadoRelayer.sol 或类似合约中)是可升级的。
- 工具:需要 Solidity 编程环境(如 Hardhat 或 Remix)、以太坊钱包和至少 1,000 $TORN。
实现步骤
1. 分析现有逻辑
- 当前 Tornado Cash 的中继者机制中,取款通过中继者完成,中继者收取手续费(通常是 ETH),并可能因违规或超额收费被扣除质押的 $TORN。
- 假设扣除逻辑在某个合约(如 RelayerRegistry 或 TornadoStakingRewards)中,我们需要修改这部分。
2. 定义提案目标
- 修改扣除代币的分配函数:
- 80% 发送到黑洞地址(例如 0x000000000000000000000000000000000000dEaD)。
- 20% 分配给治理质押者(通过现有的奖励分配机制)。
3. 编写提案智能合约
提案需要是一个独立的可执行合约,通过 delegatecall 调用现有治理合约的更新函数。以下是示例代码:
solidity
收起自动换行复制
`// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface ITornadoGovernance {
function updateRelayerPenaltyDistribution(uint256 burnPercentage, address burnAddress) external;
}
contract RelayerPenaltyProposal {
ITornadoGovernance public constant GOVERNANCE = ITornadoGovernance(0x5efda50f22d34F262c29268506C5Fa42a4a59125); // 假设的治理合约地址
address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD; // 黑洞地址
uint256 public constant BURN_PERCENTAGE = 80; // 80% 燃烧
function execute() external {
// 调用治理合约更新中继者惩罚分配逻辑
GOVERNANCE.updateRelayerPenaltyDistribution(BURN_PERCENTAGE, BURN_ADDRESS);
}
}`
4. 修改现有合约逻辑
假设治理合约允许通过提案更新中继者惩罚逻辑,我们需要在 TornadoGovernance 或相关合约中添加一个函数。以下是可能的实现(需要在治理升级中包含):
solidity
收起自动换行复制
`// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import “@openzeppelin/contracts/token/ERC20/IERC20.sol”;
contract TornadoGovernance {
IERC20 public tornToken = IERC20(0x77777FeD45859b4BeB5fc4e7DEb7ecef0dDBcc4d); // 假设的 $TORN 地址
address public burnAddress;
uint256 public burnPercentage;
// 更新惩罚分配参数
function updateRelayerPenaltyDistribution(uint256 _burnPercentage, address _burnAddress) external {
require(msg.sender == address(this), "Only callable via proposal"); // 确保只能通过治理提案调用
require(_burnPercentage <= 100, "Invalid percentage");
burnPercentage = _burnPercentage;
burnAddress = _burnAddress;
}
// 中继者惩罚函数(示例)
function penalizeRelayer(address relayer, uint256 penaltyAmount) external {
// 假设从 relayer 的质押中扣除 penaltyAmount
uint256 burnAmount = (penaltyAmount * burnPercentage) / 100;
uint256 rewardAmount = penaltyAmount - burnAmount;
// 80% 燃烧
tornToken.transfer(burnAddress, burnAmount);
// 20% 分配给治理质押者(假设通过现有奖励池)
tornToken.transfer(address(this), rewardAmount); // 简化,实际需调用奖励分配逻辑
}
}`
5. 部署提案合约
- 使用 Hardhat 或 Remix 编译并部署 RelayerPenaltyProposal.sol 到以太坊主网。
- 记录部署后的合约地址,例如 0x1234…。
6. 提交提案
- 前往 Tornado Cash 治理界面(假设仍可用)。
- 输入提案合约地址(0x1234…)和描述:
text
收起自动换行复制
提案:修改中继者惩罚代币分配,80% 发送至 0x...dEaD 燃烧销毁,20% 分配给治理质押者。
- 提交交易,支付 gas 费。
7. 社区讨论与投票
- 在 torn.community 或其他社区平台发布提案内容,解释理由(例如减少代币流通量、激励治理参与)。
- 等待 5 天投票期,确保获得足够支持(至少 25,000 $TORN)。
8. 执行提案
- 投票通过后,等待 2 天 timelock。
- 任何人都可调用提案的 execute() 函数执行更新。
注意事项
- 合约地址:
- 上面的 $TORN 和治理合约地址是假设的。你需要从 Tornado Cash 官方文档或 Etherscan 获取实际地址。
- 现有逻辑:
- 如果当前中继者惩罚机制与假设不同(例如没有直接扣除 $TORN),需要调整提案,修改相关合约(如 RelayerRegistry)。
- 审计:
- 在部署前,确保代码经过审计,避免引入漏洞。