diff options
author | Leonid <logvinov.leon@gmail.com> | 2017-08-25 04:49:11 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-25 04:49:11 +0800 |
commit | 1e590ce4baf04abedfcff528644fb9594a99e69f (patch) | |
tree | 5a42dfeb34cce4dc67ca1bf4a7d484deda64bb1a /test/token_wrapper_test.ts | |
parent | 3e1c436fa6196b1371b1468cbddd88a9e56bfc2c (diff) | |
parent | bd67cf0f9f9bf321848d2dd929fcd474e236cee7 (diff) | |
download | dexon-sol-tools-1e590ce4baf04abedfcff528644fb9594a99e69f.tar.gz dexon-sol-tools-1e590ce4baf04abedfcff528644fb9594a99e69f.tar.zst dexon-sol-tools-1e590ce4baf04abedfcff528644fb9594a99e69f.zip |
Merge pull request #137 from 0xProject/unlimited-allowance
Add setUnlimitedProxyAllowanceAsync and setUnlimitedAllowanceAsync
Diffstat (limited to 'test/token_wrapper_test.ts')
-rw-r--r-- | test/token_wrapper_test.ts | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/test/token_wrapper_test.ts b/test/token_wrapper_test.ts index 8adaa6351..f4653e432 100644 --- a/test/token_wrapper_test.ts +++ b/test/token_wrapper_test.ts @@ -16,6 +16,7 @@ import { ApprovalContractEventArgs, } from '../src'; import {BlockchainLifecycle} from './utils/blockchain_lifecycle'; +import {TokenUtils} from './utils/token_utils'; import {DoneCallback} from '../src/types'; chaiSetup.configure(); @@ -27,6 +28,7 @@ describe('TokenWrapper', () => { let zeroEx: ZeroEx; let userAddresses: string[]; let tokens: Token[]; + let tokenUtils: TokenUtils; let coinbase: string; let addressWithoutFunds: string; before(async () => { @@ -34,6 +36,7 @@ describe('TokenWrapper', () => { zeroEx = new ZeroEx(web3.currentProvider); userAddresses = await promisify(web3.eth.getAccounts)(); tokens = await zeroEx.tokenRegistry.getTokensAsync(); + tokenUtils = new TokenUtils(tokens); coinbase = userAddresses[0]; addressWithoutFunds = userAddresses[1]; }); @@ -206,6 +209,45 @@ describe('TokenWrapper', () => { return expect(allowanceAfterSet).to.be.bignumber.equal(expectedAllowanceAfterAllowanceSet); }); }); + describe('#setUnlimitedAllowanceAsync', () => { + it('should set the unlimited spender\'s allowance', async () => { + const token = tokens[0]; + const ownerAddress = coinbase; + const spenderAddress = addressWithoutFunds; + + await zeroEx.token.setUnlimitedAllowanceAsync(token.address, ownerAddress, spenderAddress); + const allowance = await zeroEx.token.getAllowanceAsync(token.address, ownerAddress, spenderAddress); + return expect(allowance).to.be.bignumber.equal(zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); + }); + it('should reduce the gas cost for transfers including tokens with unlimited allowance support', async () => { + const transferAmount = new BigNumber(5); + const zrx = tokenUtils.getProtocolTokenOrThrow(); + const [, userWithNormalAllowance, userWithUnlimitedAllowance] = userAddresses; + await zeroEx.token.setAllowanceAsync(zrx.address, coinbase, userWithNormalAllowance, transferAmount); + await zeroEx.token.setUnlimitedAllowanceAsync(zrx.address, coinbase, userWithUnlimitedAllowance); + + const initBalanceWithNormalAllowance = await promisify(web3.eth.getBalance)(userWithNormalAllowance); + const initBalanceWithUnlimitedAllowance = await promisify(web3.eth.getBalance)(userWithUnlimitedAllowance); + + await zeroEx.token.transferFromAsync( + zrx.address, coinbase, userWithNormalAllowance, userWithNormalAllowance, transferAmount, + ); + await zeroEx.token.transferFromAsync( + zrx.address, coinbase, userWithUnlimitedAllowance, userWithUnlimitedAllowance, transferAmount, + ); + + const finalBalanceWithNormalAllowance = await promisify(web3.eth.getBalance)(userWithNormalAllowance); + const finalBalanceWithUnlimitedAllowance = await promisify(web3.eth.getBalance)(userWithUnlimitedAllowance); + + const normalGasCost = initBalanceWithNormalAllowance.minus(finalBalanceWithNormalAllowance); + const unlimitedGasCost = initBalanceWithUnlimitedAllowance.minus(finalBalanceWithUnlimitedAllowance); + + // In theory the gas cost with unlimited allowance should be smaller, but with testrpc it's actually bigger. + // This needs to be investigated in ethereumjs-vm. This test is essentially a repro. + // TODO: Make this test pass with inverted assertion. + expect(unlimitedGasCost.toNumber()).to.be.gt(normalGasCost.toNumber()); + }); + }); describe('#getAllowanceAsync', () => { describe('With web3 provider with accounts', () => { it('should get the proxy allowance', async () => { @@ -282,6 +324,16 @@ describe('TokenWrapper', () => { return expect(allowanceAfterSet).to.be.bignumber.equal(expectedAllowanceAfterAllowanceSet); }); }); + describe('#setUnlimitedProxyAllowanceAsync', () => { + it('should set the unlimited proxy allowance', async () => { + const token = tokens[0]; + const ownerAddress = coinbase; + + await zeroEx.token.setUnlimitedProxyAllowanceAsync(token.address, ownerAddress); + const allowance = await zeroEx.token.getProxyAllowanceAsync(token.address, ownerAddress); + return expect(allowance).to.be.bignumber.equal(zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); + }); + }); describe('#subscribeAsync', () => { const indexFilterValues = {}; const shouldThrowOnInsufficientBalanceOrAllowance = true; |