From 7fa5b474ebac649b6a23c8b9108e07c117dcc00b Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Tue, 21 Aug 2018 10:15:45 -0700 Subject: Add ZRX balances and allowances to TraderInfo --- .../extensions/OrderValidator/OrderValidator.sol | 23 +++-- .../contracts/test/extensions/order_validator.ts | 109 ++++++++++++++++++++- 2 files changed, 122 insertions(+), 10 deletions(-) (limited to 'packages/contracts') diff --git a/packages/contracts/src/2.0.0/extensions/OrderValidator/OrderValidator.sol b/packages/contracts/src/2.0.0/extensions/OrderValidator/OrderValidator.sol index 1c9cc6978..8f4ce9ccc 100644 --- a/packages/contracts/src/2.0.0/extensions/OrderValidator/OrderValidator.sol +++ b/packages/contracts/src/2.0.0/extensions/OrderValidator/OrderValidator.sol @@ -34,20 +34,26 @@ contract OrderValidator { using LibBytes for bytes; struct TraderInfo { - uint256 makerBalance; // Maker's balance of makerAsset - uint256 makerAllowance; // Maker's allowance to corresponding AssetProxy - uint256 takerBalance; // Taker's balance of takerAsset - uint256 takerAllowance; // Taker's allowance to corresponding AssetProxy + uint256 makerBalance; // Maker's balance of makerAsset + uint256 makerAllowance; // Maker's allowance to corresponding AssetProxy + uint256 takerBalance; // Taker's balance of takerAsset + uint256 takerAllowance; // Taker's allowance to corresponding AssetProxy + uint256 makerZrxBalance; // Maker's balance of ZRX + uint256 makerZrxAllowance; // Maker's allowance of ZRX to ERC20Proxy + uint256 takerZrxBalance; // Taker's balance of ZRX + uint256 takerZrxAllowance; // Taker's allowance of ZRX to ERC20Proxy } - // Exchange contract. - // solhint-disable-next-line var-name-mixedcase + // solhint-disable var-name-mixedcase IExchange internal EXCHANGE; + bytes internal ZRX_ASSET_DATA; + // solhint-enable var-name-mixedcase - constructor (address _exchange) + constructor (address _exchange, bytes memory _zrxAssetData) public { EXCHANGE = IExchange(_exchange); + ZRX_ASSET_DATA = _zrxAssetData; } /// @dev Fetches information for order and maker/taker of order. @@ -89,6 +95,9 @@ contract OrderValidator { { (traderInfo.makerBalance, traderInfo.makerAllowance) = getBalanceAndAllowance(order.makerAddress, order.makerAssetData); (traderInfo.takerBalance, traderInfo.takerAllowance) = getBalanceAndAllowance(takerAddress, order.takerAssetData); + bytes memory zrxAssetData = ZRX_ASSET_DATA; + (traderInfo.makerZrxBalance, traderInfo.makerZrxAllowance) = getBalanceAndAllowance(order.makerAddress, zrxAssetData); + (traderInfo.takerZrxBalance, traderInfo.takerZrxAllowance) = getBalanceAndAllowance(takerAddress, zrxAssetData); return traderInfo; } diff --git a/packages/contracts/test/extensions/order_validator.ts b/packages/contracts/test/extensions/order_validator.ts index 22a140465..a3b704f27 100644 --- a/packages/contracts/test/extensions/order_validator.ts +++ b/packages/contracts/test/extensions/order_validator.ts @@ -33,6 +33,7 @@ describe('OrderValidator', () => { let erc721AssetData: string; let erc20Token: DummyERC20TokenContract; + let zrxToken: DummyERC20TokenContract; let erc721Token: DummyERC721TokenContract; let exchange: ExchangeContract; let orderValidator: OrderValidatorContract; @@ -62,18 +63,22 @@ describe('OrderValidator', () => { const erc20Wrapper = new ERC20Wrapper(provider, usedAddresses, owner); const erc721Wrapper = new ERC721Wrapper(provider, usedAddresses, owner); - const numDummyErc20ToDeploy = 1; - [erc20Token] = await erc20Wrapper.deployDummyTokensAsync(numDummyErc20ToDeploy, constants.DUMMY_TOKEN_DECIMALS); + const numDummyErc20ToDeploy = 2; + [erc20Token, zrxToken] = await erc20Wrapper.deployDummyTokensAsync( + numDummyErc20ToDeploy, + constants.DUMMY_TOKEN_DECIMALS, + ); erc20Proxy = await erc20Wrapper.deployProxyAsync(); [erc721Token] = await erc721Wrapper.deployDummyTokensAsync(); erc721Proxy = await erc721Wrapper.deployProxyAsync(); + const zrxAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address); exchange = await ExchangeContract.deployFrom0xArtifactAsync( artifacts.Exchange, provider, txDefaults, - assetDataUtils.encodeERC20AssetData(erc20Token.address), + zrxAssetData, ); const exchangeWrapper = new ExchangeWrapper(exchange, provider); await exchangeWrapper.registerAssetProxyAsync(erc20Proxy.address, owner); @@ -84,6 +89,7 @@ describe('OrderValidator', () => { provider, txDefaults, exchange.address, + zrxAssetData, ); erc20AssetData = assetDataUtils.encodeERC20AssetData(erc20Token.address); @@ -221,10 +227,16 @@ describe('OrderValidator', () => { expect(traderInfo.makerAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo.takerBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo.takerAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo.makerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo.takerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); }); it('should return the correct info when balances and allowances are set', async () => { const makerBalance = new BigNumber(123); const makerAllowance = new BigNumber(456); + const makerZrxBalance = new BigNumber(789); + const takerZrxAllowance = new BigNumber(987); await web3Wrapper.awaitTransactionSuccessAsync( await erc20Token.setBalance.sendTransactionAsync(makerAddress, makerBalance), constants.AWAIT_TRANSACTION_MINED_MS, @@ -235,6 +247,16 @@ describe('OrderValidator', () => { }), constants.AWAIT_TRANSACTION_MINED_MS, ); + await web3Wrapper.awaitTransactionSuccessAsync( + await zrxToken.setBalance.sendTransactionAsync(makerAddress, makerZrxBalance), + constants.AWAIT_TRANSACTION_MINED_MS, + ); + await web3Wrapper.awaitTransactionSuccessAsync( + await zrxToken.approve.sendTransactionAsync(erc20Proxy.address, takerZrxAllowance, { + from: takerAddress, + }), + constants.AWAIT_TRANSACTION_MINED_MS, + ); await web3Wrapper.awaitTransactionSuccessAsync( await erc721Token.mint.sendTransactionAsync(takerAddress, tokenId), constants.AWAIT_TRANSACTION_MINED_MS, @@ -250,6 +272,10 @@ describe('OrderValidator', () => { expect(traderInfo.makerAllowance).to.be.bignumber.equal(makerAllowance); expect(traderInfo.takerBalance).to.be.bignumber.equal(ERC721_BALANCE); expect(traderInfo.takerAllowance).to.be.bignumber.equal(ERC721_ALLOWANCE); + expect(traderInfo.makerZrxBalance).to.be.bignumber.equal(makerZrxBalance); + expect(traderInfo.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo.takerZrxAllowance).to.be.bignumber.equal(takerZrxAllowance); }); }); describe('getTradersInfo', () => { @@ -267,14 +293,24 @@ describe('OrderValidator', () => { expect(traderInfo1.makerAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo1.takerBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo1.takerAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo1.makerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo1.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo1.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo1.takerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo2.makerBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo2.makerAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo2.takerBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo2.takerAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo2.makerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo2.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo2.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo2.takerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); }); it('should return the correct info when balances and allowances are set', async () => { const makerBalance = new BigNumber(123); const makerAllowance = new BigNumber(456); + const makerZrxBalance = new BigNumber(789); + const takerZrxAllowance = new BigNumber(987); await web3Wrapper.awaitTransactionSuccessAsync( await erc20Token.setBalance.sendTransactionAsync(makerAddress, makerBalance), constants.AWAIT_TRANSACTION_MINED_MS, @@ -285,6 +321,16 @@ describe('OrderValidator', () => { }), constants.AWAIT_TRANSACTION_MINED_MS, ); + await web3Wrapper.awaitTransactionSuccessAsync( + await zrxToken.setBalance.sendTransactionAsync(makerAddress, makerZrxBalance), + constants.AWAIT_TRANSACTION_MINED_MS, + ); + await web3Wrapper.awaitTransactionSuccessAsync( + await zrxToken.approve.sendTransactionAsync(erc20Proxy.address, takerZrxAllowance, { + from: takerAddress, + }), + constants.AWAIT_TRANSACTION_MINED_MS, + ); const isApproved = true; await web3Wrapper.awaitTransactionSuccessAsync( await erc721Token.setApprovalForAll.sendTransactionAsync(erc721Proxy.address, isApproved, { @@ -304,10 +350,18 @@ describe('OrderValidator', () => { expect(traderInfo1.makerAllowance).to.be.bignumber.equal(makerAllowance); expect(traderInfo1.takerBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo1.takerAllowance).to.be.bignumber.equal(ERC721_ALLOWANCE); + expect(traderInfo1.makerZrxBalance).to.be.bignumber.equal(makerZrxBalance); + expect(traderInfo1.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo1.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo1.takerZrxAllowance).to.be.bignumber.equal(takerZrxAllowance); expect(traderInfo2.makerBalance).to.be.bignumber.equal(makerBalance); expect(traderInfo2.makerAllowance).to.be.bignumber.equal(makerAllowance); expect(traderInfo2.takerBalance).to.be.bignumber.equal(ERC721_BALANCE); expect(traderInfo2.takerAllowance).to.be.bignumber.equal(ERC721_ALLOWANCE); + expect(traderInfo2.makerZrxBalance).to.be.bignumber.equal(makerZrxBalance); + expect(traderInfo2.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo2.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo2.takerZrxAllowance).to.be.bignumber.equal(takerZrxAllowance); }); }); describe('getOrderAndTraderInfo', () => { @@ -327,10 +381,16 @@ describe('OrderValidator', () => { expect(traderInfo.makerAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo.takerBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo.takerAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo.makerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo.takerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); }); it('should return the correct info when balances and allowances are set', async () => { const makerBalance = new BigNumber(123); const makerAllowance = new BigNumber(456); + const makerZrxBalance = new BigNumber(789); + const takerZrxAllowance = new BigNumber(987); await web3Wrapper.awaitTransactionSuccessAsync( await erc20Token.setBalance.sendTransactionAsync(makerAddress, makerBalance), constants.AWAIT_TRANSACTION_MINED_MS, @@ -341,6 +401,16 @@ describe('OrderValidator', () => { }), constants.AWAIT_TRANSACTION_MINED_MS, ); + await web3Wrapper.awaitTransactionSuccessAsync( + await zrxToken.setBalance.sendTransactionAsync(makerAddress, makerZrxBalance), + constants.AWAIT_TRANSACTION_MINED_MS, + ); + await web3Wrapper.awaitTransactionSuccessAsync( + await zrxToken.approve.sendTransactionAsync(erc20Proxy.address, takerZrxAllowance, { + from: takerAddress, + }), + constants.AWAIT_TRANSACTION_MINED_MS, + ); await web3Wrapper.awaitTransactionSuccessAsync( await erc721Token.mint.sendTransactionAsync(takerAddress, tokenId), constants.AWAIT_TRANSACTION_MINED_MS, @@ -363,6 +433,10 @@ describe('OrderValidator', () => { expect(traderInfo.makerAllowance).to.be.bignumber.equal(makerAllowance); expect(traderInfo.takerBalance).to.be.bignumber.equal(ERC721_BALANCE); expect(traderInfo.takerAllowance).to.be.bignumber.equal(ERC721_ALLOWANCE); + expect(traderInfo.makerZrxBalance).to.be.bignumber.equal(makerZrxBalance); + expect(traderInfo.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo.takerZrxAllowance).to.be.bignumber.equal(takerZrxAllowance); }); }); describe('getOrdersAndTradersInfo', () => { @@ -391,14 +465,24 @@ describe('OrderValidator', () => { expect(traderInfo1.makerAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo1.takerBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo1.takerAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo1.makerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo1.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo1.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo1.takerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo2.makerBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo2.makerAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo2.takerBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo2.takerAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo2.makerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo2.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo2.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo2.takerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); }); it('should return the correct info when balances and allowances are set', async () => { const makerBalance = new BigNumber(123); const makerAllowance = new BigNumber(456); + const makerZrxBalance = new BigNumber(789); + const takerZrxAllowance = new BigNumber(987); await web3Wrapper.awaitTransactionSuccessAsync( await erc20Token.setBalance.sendTransactionAsync(makerAddress, makerBalance), constants.AWAIT_TRANSACTION_MINED_MS, @@ -409,6 +493,16 @@ describe('OrderValidator', () => { }), constants.AWAIT_TRANSACTION_MINED_MS, ); + await web3Wrapper.awaitTransactionSuccessAsync( + await zrxToken.setBalance.sendTransactionAsync(makerAddress, makerZrxBalance), + constants.AWAIT_TRANSACTION_MINED_MS, + ); + await web3Wrapper.awaitTransactionSuccessAsync( + await zrxToken.approve.sendTransactionAsync(erc20Proxy.address, takerZrxAllowance, { + from: takerAddress, + }), + constants.AWAIT_TRANSACTION_MINED_MS, + ); const isApproved = true; await web3Wrapper.awaitTransactionSuccessAsync( await erc721Token.setApprovalForAll.sendTransactionAsync(erc721Proxy.address, isApproved, { @@ -438,10 +532,19 @@ describe('OrderValidator', () => { expect(traderInfo1.makerAllowance).to.be.bignumber.equal(makerAllowance); expect(traderInfo1.takerBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo1.takerAllowance).to.be.bignumber.equal(ERC721_ALLOWANCE); + expect(traderInfo1.makerZrxBalance).to.be.bignumber.equal(makerZrxBalance); + expect(traderInfo1.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo1.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo1.takerZrxAllowance).to.be.bignumber.equal(takerZrxAllowance); expect(traderInfo2.makerBalance).to.be.bignumber.equal(makerBalance); expect(traderInfo2.makerAllowance).to.be.bignumber.equal(makerAllowance); expect(traderInfo2.takerBalance).to.be.bignumber.equal(ERC721_BALANCE); expect(traderInfo2.takerAllowance).to.be.bignumber.equal(ERC721_ALLOWANCE); + expect(traderInfo2.makerZrxBalance).to.be.bignumber.equal(makerZrxBalance); + expect(traderInfo2.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo2.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(traderInfo2.takerZrxAllowance).to.be.bignumber.equal(takerZrxAllowance); }); }); }); +// tslint:disable:max-file-line-count -- cgit v1.2.3