-
Notifications
You must be signed in to change notification settings - Fork 453
Open
Description
pragma solidity ^0.5.10;
interface ITRC20 {
function transferFrom(address from, address to, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function balanceOf(address owner) external view returns (uint256);
}
contract TokenSwap {
ITRC20 public tokenA; // Token user sends
ITRC20 public tokenB; // Token user receives (e.g. USDT TRC20)
address public owner;
uint256 public rate; // Conversion rate with 3 decimals. Example: rate=800 means 1 tokenA = 0.8 tokenB
event SwapExecuted(address indexed user, uint256 amountTokenA, uint256 amountTokenB);
constructor(address _tokenA, address _tokenB, uint256 _rate, address _owner) public {
tokenA = ITRC20(_tokenA);
tokenB = ITRC20(_tokenB);
rate = _rate;
owner = _owner;
}
function swap(uint256 amountTokenA) public {
require(amountTokenA > 0, "Amount must be greater than zero");
uint256 amountTokenB = (amountTokenA * rate) / 1000;
require(tokenB.balanceOf(address(this)) >= amountTokenB, "Insufficient tokenB balance in contract");
require(tokenA.transferFrom(msg.sender, address(this), amountTokenA), "Transfer of tokenA failed");
require(tokenB.transfer(msg.sender, amountTokenB), "Transfer of tokenB failed");
emit SwapExecuted(msg.sender, amountTokenA, amountTokenB);
}
function withdrawTokens(address tokenAddress, uint256 amount) public {
require(msg.sender == owner, "Only owner can withdraw tokens");
ITRC20(tokenAddress).transfer(owner, amount);
}
function updateRate(uint256 newRate) public {
require(msg.sender == owner, "Only owner can update rate");
rate = newRate;
}
}
Metadata
Metadata
Assignees
Labels
No labels