GSN compatibility (#1880)

* switch to using Context internally

* add context import

* Add smoke test to make sure enabling GSN support works

* Update test/GSN/ERC721GSNRecipientMock.test.js

Co-Authored-By: Francisco Giordano <frangio.1@gmail.com>

* Upgrade truffle

* add missing awaits

* Revert "Upgrade truffle"

This reverts commit f9b0ba9019.
This commit is contained in:
Nicolás Venturo
2019-08-14 09:21:38 -03:00
committed by Francisco Giordano
parent f095b62856
commit d1158ea68c
30 changed files with 645 additions and 108 deletions

View File

@ -1,5 +1,6 @@
pragma solidity ^0.5.0;
import "../GSN/Context.sol";
import "../access/roles/SignerRole.sol";
import "../cryptography/ECDSA.sol";
@ -34,7 +35,7 @@ import "../cryptography/ECDSA.sol";
* the data in the signature much more complex.
* See https://ethereum.stackexchange.com/a/50616 for more details.
*/
contract SignatureBouncer is SignerRole {
contract SignatureBouncer is Context, SignerRole {
using ECDSA for bytes32;
// Function selectors are 4 bytes long, as documented in
@ -51,7 +52,7 @@ contract SignatureBouncer is SignerRole {
* @dev Requires that a valid signature of a signer was provided.
*/
modifier onlyValidSignature(bytes memory signature) {
require(_isValidSignature(msg.sender, signature), "SignatureBouncer: invalid signature for caller");
require(_isValidSignature(_msgSender(), signature), "SignatureBouncer: invalid signature for caller");
_;
}
@ -60,7 +61,7 @@ contract SignatureBouncer is SignerRole {
*/
modifier onlyValidSignatureAndMethod(bytes memory signature) {
// solhint-disable-next-line max-line-length
require(_isValidSignatureAndMethod(msg.sender, signature), "SignatureBouncer: invalid signature for caller and method");
require(_isValidSignatureAndMethod(_msgSender(), signature), "SignatureBouncer: invalid signature for caller and method");
_;
}
@ -69,7 +70,7 @@ contract SignatureBouncer is SignerRole {
*/
modifier onlyValidSignatureAndData(bytes memory signature) {
// solhint-disable-next-line max-line-length
require(_isValidSignatureAndData(msg.sender, signature), "SignatureBouncer: invalid signature for caller and data");
require(_isValidSignatureAndData(_msgSender(), signature), "SignatureBouncer: invalid signature for caller and data");
_;
}
@ -86,9 +87,10 @@ contract SignatureBouncer is SignerRole {
* @return bool
*/
function _isValidSignatureAndMethod(address account, bytes memory signature) internal view returns (bool) {
bytes memory msgData = _msgData();
bytes memory data = new bytes(_METHOD_ID_SIZE);
for (uint256 i = 0; i < data.length; i++) {
data[i] = msg.data[i];
data[i] = msgData[i];
}
return _isValidDataHash(keccak256(abi.encodePacked(address(this), account, data)), signature);
}
@ -99,11 +101,12 @@ contract SignatureBouncer is SignerRole {
* @return bool
*/
function _isValidSignatureAndData(address account, bytes memory signature) internal view returns (bool) {
require(msg.data.length > _SIGNATURE_SIZE, "SignatureBouncer: data is too short");
bytes memory msgData = _msgData();
require(msgData.length > _SIGNATURE_SIZE, "SignatureBouncer: data is too short");
bytes memory data = new bytes(msg.data.length - _SIGNATURE_SIZE);
bytes memory data = new bytes(msgData.length - _SIGNATURE_SIZE);
for (uint256 i = 0; i < data.length; i++) {
data[i] = msg.data[i];
data[i] = msgData[i];
}
return _isValidDataHash(keccak256(abi.encodePacked(address(this), account, data)), signature);