Fix the GSNBouncerERC20Fee token decimals to 18 (#1929)

* fix erc20 fee token decimals to 18

* lint

* Update contracts/GSN/bouncers/GSNBouncerERC20Fee.sol

Co-Authored-By: Nicolás Venturo <nicolas.venturo@gmail.com>

* change location of hardcoded decimals for clarity

* remove mention of decimals from docs

* remove trailing whitespace from guide

(cherry picked from commit b8ccf8e0f1)
release-v2.4.0
Francisco Giordano 5 years ago
parent 8026a8ae2e
commit 4f4d305784
  1. 7
      contracts/GSN/bouncers/GSNBouncerERC20Fee.sol
  2. 2
      contracts/mocks/GSNBouncerERC20FeeMock.sol
  3. 4
      docs/modules/ROOT/pages/gsn-bouncers.adoc
  4. 9
      test/GSN/GSNBouncerERC20Fee.test.js

@ -27,11 +27,10 @@ contract GSNBouncerERC20Fee is GSNBouncerBase {
__unstable__ERC20PrimaryAdmin private _token;
/**
* @dev The arguments to the constructor are the details that the gas payment token will have: `name`, `symbol`, and
* `decimals`.
* @dev The arguments to the constructor are the details that the gas payment token will have: `name` and `symbol`. `decimals` is hard-coded to 18.
*/
constructor(string memory name, string memory symbol, uint8 decimals) public {
_token = new __unstable__ERC20PrimaryAdmin(name, symbol, decimals);
constructor(string memory name, string memory symbol) public {
_token = new __unstable__ERC20PrimaryAdmin(name, symbol, 18);
}
/**

@ -4,7 +4,7 @@ import "../GSN/GSNRecipient.sol";
import "../GSN/bouncers/GSNBouncerERC20Fee.sol";
contract GSNBouncerERC20FeeMock is GSNRecipient, GSNBouncerERC20Fee {
constructor(string memory name, string memory symbol, uint8 decimals) public GSNBouncerERC20Fee(name, symbol, decimals) {
constructor(string memory name, string memory symbol) public GSNBouncerERC20Fee(name, symbol) {
// solhint-disable-previous-line no-empty-blocks
}

@ -100,12 +100,10 @@ NOTE: Always use `_preRelayedCall` and `_postRelayedCall` functions. Internal `
Your GSN recipient contract needs to inherit from `GSNRecipient` and `GSNBouncerERC20Fee` along with appropriate xref:access-control.adoc[access control] (for token minting), set the token details in the constructor of `GSNBouncerERC20Fee` and create a public `mint` function suitably protected by your chosen access control as per the following sample code (which uses the xref:api:access.adoc#MinterRole[MinterRole]):
NOTE: The token must have decimals of 18 to match that of ether, due to the baked-in exchange rate of 1:1.
[source,solidity]
----
contract MyContract is GSNRecipient, GSNBouncerERC20Fee, MinterRole {
constructor() public GSNBouncerERC20Fee("FeeToken", "FEE", 18) {
constructor() public GSNBouncerERC20Fee("FeeToken", "FEE") {
}
function mint(address account, uint256 amount) public onlyMinter {

@ -1,4 +1,4 @@
const { BN, ether, expectEvent } = require('openzeppelin-test-helpers');
const { ether, expectEvent } = require('openzeppelin-test-helpers');
const gsn = require('@openzeppelin/gsn-helpers');
const { expect } = require('chai');
@ -10,10 +10,9 @@ const IRelayHub = artifacts.require('IRelayHub');
contract('GSNBouncerERC20Fee', function ([_, sender, other]) {
const name = 'FeeToken';
const symbol = 'FTKN';
const decimals = new BN('18');
beforeEach(async function () {
this.recipient = await GSNBouncerERC20FeeMock.new(name, symbol, decimals);
this.recipient = await GSNBouncerERC20FeeMock.new(name, symbol);
this.token = await ERC20Detailed.at(await this.recipient.token());
});
@ -26,8 +25,8 @@ contract('GSNBouncerERC20Fee', function ([_, sender, other]) {
expect(await this.token.symbol()).to.equal(symbol);
});
it('has decimals', async function () {
expect(await this.token.decimals()).to.be.bignumber.equal(decimals);
it('has 18 decimals', async function () {
expect(await this.token.decimals()).to.be.bignumber.equal('18');
});
});

Loading…
Cancel
Save