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));

Aniket
  • 3,545
  • 2
  • 20
  • 42
Rudrika
  • 407
  • 6
  • 17

1 Answers1

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

Aniket
  • 3,545
  • 2
  • 20
  • 42
  • 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 Feb 05 '19 at 06:31