Do not attempt to parse tokenAddress if decoding data from multiAssetProxy
This commit is contained in:
		@@ -1,11 +1,11 @@
 | 
			
		||||
import { ExchangeCancelEventArgs, ExchangeCancelUpToEventArgs, ExchangeFillEventArgs } from '@0x/contract-wrappers';
 | 
			
		||||
import { assetDataUtils } from '@0x/order-utils';
 | 
			
		||||
import { AssetProxyId, ERC721AssetData } from '@0x/types';
 | 
			
		||||
import { AssetProxyId, ERC20AssetData, ERC721AssetData } from '@0x/types';
 | 
			
		||||
import { LogWithDecodedArgs } from 'ethereum-types';
 | 
			
		||||
import * as R from 'ramda';
 | 
			
		||||
 | 
			
		||||
import { ExchangeCancelEvent, ExchangeCancelUpToEvent, ExchangeFillEvent } from '../../entities';
 | 
			
		||||
import { bigNumbertoStringOrNull } from '../../utils';
 | 
			
		||||
import { bigNumbertoStringOrNull, convertAssetProxyIdToType } from '../../utils';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Parses raw event logs for a fill event and returns an array of
 | 
			
		||||
@@ -40,9 +40,7 @@ export const parseExchangeCancelUpToEvents: (
 | 
			
		||||
 */
 | 
			
		||||
export function _convertToExchangeFillEvent(eventLog: LogWithDecodedArgs<ExchangeFillEventArgs>): ExchangeFillEvent {
 | 
			
		||||
    const makerAssetData = assetDataUtils.decodeAssetDataOrThrow(eventLog.args.makerAssetData);
 | 
			
		||||
    const makerAssetType = makerAssetData.assetProxyId === AssetProxyId.ERC20 ? 'erc20' : 'erc721';
 | 
			
		||||
    const takerAssetData = assetDataUtils.decodeAssetDataOrThrow(eventLog.args.takerAssetData);
 | 
			
		||||
    const takerAssetType = takerAssetData.assetProxyId === AssetProxyId.ERC20 ? 'erc20' : 'erc721';
 | 
			
		||||
    const exchangeFillEvent = new ExchangeFillEvent();
 | 
			
		||||
    exchangeFillEvent.contractAddress = eventLog.address as string;
 | 
			
		||||
    exchangeFillEvent.blockNumber = eventLog.blockNumber as number;
 | 
			
		||||
@@ -59,16 +57,24 @@ export function _convertToExchangeFillEvent(eventLog: LogWithDecodedArgs<Exchang
 | 
			
		||||
    exchangeFillEvent.takerFeePaid = eventLog.args.takerFeePaid;
 | 
			
		||||
    exchangeFillEvent.orderHash = eventLog.args.orderHash;
 | 
			
		||||
    exchangeFillEvent.rawMakerAssetData = eventLog.args.makerAssetData;
 | 
			
		||||
    exchangeFillEvent.makerAssetType = makerAssetType;
 | 
			
		||||
    exchangeFillEvent.makerAssetType = convertAssetProxyIdToType(makerAssetData.assetProxyId as AssetProxyId);
 | 
			
		||||
    exchangeFillEvent.makerAssetProxyId = makerAssetData.assetProxyId;
 | 
			
		||||
    exchangeFillEvent.makerTokenAddress = makerAssetData.tokenAddress;
 | 
			
		||||
    // HACK(abandeali1): this event schema currently does not support multiple maker/taker assets, so we store a null byte array when decoding assetData from the MultiAssetProxy
 | 
			
		||||
    exchangeFillEvent.makerTokenAddress =
 | 
			
		||||
        makerAssetData.assetProxyId === AssetProxyId.MultiAsset
 | 
			
		||||
            ? '0x'
 | 
			
		||||
            : (makerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress;
 | 
			
		||||
    // tslint has a false positive here. Type assertion is required.
 | 
			
		||||
    // tslint:disable-next-line:no-unnecessary-type-assertion
 | 
			
		||||
    exchangeFillEvent.makerTokenId = bigNumbertoStringOrNull((makerAssetData as ERC721AssetData).tokenId);
 | 
			
		||||
    exchangeFillEvent.rawTakerAssetData = eventLog.args.takerAssetData;
 | 
			
		||||
    exchangeFillEvent.takerAssetType = takerAssetType;
 | 
			
		||||
    exchangeFillEvent.takerAssetType = convertAssetProxyIdToType(takerAssetData.assetProxyId as AssetProxyId);
 | 
			
		||||
    exchangeFillEvent.takerAssetProxyId = takerAssetData.assetProxyId;
 | 
			
		||||
    exchangeFillEvent.takerTokenAddress = takerAssetData.tokenAddress;
 | 
			
		||||
    // HACK(abandeali1): this event schema currently does not support multiple maker/taker assets, so we store a null byte array when decoding assetData from the MultiAssetProxy
 | 
			
		||||
    exchangeFillEvent.takerTokenAddress =
 | 
			
		||||
        makerAssetData.assetProxyId === AssetProxyId.MultiAsset
 | 
			
		||||
            ? '0x'
 | 
			
		||||
            : (takerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress;
 | 
			
		||||
    // tslint:disable-next-line:no-unnecessary-type-assertion
 | 
			
		||||
    exchangeFillEvent.takerTokenId = bigNumbertoStringOrNull((takerAssetData as ERC721AssetData).tokenId);
 | 
			
		||||
    return exchangeFillEvent;
 | 
			
		||||
@@ -83,9 +89,7 @@ export function _convertToExchangeCancelEvent(
 | 
			
		||||
    eventLog: LogWithDecodedArgs<ExchangeCancelEventArgs>,
 | 
			
		||||
): ExchangeCancelEvent {
 | 
			
		||||
    const makerAssetData = assetDataUtils.decodeAssetDataOrThrow(eventLog.args.makerAssetData);
 | 
			
		||||
    const makerAssetType = makerAssetData.assetProxyId === AssetProxyId.ERC20 ? 'erc20' : 'erc721';
 | 
			
		||||
    const takerAssetData = assetDataUtils.decodeAssetDataOrThrow(eventLog.args.takerAssetData);
 | 
			
		||||
    const takerAssetType = takerAssetData.assetProxyId === AssetProxyId.ERC20 ? 'erc20' : 'erc721';
 | 
			
		||||
    const exchangeCancelEvent = new ExchangeCancelEvent();
 | 
			
		||||
    exchangeCancelEvent.contractAddress = eventLog.address as string;
 | 
			
		||||
    exchangeCancelEvent.blockNumber = eventLog.blockNumber as number;
 | 
			
		||||
@@ -98,15 +102,23 @@ export function _convertToExchangeCancelEvent(
 | 
			
		||||
    exchangeCancelEvent.senderAddress = eventLog.args.senderAddress;
 | 
			
		||||
    exchangeCancelEvent.orderHash = eventLog.args.orderHash;
 | 
			
		||||
    exchangeCancelEvent.rawMakerAssetData = eventLog.args.makerAssetData;
 | 
			
		||||
    exchangeCancelEvent.makerAssetType = makerAssetType;
 | 
			
		||||
    exchangeCancelEvent.makerAssetType = convertAssetProxyIdToType(makerAssetData.assetProxyId as AssetProxyId);
 | 
			
		||||
    exchangeCancelEvent.makerAssetProxyId = makerAssetData.assetProxyId;
 | 
			
		||||
    exchangeCancelEvent.makerTokenAddress = makerAssetData.tokenAddress;
 | 
			
		||||
    // HACK(abandeali1): this event schema currently does not support multiple maker/taker assets, so we store a null byte array when decoding assetData from the MultiAssetProxy
 | 
			
		||||
    exchangeCancelEvent.makerTokenAddress =
 | 
			
		||||
        makerAssetData.assetProxyId === AssetProxyId.MultiAsset
 | 
			
		||||
            ? '0x'
 | 
			
		||||
            : (makerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress;
 | 
			
		||||
    // tslint:disable-next-line:no-unnecessary-type-assertion
 | 
			
		||||
    exchangeCancelEvent.makerTokenId = bigNumbertoStringOrNull((makerAssetData as ERC721AssetData).tokenId);
 | 
			
		||||
    exchangeCancelEvent.rawTakerAssetData = eventLog.args.takerAssetData;
 | 
			
		||||
    exchangeCancelEvent.takerAssetType = takerAssetType;
 | 
			
		||||
    exchangeCancelEvent.takerAssetType = convertAssetProxyIdToType(takerAssetData.assetProxyId as AssetProxyId);
 | 
			
		||||
    exchangeCancelEvent.takerAssetProxyId = takerAssetData.assetProxyId;
 | 
			
		||||
    exchangeCancelEvent.takerTokenAddress = takerAssetData.tokenAddress;
 | 
			
		||||
    // HACK(abandeali1): this event schema currently does not support multiple maker/taker assets, so we store a null byte array when decoding assetData from the MultiAssetProxy
 | 
			
		||||
    exchangeCancelEvent.takerTokenAddress =
 | 
			
		||||
        makerAssetData.assetProxyId === AssetProxyId.MultiAsset
 | 
			
		||||
            ? '0x'
 | 
			
		||||
            : (takerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress;
 | 
			
		||||
    // tslint:disable-next-line:no-unnecessary-type-assertion
 | 
			
		||||
    exchangeCancelEvent.takerTokenId = bigNumbertoStringOrNull((takerAssetData as ERC721AssetData).tokenId);
 | 
			
		||||
    return exchangeCancelEvent;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
import { APIOrder, OrdersResponse } from '@0x/connect';
 | 
			
		||||
import { assetDataUtils, orderHashUtils } from '@0x/order-utils';
 | 
			
		||||
import { AssetProxyId, ERC721AssetData } from '@0x/types';
 | 
			
		||||
import { AssetProxyId, ERC20AssetData, ERC721AssetData } from '@0x/types';
 | 
			
		||||
import * as R from 'ramda';
 | 
			
		||||
 | 
			
		||||
import { SraOrder } from '../../entities';
 | 
			
		||||
import { bigNumbertoStringOrNull } from '../../utils';
 | 
			
		||||
import { bigNumbertoStringOrNull, convertAssetProxyIdToType } from '../../utils';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Parses a raw order response from an SRA endpoint and returns an array of
 | 
			
		||||
@@ -22,9 +22,7 @@ export function parseSraOrders(rawOrdersResponse: OrdersResponse): SraOrder[] {
 | 
			
		||||
export function _convertToEntity(apiOrder: APIOrder): SraOrder {
 | 
			
		||||
    // TODO(albrow): refactor out common asset data decoding code.
 | 
			
		||||
    const makerAssetData = assetDataUtils.decodeAssetDataOrThrow(apiOrder.order.makerAssetData);
 | 
			
		||||
    const makerAssetType = makerAssetData.assetProxyId === AssetProxyId.ERC20 ? 'erc20' : 'erc721';
 | 
			
		||||
    const takerAssetData = assetDataUtils.decodeAssetDataOrThrow(apiOrder.order.takerAssetData);
 | 
			
		||||
    const takerAssetType = takerAssetData.assetProxyId === AssetProxyId.ERC20 ? 'erc20' : 'erc721';
 | 
			
		||||
 | 
			
		||||
    const sraOrder = new SraOrder();
 | 
			
		||||
    sraOrder.exchangeAddress = apiOrder.order.exchangeAddress;
 | 
			
		||||
@@ -43,16 +41,24 @@ export function _convertToEntity(apiOrder: APIOrder): SraOrder {
 | 
			
		||||
    sraOrder.signature = apiOrder.order.signature;
 | 
			
		||||
 | 
			
		||||
    sraOrder.rawMakerAssetData = apiOrder.order.makerAssetData;
 | 
			
		||||
    sraOrder.makerAssetType = makerAssetType;
 | 
			
		||||
    sraOrder.makerAssetType = convertAssetProxyIdToType(makerAssetData.assetProxyId as AssetProxyId);
 | 
			
		||||
    sraOrder.makerAssetProxyId = makerAssetData.assetProxyId;
 | 
			
		||||
    sraOrder.makerTokenAddress = makerAssetData.tokenAddress;
 | 
			
		||||
    // HACK(abandeali1): this event schema currently does not support multiple maker/taker assets, so we store a null byte array when decoding assetData from the MultiAssetProxy
 | 
			
		||||
    sraOrder.makerTokenAddress =
 | 
			
		||||
        makerAssetData.assetProxyId === AssetProxyId.MultiAsset
 | 
			
		||||
            ? '0x'
 | 
			
		||||
            : (makerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress;
 | 
			
		||||
    // tslint has a false positive here. Type assertion is required.
 | 
			
		||||
    // tslint:disable-next-line:no-unnecessary-type-assertion
 | 
			
		||||
    sraOrder.makerTokenId = bigNumbertoStringOrNull((makerAssetData as ERC721AssetData).tokenId);
 | 
			
		||||
    sraOrder.rawTakerAssetData = apiOrder.order.takerAssetData;
 | 
			
		||||
    sraOrder.takerAssetType = takerAssetType;
 | 
			
		||||
    sraOrder.takerAssetType = convertAssetProxyIdToType(takerAssetData.assetProxyId as AssetProxyId);
 | 
			
		||||
    sraOrder.takerAssetProxyId = takerAssetData.assetProxyId;
 | 
			
		||||
    sraOrder.takerTokenAddress = takerAssetData.tokenAddress;
 | 
			
		||||
    // HACK(abandeali1): this event schema currently does not support multiple maker/taker assets, so we store a null byte array when decoding assetData from the MultiAssetProxy
 | 
			
		||||
    sraOrder.takerTokenAddress =
 | 
			
		||||
        makerAssetData.assetProxyId === AssetProxyId.MultiAsset
 | 
			
		||||
            ? '0x'
 | 
			
		||||
            : (takerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress;
 | 
			
		||||
    // tslint:disable-next-line:no-unnecessary-type-assertion
 | 
			
		||||
    sraOrder.takerTokenId = bigNumbertoStringOrNull((takerAssetData as ERC721AssetData).tokenId);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,2 +1,2 @@
 | 
			
		||||
export type AssetType = 'erc20' | 'erc721';
 | 
			
		||||
export type AssetType = 'erc20' | 'erc721' | 'multiAsset';
 | 
			
		||||
export type OrderType = 'bid' | 'ask';
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
import { AssetProxyId } from '@0x/types';
 | 
			
		||||
 | 
			
		||||
import { AssetType } from '../../types';
 | 
			
		||||
 | 
			
		||||
export function convertAssetProxyIdToType(assetProxyId: AssetProxyId): AssetType {
 | 
			
		||||
    switch (assetProxyId) {
 | 
			
		||||
        case AssetProxyId.ERC20:
 | 
			
		||||
            return 'erc20';
 | 
			
		||||
        case AssetProxyId.ERC721:
 | 
			
		||||
            return 'erc721';
 | 
			
		||||
        case AssetProxyId.MultiAsset:
 | 
			
		||||
            return 'multiAsset';
 | 
			
		||||
        default:
 | 
			
		||||
            throw new Error(`${assetProxyId} not a supported assetProxyId`);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,2 +1,3 @@
 | 
			
		||||
export * from './big_number';
 | 
			
		||||
export * from './number_to_bigint';
 | 
			
		||||
export * from './asset_proxy_id_types';
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user