这是一个基于以太坊的ETH代币分发合约,支持存款、提现、转账、授权和批量分发等功能。
- 支持直接向合约发送ETH进行存款
- 支持通过
deposit()
函数进行存款 - 自动记录每个地址的存款余额
- 记录合约总存款金额
- 支持查询任意地址的存款余额
- 实时更新存款记录
- 防止超额提现
- 存款人可以提取自己的全部余额
- 支持将ETH转移到其他钱包地址
- 合约部署者可以提取合约中的所有ETH
- 支持授权其他地址使用自己的存款
- 可查询授权额度
- 被授权地址可以使用授权额度进行转账
- 提现时自动清除所有授权
- 支持一次性向多个地址分发ETH
- 自动处理多余的ETH返还
- 完整的交易事件记录
function deposit() external payable
- 功能:向合约存入ETH
- 参数:无(通过msg.value发送ETH)
- 事件:触发
Deposited
事件
function getBalance(address account) external view returns (uint256)
- 功能:查询指定地址的存款余额
- 参数:account - 要查询的地址
- 返回:该地址的ETH余额(单位:wei)
function approve(address spender, uint256 amount) external
- 功能:授权其他地址使用自己的存款
- 参数:
- spender: 被授权地址
- amount: 授权金额(单位:wei)
- 事件:触发
Approved
事件
function allowance(address owner, address spender) external view returns (uint256)
- 功能:查询授权额度
- 参数:
- owner: 授权人地址
- spender: 被授权人地址
- 返回:授权额度(单位:wei)
function transferFrom(address from, address to, uint256 amount) external
- 功能:使用授权额度进行转账
- 参数:
- from: 授权人地址
- to: 接收地址
- amount: 转账金额(单位:wei)
- 事件:触发
TransferFrom
事件
function withdraw() external
- 功能:提取调用者的全部存款余额
- 权限:仅存款人可调用
- 事件:触发
Withdrawn
事件
function transferTo(address to, uint256 amount) external
- 功能:将ETH转移到其他地址
- 参数:
- to: 接收地址
- amount: 转账金额(单位:wei)
- 事件:触发
Transferred
事件
function withdrawAll() external
- 功能:提取合约中的所有ETH
- 权限:仅合约部署者可调用
- 事件:触发
Withdrawn
事件
function distribute(address[] calldata recipients, uint256[] calldata amounts) external payable
- 功能:向多个地址分发ETH
- 参数:
- recipients: 接收地址数组
- amounts: 对应的金额数组
- 事件:触发
DistributionCompleted
事件
Deposited(address indexed depositor, uint256 amount)
: 存款事件Withdrawn(address indexed to, uint256 amount)
: 提现事件Transferred(address indexed from, address indexed to, uint256 amount)
: 转账事件DistributionCompleted(address[] recipients, uint256[] amounts)
: 分发完成事件Approved(address indexed owner, address indexed spender, uint256 amount)
: 授权事件TransferFrom(address indexed spender, address indexed from, address indexed to, uint256 amount)
: 使用授权转账事件
-
权限控制
- 使用
onlyOwner
修饰器保护管理员功能 - 提现功能仅允许存款人操作
- 授权额度不能超过存款余额
- 使用
-
安全检查
- 地址有效性验证
- 余额充足性检查
- 授权额度检查
- 转账成功验证
-
异常处理
- 所有关键操作都有require检查
- 转账失败自动回滚
- 提现时自动清除所有授权
- 存款
// 直接发送ETH到合约地址
// 或调用deposit函数
await contract.deposit({ value: ethers.utils.parseEther("1.0") });
- 查询余额
const balance = await contract.getBalance(userAddress);
console.log("Balance:", ethers.utils.formatEther(balance));
- 授权
// 授权其他地址使用自己的存款
await contract.approve(spenderAddress, ethers.utils.parseEther("0.5"));
// 查询授权额度
const allowance = await contract.allowance(ownerAddress, spenderAddress);
console.log("Allowance:", ethers.utils.formatEther(allowance));
// 使用授权额度转账
await contract.transferFrom(ownerAddress, recipientAddress, ethers.utils.parseEther("0.3"));
- 提现
await contract.withdraw();
- 转账
await contract.transferTo(recipientAddress, ethers.utils.parseEther("0.5"));
- 批量分发
const recipients = [address1, address2, address3];
const amounts = [
ethers.utils.parseEther("0.1"),
ethers.utils.parseEther("0.2"),
ethers.utils.parseEther("0.3")
];
await contract.distribute(recipients, amounts, {
value: ethers.utils.parseEther("0.6")
});
- 所有金额单位均为wei(1 ETH = 10^18 wei)
- 确保在调用合约前有足够的ETH余额
- 批量分发时确保发送的ETH总额大于或等于分发总额
- 授权金额不能超过存款余额
- 提现时会自动清除所有授权
- 建议在测试网络上充分测试后再部署到主网
MIT License