Merge branch 'solc-0.7' into solc-0.8
This commit is contained in:
@ -2,23 +2,4 @@
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
/*
|
||||
* @dev Provides information about the current execution context, including the
|
||||
* sender of the transaction and its data. While these are generally available
|
||||
* via msg.sender and msg.data, they should not be accessed in such a direct
|
||||
* manner, since when dealing with GSN meta-transactions the account sending and
|
||||
* paying for execution may not be the actual sender (as far as an application
|
||||
* is concerned).
|
||||
*
|
||||
* This contract is only required for intermediate, library-like contracts.
|
||||
*/
|
||||
abstract contract Context {
|
||||
function _msgSender() internal view virtual returns (address) {
|
||||
return msg.sender;
|
||||
}
|
||||
|
||||
function _msgData() internal view virtual returns (bytes memory) {
|
||||
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
|
||||
return msg.data;
|
||||
}
|
||||
}
|
||||
import "../utils/Context.sol";
|
||||
|
||||
@ -2,9 +2,9 @@
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../utils/Context.sol";
|
||||
import "./IRelayRecipient.sol";
|
||||
import "./IRelayHub.sol";
|
||||
import "./Context.sol";
|
||||
|
||||
/**
|
||||
* @dev Base GSN recipient contract: includes the {IRelayRecipient} interface
|
||||
@ -35,7 +35,7 @@ abstract contract GSNRecipient is IRelayRecipient, Context {
|
||||
/**
|
||||
* @dev Returns the address of the {IRelayHub} contract for this recipient.
|
||||
*/
|
||||
function getHubAddr() public view override returns (address) {
|
||||
function getHubAddr() public view virtual override returns (address) {
|
||||
return _relayHub;
|
||||
}
|
||||
|
||||
@ -62,7 +62,7 @@ abstract contract GSNRecipient is IRelayRecipient, Context {
|
||||
*/
|
||||
// This function is view for future-proofing, it may require reading from
|
||||
// storage in the future.
|
||||
function relayHubVersion() public view returns (string memory) {
|
||||
function relayHubVersion() public view virtual returns (string memory) {
|
||||
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
|
||||
return "1.0.0";
|
||||
}
|
||||
@ -73,7 +73,7 @@ abstract contract GSNRecipient is IRelayRecipient, Context {
|
||||
* Derived contracts should expose this in an external interface with proper access control.
|
||||
*/
|
||||
function _withdrawDeposits(uint256 amount, address payable payee) internal virtual {
|
||||
IRelayHub(_relayHub).withdraw(amount, payee);
|
||||
IRelayHub(getHubAddr()).withdraw(amount, payee);
|
||||
}
|
||||
|
||||
// Overrides for Context's functions: when called from RelayHub, sender and
|
||||
@ -88,7 +88,7 @@ abstract contract GSNRecipient is IRelayRecipient, Context {
|
||||
* IMPORTANT: Contracts derived from {GSNRecipient} should never use `msg.sender`, and use {_msgSender} instead.
|
||||
*/
|
||||
function _msgSender() internal view virtual override returns (address) {
|
||||
if (msg.sender != _relayHub) {
|
||||
if (msg.sender != getHubAddr()) {
|
||||
return msg.sender;
|
||||
} else {
|
||||
return _getRelayedCallSender();
|
||||
@ -102,7 +102,7 @@ abstract contract GSNRecipient is IRelayRecipient, Context {
|
||||
* IMPORTANT: Contracts derived from {GSNRecipient} should never use `msg.data`, and use {_msgData} instead.
|
||||
*/
|
||||
function _msgData() internal view virtual override returns (bytes memory) {
|
||||
if (msg.sender != _relayHub) {
|
||||
if (msg.sender != getHubAddr()) {
|
||||
return msg.data;
|
||||
} else {
|
||||
return _getRelayedCallData();
|
||||
@ -162,7 +162,7 @@ abstract contract GSNRecipient is IRelayRecipient, Context {
|
||||
* @dev Return this in acceptRelayedCall to proceed with the execution of a relayed call. Note that this contract
|
||||
* will be charged a fee by RelayHub
|
||||
*/
|
||||
function _approveRelayedCall() internal pure returns (uint256, bytes memory) {
|
||||
function _approveRelayedCall() internal pure virtual returns (uint256, bytes memory) {
|
||||
return _approveRelayedCall("");
|
||||
}
|
||||
|
||||
@ -171,14 +171,14 @@ abstract contract GSNRecipient is IRelayRecipient, Context {
|
||||
*
|
||||
* This overload forwards `context` to _preRelayedCall and _postRelayedCall.
|
||||
*/
|
||||
function _approveRelayedCall(bytes memory context) internal pure returns (uint256, bytes memory) {
|
||||
function _approveRelayedCall(bytes memory context) internal pure virtual returns (uint256, bytes memory) {
|
||||
return (_RELAYED_CALL_ACCEPTED, context);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Return this in acceptRelayedCall to impede execution of a relayed call. No fees will be charged.
|
||||
*/
|
||||
function _rejectRelayedCall(uint256 errorCode) internal pure returns (uint256, bytes memory) {
|
||||
function _rejectRelayedCall(uint256 errorCode) internal pure virtual returns (uint256, bytes memory) {
|
||||
return (_RELAYED_CALL_REJECTED + errorCode, "");
|
||||
}
|
||||
|
||||
@ -186,7 +186,7 @@ abstract contract GSNRecipient is IRelayRecipient, Context {
|
||||
* @dev Calculates how much RelayHub will charge a recipient for using `gas` at a `gasPrice`, given a relayer's
|
||||
* `serviceFee`.
|
||||
*/
|
||||
function _computeCharge(uint256 gas, uint256 gasPrice, uint256 serviceFee) internal pure returns (uint256) {
|
||||
function _computeCharge(uint256 gas, uint256 gasPrice, uint256 serviceFee) internal pure virtual returns (uint256) {
|
||||
// The fee is expressed as a percentage. E.g. a value of 40 stands for a 40% fee, so the recipient will be
|
||||
// charged for 1.4 times the spent amount.
|
||||
return (gas * gasPrice * (100 + serviceFee)) / 100;
|
||||
|
||||
@ -35,15 +35,15 @@ contract GSNRecipientERC20Fee is GSNRecipient {
|
||||
/**
|
||||
* @dev Returns the gas payment token.
|
||||
*/
|
||||
function token() public view returns (IERC20) {
|
||||
return IERC20(_token);
|
||||
function token() public view virtual returns (__unstable__ERC20Owned) {
|
||||
return _token;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Internal function that mints the gas payment token. Derived contracts should expose this function in their public API, with proper access control mechanisms.
|
||||
*/
|
||||
function _mint(address account, uint256 amount) internal virtual {
|
||||
_token.mint(account, amount);
|
||||
token().mint(account, amount);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -66,7 +66,7 @@ contract GSNRecipientERC20Fee is GSNRecipient {
|
||||
override
|
||||
returns (uint256, bytes memory)
|
||||
{
|
||||
if (_token.balanceOf(from) < maxPossibleCharge) {
|
||||
if (token().balanceOf(from) < maxPossibleCharge) {
|
||||
return _rejectRelayedCall(uint256(GSNRecipientERC20FeeErrorCodes.INSUFFICIENT_BALANCE));
|
||||
}
|
||||
|
||||
@ -83,7 +83,7 @@ contract GSNRecipientERC20Fee is GSNRecipient {
|
||||
(address from, uint256 maxPossibleCharge) = abi.decode(context, (address, uint256));
|
||||
|
||||
// The maximum token charge is pre-charged from the user
|
||||
_token.safeTransferFrom(from, address(this), maxPossibleCharge);
|
||||
token().safeTransferFrom(from, address(this), maxPossibleCharge);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -102,7 +102,7 @@ contract GSNRecipientERC20Fee is GSNRecipient {
|
||||
actualCharge = actualCharge - overestimation;
|
||||
|
||||
// After the relayed call has been executed and the actual charge estimated, the excess pre-charge is returned
|
||||
_token.safeTransfer(from, maxPossibleCharge - actualCharge);
|
||||
token().safeTransfer(from, maxPossibleCharge - actualCharge);
|
||||
}
|
||||
}
|
||||
|
||||
@ -119,12 +119,12 @@ contract __unstable__ERC20Owned is ERC20, Ownable {
|
||||
constructor(string memory name, string memory symbol) ERC20(name, symbol) { }
|
||||
|
||||
// The owner (GSNRecipientERC20Fee) can mint tokens
|
||||
function mint(address account, uint256 amount) public onlyOwner {
|
||||
function mint(address account, uint256 amount) public virtual onlyOwner {
|
||||
_mint(account, amount);
|
||||
}
|
||||
|
||||
// The owner has 'infinite' allowance for all token holders
|
||||
function allowance(address tokenOwner, address spender) public view override returns (uint256) {
|
||||
function allowance(address tokenOwner, address spender) public view virtual override returns (uint256) {
|
||||
if (spender == owner()) {
|
||||
return _UINT256_MAX;
|
||||
} else {
|
||||
@ -133,7 +133,7 @@ contract __unstable__ERC20Owned is ERC20, Ownable {
|
||||
}
|
||||
|
||||
// Allowance for the owner cannot be changed (it is always 'infinite')
|
||||
function _approve(address tokenOwner, address spender, uint256 value) internal override {
|
||||
function _approve(address tokenOwner, address spender, uint256 value) internal virtual override {
|
||||
if (spender == owner()) {
|
||||
return;
|
||||
} else {
|
||||
@ -141,7 +141,7 @@ contract __unstable__ERC20Owned is ERC20, Ownable {
|
||||
}
|
||||
}
|
||||
|
||||
function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
|
||||
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
|
||||
if (recipient == owner()) {
|
||||
_transfer(sender, recipient, amount);
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user