pragma solidity >=0.4.22 <0.6.0; import "remix_tests.sol"; // this import is automatically injected by Remix. contract test { bytes32 public constant DOMAIN_SEPARATOR; bytes4 public constant XADD_IDENTIFIER; address private constant FROM = ; uint8 private constant V = ; bytes32 private constant R = ; bytes32 private constant S = ; uint private constant Y = 15; uint private constant Z = 9; uint public x; constructor() public { DOMAIN_SEPARATOR = keccak256(abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes("test")), keccak256(bytes("1")), 1, FROM )); XADD_IDENTIFIER = ; x = 7; } function metaTx () public { bytes message = abi.encodeWithSignature("xAdd(uint,uint)", Y, Z); bytes32 digest = keccak256(abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256(message) )); metaRx (FROM, message, V,R,S); } function metaRx (address from, bytes memory message, uint8 v, bytes32 r, bytes32 s /*nonce*/) public { bytes32 digest = keccak256(abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256(message) )); require( address(this) == ecrecover(digest, v,r,s) ); // skipped: check nonce & increment nonce // *** parse message and call corresponding function (bytes4 methodIdentifier, bytes paramPacked) = abi.decode(message); require ( methodIdentifier == XADD_IDENTIFIER ); (uint y, uint z) = abi.decode(paramPacked); xAdd(y, z); } function xAdd (uint y, uint z) internal { x = x*y + z; } }
0.4.18