Browse Source

Fixed how allowance crowdsale checks remaining tokens. (#1449)

Nicolás Venturo 7 years ago
parent
commit
1ac1ac984e

+ 5 - 1
contracts/crowdsale/emission/AllowanceCrowdsale.sol

@@ -4,6 +4,7 @@ import "../Crowdsale.sol";
 import "../../token/ERC20/IERC20.sol";
 import "../../token/ERC20/IERC20.sol";
 import "../../token/ERC20/SafeERC20.sol";
 import "../../token/ERC20/SafeERC20.sol";
 import "../../math/SafeMath.sol";
 import "../../math/SafeMath.sol";
+import "../../math/Math.sol";
 
 
 /**
 /**
  * @title AllowanceCrowdsale
  * @title AllowanceCrowdsale
@@ -36,7 +37,10 @@ contract AllowanceCrowdsale is Crowdsale {
    * @return Amount of tokens left in the allowance
    * @return Amount of tokens left in the allowance
    */
    */
   function remainingTokens() public view returns (uint256) {
   function remainingTokens() public view returns (uint256) {
-    return token().allowance(_tokenWallet, this);
+    return Math.min(
+      token().balanceOf(_tokenWallet),
+      token().allowance(_tokenWallet, this)
+    );
   }
   }
 
 
   /**
   /**

+ 11 - 0
test/crowdsale/AllowanceCrowdsale.test.js

@@ -69,6 +69,17 @@ contract('AllowanceCrowdsale', function ([_, investor, wallet, purchaser, tokenW
       await this.crowdsale.buyTokens(investor, { value: value, from: purchaser });
       await this.crowdsale.buyTokens(investor, { value: value, from: purchaser });
       (await this.crowdsale.remainingTokens()).should.be.bignumber.equal(remainingAllowance);
       (await this.crowdsale.remainingTokens()).should.be.bignumber.equal(remainingAllowance);
     });
     });
+
+    context('when the allowance is larger than the token amount', function () {
+      beforeEach(async function () {
+        const amount = await this.token.balanceOf(tokenWallet);
+        await this.token.approve(this.crowdsale.address, amount.plus(1), { from: tokenWallet });
+      });
+
+      it('should report the amount instead of the allowance', async function () {
+        (await this.crowdsale.remainingTokens()).should.be.bignumber.equal(await this.token.balanceOf(tokenWallet));
+      });
+    });
   });
   });
 
 
   describe('when token wallet is different from token address', function () {
   describe('when token wallet is different from token address', function () {