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:
committed by
Francisco Giordano
parent
f095b62856
commit
d1158ea68c
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user