From afa2dd73743398f3973ab7de5a7a0d4c18acc5a5 Mon Sep 17 00:00:00 2001
From: Amir Bandeali <abandeali1@gmail.com>
Date: Mon, 27 Aug 2018 16:34:42 -0700
Subject: Add test for fillOrder and dispatchTransferFrom where maker == taker

---
 packages/contracts/test/exchange/core.ts       | 39 ++++++++++++++++++-
 packages/contracts/test/exchange/dispatcher.ts | 54 ++++++++++++++++++++++++++
 2 files changed, 92 insertions(+), 1 deletion(-)

(limited to 'packages/contracts/test/exchange')

diff --git a/packages/contracts/test/exchange/core.ts b/packages/contracts/test/exchange/core.ts
index 3bb71b58f..acb99eed1 100644
--- a/packages/contracts/test/exchange/core.ts
+++ b/packages/contracts/test/exchange/core.ts
@@ -8,7 +8,10 @@ import { LogWithDecodedArgs } from 'ethereum-types';
 import ethUtil = require('ethereumjs-util');
 import * as _ from 'lodash';
 
-import { DummyERC20TokenContract } from '../../generated_contract_wrappers/dummy_erc20_token';
+import {
+    DummyERC20TokenContract,
+    DummyERC20TokenTransferEventArgs,
+} from '../../generated_contract_wrappers/dummy_erc20_token';
 import { DummyERC721TokenContract } from '../../generated_contract_wrappers/dummy_erc721_token';
 import { DummyNoReturnERC20TokenContract } from '../../generated_contract_wrappers/dummy_no_return_erc20_token';
 import { ERC20ProxyContract } from '../../generated_contract_wrappers/erc20_proxy';
@@ -243,6 +246,40 @@ describe('Exchange core', () => {
                 RevertReason.ValidatorError,
             );
         });
+
+        it('should not emit transfer events for transfers where from == to', async () => {
+            const txReceipt = await exchangeWrapper.fillOrderAsync(signedOrder, makerAddress);
+            const logs = txReceipt.logs;
+            const transferLogs = _.filter(
+                logs,
+                log => (log as LogWithDecodedArgs<DummyERC20TokenTransferEventArgs>).event === 'Transfer',
+            );
+            expect(transferLogs.length).to.be.equal(2);
+            expect((transferLogs[0] as LogWithDecodedArgs<DummyERC20TokenTransferEventArgs>).address).to.be.equal(
+                zrxToken.address,
+            );
+            expect((transferLogs[0] as LogWithDecodedArgs<DummyERC20TokenTransferEventArgs>).args._from).to.be.equal(
+                makerAddress,
+            );
+            expect((transferLogs[0] as LogWithDecodedArgs<DummyERC20TokenTransferEventArgs>).args._to).to.be.equal(
+                feeRecipientAddress,
+            );
+            expect(
+                (transferLogs[0] as LogWithDecodedArgs<DummyERC20TokenTransferEventArgs>).args._value,
+            ).to.be.bignumber.equal(signedOrder.makerFee);
+            expect((transferLogs[1] as LogWithDecodedArgs<DummyERC20TokenTransferEventArgs>).address).to.be.equal(
+                zrxToken.address,
+            );
+            expect((transferLogs[1] as LogWithDecodedArgs<DummyERC20TokenTransferEventArgs>).args._from).to.be.equal(
+                makerAddress,
+            );
+            expect((transferLogs[1] as LogWithDecodedArgs<DummyERC20TokenTransferEventArgs>).args._to).to.be.equal(
+                feeRecipientAddress,
+            );
+            expect(
+                (transferLogs[1] as LogWithDecodedArgs<DummyERC20TokenTransferEventArgs>).args._value,
+            ).to.be.bignumber.equal(signedOrder.takerFee);
+        });
     });
 
     describe('Testing exchange of ERC20 tokens with no return values', () => {
diff --git a/packages/contracts/test/exchange/dispatcher.ts b/packages/contracts/test/exchange/dispatcher.ts
index 81871a680..a8ae897a8 100644
--- a/packages/contracts/test/exchange/dispatcher.ts
+++ b/packages/contracts/test/exchange/dispatcher.ts
@@ -205,6 +205,60 @@ describe('AssetProxyDispatcher', () => {
             );
         });
 
+        it('should not dispatch a transfer if amount == 0', async () => {
+            // Register ERC20 proxy
+            await web3Wrapper.awaitTransactionSuccessAsync(
+                await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(erc20Proxy.address, { from: owner }),
+                constants.AWAIT_TRANSACTION_MINED_MS,
+            );
+            // Construct metadata for ERC20 proxy
+            const encodedAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
+
+            // Perform a transfer from makerAddress to takerAddress
+            const erc20Balances = await erc20Wrapper.getBalancesAsync();
+            const amount = constants.ZERO_AMOUNT;
+            const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(
+                await assetProxyDispatcher.publicDispatchTransferFrom.sendTransactionAsync(
+                    encodedAssetData,
+                    makerAddress,
+                    takerAddress,
+                    amount,
+                    { from: owner },
+                ),
+                constants.AWAIT_TRANSACTION_MINED_MS,
+            );
+            expect(txReceipt.logs.length).to.be.equal(0);
+            const newBalances = await erc20Wrapper.getBalancesAsync();
+            expect(newBalances).to.deep.equal(erc20Balances);
+        });
+
+        it('should not dispatch a transfer if from == to', async () => {
+            // Register ERC20 proxy
+            await web3Wrapper.awaitTransactionSuccessAsync(
+                await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(erc20Proxy.address, { from: owner }),
+                constants.AWAIT_TRANSACTION_MINED_MS,
+            );
+            // Construct metadata for ERC20 proxy
+            const encodedAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
+
+            // Perform a transfer from makerAddress to takerAddress
+            const erc20Balances = await erc20Wrapper.getBalancesAsync();
+            const amount = new BigNumber(10);
+            const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(
+                await assetProxyDispatcher.publicDispatchTransferFrom.sendTransactionAsync(
+                    encodedAssetData,
+                    makerAddress,
+                    makerAddress,
+                    amount,
+                    { from: owner },
+                ),
+                constants.AWAIT_TRANSACTION_MINED_MS,
+            );
+            expect(txReceipt.logs.length).to.be.equal(0);
+            const newBalances = await erc20Wrapper.getBalancesAsync();
+            expect(newBalances).to.deep.equal(erc20Balances);
+        });
+
         it('should throw if dispatching to unregistered proxy', async () => {
             // Construct metadata for ERC20 proxy
             const encodedAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
-- 
cgit v1.2.3