Add recursive MultiAsset decoding, store first address in pipeline
This commit is contained in:
parent
0fba0b1a1b
commit
1dda10b4f3
@ -83,6 +83,7 @@ export {
|
|||||||
ERC20AssetData,
|
ERC20AssetData,
|
||||||
ERC721AssetData,
|
ERC721AssetData,
|
||||||
MultiAssetData,
|
MultiAssetData,
|
||||||
|
MultiAssetDataWithRecursiveDecoding,
|
||||||
SignatureType,
|
SignatureType,
|
||||||
OrderRelevantState,
|
OrderRelevantState,
|
||||||
Stats,
|
Stats,
|
||||||
|
@ -1,4 +1,11 @@
|
|||||||
import { AssetProxyId, ERC20AssetData, ERC721AssetData, MultiAssetData, SingleAssetData } from '@0x/types';
|
import {
|
||||||
|
AssetProxyId,
|
||||||
|
ERC20AssetData,
|
||||||
|
ERC721AssetData,
|
||||||
|
MultiAssetData,
|
||||||
|
MultiAssetDataWithRecursiveDecoding,
|
||||||
|
SingleAssetData,
|
||||||
|
} from '@0x/types';
|
||||||
import { AbiEncoder, BigNumber } from '@0x/utils';
|
import { AbiEncoder, BigNumber } from '@0x/utils';
|
||||||
import { MethodAbi } from 'ethereum-types';
|
import { MethodAbi } from 'ethereum-types';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
@ -114,6 +121,26 @@ export const assetDataUtils = {
|
|||||||
nestedAssetData,
|
nestedAssetData,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
* Decodes a MultiAsset assetData hex string into it's corresponding amounts and decoded nestedAssetData elements (all nested elements are flattened)
|
||||||
|
* @param assetData Hex encoded assetData string to decode
|
||||||
|
* @return An object containing the decoded amounts and nestedAssetData
|
||||||
|
*/
|
||||||
|
decodeMultiAssetDataRecursively(assetData: string): MultiAssetDataWithRecursiveDecoding {
|
||||||
|
const decodedAssetData = assetDataUtils.decodeMultiAssetData(assetData);
|
||||||
|
const decodedNestedAssetData = _.map(decodedAssetData.nestedAssetData as string[], nestedAssetDataElement => {
|
||||||
|
const decodedNestedAssetDataElement = assetDataUtils.decodeAssetDataOrThrow(nestedAssetDataElement);
|
||||||
|
return decodedNestedAssetDataElement.assetProxyId === AssetProxyId.MultiAsset
|
||||||
|
? assetDataUtils.decodeMultiAssetDataRecursively(nestedAssetDataElement).nestedAssetData
|
||||||
|
: (decodedNestedAssetDataElement as SingleAssetData);
|
||||||
|
});
|
||||||
|
const flattenedDecodedNestedAssetData = _.flattenDeep(decodedNestedAssetData);
|
||||||
|
return {
|
||||||
|
assetProxyId: decodedAssetData.assetProxyId,
|
||||||
|
amounts: decodedAssetData.amounts,
|
||||||
|
nestedAssetData: flattenedDecodedNestedAssetData as SingleAssetData[],
|
||||||
|
};
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
* Decode and return the assetProxyId from the assetData
|
* Decode and return the assetProxyId from the assetData
|
||||||
* @param assetData Hex encoded assetData string to decode
|
* @param assetData Hex encoded assetData string to decode
|
||||||
|
@ -108,7 +108,7 @@ export class ExchangeTransferSimulator {
|
|||||||
const amountsElement = decodedAssetData.amounts[index];
|
const amountsElement = decodedAssetData.amounts[index];
|
||||||
const totalAmount = amountInBaseUnits.times(amountsElement);
|
const totalAmount = amountInBaseUnits.times(amountsElement);
|
||||||
await this.transferFromAsync(
|
await this.transferFromAsync(
|
||||||
nestedAssetDataElement,
|
nestedAssetDataElement as string,
|
||||||
from,
|
from,
|
||||||
to,
|
to,
|
||||||
totalAmount,
|
totalAmount,
|
||||||
|
@ -38,6 +38,7 @@ export {
|
|||||||
ERC20AssetData,
|
ERC20AssetData,
|
||||||
ERC721AssetData,
|
ERC721AssetData,
|
||||||
MultiAssetData,
|
MultiAssetData,
|
||||||
|
MultiAssetDataWithRecursiveDecoding,
|
||||||
AssetProxyId,
|
AssetProxyId,
|
||||||
SignatureType,
|
SignatureType,
|
||||||
OrderStateValid,
|
OrderStateValid,
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
"@0x/contract-artifacts": "^1.0.1",
|
"@0x/contract-artifacts": "^1.0.1",
|
||||||
"@0x/contract-wrappers": "^3.0.0",
|
"@0x/contract-wrappers": "^3.0.0",
|
||||||
"@0x/dev-utils": "^1.0.21",
|
"@0x/dev-utils": "^1.0.21",
|
||||||
"@0x/order-utils": "^2.0.0",
|
"@0x/order-utils": "^3.0.7",
|
||||||
"@0x/subproviders": "^2.1.8",
|
"@0x/subproviders": "^2.1.8",
|
||||||
"@0x/types": "^1.4.1",
|
"@0x/types": "^1.4.1",
|
||||||
"@0x/utils": "^2.0.8",
|
"@0x/utils": "^2.0.8",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { ExchangeCancelEventArgs, ExchangeCancelUpToEventArgs, ExchangeFillEventArgs } from '@0x/contract-wrappers';
|
import { ExchangeCancelEventArgs, ExchangeCancelUpToEventArgs, ExchangeFillEventArgs } from '@0x/contract-wrappers';
|
||||||
import { assetDataUtils } from '@0x/order-utils';
|
import { assetDataUtils } from '@0x/order-utils';
|
||||||
import { AssetProxyId, ERC20AssetData, ERC721AssetData } from '@0x/types';
|
import { AssetProxyId, ERC721AssetData, SingleAssetData } from '@0x/types';
|
||||||
import { LogWithDecodedArgs } from 'ethereum-types';
|
import { LogWithDecodedArgs } from 'ethereum-types';
|
||||||
import * as R from 'ramda';
|
import * as R from 'ramda';
|
||||||
|
|
||||||
@ -62,8 +62,9 @@ export function _convertToExchangeFillEvent(eventLog: LogWithDecodedArgs<Exchang
|
|||||||
// 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
|
// 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 =
|
exchangeFillEvent.makerTokenAddress =
|
||||||
makerAssetData.assetProxyId === AssetProxyId.MultiAsset
|
makerAssetData.assetProxyId === AssetProxyId.MultiAsset
|
||||||
? '0x'
|
? assetDataUtils.decodeMultiAssetDataRecursively(eventLog.args.makerAssetData).nestedAssetData[0]
|
||||||
: (makerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress;
|
.tokenAddress
|
||||||
|
: (makerAssetData as SingleAssetData).tokenAddress;
|
||||||
// tslint has a false positive here. Type assertion is required.
|
// tslint has a false positive here. Type assertion is required.
|
||||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||||
exchangeFillEvent.makerTokenId = bigNumbertoStringOrNull((makerAssetData as ERC721AssetData).tokenId);
|
exchangeFillEvent.makerTokenId = bigNumbertoStringOrNull((makerAssetData as ERC721AssetData).tokenId);
|
||||||
@ -72,9 +73,10 @@ export function _convertToExchangeFillEvent(eventLog: LogWithDecodedArgs<Exchang
|
|||||||
exchangeFillEvent.takerAssetProxyId = takerAssetData.assetProxyId;
|
exchangeFillEvent.takerAssetProxyId = takerAssetData.assetProxyId;
|
||||||
// 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
|
// 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 =
|
exchangeFillEvent.takerTokenAddress =
|
||||||
makerAssetData.assetProxyId === AssetProxyId.MultiAsset
|
takerAssetData.assetProxyId === AssetProxyId.MultiAsset
|
||||||
? '0x'
|
? assetDataUtils.decodeMultiAssetDataRecursively(eventLog.args.takerAssetData).nestedAssetData[0]
|
||||||
: (takerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress;
|
.tokenAddress
|
||||||
|
: (takerAssetData as SingleAssetData).tokenAddress;
|
||||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||||
exchangeFillEvent.takerTokenId = bigNumbertoStringOrNull((takerAssetData as ERC721AssetData).tokenId);
|
exchangeFillEvent.takerTokenId = bigNumbertoStringOrNull((takerAssetData as ERC721AssetData).tokenId);
|
||||||
return exchangeFillEvent;
|
return exchangeFillEvent;
|
||||||
@ -107,8 +109,9 @@ export function _convertToExchangeCancelEvent(
|
|||||||
// 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
|
// 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 =
|
exchangeCancelEvent.makerTokenAddress =
|
||||||
makerAssetData.assetProxyId === AssetProxyId.MultiAsset
|
makerAssetData.assetProxyId === AssetProxyId.MultiAsset
|
||||||
? '0x'
|
? assetDataUtils.decodeMultiAssetDataRecursively(eventLog.args.makerAssetData).nestedAssetData[0]
|
||||||
: (makerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress;
|
.tokenAddress
|
||||||
|
: (makerAssetData as SingleAssetData).tokenAddress;
|
||||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||||
exchangeCancelEvent.makerTokenId = bigNumbertoStringOrNull((makerAssetData as ERC721AssetData).tokenId);
|
exchangeCancelEvent.makerTokenId = bigNumbertoStringOrNull((makerAssetData as ERC721AssetData).tokenId);
|
||||||
exchangeCancelEvent.rawTakerAssetData = eventLog.args.takerAssetData;
|
exchangeCancelEvent.rawTakerAssetData = eventLog.args.takerAssetData;
|
||||||
@ -116,9 +119,10 @@ export function _convertToExchangeCancelEvent(
|
|||||||
exchangeCancelEvent.takerAssetProxyId = takerAssetData.assetProxyId;
|
exchangeCancelEvent.takerAssetProxyId = takerAssetData.assetProxyId;
|
||||||
// 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
|
// 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 =
|
exchangeCancelEvent.takerTokenAddress =
|
||||||
makerAssetData.assetProxyId === AssetProxyId.MultiAsset
|
takerAssetData.assetProxyId === AssetProxyId.MultiAsset
|
||||||
? '0x'
|
? assetDataUtils.decodeMultiAssetDataRecursively(eventLog.args.takerAssetData).nestedAssetData[0]
|
||||||
: (takerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress;
|
.tokenAddress
|
||||||
|
: (takerAssetData as SingleAssetData).tokenAddress;
|
||||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||||
exchangeCancelEvent.takerTokenId = bigNumbertoStringOrNull((takerAssetData as ERC721AssetData).tokenId);
|
exchangeCancelEvent.takerTokenId = bigNumbertoStringOrNull((takerAssetData as ERC721AssetData).tokenId);
|
||||||
return exchangeCancelEvent;
|
return exchangeCancelEvent;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { APIOrder, OrdersResponse } from '@0x/connect';
|
import { APIOrder, OrdersResponse } from '@0x/connect';
|
||||||
import { assetDataUtils, orderHashUtils } from '@0x/order-utils';
|
import { assetDataUtils, orderHashUtils } from '@0x/order-utils';
|
||||||
import { AssetProxyId, ERC20AssetData, ERC721AssetData } from '@0x/types';
|
import { AssetProxyId, ERC721AssetData, SingleAssetData } from '@0x/types';
|
||||||
import * as R from 'ramda';
|
import * as R from 'ramda';
|
||||||
|
|
||||||
import { SraOrder } from '../../entities';
|
import { SraOrder } from '../../entities';
|
||||||
@ -46,8 +46,9 @@ export function _convertToEntity(apiOrder: APIOrder): SraOrder {
|
|||||||
// 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
|
// 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 =
|
sraOrder.makerTokenAddress =
|
||||||
makerAssetData.assetProxyId === AssetProxyId.MultiAsset
|
makerAssetData.assetProxyId === AssetProxyId.MultiAsset
|
||||||
? '0x'
|
? assetDataUtils.decodeMultiAssetDataRecursively(apiOrder.order.makerAssetData).nestedAssetData[0]
|
||||||
: (makerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress;
|
.tokenAddress
|
||||||
|
: (makerAssetData as SingleAssetData).tokenAddress;
|
||||||
// tslint has a false positive here. Type assertion is required.
|
// tslint has a false positive here. Type assertion is required.
|
||||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||||
sraOrder.makerTokenId = bigNumbertoStringOrNull((makerAssetData as ERC721AssetData).tokenId);
|
sraOrder.makerTokenId = bigNumbertoStringOrNull((makerAssetData as ERC721AssetData).tokenId);
|
||||||
@ -56,9 +57,10 @@ export function _convertToEntity(apiOrder: APIOrder): SraOrder {
|
|||||||
sraOrder.takerAssetProxyId = takerAssetData.assetProxyId;
|
sraOrder.takerAssetProxyId = takerAssetData.assetProxyId;
|
||||||
// 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
|
// 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 =
|
sraOrder.takerTokenAddress =
|
||||||
makerAssetData.assetProxyId === AssetProxyId.MultiAsset
|
takerAssetData.assetProxyId === AssetProxyId.MultiAsset
|
||||||
? '0x'
|
? assetDataUtils.decodeMultiAssetDataRecursively(apiOrder.order.takerAssetData).nestedAssetData[0]
|
||||||
: (takerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress;
|
.tokenAddress
|
||||||
|
: (takerAssetData as SingleAssetData).tokenAddress;
|
||||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||||
sraOrder.takerTokenId = bigNumbertoStringOrNull((takerAssetData as ERC721AssetData).tokenId);
|
sraOrder.takerTokenId = bigNumbertoStringOrNull((takerAssetData as ERC721AssetData).tokenId);
|
||||||
|
|
||||||
|
@ -171,13 +171,19 @@ export interface ERC721AssetData {
|
|||||||
tokenId: BigNumber;
|
tokenId: BigNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type SingleAssetData = ERC20AssetData | ERC721AssetData;
|
||||||
|
|
||||||
export interface MultiAssetData {
|
export interface MultiAssetData {
|
||||||
assetProxyId: string;
|
assetProxyId: string;
|
||||||
amounts: BigNumber[];
|
amounts: BigNumber[];
|
||||||
nestedAssetData: string[];
|
nestedAssetData: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export type SingleAssetData = ERC20AssetData | ERC721AssetData;
|
export interface MultiAssetDataWithRecursiveDecoding {
|
||||||
|
assetProxyId: string;
|
||||||
|
amounts: BigNumber[];
|
||||||
|
nestedAssetData: SingleAssetData[];
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: DRY. These should be extracted from contract code.
|
// TODO: DRY. These should be extracted from contract code.
|
||||||
export enum RevertReason {
|
export enum RevertReason {
|
||||||
|
@ -507,7 +507,7 @@
|
|||||||
lodash "^4.17.5"
|
lodash "^4.17.5"
|
||||||
uuid "^3.1.0"
|
uuid "^3.1.0"
|
||||||
|
|
||||||
"@0x/order-utils@^2.0.0", "@0x/order-utils@^2.0.1":
|
"@0x/order-utils@^2.0.1":
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@0x/order-utils/-/order-utils-2.0.1.tgz#8c46d7aeb9e2cce54a0822824c12427cbe5f7eb4"
|
resolved "https://registry.yarnpkg.com/@0x/order-utils/-/order-utils-2.0.1.tgz#8c46d7aeb9e2cce54a0822824c12427cbe5f7eb4"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -7339,7 +7339,7 @@ ganache-core@0xProject/ganache-core#monorepo-dep:
|
|||||||
ethereumjs-tx "0xProject/ethereumjs-tx#fake-tx-include-signature-by-default"
|
ethereumjs-tx "0xProject/ethereumjs-tx#fake-tx-include-signature-by-default"
|
||||||
ethereumjs-util "^5.2.0"
|
ethereumjs-util "^5.2.0"
|
||||||
ethereumjs-vm "2.3.5"
|
ethereumjs-vm "2.3.5"
|
||||||
ethereumjs-wallet "~0.6.0"
|
ethereumjs-wallet "0.6.0"
|
||||||
fake-merkle-patricia-tree "~1.0.1"
|
fake-merkle-patricia-tree "~1.0.1"
|
||||||
heap "~0.2.6"
|
heap "~0.2.6"
|
||||||
js-scrypt "^0.2.0"
|
js-scrypt "^0.2.0"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user