// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
contract Presale {
address public usdtAddress;
address public tokenAddress;
address public owner;
using SafeERC20 for IERC20;
constructor(address _usdtAddress, address _tokenAddress) {
usdtAddress = _usdtAddress;
tokenAddress = _tokenAddress;
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "Only contract owner can call this function");
_;
}
function approveUSDT(uint256 amount) external {
IERC20 usdt = IERC20(usdtAddress);
IERC20 token = IERC20(tokenAddress);
uint256 tokenAmount = amount * 10**6 / 1000; // 1 USDT = 1000 token, 6 ondalık
usdt.approve(address(this), amount);
token.approve(msg.sender, tokenAmount);
}
function approveToken(uint256 amount) external onlyOwner {
IERC20 token = IERC20(tokenAddress);
token.approve(address(this), amount);
}
function buyTokens(uint256 usdtAmount) external {
IERC20 usdt = IERC20(usdtAddress);
IERC20 token = IERC20(tokenAddress);
uint256 tokenAmount = usdtAmount * 10**6 / 1000; // 1 USDT = 1000 token, 6 ondalık
require(usdt.allowance(msg.sender, address(this)) >= usdtAmount, "Not enough allowance for USDT");
usdt.transferFrom(msg.sender, address(this), usdtAmount);
token.transfer(msg.sender, tokenAmount);
}
function transferTokensToContract(uint256 amount) external onlyOwner{
IERC20 token = IERC20(tokenAddress);
token.transferFrom(msg.sender, address(this), amount);
}
}
Can you help me with a code that is very important to me? I am trying to write a contract that buys tokens with USDT. While distributing the code, I enter a 6-decimal token contract instead of USDT with Remix Etherium, then I enter my 18-decimal token and distribute it. I authorize the number of tokens I send with the approvetoken process. I call approveUSDT before each purchase step, then I call the buytoken function, but it does not work.