This is advanced topic. See http://solidity.readthedocs.io/en/v0.4.21/types.html#address
call, delegatecall & callcode
bytes4(keccak256("functionName(uint256)"))
call
delegatecall
callcode (deprecated)
pragma solidity ^0.4.17;
contract Markable {
uint256 mark;
function getMark() view public returns (uint256) {
return mark;
}
function setMark(uint256 _mark) public {
mark = _mark;
}
}
contract Markable2 {
string mark2;
function getMark2() view public returns (string) {
return mark2;
}
function setMark2(string _mark) public {
mark2 = _mark;
}
}
contract SomeContract is Markable, Markable2 {
event callMeMaybeEvent(address _from);
function callMeMaybe(uint256 _mark) payable public {
mark = _mark;
emit callMeMaybeEvent(this);
}
}
contract ThatCallsSomeContract is Markable, Markable2 {
event callResult(string desc, bool succ);
function callTheOtherContract(address _contractAddress, uint256 mark1, uint256 mark2, string mark3) public {
bool s1 = _contractAddress.call(bytes4(keccak256("callMeMaybe(uint256)")), mark1);
emit callResult("first",s1);
bool s2 = _contractAddress.delegatecall(bytes4(keccak256("callMeMaybe(uint256)")), mark2);
emit callResult("second", s2);
SomeLib.calledSomeLibFun(mark3);
}
}
library SomeLib {
event calledSomeLib(address _from);
function calledSomeLibFun(string _mark) public {
Markable2(this).setMark2(_mark);
emit calledSomeLib(this);
}
}