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