A simple test to show that the answer is "sendMessage()"
.
Solidity Contract:
pragma solidity 0.6.12;
contract MyContract {
uint256 private constant SUCCESS = 42;
uint256 private constant FAILURE = 84;
function sendMessage() external pure returns (uint256) {
return SUCCESS;
}
function test(bytes4 funcSelector) external view returns (uint256) {
bytes memory data = abi.encodeWithSelector(funcSelector);
(bool success, bytes memory returnData) = address(this).staticcall(data);
if (success && returnData.length == 32)
return abi.decode(returnData, (uint256));
return FAILURE;
}
}
Truffle 5.x Script:
contract("MyContract", () => {
it("test", async () => {
const myContract = await artifacts.require("MyContract").new();
const success = await myContract.test(web3.utils.keccak256("sendMessage()"));
const failure = await myContract.test(web3.utils.keccak256("sendMessage"));
console.log(success.toString()); // prints 42
console.log(failure.toString()); // prints 84
});
});
Here is a simpler way to do it, without even interacting with a contract:
const Web3 = require("web3");
const web3 = new Web3();
const abi = [{
"inputs":[],
"name":"sendMessage",
"outputs":[],
"stateMutability":"pure",
"type":"function"
}];
const contract = new web3.eth.Contract(abi);
console.log(Web3.utils.keccak256("sendMessage").slice(0, 10));
console.log(Web3.utils.keccak256("sendMessage()").slice(0, 10));
for (const method of contract._jsonInterface)
if (method.name == "sendMessage")
console.log(method.signature);
The printout is:
0x736c24a9
0xe5aed28a
0xe5aed28a
"sendMessage()"