Skip to content

airdrop-uno/solidity

Repository files navigation

ETH Distribution Contract

这是一个基于以太坊的ETH代币分发合约,支持存款、提现、转账、授权和批量分发等功能。

功能特点

1. 存款功能

  • 支持直接向合约发送ETH进行存款
  • 支持通过deposit()函数进行存款
  • 自动记录每个地址的存款余额
  • 记录合约总存款金额

2. 余额管理

  • 支持查询任意地址的存款余额
  • 实时更新存款记录
  • 防止超额提现

3. 提现功能

  • 存款人可以提取自己的全部余额
  • 支持将ETH转移到其他钱包地址
  • 合约部署者可以提取合约中的所有ETH

4. 授权功能

  • 支持授权其他地址使用自己的存款
  • 可查询授权额度
  • 被授权地址可以使用授权额度进行转账
  • 提现时自动清除所有授权

5. 批量分发

  • 支持一次性向多个地址分发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): 使用授权转账事件

安全特性

  1. 权限控制

    • 使用onlyOwner修饰器保护管理员功能
    • 提现功能仅允许存款人操作
    • 授权额度不能超过存款余额
  2. 安全检查

    • 地址有效性验证
    • 余额充足性检查
    • 授权额度检查
    • 转账成功验证
  3. 异常处理

    • 所有关键操作都有require检查
    • 转账失败自动回滚
    • 提现时自动清除所有授权

使用示例

  1. 存款
// 直接发送ETH到合约地址
// 或调用deposit函数
await contract.deposit({ value: ethers.utils.parseEther("1.0") });
  1. 查询余额
const balance = await contract.getBalance(userAddress);
console.log("Balance:", ethers.utils.formatEther(balance));
  1. 授权
// 授权其他地址使用自己的存款
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"));
  1. 提现
await contract.withdraw();
  1. 转账
await contract.transferTo(recipientAddress, ethers.utils.parseEther("0.5"));
  1. 批量分发
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")
});

注意事项

  1. 所有金额单位均为wei(1 ETH = 10^18 wei)
  2. 确保在调用合约前有足够的ETH余额
  3. 批量分发时确保发送的ETH总额大于或等于分发总额
  4. 授权金额不能超过存款余额
  5. 提现时会自动清除所有授权
  6. 建议在测试网络上充分测试后再部署到主网

许可证

MIT License

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published