Add etherToken.getLogsAsync and etherToken.subscribe with tests
This commit is contained in:
		@@ -201,7 +201,7 @@ export class ZeroEx {
 | 
			
		||||
            this._web3Wrapper, config.networkId, config.tokenRegistryContractAddress,
 | 
			
		||||
        );
 | 
			
		||||
        this.etherToken = new EtherTokenWrapper(
 | 
			
		||||
            this._web3Wrapper, config.networkId, this.token,
 | 
			
		||||
            this._web3Wrapper, config.networkId, this._abiDecoder, this.token,
 | 
			
		||||
        );
 | 
			
		||||
        this.orderStateWatcher = new OrderStateWatcher(
 | 
			
		||||
            this._web3Wrapper, this._abiDecoder, this.token, this.exchange, config.orderWatcherConfig,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,21 @@
 | 
			
		||||
import {schemas} from '@0xproject/json-schemas';
 | 
			
		||||
import {Web3Wrapper} from '@0xproject/web3-wrapper';
 | 
			
		||||
import BigNumber from 'bignumber.js';
 | 
			
		||||
import * as _ from 'lodash';
 | 
			
		||||
 | 
			
		||||
import {artifacts} from '../artifacts';
 | 
			
		||||
import {TransactionOpts, ZeroExError} from '../types';
 | 
			
		||||
import {
 | 
			
		||||
    BlockRange,
 | 
			
		||||
    EtherTokenContractEventArgs,
 | 
			
		||||
    EtherTokenEvents,
 | 
			
		||||
    EventCallback,
 | 
			
		||||
    IndexedFilterValues,
 | 
			
		||||
    LogWithDecodedArgs,
 | 
			
		||||
    TokenEvents,
 | 
			
		||||
    TransactionOpts,
 | 
			
		||||
    ZeroExError,
 | 
			
		||||
} from '../types';
 | 
			
		||||
import {AbiDecoder} from '../utils/abi_decoder';
 | 
			
		||||
import {assert} from '../utils/assert';
 | 
			
		||||
 | 
			
		||||
import {ContractWrapper} from './contract_wrapper';
 | 
			
		||||
@@ -17,8 +29,8 @@ import {TokenWrapper} from './token_wrapper';
 | 
			
		||||
export class EtherTokenWrapper extends ContractWrapper {
 | 
			
		||||
    private _etherTokenContractIfExists?: EtherTokenContract;
 | 
			
		||||
    private _tokenWrapper: TokenWrapper;
 | 
			
		||||
    constructor(web3Wrapper: Web3Wrapper, networkId: number, tokenWrapper: TokenWrapper) {
 | 
			
		||||
        super(web3Wrapper, networkId);
 | 
			
		||||
    constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder: AbiDecoder, tokenWrapper: TokenWrapper) {
 | 
			
		||||
        super(web3Wrapper, networkId, abiDecoder);
 | 
			
		||||
        this._tokenWrapper = tokenWrapper;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
@@ -75,7 +87,63 @@ export class EtherTokenWrapper extends ContractWrapper {
 | 
			
		||||
        });
 | 
			
		||||
        return txHash;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets historical logs without creating a subscription
 | 
			
		||||
     * @param   etherTokenAddress   An address of the ether token that emmited the logs.
 | 
			
		||||
     * @param   eventName           The ether token contract event you would like to subscribe to.
 | 
			
		||||
     * @param   blockRange          Block range to get logs from.
 | 
			
		||||
     * @param   indexFilterValues   An object where the keys are indexed args returned by the event and
 | 
			
		||||
     *                              the value is the value you are interested in. E.g `{_owner: aUserAddressHex}`
 | 
			
		||||
     * @return  Array of logs that match the parameters
 | 
			
		||||
     */
 | 
			
		||||
    public async getLogsAsync<ArgsType extends EtherTokenContractEventArgs>(
 | 
			
		||||
        etherTokenAddress: string, eventName: EtherTokenEvents, blockRange: BlockRange,
 | 
			
		||||
        indexFilterValues: IndexedFilterValues): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
 | 
			
		||||
        assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
 | 
			
		||||
        assert.doesBelongToStringEnum('eventName', eventName, TokenEvents);
 | 
			
		||||
        assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema);
 | 
			
		||||
        assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
 | 
			
		||||
        const logs = await this._getLogsAsync<ArgsType>(
 | 
			
		||||
            etherTokenAddress, eventName, blockRange, indexFilterValues, artifacts.TokenArtifact.abi,
 | 
			
		||||
        );
 | 
			
		||||
        return logs;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Subscribe to an event type emitted by the Token contract.
 | 
			
		||||
     * @param   etherTokenAddress   The hex encoded address where the ether token is deployed.
 | 
			
		||||
     * @param   eventName           The ether token contract event you would like to subscribe to.
 | 
			
		||||
     * @param   indexFilterValues   An object where the keys are indexed args returned by the event and
 | 
			
		||||
     *                              the value is the value you are interested in. E.g `{_owner: aUserAddressHex}`
 | 
			
		||||
     * @param   callback            Callback that gets called when a log is added/removed
 | 
			
		||||
     * @return Subscription token used later to unsubscribe
 | 
			
		||||
     */
 | 
			
		||||
    public subscribe<ArgsType extends EtherTokenContractEventArgs>(
 | 
			
		||||
        etherTokenAddress: string, eventName: EtherTokenEvents, indexFilterValues: IndexedFilterValues,
 | 
			
		||||
        callback: EventCallback<ArgsType>): string {
 | 
			
		||||
        assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
 | 
			
		||||
        assert.doesBelongToStringEnum('eventName', eventName, TokenEvents);
 | 
			
		||||
        assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
 | 
			
		||||
        assert.isFunction('callback', callback);
 | 
			
		||||
        const subscriptionToken = this._subscribe<ArgsType>(
 | 
			
		||||
            etherTokenAddress, eventName, indexFilterValues, artifacts.TokenArtifact.abi, callback,
 | 
			
		||||
        );
 | 
			
		||||
        return subscriptionToken;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Cancel a subscription
 | 
			
		||||
     * @param   subscriptionToken Subscription token returned by `subscribe()`
 | 
			
		||||
     */
 | 
			
		||||
    public unsubscribe(subscriptionToken: string): void {
 | 
			
		||||
        this._unsubscribe(subscriptionToken);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Cancels all existing subscriptions
 | 
			
		||||
     */
 | 
			
		||||
    public unsubscribeAll(): void {
 | 
			
		||||
        super.unsubscribeAll();
 | 
			
		||||
    }
 | 
			
		||||
    private _invalidateContractInstance(): void {
 | 
			
		||||
        this.unsubscribeAll();
 | 
			
		||||
        delete this._etherTokenContractIfExists;
 | 
			
		||||
    }
 | 
			
		||||
    private async _getEtherTokenContractAsync(etherTokenAddress: string): Promise<EtherTokenContract> {
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ export {ZeroEx} from './0x';
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
    Order,
 | 
			
		||||
    BlockParamLiteral,
 | 
			
		||||
    SignedOrder,
 | 
			
		||||
    ECSignature,
 | 
			
		||||
    ZeroExError,
 | 
			
		||||
@@ -27,6 +28,7 @@ export {
 | 
			
		||||
    ContractEventArg,
 | 
			
		||||
    Web3Provider,
 | 
			
		||||
    ZeroExConfig,
 | 
			
		||||
    EtherTokenEvents,
 | 
			
		||||
    TransactionReceiptWithDecodedLogs,
 | 
			
		||||
    LogWithDecodedArgs,
 | 
			
		||||
    MethodOpts,
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@ export enum ZeroExError {
 | 
			
		||||
export enum InternalZeroExError {
 | 
			
		||||
    NoAbiDecoder = 'NO_ABI_DECODER',
 | 
			
		||||
    ZrxNotInTokenRegistry = 'ZRX_NOT_IN_TOKEN_REGISTRY',
 | 
			
		||||
    WethNotInTokenRegistry = 'WETH_NOT_IN_TOKEN_REGISTRY',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -146,8 +147,17 @@ export interface ApprovalContractEventArgs {
 | 
			
		||||
    _spender: string;
 | 
			
		||||
    _value: BigNumber;
 | 
			
		||||
}
 | 
			
		||||
export interface DepositContractEventArgs {
 | 
			
		||||
    _owner: string;
 | 
			
		||||
    _value: BigNumber;
 | 
			
		||||
}
 | 
			
		||||
export interface WithdrawalContractEventArgs {
 | 
			
		||||
    _owner: string;
 | 
			
		||||
    _value: BigNumber;
 | 
			
		||||
}
 | 
			
		||||
export type TokenContractEventArgs = TransferContractEventArgs|ApprovalContractEventArgs;
 | 
			
		||||
export type ContractEventArgs = ExchangeContractEventArgs|TokenContractEventArgs;
 | 
			
		||||
export type EtherTokenContractEventArgs = TokenContractEventArgs|DepositContractEventArgs|WithdrawalContractEventArgs;
 | 
			
		||||
export type ContractEventArgs = ExchangeContractEventArgs|TokenContractEventArgs|EtherTokenContractEventArgs;
 | 
			
		||||
export type ContractEventArg = string|BigNumber;
 | 
			
		||||
 | 
			
		||||
export interface Order {
 | 
			
		||||
@@ -201,7 +211,14 @@ export enum TokenEvents {
 | 
			
		||||
    Approval = 'Approval',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type ContractEvents = TokenEvents|ExchangeEvents;
 | 
			
		||||
export enum EtherTokenEvents  {
 | 
			
		||||
    Transfer = 'Transfer',
 | 
			
		||||
    Approval = 'Approval',
 | 
			
		||||
    Deposit = 'Deposit',
 | 
			
		||||
    Withdrawal = 'Withdrawal',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type ContractEvents = TokenEvents|ExchangeEvents|EtherTokenEvents;
 | 
			
		||||
 | 
			
		||||
export interface IndexedFilterValues {
 | 
			
		||||
    [index: string]: ContractEventArg;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,11 +4,23 @@ import * as chai from 'chai';
 | 
			
		||||
import 'mocha';
 | 
			
		||||
import * as Web3 from 'web3';
 | 
			
		||||
 | 
			
		||||
import {ZeroEx, ZeroExError} from '../src';
 | 
			
		||||
import {
 | 
			
		||||
    ApprovalContractEventArgs,
 | 
			
		||||
    BlockParamLiteral,
 | 
			
		||||
    BlockRange,
 | 
			
		||||
    DecodedLogEvent,
 | 
			
		||||
    EtherTokenEvents,
 | 
			
		||||
    Token,
 | 
			
		||||
    TransferContractEventArgs,
 | 
			
		||||
    ZeroEx,
 | 
			
		||||
    ZeroExError,
 | 
			
		||||
} from '../src';
 | 
			
		||||
import {artifacts} from '../src/artifacts';
 | 
			
		||||
import {DoneCallback} from '../src/types';
 | 
			
		||||
 | 
			
		||||
import {chaiSetup} from './utils/chai_setup';
 | 
			
		||||
import {constants} from './utils/constants';
 | 
			
		||||
import {TokenUtils} from './utils/token_utils';
 | 
			
		||||
import {web3Factory} from './utils/web3_factory';
 | 
			
		||||
 | 
			
		||||
chaiSetup.configure();
 | 
			
		||||
@@ -24,11 +36,13 @@ const MAX_REASONABLE_GAS_COST_IN_WEI = 62517;
 | 
			
		||||
describe('EtherTokenWrapper', () => {
 | 
			
		||||
    let web3: Web3;
 | 
			
		||||
    let zeroEx: ZeroEx;
 | 
			
		||||
    let tokens: Token[];
 | 
			
		||||
    let userAddresses: string[];
 | 
			
		||||
    let addressWithETH: string;
 | 
			
		||||
    let wethContractAddress: string;
 | 
			
		||||
    let depositWeiAmount: BigNumber;
 | 
			
		||||
    let decimalPlaces: number;
 | 
			
		||||
    let addressWithoutFunds: string;
 | 
			
		||||
    const gasPrice = new BigNumber(1);
 | 
			
		||||
    const zeroExConfig = {
 | 
			
		||||
        gasPrice,
 | 
			
		||||
@@ -37,11 +51,13 @@ describe('EtherTokenWrapper', () => {
 | 
			
		||||
    before(async () => {
 | 
			
		||||
        web3 = web3Factory.create();
 | 
			
		||||
        zeroEx = new ZeroEx(web3.currentProvider, zeroExConfig);
 | 
			
		||||
        tokens = await zeroEx.tokenRegistry.getTokensAsync();
 | 
			
		||||
        userAddresses = await zeroEx.getAvailableAddressesAsync();
 | 
			
		||||
        addressWithETH = userAddresses[0];
 | 
			
		||||
        wethContractAddress = (zeroEx.etherToken as any)._getContractAddress(artifacts.EtherTokenArtifact);
 | 
			
		||||
        depositWeiAmount = (zeroEx as any)._web3Wrapper.toWei(new BigNumber(5));
 | 
			
		||||
        decimalPlaces = 7;
 | 
			
		||||
        addressWithoutFunds = userAddresses[1];
 | 
			
		||||
    });
 | 
			
		||||
    beforeEach(async () => {
 | 
			
		||||
        await blockchainLifecycle.startAsync();
 | 
			
		||||
@@ -113,4 +129,157 @@ describe('EtherTokenWrapper', () => {
 | 
			
		||||
            ).to.be.rejectedWith(ZeroExError.InsufficientWEthBalanceForWithdrawal);
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    describe('#subscribe', () => {
 | 
			
		||||
        const indexFilterValues = {};
 | 
			
		||||
        let etherTokenAddress: string;
 | 
			
		||||
        const transferAmount = new BigNumber(42);
 | 
			
		||||
        const allowanceAmount = new BigNumber(42);
 | 
			
		||||
        before(() => {
 | 
			
		||||
            const tokenUtils = new TokenUtils(tokens);
 | 
			
		||||
            const etherToken = tokenUtils.getWethTokenOrThrow();
 | 
			
		||||
            etherTokenAddress = etherToken.address;
 | 
			
		||||
        });
 | 
			
		||||
        afterEach(() => {
 | 
			
		||||
            zeroEx.etherToken.unsubscribeAll();
 | 
			
		||||
        });
 | 
			
		||||
        // Hack: Mocha does not allow a test to be both async and have a `done` callback
 | 
			
		||||
        // Since we need to await the receipt of the event in the `subscribe` callback,
 | 
			
		||||
        // we do need both. A hack is to make the top-level a sync fn w/ a done callback and then
 | 
			
		||||
        // wrap the rest of the test in an async block
 | 
			
		||||
        // Source: https://github.com/mochajs/mocha/issues/2407
 | 
			
		||||
        it('Should receive the Transfer event when tokens are transfered', (done: DoneCallback) => {
 | 
			
		||||
            (async () => {
 | 
			
		||||
                const callback = (err: Error, logEvent: DecodedLogEvent<TransferContractEventArgs>) => {
 | 
			
		||||
                    expect(logEvent).to.not.be.undefined();
 | 
			
		||||
                    expect(logEvent.isRemoved).to.be.false();
 | 
			
		||||
                    expect(logEvent.log.logIndex).to.be.equal(0);
 | 
			
		||||
                    expect(logEvent.log.transactionIndex).to.be.equal(0);
 | 
			
		||||
                    expect(logEvent.log.blockNumber).to.be.a('number');
 | 
			
		||||
                    const args = logEvent.log.args;
 | 
			
		||||
                    expect(args._from).to.be.equal(addressWithETH);
 | 
			
		||||
                    expect(args._to).to.be.equal(addressWithoutFunds);
 | 
			
		||||
                    expect(args._value).to.be.bignumber.equal(transferAmount);
 | 
			
		||||
                    done();
 | 
			
		||||
                };
 | 
			
		||||
                await zeroEx.etherToken.depositAsync(etherTokenAddress, transferAmount, addressWithETH);
 | 
			
		||||
                zeroEx.etherToken.subscribe(
 | 
			
		||||
                    etherTokenAddress, EtherTokenEvents.Transfer, indexFilterValues, callback);
 | 
			
		||||
                await zeroEx.token.transferAsync(
 | 
			
		||||
                    etherTokenAddress, addressWithETH, addressWithoutFunds, transferAmount,
 | 
			
		||||
                );
 | 
			
		||||
            })().catch(done);
 | 
			
		||||
        });
 | 
			
		||||
        it('Should receive the Approval event when allowance is being set', (done: DoneCallback) => {
 | 
			
		||||
            (async () => {
 | 
			
		||||
                const callback = (err: Error, logEvent: DecodedLogEvent<ApprovalContractEventArgs>) => {
 | 
			
		||||
                    expect(logEvent).to.not.be.undefined();
 | 
			
		||||
                    expect(logEvent.isRemoved).to.be.false();
 | 
			
		||||
                    const args = logEvent.log.args;
 | 
			
		||||
                    expect(args._owner).to.be.equal(addressWithETH);
 | 
			
		||||
                    expect(args._spender).to.be.equal(addressWithoutFunds);
 | 
			
		||||
                    expect(args._value).to.be.bignumber.equal(allowanceAmount);
 | 
			
		||||
                    done();
 | 
			
		||||
                };
 | 
			
		||||
                zeroEx.etherToken.subscribe(
 | 
			
		||||
                    etherTokenAddress, EtherTokenEvents.Approval, indexFilterValues, callback);
 | 
			
		||||
                await zeroEx.token.setAllowanceAsync(
 | 
			
		||||
                    etherTokenAddress, addressWithETH, addressWithoutFunds, allowanceAmount,
 | 
			
		||||
                );
 | 
			
		||||
            })().catch(done);
 | 
			
		||||
        });
 | 
			
		||||
        it('Outstanding subscriptions are cancelled when zeroEx.setProvider called', (done: DoneCallback) => {
 | 
			
		||||
            (async () => {
 | 
			
		||||
                const callbackNeverToBeCalled = (err: Error, logEvent: DecodedLogEvent<ApprovalContractEventArgs>) => {
 | 
			
		||||
                    done(new Error('Expected this subscription to have been cancelled'));
 | 
			
		||||
                };
 | 
			
		||||
                zeroEx.etherToken.subscribe(
 | 
			
		||||
                    etherTokenAddress, EtherTokenEvents.Transfer, indexFilterValues, callbackNeverToBeCalled,
 | 
			
		||||
                );
 | 
			
		||||
                const callbackToBeCalled = (err: Error, logEvent: DecodedLogEvent<ApprovalContractEventArgs>) => {
 | 
			
		||||
                    done();
 | 
			
		||||
                };
 | 
			
		||||
                const newProvider = web3Factory.getRpcProvider();
 | 
			
		||||
                zeroEx.setProvider(newProvider, constants.TESTRPC_NETWORK_ID);
 | 
			
		||||
                await zeroEx.etherToken.depositAsync(etherTokenAddress, transferAmount, addressWithETH);
 | 
			
		||||
                zeroEx.etherToken.subscribe(
 | 
			
		||||
                    etherTokenAddress, EtherTokenEvents.Transfer, indexFilterValues, callbackToBeCalled,
 | 
			
		||||
                );
 | 
			
		||||
                await zeroEx.token.transferAsync(
 | 
			
		||||
                    etherTokenAddress, addressWithETH, addressWithoutFunds, transferAmount,
 | 
			
		||||
                );
 | 
			
		||||
            })().catch(done);
 | 
			
		||||
        });
 | 
			
		||||
        it('Should cancel subscription when unsubscribe called', (done: DoneCallback) => {
 | 
			
		||||
            (async () => {
 | 
			
		||||
                const callbackNeverToBeCalled = (err: Error, logEvent: DecodedLogEvent<ApprovalContractEventArgs>) => {
 | 
			
		||||
                    done(new Error('Expected this subscription to have been cancelled'));
 | 
			
		||||
                };
 | 
			
		||||
                await zeroEx.etherToken.depositAsync(etherTokenAddress, transferAmount, addressWithETH);
 | 
			
		||||
                const subscriptionToken = zeroEx.etherToken.subscribe(
 | 
			
		||||
                    etherTokenAddress, EtherTokenEvents.Transfer, indexFilterValues, callbackNeverToBeCalled);
 | 
			
		||||
                zeroEx.etherToken.unsubscribe(subscriptionToken);
 | 
			
		||||
                await zeroEx.token.transferAsync(
 | 
			
		||||
                    etherTokenAddress, addressWithETH, addressWithoutFunds, transferAmount,
 | 
			
		||||
                );
 | 
			
		||||
                done();
 | 
			
		||||
            })().catch(done);
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    describe('#getLogsAsync', () => {
 | 
			
		||||
        let etherTokenAddress: string;
 | 
			
		||||
        let tokenTransferProxyAddress: string;
 | 
			
		||||
        const blockRange: BlockRange = {
 | 
			
		||||
            fromBlock: 0,
 | 
			
		||||
            toBlock: BlockParamLiteral.Latest,
 | 
			
		||||
        };
 | 
			
		||||
        let txHash: string;
 | 
			
		||||
        before(() => {
 | 
			
		||||
            addressWithETH = userAddresses[0];
 | 
			
		||||
            const tokenUtils = new TokenUtils(tokens);
 | 
			
		||||
            const etherToken = tokenUtils.getWethTokenOrThrow();
 | 
			
		||||
            etherTokenAddress = etherToken.address;
 | 
			
		||||
            tokenTransferProxyAddress = zeroEx.proxy.getContractAddress();
 | 
			
		||||
        });
 | 
			
		||||
        it('should get logs with decoded args emitted by Approval', async () => {
 | 
			
		||||
            txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(etherTokenAddress, addressWithETH);
 | 
			
		||||
            await zeroEx.awaitTransactionMinedAsync(txHash);
 | 
			
		||||
            const eventName = EtherTokenEvents.Approval;
 | 
			
		||||
            const indexFilterValues = {};
 | 
			
		||||
            const logs = await zeroEx.etherToken.getLogsAsync<ApprovalContractEventArgs>(
 | 
			
		||||
                etherTokenAddress, eventName, blockRange, indexFilterValues,
 | 
			
		||||
            );
 | 
			
		||||
            expect(logs).to.have.length(1);
 | 
			
		||||
            const args = logs[0].args;
 | 
			
		||||
            expect(logs[0].event).to.be.equal(eventName);
 | 
			
		||||
            expect(args._owner).to.be.equal(addressWithETH);
 | 
			
		||||
            expect(args._spender).to.be.equal(tokenTransferProxyAddress);
 | 
			
		||||
            expect(args._value).to.be.bignumber.equal(zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS);
 | 
			
		||||
        });
 | 
			
		||||
        it('should only get the logs with the correct event name', async () => {
 | 
			
		||||
            txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(etherTokenAddress, addressWithETH);
 | 
			
		||||
            await zeroEx.awaitTransactionMinedAsync(txHash);
 | 
			
		||||
            const differentEventName = EtherTokenEvents.Transfer;
 | 
			
		||||
            const indexFilterValues = {};
 | 
			
		||||
            const logs = await zeroEx.etherToken.getLogsAsync(
 | 
			
		||||
                etherTokenAddress, differentEventName, blockRange, indexFilterValues,
 | 
			
		||||
            );
 | 
			
		||||
            expect(logs).to.have.length(0);
 | 
			
		||||
        });
 | 
			
		||||
        it('should only get the logs with the correct indexed fields', async () => {
 | 
			
		||||
            txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(etherTokenAddress, addressWithETH);
 | 
			
		||||
            await zeroEx.awaitTransactionMinedAsync(txHash);
 | 
			
		||||
            txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(etherTokenAddress, addressWithoutFunds);
 | 
			
		||||
            await zeroEx.awaitTransactionMinedAsync(txHash);
 | 
			
		||||
            const eventName = EtherTokenEvents.Approval;
 | 
			
		||||
            const indexFilterValues = {
 | 
			
		||||
                _owner: addressWithETH,
 | 
			
		||||
            };
 | 
			
		||||
            const logs = await zeroEx.etherToken.getLogsAsync<ApprovalContractEventArgs>(
 | 
			
		||||
                etherTokenAddress, eventName, blockRange, indexFilterValues,
 | 
			
		||||
            );
 | 
			
		||||
            expect(logs).to.have.length(1);
 | 
			
		||||
            const args = logs[0].args;
 | 
			
		||||
            expect(args._owner).to.be.equal(addressWithETH);
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ import * as Web3 from 'web3';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
    ApprovalContractEventArgs,
 | 
			
		||||
    BlockParamLiteral,
 | 
			
		||||
    BlockRange,
 | 
			
		||||
    DecodedLogEvent,
 | 
			
		||||
    Token,
 | 
			
		||||
@@ -15,7 +16,7 @@ import {
 | 
			
		||||
    ZeroEx,
 | 
			
		||||
    ZeroExError,
 | 
			
		||||
} from '../src';
 | 
			
		||||
import {BlockParamLiteral, DoneCallback} from '../src/types';
 | 
			
		||||
import {DoneCallback} from '../src/types';
 | 
			
		||||
 | 
			
		||||
import {chaiSetup} from './utils/chai_setup';
 | 
			
		||||
import {constants} from './utils/constants';
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,13 @@ export class TokenUtils {
 | 
			
		||||
        }
 | 
			
		||||
        return zrxToken;
 | 
			
		||||
    }
 | 
			
		||||
    public getWethTokenOrThrow(): Token {
 | 
			
		||||
        const wethToken = _.find(this.tokens, {symbol: WETH_TOKEN_SYMBOL});
 | 
			
		||||
        if (_.isUndefined(wethToken)) {
 | 
			
		||||
            throw new Error(InternalZeroExError.WethNotInTokenRegistry);
 | 
			
		||||
        }
 | 
			
		||||
        return wethToken;
 | 
			
		||||
    }
 | 
			
		||||
    public getDummyTokens(): Token[] {
 | 
			
		||||
        const dummyTokens = _.filter(this.tokens, token => {
 | 
			
		||||
            return !_.includes([PROTOCOL_TOKEN_SYMBOL, WETH_TOKEN_SYMBOL], token.symbol);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user