我参加了 IDO,使用这个智能合约为我的硬币打上了烙印 https://bscscan.com/address/0x4e62210aacc9a979e9f20e8d14bc01b01365dc32#code
我不明白如何调用构造函数,从哪里调用。感觉就像您可以在 JavaScript(或其他)中调用合约并将参数传递给构造函数。如果是这样,那么事实证明第一个参数可以传递给任何绝对标记。代码中没有检查 IERC20 代币是这个特定的代币,而不是其他
代币
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "Ownable.sol";
import "IERC20.sol";
import "ERC20.sol";
import {SafeERC20} from "SafeERC20.sol";
import {SafeMath} from "SafeMath.sol";
contract A4Sale is Ownable {
using SafeERC20 for IERC20;
using SafeMath for uint256;
IERC20 private _token;
IERC20 private _currency;
uint256 public _cap;
uint256 private _rate = 1;
uint256 public startTime;
uint256 public releaseTime;
uint256 public claimTime;
uint256 public endTime;
uint256 private minDepositValue = 10 * 10 ** 18;
uint256 private minWithdrawValue = 1 * 10 ** 18;
uint256 private _unitsTotal = 0;
mapping(address => uint256) public _deposits;
event Deposit(address indexed, uint256 indexed, uint256 indexed);
event Withdraw(address indexed, uint256 indexed, uint256 indexed);
event TokenWithdrowed(address indexed, uint256 indexed);
constructor(
IERC20 token,
IERC20 currency,
uint256 cap,
uint256 _startTime,
uint256 _releaseTime,
uint256 _claimTime,
uint256 _endTime ) public
{
_token = token;
_currency = currency;
_cap = cap;
startTime = _startTime;
releaseTime = _releaseTime;
claimTime = _claimTime;
endTime = _endTime;
}
function rate() view public returns (uint256) {
return _rate;
}
function total() view public returns (uint256) {
return _unitsTotal;
}
// investor token balance
function balanceOf(address investor) view public returns (uint256) {
return _deposits[investor];
}
function deposit( uint256 value ) public {
_deposit(value);
}
function withdraw( uint256 value ) public {
_withdraw(value);
}
function withdrawTokens() public {
_withdrawTokens();
}
function withdrawIDO( uint256 value ) onlyOwner public {
require(claimTime <= block.timestamp, "IDO is active");
_unitsTotal = _unitsTotal.sub(value);
IERC20(_currency).transfer(msg.sender, value);
}
function _deposit( uint256 value ) internal
{
require(startTime <= block.timestamp && releaseTime > block.timestamp, "IDO is stopped");
require(value >= minDepositValue, "Not enough value");
_deposits[msg.sender] = _deposits[msg.sender].add(value);
_unitsTotal = _unitsTotal.add(value);
_rate = _unitsTotal.div(_cap);
IERC20(_currency).transferFrom(msg.sender, address(this), value);
emit Deposit(msg.sender, value, _rate);
}
function _withdraw( uint256 value ) internal
{
require(releaseTime <= block.timestamp && claimTime > block.timestamp, "No time for withdraw");
require(value <= _deposits[msg.sender] && value > minWithdrawValue, "Error withdraw value");
_deposits[msg.sender] = _deposits[msg.sender].sub(value);
_unitsTotal = _unitsTotal.sub(value);
_rate = _unitsTotal.div(_cap);
IERC20(_currency).transfer(msg.sender, value);
emit Withdraw(msg.sender, value, _rate);
}
function _withdrawTokens() internal
{
require(claimTime <= block.timestamp && endTime > block.timestamp, "No time for claime");
require(_deposits[msg.sender] > 0, "Zero tokens");
uint256 tokens = _deposits[msg.sender].div(_rate);
_deposits[msg.sender] = 0;
_token.transfer(msg.sender, tokens);
emit TokenWithdrowed(msg.sender, tokens);
}
}
我在一次主题对话中在推车中问道。他们说构造函数是在部署合约的阶段调用的,也就是在创建合约的阶段。事实证明(我想)如果我在创建合约的阶段不小心发送了错误的硬币,它们将被成功添加。
我认为我们需要创建一个函数来检查这是正确的令牌。您可以在构造函数中传递一些内容,但如果我们犯了错误,我们需要检查我们是否正在为所需的令牌初始化 IDO。创建一个函数来初始化 IDO,该函数会在智能合约中的每个函数上检查是否使用了所需的硬币。只有智能合约的创建者可以调用此函数,并且只有一次,如果它是所需的硬币。
在这种情况下,如果我们犯了错误,我们将有机会不创建新的智能合约。
如果您认为情况并非如此,请写下来。Solidity 是一种需要花钱测试代码的语言,我不想用钱来测试我所有的笑话:D