来自transferFrom合同接口的ERC20方法:
function transferFrom(address _from, address _to, uint _value) public;我的合同中的transferFrom函数:
function transferFrom(address _from, address _to, uint _value) public returns (bool) {
token.transferFrom(_from, _to, _value);
return true;
}transferFromOneToMany函数与for循环transferFrom函数
function transferFromOneToMany(address _from, address[] memory _receivers, uint[] memory _values) public onlyOwner returns (bool) {
require(_receivers.length == _values.length && _receivers.length >= 1);
for (uint j = 0; j < _receivers.length; j++) {
token.transferFrom(_from, _receivers[j], _values[j]);
}
return true;
}transferFrom函数工作良好,我收到了事务的确认(事件转移)
transferFromOneToMany不太好,我获得了成功,但是事务没有传输事件,例如0x501d19e013defcc6cc1808f75ea0cca575ab8bfb26d96a1869b4671da743e44b
发布于 2020-04-07 12:33:57
您的代码中至少有两个主要问题可以解释为什么它不能工作,但到现在为止,我确实需要token变量所引用的智能协议的源代码。以下是问题所在:
token.transferFrom函数返回的值。可能返回的值如果在某些情况下是false,这意味着传输失败。transferFrom函数没有任何访问控制,这意味着任何人都可以在盗取令牌时调用它。虽然第二个问题本身不能导致传输失败,但我认为您误解了transferFrom函数是如何工作的。下面是一个场景:
transferFrom,要求它把一些代币从鲍勃转到卡罗尔。我假设在步骤4和6中,应该有Alice而不是您的智能契约,这样整个模式才能正常工作。在当前的实现中,任何人都可以调用智能契约的transferFrom函数,请求将Bob的令牌传输到任意地址,而且,由于Alice的地址从未被验证,这些令牌实际上将被窃取。
因此,在您的情况下,失败的传输可能是由于Bob允许Alice接收他的令牌,而token智能契约检查Bob是否允许您的智能契约接收它们。
好的。我查看了您的事务,您似乎已经向transferFromOneToMany传递了以下值:
_from: 0x18c7abf493c747f39ce006abeb9bd6d2592e833e
_receivers: [
0xb7a5329bcb48308e3fba671dfe7e0f6477b1f759,
0xb7a5329bcb48308e3fba671dfe7e0f6477b1f759
]
_values: [949999, 50000]您的合同地址是0x14a108a349cde4cb9019672f2489b003dc393049。令牌智能协议的地址是0xdAC17F958D2ee523a2206206994597C13D831ec7,您已经从以下地址发送了事务:0x11b202de5b68ea66610b571b028dcca7743b64bc,该地址是智能契约的所有者。
因此,要使您的传输成功,_from地址的所有者应该允许您的智能契约至少接收999999个令牌。然而,_owner: 0x18c7abf493c747f39ce006abeb9bd6d2592e833e和_spender: 0x14a108a349cde4cb9019672f2489b003dc393049的实际免税额为零。这就是你的传输失败的原因。
https://ethereum.stackexchange.com/questions/82228
复制相似问题