Solidity实现ETH转入自动发放ERC20代币及定价方案咨询
ERC20代币实现ETH自动兑换功能示例代码
嘿,我完全理解你想要实现的功能——用户给合约转ETH,自动按你设定的价格发放对应数量的ERC20代币对吧?作为非专业开发者,我尽量把代码写得简洁易懂,同时用经过安全审计的标准库来降低风险,下面是完整的示例代码,还加了详细注释帮你理解:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; // 引入OpenZeppelin的标准ERC20和Ownable合约,这些都是经过安全审计的 import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; // 我们的代币合约继承自ERC20和Ownable contract EthSwapToken is ERC20, Ownable { // 存储ETH到代币的兑换价格:单位是「每个wei ETH可兑换的代币最小单位数量」 // 举个例子:如果设置为1000,意味着1 wei ETH换1000 wei代币 → 1 ETH(1e18 wei)换1000个完整代币(假设代币小数位是18) uint256 public ethToTokenPrice; // 构造函数:初始化代币名称、符号,以及初始兑换价格 // 这里的初始价格设为1000,也就是1 ETH换1000代币 constructor() ERC20("EthSwapToken", "EST") Ownable(msg.sender) { ethToTokenPrice = 1000; } // 当合约收到ETH时自动触发的函数,处理兑换逻辑 receive() external payable { // 计算要发放的代币数量:收到的ETH数量(wei) × 兑换价格 uint256 tokenAmount = msg.value * ethToTokenPrice; // 给ETH转账者mint对应数量的代币 _mint(msg.sender, tokenAmount); } // 只有合约所有者能调用的函数,用来更新兑换价格 // 比如后续想调整1 ETH换2000代币,就调用这个函数传入2000 function setEthToTokenPrice(uint256 newPrice) external onlyOwner { ethToTokenPrice = newPrice; } }
关键细节解释:
- 为什么用OpenZeppelin? 作为非专业开发者,直接使用经过社区广泛验证和安全审计的标准库,能避免很多自己写代码可能出现的安全漏洞(比如整数溢出、权限问题等),Solidity 0.8+虽然自带溢出检查,但OpenZeppelin还提供了很多成熟的功能实现。
- 兑换价格的单位:这里的
ethToTokenPrice是「每个wei ETH能换的代币最小单位数量」,如果你的代币小数位不是默认的18,需要调整这个值的计算逻辑,确保兑换比例符合你的预期。 - receive函数:这是Solidity中专门用来处理ETH转账的函数,当用户直接给合约地址转ETH时,这个函数会自动执行,完成代币发放。
- Ownable权限控制:
setEthToTokenPrice函数加上了onlyOwner修饰符,只有部署合约的地址能修改价格,防止其他人随意调整兑换比例。
注意事项:
- 测试先行:部署到主网之前,一定要在以太坊测试网(比如Sepolia)上完整测试所有功能,确保转ETH后能正确收到代币,价格调整功能也正常工作。
- 安全意识:虽然用了标准库,但合约部署后就无法修改(除了我们设置的价格调整功能),所以部署前要仔细检查代码,确认逻辑符合你的需求。
- 代币小数位:如果你的代币需要设置不同的小数位(比如6位),可以在ERC20构造函数里添加第三个参数,比如
ERC20("EthSwapToken", "EST", 6),同时要对应调整ethToTokenPrice的数值,保证兑换比例正确。
内容的提问来源于stack exchange,提问作者Crypto Lover
相关产品推荐
相关产品推荐

