ethereum - 将 ERC20 代币从一个智能合约发送到另一个智能合约的问题
问题描述
我有一个 ERC20 代币(加密货币)并想向 VulnerableTokenSale 智能合约发送一些代币,但它显示代币余额为零(get_balanceToken 函数)。有可能这样做吗?我在以太坊网站上使用 Remix。
contract VulnerableTokenSale {
address public wallet;
uint256 rate;
ERC20 public token;
address public owner;
mapping(address => uint256) public balances;
address [] beneficiaries;
modifier onlyOwner() {
require(msg.sender == owner, "not owner");
_;
}
constructor(address _wallet, uint256 _rate, ERC20 _token)
public {
wallet = _wallet;
rate = _rate;
token = _token;
owner = msg.sender;
}
function sendTokensWithRatio(uint256 _numerator, uint256 _denominator) external onlyOwner {
require(_numerator <= _denominator);
for(uint256 i = 0; i < beneficiaries.length; i++){
address beneficiary = beneficiaries[i];
uint256 balance = balances[beneficiary];
if(balance > 0) {
uint256 amount = balance * _numerator;
amount = amount / _denominator;
balances[beneficiary] = balance - amount;
token.transfer(beneficiary, amount);
}
}
}
function purchaseTokens() public payable{
uint256 weiAmount = msg.value;
uint256 _tokenAmount = weiAmount * rate;
beneficiaries.push(msg.sender);
balances[msg.sender] = balances[msg.sender] + _tokenAmount;
}
}
解决方案
认为您的构造函数略有错误,我从未见过有人直接接受 ERC 令牌。
我的合同中有这样的内容:
constructor(address _wallet, uint256 _rate, address _tokenAddress) public {
wallet = _wallet;
rate = _rate;
token = ERC20(_tokenAddress);
owner = msg.sender;
}
请注意,您需要 ERC20 接口才能进行上述操作:
interface ERC20 {
function totalSupply() public view returns (uint);
function balanceOf(address tokenOwner) public view returns (uint balance);
function allowance(address tokenOwner, address spender) public view returns (uint remaining);
function transfer(address to, uint tokens) public returns (bool success);
function approve(address spender, uint tokens) public returns (bool success);
function transferFrom(address from, address to, uint tokens) public returns (bool success);
// optional
function name() external view returns (string);
function symbol() external view returns (string);
function decimals() external view returns (string);
event Transfer(address indexed from, address indexed to, uint tokens);
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
推荐阅读
- c# - SimpleInjector 在使用泛型接口时注入一个空集合
- javascript - 导致组件中未定义行为的路由
- java - 垃圾回收期间何时调用 finalize()?
- laravel - 哪个文件处理 Laravel 中的重定向代码
- php - WordPress:重置密码总是无效的密钥
- c# - 执行安装在全局 nuget 缓存中的 NetCoreApp
- elasticsearch - Elasticsearch 最小聚合返回 null
- python - 如何通过 make_pipeline() 标准化训练和测试数据集
- r - 如何根据最后一天的成交量数据的四分位值对股票列表进行子集化以获取新列表
- javascript - 无法从 JavaScript 中的 html 计算器获取按钮