anchor.diff:            address(this) // Prevents replays in multiple recipients
         );
         if (keccak256(blob).toEthSignedMessageHash().recover(approvalData) == _trustedSigner) {
  -          return _confirmRelayedCall();
  +          return _approveRelayedCall();
         } else {
  -          return _declineRelayedCall(uint256(GSNRecipientSignedDataErrorCodes.INVALID_SIGNER));
  +          return _rejectRelayedCall(uint256(GSNRecipientSignedDataErrorCodes.INVALID_SIGNER));
         }
     }
   ----
  
positive.code: [source,solidity]
  ----
  
    return _confirmRelayedCall();
  
    // Defined on base class GSNBouncerBase
    // uint256 constant private RELAYED_CALL_ACCEPTED = 0;
    // function _confirmRelayedCall(bytes memory context) internal pure returns (uint256, bytes memory) {
    //    return (RELAYED_CALL_ACCEPTED, context);
    // }
  ----
  
negative.code:     returns (uint256, bytes memory)
  {
      if (_token.balanceOf(from) < maxPossibleCharge) {
          return _rejectRelayedCall(uint256(GSNBouncerERC20FeeErrorCodes.INSUFFICIENT_BALANCE));
      } else if (_token.allowance(from, address(this)) < maxPossibleCharge) {
          return _rejectRelayedCall(uint256(GSNBouncerERC20FeeErrorCodes.INSUFFICIENT_ALLOWANCE));
      }
  
      return _approveRelayedCall(abi.encode(from, maxPossibleCharge, transactionFee, gasPrice));
  }
  ----
  
  