Я читаю исходный код этого токена erc20:
https://etherscan.io/address/0xfdfd5db568f2ecf9b06a16116b9201b0500735b4#code
код такой:
contract VelixIDToken is ReleasableToken, BurnableToken {
...
function transfer(address _to, uint _value) public returns (bool success) {
// Call StandardToken.transfer()
CanTransferChecked(released || transferAgents[msg.sender], msg.sender, transferAgents[msg.sender], released);
if (released || transferAgents[msg.sender]) {
return super.transfer(_to, _value);
} else {
return false;
}
}
...
}
contract ReleasableToken is ERC20, Ownable {
...
function transfer(address _to, uint _value) public returns (bool success) {
// Call StandardToken.transfer()
CanTransferChecked(released || transferAgents[msg.sender], msg.sender, transferAgents[msg.sender], released);
if (released || transferAgents[msg.sender]) {revert();}
return super.transfer(_to, _value);
}
...
}
в моем понимании, передача токена() никогда не может произойти, released
сейчас это ложь, поэтому в VelixIDToken только TransferAgent может пройти проверку:
if (released || transferAgents[msg.sender])
,
ну, в ReleasableToken вызов вернется, потому что:
if (released || transferAgents[msg.sender]) {revert();}
.
но я вижу успешную передачу токена на etherscan:
https://etherscan.io/tx/0xfa76397fc5d1d5e155fa969f56095d4ecdad4dc90a64798ca79fa2773923fb07
так где я не прав?
пс. Я даже задался вопросом, может ли исходный код, загруженный на etherscan, быть неверным?
Я считаю, что это super.transfer
относится к transfer
реализации в BurnableToken
, а не transfer
в ReleasableToken
. Из https://solidity.readthedocs.io/en/v0.4.24/contracts.html#multiple-inheritance-and-linearization :
Особенно важен порядок, в котором базовые классы даны в директиве is: вы должны перечислить прямые базовые контракты в порядке от «наиболее похожих на базовые» до «наиболее производных».