ERC-20 智能合约:支持 TRX 和 USDT 兑换
以下是一个支持 TRX 和 USDT 兑换的 ERC-20 智能合约的示例代码:
pragma solidity ^0.8.14;
interface IChainlink {
function getLatestPrice() external view returns (uint256);
}
contract ERC20 {
string public name;
string public symbol;
uint8 public decimals;
uint256 public totalSupply;
address public owner;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
constructor(string memory _name, string memory _symbol, uint8 _decimals, uint256 _initialSupply) {
name = _name;
symbol = _symbol;
decimals = _decimals;
totalSupply = _initialSupply * 10 ** uint256(_decimals);
owner = msg.sender;
balanceOf[owner] = totalSupply;
emit Transfer(address(0), owner, totalSupply);
}
modifier onlyOwner() {
require(msg.sender == owner, 'Only contract owner can call this function');
_;
}
function transfer(address _to, uint256 _value) external returns (bool success) {
require(balanceOf[msg.sender] >= _value, 'Insufficient balance');
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
emit Transfer(msg.sender, _to, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) external returns (bool success) {
require(balanceOf[_from] >= _value, 'Insufficient balance');
require(allowance[_from][msg.sender] >= _value, 'Insufficient allowance');
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
allowance[_from][msg.sender] -= _value;
emit Transfer(_from, _to, _value);
return true;
}
function approve(address _spender, uint256 _value) external returns (bool success) {
allowance[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function depositTRX() external payable {
balanceOf[address(this)] += msg.value;
}
function depositUSDT(uint256 _amount) external {
require(_amount > 0, 'Invalid amount');
// 使用 Chainlink 查询 USDT 与 TRX 的兑换价格
uint256 trxAmount = _amount * getUSDTtoTRXPrice();
require(balanceOf[address(this)] >= trxAmount, 'Insufficient TRX balance');
balanceOf[address(this)] -= trxAmount;
balanceOf[msg.sender] += trxAmount;
emit Transfer(address(this), msg.sender, trxAmount);
}
function withdrawTRX(uint256 _amount) external onlyOwner {
require(_amount > 0, 'Invalid amount');
require(balanceOf[address(this)] >= _amount, 'Insufficient TRX balance');
balanceOf[address(this)] -= _amount;
payable(owner).transfer(_amount);
}
function withdrawUSDT(uint256 _amount) external onlyOwner {
require(_amount > 0, 'Invalid amount');
require(balanceOf[address(this)] >= _amount, 'Insufficient USDT balance');
balanceOf[address(this)] -= _amount;
emit Transfer(address(this), owner, _amount);
}
function getUSDTtoTRXPrice() private view returns (uint256) {
// 使用 Chainlink 的合约地址来查询当前 USDT 与 TRX 的兑换价格
// 假设 Chainlink 合约地址为 0x1234567890
IChainlink chainlink = IChainlink(0x1234567890);
return chainlink.getLatestPrice();
}
}
请注意,此合约仅是一个示例,可能需要进行进一步的测试和优化。在部署和使用合约时,请确保了解和遵守相关的法律和监管要求。
原文地址: https://www.cveoy.top/t/topic/pdRc 著作权归作者所有。请勿转载和采集!