3

Here is code snippet,

 function transfer(address _to, uint _value, bytes memory _data, string memory _custom_fallback) public returns (bool success) {

   if(isContract(_to)) {
       if (balanceOf(msg.sender) < _value) revert();
       balances[msg.sender] = safeSub(balanceOf(msg.sender), _value);
       balances[_to] = safeAdd(balanceOf(_to), _value);
       assert(_to.call.value(0)(bytes4(keccak256(_custom_fallback)), msg.sender, _value, _data));
       emit Transfer(msg.sender, _to, _value, _data);
    return true;
   }
   else {
       return transferToAddress(_to, _value, _data);
   }
}

I am currently working with Solidity Version ^0.5.1. What is the alternative and upgraded method to execute this assert function given below. And what is the main working of this assert() and their arguments?

assert(_to.call.value(0)(bytes4(keccak256(_custom_fallback)), msg.sender, _value, _data));

1 Answer 1

3

assert(_to.call.value(0)(bytes4(keccak256(_custom_fallback)), msg.sender, _value, _data));

  • what is the main working of this assert() and their arguments?

This assert is calling a function of _to (when it is a contract) passed as a parameter in transfer and checking the return value as true. bytes4(keccak256(_custom_fallback)) is used to select the function to execute and msg.sender, _value, _data are the parameter values to pass in calling function. value(0) signifies the sending of 0 wei with the call.

See related: Whats the difference between .call.value() and .call.value()()

  • What is the alternative and upgraded method to execute this assert function given below

You can use abi.encodeWithSignature(string memory signature, ...) returns (bytes memory) as:

_to.call.value(0)(abi.encodeWithSignature(_custom_fallback, msg.sender, _value, _data));

See related: https://solidity.readthedocs.io/en/v0.5.3/units-and-global-variables.html#abi-encoding-and-decoding-functions

1
  • But Right now I am working with ERC223 token transfer, in that case does Signature Encoding is really applicable? Previously I have used keccak256(abi.encodePacked()) for this encoding. But there is wrong syntax or structure I have, so It didn't worked with _to.call.value(0).
    – Rudrika
    Commented Feb 5, 2019 at 6:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.