我已经签署了2份合同:
1。 ERC 827兼容令牌
function transferFrom(address _from, address _to, uint256 _value, bytes _data) public returns (bool) {
require(_to != address(this));
super.transferFrom(_from, _to, _value);
require(_to.call(_data));
return true;
}
2。上层方法将通过“_data”参数调用并传递一些数据的测试合同。
uint public data;
function setData(uint256 a) returns (bool) {
data = a;
Data(msg.sender, address(this), 10, a);
return true;
}
现在我试图测试user1调用transferFrom()的情况,该调用应该调用Test contract 2。
var abi = require('ethereumjs-abi');
const expectSuccess = async (promise) => {
if(isTestRPC()) {
/* handle TestRPC */
return (await promise)
} else {
/* handle everything else */
let ret = await promise
ret.receipt.status.should.be.equal("0x1")
return ret
}
}
it ('getData', async function() {
let token = await Token.at("token address");
let t = await Test.deployed();
let str = "getData(uint256)";
var encode = abi.simpleEncode(str,1)
await expectSuccess(token.transferFrom(a2,t.address,web3.toBigNumber(10),encode));});
注意:a2地址包含10个令牌,并且已通过之前的测试确认过。
上面的运行测试给出了错误 - >错误:处理事务时出现VM异常:还原。对令牌合同(1)和测试合同(2)进行的其他测试正在进行。
我真的很感激任何帮助!!提前谢谢......
答案 0 :(得分:1)
要使用transferFrom
,首先需要执行方法approve
以实际允许地址_to
花费_from
的帐户令牌,就像在ERC20令牌中一样。
使用
_spender
参数在_data
上执行函数,如果是。{ 功能结束成功允许_spender
退出您的 帐户多次,最高为_value
金额。如果这个功能是 再次调用它会用_value
覆盖当前的限额。
function approve(address _spender, uint256 _value, bytes _data) public returns (bool) {
require(_spender != address(this));
require(super.approve(_spender, _value));
require(_spender.call(_data));
return true;
}