我有两个基本合同:一个是代币,第二个是出售。
代币合约:
contract MyToken is StandardToken, Ownable {
string public constant name = "My Sample Token";
string public constant symbol = "MST";
uint32 public constant decimals = 18;
function MyToken(uint _totalSupply) {
require (_totalSupply > 0);
totalSupply = _totalSupply;
balances[msg.sender] = totalSupply;
}
}
销售合同
contract Sale {
address owner;
address public founderAddress;
uint256 public constant foundersAmount = 50;
MyToken public token = new MyToken(1000);
uint256 public issuedTokensAmount = 0;
function Sale() {
owner = msg.sender;
founderAddress = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
token.transfer(founderAddress, foundersAmount);
}
function() external payable {
token.transfer(msg.sender, 1);
owner.transfer(msg.value);
}
}
StandardToken和Ownable都是来自 OpenZeppelin 存储库的标准实现。完整的合同来源可在此处获得。
所以基本上在我的销售合同中,我创建了一个具有固定供应量的代币合同实例,并将所有代币分配给调用者。然后我将一些代币转移到创始人地址。当我尝试向销售合约发送一些以太坊时,我试图将我的一些代币转移给发送者(在 Remix 浏览器中运行所有代码,我创建了一个销售合约实例并调用“回退”方法指定一些以太币数量)。但是,这会失败并显示“执行期间出现异常。(操作码无效)。请调试事务以获取更多信息。” 信息。调试时我所能看到的只是代码在支付方法中失败:
token.transfer(msg.sender, 1);
我看不到确切的原因,因为我无法进入此方法并查看内部发生的情况。
有趣的是,当我在销售合同构造函数中删除对令牌实例的传输方法的调用时 - 代码似乎运行良好,没有任何异常。
我错过了什么?