Fix tests
This commit is contained in:
		@@ -19,7 +19,7 @@
 | 
			
		||||
            "Yarn workspaces do not link binaries correctly so we need to reference them directly https://github.com/yarnpkg/yarn/issues/3846",
 | 
			
		||||
        "compile":
 | 
			
		||||
            "node ../deployer/lib/src/cli.js compile --contracts ${npm_package_config_contracts} --contracts-dir src/contracts --artifacts-dir ../migrations/src/artifacts",
 | 
			
		||||
        "clean": "shx rm -rf ./lib",
 | 
			
		||||
        "clean": "shx rm -rf ./lib ./src/contract_wrappers/generated",
 | 
			
		||||
        "generate_contract_wrappers":
 | 
			
		||||
            "node ../abi-gen/lib/index.js --abis  ${npm_package_config_abis} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated --backend ethers && prettier --write 'src/contract_wrappers/generated/**.ts'",
 | 
			
		||||
        "lint": "tslint --project . 'migrations/**/*.ts' 'test/**/*.ts' 'util/**/*.ts' 'deploy/**/*.ts'",
 | 
			
		||||
@@ -30,9 +30,9 @@
 | 
			
		||||
    },
 | 
			
		||||
    "config": {
 | 
			
		||||
        "abis":
 | 
			
		||||
            "../migrations/src/artifacts/@(DummyERC20Token|Exchange|TokenRegistry|MultiSigWallet|MultiSigWalletWithTimeLock|MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress|TokenRegistry|ZRXToken|AssetProxyDispatcher|ERC20Proxy|ERC721Proxy|DummyERC721Token|LibBytes).json",
 | 
			
		||||
            "../migrations/src/artifacts/@(DummyERC20Token|Exchange|TokenRegistry|MultiSigWallet|MultiSigWalletWithTimeLock|MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress|TokenRegistry|ZRXToken|TestAssetProxyDispatcher|ERC20Proxy|ERC721Proxy|DummyERC721Token|LibBytes|Authorizable).json",
 | 
			
		||||
        "contracts":
 | 
			
		||||
            "Exchange,DummyERC20Token,ZRXToken,WETH9,MultiSigWallet,MultiSigWalletWithTimeLock,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,TokenRegistry,AssetProxyDispatcher,ERC20Proxy,ERC721Proxy,DummyERC721Token,LibBytes"
 | 
			
		||||
            "Exchange,DummyERC20Token,ZRXToken,WETH9,MultiSigWallet,MultiSigWalletWithTimeLock,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,TokenRegistry,TestAssetProxyDispatcher,ERC20Proxy,ERC721Proxy,DummyERC721Token,LibBytes,Authorizable"
 | 
			
		||||
    },
 | 
			
		||||
    "repository": {
 | 
			
		||||
        "type": "git",
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,33 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  Copyright 2018 ZeroEx Intl.
 | 
			
		||||
 | 
			
		||||
  Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
  you may not use this file except in compliance with the License.
 | 
			
		||||
  You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
  Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
  distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
  See the License for the specific language governing permissions and
 | 
			
		||||
  limitations under the License.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
pragma solidity ^0.4.21;
 | 
			
		||||
 | 
			
		||||
import "../../protocol/Exchange/MixinAssetProxyDispatcher.sol";
 | 
			
		||||
 | 
			
		||||
contract TestAssetProxyDispatcher is MixinAssetProxyDispatcher {
 | 
			
		||||
    function publicDispatchTransferFrom(
 | 
			
		||||
        bytes memory assetMetadata,
 | 
			
		||||
        address from,
 | 
			
		||||
        address to,
 | 
			
		||||
        uint256 amount)
 | 
			
		||||
        public
 | 
			
		||||
    {
 | 
			
		||||
        dispatchTransferFrom(assetMetadata, from, to, amount);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -9,7 +9,7 @@ import { constants } from './constants';
 | 
			
		||||
import { formatters } from './formatters';
 | 
			
		||||
import { LogDecoder } from './log_decoder';
 | 
			
		||||
import { orderUtils } from './order_utils';
 | 
			
		||||
import { SignedOrder } from './types';
 | 
			
		||||
import { AssetProxyId, SignedOrder } from './types';
 | 
			
		||||
 | 
			
		||||
export class ExchangeWrapper {
 | 
			
		||||
    private _exchange: ExchangeContract;
 | 
			
		||||
@@ -189,7 +189,24 @@ export class ExchangeWrapper {
 | 
			
		||||
        const tx = await this._getTxWithDecodedExchangeLogsAsync(txHash);
 | 
			
		||||
        return tx;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public async registerAssetProxyAsync(
 | 
			
		||||
        assetProxyId: AssetProxyId,
 | 
			
		||||
        assetProxyAddress: string,
 | 
			
		||||
        from: string,
 | 
			
		||||
        opts: { oldAssetProxyAddressIfExists?: string } = {},
 | 
			
		||||
    ): Promise<TransactionReceiptWithDecodedLogs> {
 | 
			
		||||
        const oldAssetProxyAddress = _.isUndefined(opts.oldAssetProxyAddressIfExists)
 | 
			
		||||
            ? ZeroEx.NULL_ADDRESS
 | 
			
		||||
            : opts.oldAssetProxyAddressIfExists;
 | 
			
		||||
        const txHash = await this._exchange.registerAssetProxy.sendTransactionAsync(
 | 
			
		||||
            assetProxyId,
 | 
			
		||||
            assetProxyAddress,
 | 
			
		||||
            oldAssetProxyAddress,
 | 
			
		||||
            { from },
 | 
			
		||||
        );
 | 
			
		||||
        const tx = await this._getTxWithDecodedExchangeLogsAsync(txHash);
 | 
			
		||||
        return tx;
 | 
			
		||||
    }
 | 
			
		||||
    public async getOrderHashAsync(signedOrder: SignedOrder): Promise<string> {
 | 
			
		||||
        const order = orderUtils.getOrderStruct(signedOrder);
 | 
			
		||||
        const orderHash = await this._exchange.getOrderHash.callAsync(order);
 | 
			
		||||
 
 | 
			
		||||
@@ -93,11 +93,12 @@ export enum ContractName {
 | 
			
		||||
    AccountLevels = 'AccountLevels',
 | 
			
		||||
    EtherDelta = 'EtherDelta',
 | 
			
		||||
    Arbitrage = 'Arbitrage',
 | 
			
		||||
    AssetProxyDispatcher = 'AssetProxyDispatcher',
 | 
			
		||||
    TestAssetProxyDispatcher = 'TestAssetProxyDispatcher',
 | 
			
		||||
    ERC20Proxy = 'ERC20Proxy',
 | 
			
		||||
    ERC721Proxy = 'ERC721Proxy',
 | 
			
		||||
    DummyERC721Token = 'DummyERC721Token',
 | 
			
		||||
    LibBytes = 'LibBytes',
 | 
			
		||||
    Authorizable = 'Authorizable',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface Artifact {
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ import { Web3Wrapper } from '@0xproject/web3-wrapper';
 | 
			
		||||
import * as chai from 'chai';
 | 
			
		||||
import * as Web3 from 'web3';
 | 
			
		||||
 | 
			
		||||
import { AssetProxyDispatcherContract } from '../../src/contract_wrappers/generated/asset_proxy_dispatcher';
 | 
			
		||||
import { AuthorizableContract } from '../../src/contract_wrappers/generated/authorizable';
 | 
			
		||||
import { constants } from '../../src/utils/constants';
 | 
			
		||||
import { ContractName } from '../../src/utils/types';
 | 
			
		||||
import { chaiSetup } from '../utils/chai_setup';
 | 
			
		||||
@@ -14,21 +14,17 @@ chaiSetup.configure();
 | 
			
		||||
const expect = chai.expect;
 | 
			
		||||
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
 | 
			
		||||
 | 
			
		||||
describe('AssetProxyDispatcher (Authorization Methods)', () => {
 | 
			
		||||
describe('Authorizable', () => {
 | 
			
		||||
    let owner: string;
 | 
			
		||||
    let notOwner: string;
 | 
			
		||||
    let address: string;
 | 
			
		||||
    let assetProxyDispatcher: AssetProxyDispatcherContract;
 | 
			
		||||
    let authorizable: AuthorizableContract;
 | 
			
		||||
    before(async () => {
 | 
			
		||||
        const accounts = await web3Wrapper.getAvailableAddressesAsync();
 | 
			
		||||
        owner = address = accounts[0];
 | 
			
		||||
        notOwner = accounts[1];
 | 
			
		||||
        const assetProxyDispatcherInstance = await deployer.deployAsync(ContractName.AssetProxyDispatcher);
 | 
			
		||||
        assetProxyDispatcher = new AssetProxyDispatcherContract(
 | 
			
		||||
            assetProxyDispatcherInstance.abi,
 | 
			
		||||
            assetProxyDispatcherInstance.address,
 | 
			
		||||
            provider,
 | 
			
		||||
        );
 | 
			
		||||
        const authorizableInstance = await deployer.deployAsync(ContractName.Authorizable);
 | 
			
		||||
        authorizable = new AuthorizableContract(authorizableInstance.abi, authorizableInstance.address, provider);
 | 
			
		||||
    });
 | 
			
		||||
    beforeEach(async () => {
 | 
			
		||||
        await blockchainLifecycle.startAsync();
 | 
			
		||||
@@ -39,44 +35,44 @@ describe('AssetProxyDispatcher (Authorization Methods)', () => {
 | 
			
		||||
    describe('addAuthorizedAddress', () => {
 | 
			
		||||
        it('should throw if not called by owner', async () => {
 | 
			
		||||
            return expect(
 | 
			
		||||
                assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(notOwner, { from: notOwner }),
 | 
			
		||||
                authorizable.addAuthorizedAddress.sendTransactionAsync(notOwner, { from: notOwner }),
 | 
			
		||||
            ).to.be.rejectedWith(constants.REVERT);
 | 
			
		||||
        });
 | 
			
		||||
        it('should allow owner to add an authorized address', async () => {
 | 
			
		||||
            await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
 | 
			
		||||
            const isAuthorized = await assetProxyDispatcher.authorized.callAsync(address);
 | 
			
		||||
            await authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
 | 
			
		||||
            const isAuthorized = await authorizable.authorized.callAsync(address);
 | 
			
		||||
            expect(isAuthorized).to.be.true();
 | 
			
		||||
        });
 | 
			
		||||
        it('should throw if owner attempts to authorize a duplicate address', async () => {
 | 
			
		||||
            await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
 | 
			
		||||
            await authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
 | 
			
		||||
            return expect(
 | 
			
		||||
                assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(address, { from: owner }),
 | 
			
		||||
                authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner }),
 | 
			
		||||
            ).to.be.rejectedWith(constants.REVERT);
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    describe('removeAuthorizedAddress', () => {
 | 
			
		||||
        it('should throw if not called by owner', async () => {
 | 
			
		||||
            await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
 | 
			
		||||
            await authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
 | 
			
		||||
            return expect(
 | 
			
		||||
                assetProxyDispatcher.removeAuthorizedAddress.sendTransactionAsync(address, {
 | 
			
		||||
                authorizable.removeAuthorizedAddress.sendTransactionAsync(address, {
 | 
			
		||||
                    from: notOwner,
 | 
			
		||||
                }),
 | 
			
		||||
            ).to.be.rejectedWith(constants.REVERT);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should allow owner to remove an authorized address', async () => {
 | 
			
		||||
            await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
 | 
			
		||||
            await assetProxyDispatcher.removeAuthorizedAddress.sendTransactionAsync(address, {
 | 
			
		||||
            await authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
 | 
			
		||||
            await authorizable.removeAuthorizedAddress.sendTransactionAsync(address, {
 | 
			
		||||
                from: owner,
 | 
			
		||||
            });
 | 
			
		||||
            const isAuthorized = await assetProxyDispatcher.authorized.callAsync(address);
 | 
			
		||||
            const isAuthorized = await authorizable.authorized.callAsync(address);
 | 
			
		||||
            expect(isAuthorized).to.be.false();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should throw if owner attempts to remove an address that is not authorized', async () => {
 | 
			
		||||
            return expect(
 | 
			
		||||
                assetProxyDispatcher.removeAuthorizedAddress.sendTransactionAsync(address, {
 | 
			
		||||
                authorizable.removeAuthorizedAddress.sendTransactionAsync(address, {
 | 
			
		||||
                    from: owner,
 | 
			
		||||
                }),
 | 
			
		||||
            ).to.be.rejectedWith(constants.REVERT);
 | 
			
		||||
@@ -85,19 +81,19 @@ describe('AssetProxyDispatcher (Authorization Methods)', () => {
 | 
			
		||||
 | 
			
		||||
    describe('getAuthorizedAddresses', () => {
 | 
			
		||||
        it('should return all authorized addresses', async () => {
 | 
			
		||||
            const initial = await assetProxyDispatcher.getAuthorizedAddresses.callAsync();
 | 
			
		||||
            const initial = await authorizable.getAuthorizedAddresses.callAsync();
 | 
			
		||||
            expect(initial).to.have.length(0);
 | 
			
		||||
            await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(address, {
 | 
			
		||||
            await authorizable.addAuthorizedAddress.sendTransactionAsync(address, {
 | 
			
		||||
                from: owner,
 | 
			
		||||
            });
 | 
			
		||||
            const afterAdd = await assetProxyDispatcher.getAuthorizedAddresses.callAsync();
 | 
			
		||||
            const afterAdd = await authorizable.getAuthorizedAddresses.callAsync();
 | 
			
		||||
            expect(afterAdd).to.have.length(1);
 | 
			
		||||
            expect(afterAdd).to.include(address);
 | 
			
		||||
 | 
			
		||||
            await assetProxyDispatcher.removeAuthorizedAddress.sendTransactionAsync(address, {
 | 
			
		||||
            await authorizable.removeAuthorizedAddress.sendTransactionAsync(address, {
 | 
			
		||||
                from: owner,
 | 
			
		||||
            });
 | 
			
		||||
            const afterRemove = await assetProxyDispatcher.getAuthorizedAddresses.callAsync();
 | 
			
		||||
            const afterRemove = await authorizable.getAuthorizedAddresses.callAsync();
 | 
			
		||||
            expect(afterRemove).to.have.length(0);
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
@@ -4,7 +4,6 @@ import { BigNumber } from '@0xproject/utils';
 | 
			
		||||
import * as chai from 'chai';
 | 
			
		||||
import * as Web3 from 'web3';
 | 
			
		||||
 | 
			
		||||
import { AssetProxyDispatcherContract } from '../../src/contract_wrappers/generated/asset_proxy_dispatcher';
 | 
			
		||||
import { DummyERC20TokenContract } from '../../src/contract_wrappers/generated/dummy_e_r_c20_token';
 | 
			
		||||
import { DummyERC721TokenContract } from '../../src/contract_wrappers/generated/dummy_e_r_c721_token';
 | 
			
		||||
import { ERC20ProxyContract } from '../../src/contract_wrappers/generated/e_r_c20_proxy';
 | 
			
		||||
@@ -25,7 +24,7 @@ const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
 | 
			
		||||
describe('Asset Transfer Proxies', () => {
 | 
			
		||||
    let owner: string;
 | 
			
		||||
    let notAuthorized: string;
 | 
			
		||||
    let assetProxyDispatcherAddress: string;
 | 
			
		||||
    let exchangeAddress: string;
 | 
			
		||||
    let makerAddress: string;
 | 
			
		||||
    let takerAddress: string;
 | 
			
		||||
 | 
			
		||||
@@ -40,13 +39,7 @@ describe('Asset Transfer Proxies', () => {
 | 
			
		||||
 | 
			
		||||
    before(async () => {
 | 
			
		||||
        const accounts = await web3Wrapper.getAvailableAddressesAsync();
 | 
			
		||||
        const usedAddresses = ([
 | 
			
		||||
            owner,
 | 
			
		||||
            notAuthorized,
 | 
			
		||||
            assetProxyDispatcherAddress,
 | 
			
		||||
            makerAddress,
 | 
			
		||||
            takerAddress,
 | 
			
		||||
        ] = accounts);
 | 
			
		||||
        const usedAddresses = ([owner, notAuthorized, exchangeAddress, makerAddress, takerAddress] = accounts);
 | 
			
		||||
 | 
			
		||||
        erc20Wrapper = new ERC20Wrapper(deployer, provider, usedAddresses, owner);
 | 
			
		||||
        erc721Wrapper = new ERC721Wrapper(deployer, provider, usedAddresses, owner);
 | 
			
		||||
@@ -54,7 +47,7 @@ describe('Asset Transfer Proxies', () => {
 | 
			
		||||
        [zrx] = await erc20Wrapper.deployDummyERC20TokensAsync();
 | 
			
		||||
        erc20Proxy = await erc20Wrapper.deployERC20ProxyAsync();
 | 
			
		||||
        await erc20Wrapper.setBalancesAndAllowancesAsync();
 | 
			
		||||
        await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcherAddress, {
 | 
			
		||||
        await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(exchangeAddress, {
 | 
			
		||||
            from: owner,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -63,7 +56,7 @@ describe('Asset Transfer Proxies', () => {
 | 
			
		||||
        await erc721Wrapper.setBalancesAndAllowancesAsync();
 | 
			
		||||
        const erc721Balances = await erc721Wrapper.getBalancesAsync();
 | 
			
		||||
        erc721MakerTokenId = erc721Balances[makerAddress][erc721Token.address][0];
 | 
			
		||||
        await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcherAddress, {
 | 
			
		||||
        await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(exchangeAddress, {
 | 
			
		||||
            from: owner,
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
@@ -85,7 +78,7 @@ describe('Asset Transfer Proxies', () => {
 | 
			
		||||
                makerAddress,
 | 
			
		||||
                takerAddress,
 | 
			
		||||
                amount,
 | 
			
		||||
                { from: assetProxyDispatcherAddress },
 | 
			
		||||
                { from: exchangeAddress },
 | 
			
		||||
            );
 | 
			
		||||
            // Verify transfer was successful
 | 
			
		||||
            const newBalances = await erc20Wrapper.getBalancesAsync();
 | 
			
		||||
@@ -108,7 +101,7 @@ describe('Asset Transfer Proxies', () => {
 | 
			
		||||
                makerAddress,
 | 
			
		||||
                takerAddress,
 | 
			
		||||
                amount,
 | 
			
		||||
                { from: assetProxyDispatcherAddress },
 | 
			
		||||
                { from: exchangeAddress },
 | 
			
		||||
            );
 | 
			
		||||
            // Verify transfer was successful
 | 
			
		||||
            const newBalances = await erc20Wrapper.getBalancesAsync();
 | 
			
		||||
@@ -169,7 +162,7 @@ describe('Asset Transfer Proxies', () => {
 | 
			
		||||
                makerAddress,
 | 
			
		||||
                takerAddress,
 | 
			
		||||
                amount,
 | 
			
		||||
                { from: assetProxyDispatcherAddress },
 | 
			
		||||
                { from: exchangeAddress },
 | 
			
		||||
            );
 | 
			
		||||
            // Verify transfer was successful
 | 
			
		||||
            const newOwnerMakerAsset = await erc721Token.ownerOf.callAsync(erc721MakerTokenId);
 | 
			
		||||
@@ -191,7 +184,7 @@ describe('Asset Transfer Proxies', () => {
 | 
			
		||||
                    makerAddress,
 | 
			
		||||
                    takerAddress,
 | 
			
		||||
                    amount,
 | 
			
		||||
                    { from: assetProxyDispatcherAddress },
 | 
			
		||||
                    { from: exchangeAddress },
 | 
			
		||||
                ),
 | 
			
		||||
            ).to.be.rejectedWith(constants.REVERT);
 | 
			
		||||
        });
 | 
			
		||||
@@ -211,7 +204,7 @@ describe('Asset Transfer Proxies', () => {
 | 
			
		||||
                    makerAddress,
 | 
			
		||||
                    takerAddress,
 | 
			
		||||
                    amount,
 | 
			
		||||
                    { from: assetProxyDispatcherAddress },
 | 
			
		||||
                    { from: exchangeAddress },
 | 
			
		||||
                ),
 | 
			
		||||
            ).to.be.rejectedWith(constants.REVERT);
 | 
			
		||||
        });
 | 
			
		||||
@@ -5,7 +5,6 @@ import * as chai from 'chai';
 | 
			
		||||
import ethUtil = require('ethereumjs-util');
 | 
			
		||||
import * as _ from 'lodash';
 | 
			
		||||
 | 
			
		||||
import { AssetProxyDispatcherContract } from '../../src/contract_wrappers/generated/asset_proxy_dispatcher';
 | 
			
		||||
import { DummyERC20TokenContract } from '../../src/contract_wrappers/generated/dummy_e_r_c20_token';
 | 
			
		||||
import { DummyERC721TokenContract } from '../../src/contract_wrappers/generated/dummy_e_r_c721_token';
 | 
			
		||||
import { ERC20ProxyContract } from '../../src/contract_wrappers/generated/e_r_c20_proxy';
 | 
			
		||||
@@ -51,7 +50,6 @@ describe('Exchange core', () => {
 | 
			
		||||
    let zrx: DummyERC20TokenContract;
 | 
			
		||||
    let erc721Token: DummyERC721TokenContract;
 | 
			
		||||
    let exchange: ExchangeContract;
 | 
			
		||||
    let assetProxyDispatcher: AssetProxyDispatcherContract;
 | 
			
		||||
    let erc20Proxy: ERC20ProxyContract;
 | 
			
		||||
    let erc721Proxy: ERC721ProxyContract;
 | 
			
		||||
 | 
			
		||||
@@ -88,44 +86,24 @@ describe('Exchange core', () => {
 | 
			
		||||
        erc721MakerAssetIds = erc721Balances[makerAddress][erc721Token.address];
 | 
			
		||||
        erc721TakerAssetIds = erc721Balances[takerAddress][erc721Token.address];
 | 
			
		||||
 | 
			
		||||
        const assetProxyDispatcherInstance = await deployer.deployAsync(ContractName.AssetProxyDispatcher);
 | 
			
		||||
        assetProxyDispatcher = new AssetProxyDispatcherContract(
 | 
			
		||||
            assetProxyDispatcherInstance.abi,
 | 
			
		||||
            assetProxyDispatcherInstance.address,
 | 
			
		||||
            provider,
 | 
			
		||||
        );
 | 
			
		||||
        const prevERC20ProxyAddress = ZeroEx.NULL_ADDRESS;
 | 
			
		||||
        await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(
 | 
			
		||||
            AssetProxyId.ERC20,
 | 
			
		||||
            erc20Proxy.address,
 | 
			
		||||
            prevERC20ProxyAddress,
 | 
			
		||||
            { from: owner },
 | 
			
		||||
        );
 | 
			
		||||
        const prevERC721ProxyAddress = ZeroEx.NULL_ADDRESS;
 | 
			
		||||
        await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(
 | 
			
		||||
            AssetProxyId.ERC721,
 | 
			
		||||
            erc721Proxy.address,
 | 
			
		||||
            prevERC721ProxyAddress,
 | 
			
		||||
            { from: owner },
 | 
			
		||||
        );
 | 
			
		||||
        await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcher.address, {
 | 
			
		||||
            from: owner,
 | 
			
		||||
        });
 | 
			
		||||
        await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcher.address, {
 | 
			
		||||
            from: owner,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const exchangeInstance = await deployer.deployAsync(ContractName.Exchange, [
 | 
			
		||||
            assetProxyDispatcher.address,
 | 
			
		||||
            assetProxyUtils.encodeERC20ProxyData(zrx.address),
 | 
			
		||||
        ]);
 | 
			
		||||
        exchange = new ExchangeContract(exchangeInstance.abi, exchangeInstance.address, provider);
 | 
			
		||||
        await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(exchange.address, { from: owner });
 | 
			
		||||
        zeroEx = new ZeroEx(provider, {
 | 
			
		||||
            exchangeContractAddress: exchange.address,
 | 
			
		||||
            networkId: constants.TESTRPC_NETWORK_ID,
 | 
			
		||||
        });
 | 
			
		||||
        exchangeWrapper = new ExchangeWrapper(exchange, zeroEx);
 | 
			
		||||
        await exchangeWrapper.registerAssetProxyAsync(AssetProxyId.ERC20, erc20Proxy.address, owner);
 | 
			
		||||
        await exchangeWrapper.registerAssetProxyAsync(AssetProxyId.ERC721, erc721Proxy.address, owner);
 | 
			
		||||
 | 
			
		||||
        await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
 | 
			
		||||
            from: owner,
 | 
			
		||||
        });
 | 
			
		||||
        await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
 | 
			
		||||
            from: owner,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        defaultMakerAssetAddress = erc20TokenA.address;
 | 
			
		||||
        defaultTakerAssetAddress = erc20TokenB.address;
 | 
			
		||||
@@ -467,35 +445,6 @@ describe('Exchange core', () => {
 | 
			
		||||
            expect(orderUtils.getOrderHashHex(signedOrder)).to.be.equal(logArgs.orderHash);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should log 1 event with the correct arguments when order has no feeRecipient', async () => {
 | 
			
		||||
            signedOrder = orderFactory.newSignedOrder({
 | 
			
		||||
                feeRecipientAddress: ZeroEx.NULL_ADDRESS,
 | 
			
		||||
            });
 | 
			
		||||
            const divisor = 2;
 | 
			
		||||
            const res = await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, {
 | 
			
		||||
                takerAssetFillAmount: signedOrder.takerAssetAmount.div(divisor),
 | 
			
		||||
            });
 | 
			
		||||
            expect(res.logs).to.have.length(1);
 | 
			
		||||
 | 
			
		||||
            const log = res.logs[0] as LogWithDecodedArgs<FillContractEventArgs>;
 | 
			
		||||
            const logArgs = log.args;
 | 
			
		||||
            const expectedFilledMakerAssetAmount = signedOrder.makerAssetAmount.div(divisor);
 | 
			
		||||
            const expectedFilledTakerAssetAmount = signedOrder.takerAssetAmount.div(divisor);
 | 
			
		||||
            const expectedFeeMPaid = new BigNumber(0);
 | 
			
		||||
            const expectedFeeTPaid = new BigNumber(0);
 | 
			
		||||
 | 
			
		||||
            expect(signedOrder.makerAddress).to.be.equal(logArgs.makerAddress);
 | 
			
		||||
            expect(takerAddress).to.be.equal(logArgs.takerAddress);
 | 
			
		||||
            expect(signedOrder.feeRecipientAddress).to.be.equal(logArgs.feeRecipientAddress);
 | 
			
		||||
            expect(signedOrder.makerAssetData).to.be.equal(logArgs.makerAssetData);
 | 
			
		||||
            expect(signedOrder.takerAssetData).to.be.equal(logArgs.takerAssetData);
 | 
			
		||||
            expect(expectedFilledMakerAssetAmount).to.be.bignumber.equal(logArgs.makerAssetFilledAmount);
 | 
			
		||||
            expect(expectedFilledTakerAssetAmount).to.be.bignumber.equal(logArgs.takerAssetFilledAmount);
 | 
			
		||||
            expect(expectedFeeMPaid).to.be.bignumber.equal(logArgs.makerFeePaid);
 | 
			
		||||
            expect(expectedFeeTPaid).to.be.bignumber.equal(logArgs.takerFeePaid);
 | 
			
		||||
            expect(orderUtils.getOrderHashHex(signedOrder)).to.be.equal(logArgs.orderHash);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should throw when taker is specified and order is claimed by other', async () => {
 | 
			
		||||
            signedOrder = orderFactory.newSignedOrder({
 | 
			
		||||
                takerAddress: feeRecipientAddress,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,10 +4,10 @@ import { BigNumber } from '@0xproject/utils';
 | 
			
		||||
import * as chai from 'chai';
 | 
			
		||||
import * as Web3 from 'web3';
 | 
			
		||||
 | 
			
		||||
import { AssetProxyDispatcherContract } from '../../src/contract_wrappers/generated/asset_proxy_dispatcher';
 | 
			
		||||
import { DummyERC20TokenContract } from '../../src/contract_wrappers/generated/dummy_e_r_c20_token';
 | 
			
		||||
import { ERC20ProxyContract } from '../../src/contract_wrappers/generated/e_r_c20_proxy';
 | 
			
		||||
import { ERC721ProxyContract } from '../../src/contract_wrappers/generated/e_r_c721_proxy';
 | 
			
		||||
import { TestAssetProxyDispatcherContract } from '../../src/contract_wrappers/generated/test_asset_proxy_dispatcher';
 | 
			
		||||
import { assetProxyUtils } from '../../src/utils/asset_proxy_utils';
 | 
			
		||||
import { constants } from '../../src/utils/constants';
 | 
			
		||||
import { ERC20Wrapper } from '../../src/utils/erc20_wrapper';
 | 
			
		||||
@@ -25,14 +25,13 @@ describe('AssetProxyDispatcher', () => {
 | 
			
		||||
    let owner: string;
 | 
			
		||||
    let notOwner: string;
 | 
			
		||||
    let notAuthorized: string;
 | 
			
		||||
    let exchangeAddress: string;
 | 
			
		||||
    let makerAddress: string;
 | 
			
		||||
    let takerAddress: string;
 | 
			
		||||
 | 
			
		||||
    let zrx: DummyERC20TokenContract;
 | 
			
		||||
    let erc20Proxy: ERC20ProxyContract;
 | 
			
		||||
    let erc721Proxy: ERC721ProxyContract;
 | 
			
		||||
    let assetProxyDispatcher: AssetProxyDispatcherContract;
 | 
			
		||||
    let assetProxyDispatcher: TestAssetProxyDispatcherContract;
 | 
			
		||||
 | 
			
		||||
    let erc20Wrapper: ERC20Wrapper;
 | 
			
		||||
    let erc721Wrapper: ERC721Wrapper;
 | 
			
		||||
@@ -40,7 +39,7 @@ describe('AssetProxyDispatcher', () => {
 | 
			
		||||
    before(async () => {
 | 
			
		||||
        // Setup accounts & addresses
 | 
			
		||||
        const accounts = await web3Wrapper.getAvailableAddressesAsync();
 | 
			
		||||
        const usedAddresses = ([owner, notOwner, exchangeAddress, makerAddress, takerAddress] = accounts);
 | 
			
		||||
        const usedAddresses = ([owner, notOwner, makerAddress, takerAddress] = accounts);
 | 
			
		||||
        notAuthorized = notOwner;
 | 
			
		||||
 | 
			
		||||
        erc20Wrapper = new ERC20Wrapper(deployer, provider, usedAddresses, owner);
 | 
			
		||||
@@ -52,15 +51,12 @@ describe('AssetProxyDispatcher', () => {
 | 
			
		||||
 | 
			
		||||
        erc721Proxy = await erc721Wrapper.deployERC721ProxyAsync();
 | 
			
		||||
 | 
			
		||||
        const assetProxyDispatcherInstance = await deployer.deployAsync(ContractName.AssetProxyDispatcher);
 | 
			
		||||
        assetProxyDispatcher = new AssetProxyDispatcherContract(
 | 
			
		||||
        const assetProxyDispatcherInstance = await deployer.deployAsync(ContractName.TestAssetProxyDispatcher);
 | 
			
		||||
        assetProxyDispatcher = new TestAssetProxyDispatcherContract(
 | 
			
		||||
            assetProxyDispatcherInstance.abi,
 | 
			
		||||
            assetProxyDispatcherInstance.address,
 | 
			
		||||
            provider,
 | 
			
		||||
        );
 | 
			
		||||
        await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(exchangeAddress, {
 | 
			
		||||
            from: owner,
 | 
			
		||||
        });
 | 
			
		||||
        await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcher.address, {
 | 
			
		||||
            from: owner,
 | 
			
		||||
        });
 | 
			
		||||
@@ -219,7 +215,7 @@ describe('AssetProxyDispatcher', () => {
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    describe('transferFrom', () => {
 | 
			
		||||
    describe('dispatchTransferFrom', () => {
 | 
			
		||||
        it('should dispatch transfer to registered proxy', async () => {
 | 
			
		||||
            // Register ERC20 proxy
 | 
			
		||||
            const prevProxyAddress = ZeroEx.NULL_ADDRESS;
 | 
			
		||||
@@ -234,12 +230,12 @@ describe('AssetProxyDispatcher', () => {
 | 
			
		||||
            // Perform a transfer from makerAddress to takerAddress
 | 
			
		||||
            const erc20Balances = await erc20Wrapper.getBalancesAsync();
 | 
			
		||||
            const amount = new BigNumber(10);
 | 
			
		||||
            await assetProxyDispatcher.transferFrom.sendTransactionAsync(
 | 
			
		||||
            await assetProxyDispatcher.publicDispatchTransferFrom.sendTransactionAsync(
 | 
			
		||||
                encodedProxyMetadata,
 | 
			
		||||
                makerAddress,
 | 
			
		||||
                takerAddress,
 | 
			
		||||
                amount,
 | 
			
		||||
                { from: exchangeAddress },
 | 
			
		||||
                { from: owner },
 | 
			
		||||
            );
 | 
			
		||||
            // Verify transfer was successful
 | 
			
		||||
            const newBalances = await erc20Wrapper.getBalancesAsync();
 | 
			
		||||
@@ -258,37 +254,12 @@ describe('AssetProxyDispatcher', () => {
 | 
			
		||||
            const erc20Balances = await erc20Wrapper.getBalancesAsync();
 | 
			
		||||
            const amount = new BigNumber(10);
 | 
			
		||||
            return expect(
 | 
			
		||||
                assetProxyDispatcher.transferFrom.sendTransactionAsync(
 | 
			
		||||
                assetProxyDispatcher.publicDispatchTransferFrom.sendTransactionAsync(
 | 
			
		||||
                    encodedProxyMetadata,
 | 
			
		||||
                    makerAddress,
 | 
			
		||||
                    takerAddress,
 | 
			
		||||
                    amount,
 | 
			
		||||
                    { from: exchangeAddress },
 | 
			
		||||
                ),
 | 
			
		||||
            ).to.be.rejectedWith(constants.REVERT);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('should throw on transfer if requesting address is not authorized', async () => {
 | 
			
		||||
            // Register ERC20 proxy
 | 
			
		||||
            const prevProxyAddress = ZeroEx.NULL_ADDRESS;
 | 
			
		||||
            await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(
 | 
			
		||||
                AssetProxyId.ERC20,
 | 
			
		||||
                erc20Proxy.address,
 | 
			
		||||
                prevProxyAddress,
 | 
			
		||||
                { from: owner },
 | 
			
		||||
            );
 | 
			
		||||
            // Construct metadata for ERC20 proxy
 | 
			
		||||
            const encodedProxyMetadata = assetProxyUtils.encodeERC20ProxyData(zrx.address);
 | 
			
		||||
            // Perform a transfer from makerAddress to takerAddress
 | 
			
		||||
            const erc20Balances = await erc20Wrapper.getBalancesAsync();
 | 
			
		||||
            const amount = new BigNumber(10);
 | 
			
		||||
            return expect(
 | 
			
		||||
                assetProxyDispatcher.transferFrom.sendTransactionAsync(
 | 
			
		||||
                    encodedProxyMetadata,
 | 
			
		||||
                    makerAddress,
 | 
			
		||||
                    takerAddress,
 | 
			
		||||
                    amount,
 | 
			
		||||
                    { from: notAuthorized },
 | 
			
		||||
                    { from: owner },
 | 
			
		||||
                ),
 | 
			
		||||
            ).to.be.rejectedWith(constants.REVERT);
 | 
			
		||||
        });
 | 
			
		||||
@@ -29,10 +29,7 @@ describe('Exchange helpers', () => {
 | 
			
		||||
    before(async () => {
 | 
			
		||||
        const accounts = await web3Wrapper.getAvailableAddressesAsync();
 | 
			
		||||
        const makerAddress = accounts[0];
 | 
			
		||||
        const exchangeInstance = await deployer.deployAsync(ContractName.Exchange, [
 | 
			
		||||
            ZeroEx.NULL_ADDRESS,
 | 
			
		||||
            AssetProxyId.ERC20,
 | 
			
		||||
        ]);
 | 
			
		||||
        const exchangeInstance = await deployer.deployAsync(ContractName.Exchange, [AssetProxyId.ERC20]);
 | 
			
		||||
        const exchange = new ExchangeContract(exchangeInstance.abi, exchangeInstance.address, provider);
 | 
			
		||||
        const zeroEx = new ZeroEx(provider, { networkId: constants.TESTRPC_NETWORK_ID });
 | 
			
		||||
        exchangeWrapper = new ExchangeWrapper(exchange, zeroEx);
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,6 @@ import * as chai from 'chai';
 | 
			
		||||
import * as _ from 'lodash';
 | 
			
		||||
import * as Web3 from 'web3';
 | 
			
		||||
 | 
			
		||||
import { AssetProxyDispatcherContract } from '../../src/contract_wrappers/generated/asset_proxy_dispatcher';
 | 
			
		||||
import { DummyERC20TokenContract } from '../../src/contract_wrappers/generated/dummy_e_r_c20_token';
 | 
			
		||||
import { DummyERC721TokenContract } from '../../src/contract_wrappers/generated/dummy_e_r_c721_token';
 | 
			
		||||
import { ERC20ProxyContract } from '../../src/contract_wrappers/generated/e_r_c20_proxy';
 | 
			
		||||
@@ -45,7 +44,6 @@ describe('Exchange wrappers', () => {
 | 
			
		||||
    let zrx: DummyERC20TokenContract;
 | 
			
		||||
    let erc721Token: DummyERC721TokenContract;
 | 
			
		||||
    let exchange: ExchangeContract;
 | 
			
		||||
    let assetProxyDispatcher: AssetProxyDispatcherContract;
 | 
			
		||||
    let erc20Proxy: ERC20ProxyContract;
 | 
			
		||||
    let erc721Proxy: ERC721ProxyContract;
 | 
			
		||||
 | 
			
		||||
@@ -81,44 +79,24 @@ describe('Exchange wrappers', () => {
 | 
			
		||||
        erc721MakerAssetId = erc721Balances[makerAddress][erc721Token.address][0];
 | 
			
		||||
        erc721TakerAssetId = erc721Balances[takerAddress][erc721Token.address][0];
 | 
			
		||||
 | 
			
		||||
        const assetProxyDispatcherInstance = await deployer.deployAsync(ContractName.AssetProxyDispatcher);
 | 
			
		||||
        assetProxyDispatcher = new AssetProxyDispatcherContract(
 | 
			
		||||
            assetProxyDispatcherInstance.abi,
 | 
			
		||||
            assetProxyDispatcherInstance.address,
 | 
			
		||||
            provider,
 | 
			
		||||
        );
 | 
			
		||||
        const prevERC20ProxyAddress = ZeroEx.NULL_ADDRESS;
 | 
			
		||||
        await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(
 | 
			
		||||
            AssetProxyId.ERC20,
 | 
			
		||||
            erc20Proxy.address,
 | 
			
		||||
            prevERC20ProxyAddress,
 | 
			
		||||
            { from: owner },
 | 
			
		||||
        );
 | 
			
		||||
        const prevERC721ProxyAddress = ZeroEx.NULL_ADDRESS;
 | 
			
		||||
        await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(
 | 
			
		||||
            AssetProxyId.ERC721,
 | 
			
		||||
            erc721Proxy.address,
 | 
			
		||||
            prevERC721ProxyAddress,
 | 
			
		||||
            { from: owner },
 | 
			
		||||
        );
 | 
			
		||||
        await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcher.address, {
 | 
			
		||||
            from: owner,
 | 
			
		||||
        });
 | 
			
		||||
        await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcher.address, {
 | 
			
		||||
            from: owner,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const exchangeInstance = await deployer.deployAsync(ContractName.Exchange, [
 | 
			
		||||
            assetProxyDispatcher.address,
 | 
			
		||||
            assetProxyUtils.encodeERC20ProxyData(zrx.address),
 | 
			
		||||
        ]);
 | 
			
		||||
        exchange = new ExchangeContract(exchangeInstance.abi, exchangeInstance.address, provider);
 | 
			
		||||
        await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(exchange.address, { from: owner });
 | 
			
		||||
        zeroEx = new ZeroEx(provider, {
 | 
			
		||||
            exchangeContractAddress: exchange.address,
 | 
			
		||||
            networkId: constants.TESTRPC_NETWORK_ID,
 | 
			
		||||
        });
 | 
			
		||||
        exchangeWrapper = new ExchangeWrapper(exchange, zeroEx);
 | 
			
		||||
        await exchangeWrapper.registerAssetProxyAsync(AssetProxyId.ERC20, erc20Proxy.address, owner);
 | 
			
		||||
        await exchangeWrapper.registerAssetProxyAsync(AssetProxyId.ERC721, erc721Proxy.address, owner);
 | 
			
		||||
 | 
			
		||||
        await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
 | 
			
		||||
            from: owner,
 | 
			
		||||
        });
 | 
			
		||||
        await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
 | 
			
		||||
            from: owner,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        defaultMakerAssetAddress = erc20TokenA.address;
 | 
			
		||||
        defaultTakerAssetAddress = erc20TokenB.address;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user