diff options
| author | Amir Bandeali <abandeali1@gmail.com> | 2019-01-03 08:52:15 +0800 | 
|---|---|---|
| committer | Amir Bandeali <abandeali1@gmail.com> | 2019-01-08 02:31:11 +0800 | 
| commit | 1dda10b4f34eb19b731e58c26f13ecc08e367bbe (patch) | |
| tree | a33ff795d65bcbb67379414e29138cb364c02fe0 | |
| parent | 0fba0b1a1bbe1192802ebcf4b88437b94d6a1c18 (diff) | |
| download | dexon-sol-tools-1dda10b4f34eb19b731e58c26f13ecc08e367bbe.tar.gz dexon-sol-tools-1dda10b4f34eb19b731e58c26f13ecc08e367bbe.tar.zst dexon-sol-tools-1dda10b4f34eb19b731e58c26f13ecc08e367bbe.zip  | |
Add recursive MultiAsset decoding, store first address in pipeline
| -rw-r--r-- | packages/0x.js/src/index.ts | 1 | ||||
| -rw-r--r-- | packages/order-utils/src/asset_data_utils.ts | 29 | ||||
| -rw-r--r-- | packages/order-utils/src/exchange_transfer_simulator.ts | 2 | ||||
| -rw-r--r-- | packages/order-utils/src/index.ts | 1 | ||||
| -rw-r--r-- | packages/pipeline/package.json | 2 | ||||
| -rw-r--r-- | packages/pipeline/src/parsers/events/exchange_events.ts | 26 | ||||
| -rw-r--r-- | packages/pipeline/src/parsers/sra_orders/index.ts | 14 | ||||
| -rw-r--r-- | packages/types/src/index.ts | 8 | ||||
| -rw-r--r-- | yarn.lock | 4 | 
9 files changed, 64 insertions, 23 deletions
diff --git a/packages/0x.js/src/index.ts b/packages/0x.js/src/index.ts index 375843741..01742f1b9 100644 --- a/packages/0x.js/src/index.ts +++ b/packages/0x.js/src/index.ts @@ -83,6 +83,7 @@ export {      ERC20AssetData,      ERC721AssetData,      MultiAssetData, +    MultiAssetDataWithRecursiveDecoding,      SignatureType,      OrderRelevantState,      Stats, diff --git a/packages/order-utils/src/asset_data_utils.ts b/packages/order-utils/src/asset_data_utils.ts index 18c1f93b6..3741a683e 100644 --- a/packages/order-utils/src/asset_data_utils.ts +++ b/packages/order-utils/src/asset_data_utils.ts @@ -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 { MethodAbi } from 'ethereum-types';  import * as _ from 'lodash'; @@ -115,6 +122,26 @@ export const assetDataUtils = {          };      },      /** +     * 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       * @param assetData Hex encoded assetData string to decode       * @return The assetProxyId diff --git a/packages/order-utils/src/exchange_transfer_simulator.ts b/packages/order-utils/src/exchange_transfer_simulator.ts index 06621fd9e..0a948fd1f 100644 --- a/packages/order-utils/src/exchange_transfer_simulator.ts +++ b/packages/order-utils/src/exchange_transfer_simulator.ts @@ -108,7 +108,7 @@ export class ExchangeTransferSimulator {                      const amountsElement = decodedAssetData.amounts[index];                      const totalAmount = amountInBaseUnits.times(amountsElement);                      await this.transferFromAsync( -                        nestedAssetDataElement, +                        nestedAssetDataElement as string,                          from,                          to,                          totalAmount, diff --git a/packages/order-utils/src/index.ts b/packages/order-utils/src/index.ts index e098f23c3..398188433 100644 --- a/packages/order-utils/src/index.ts +++ b/packages/order-utils/src/index.ts @@ -38,6 +38,7 @@ export {      ERC20AssetData,      ERC721AssetData,      MultiAssetData, +    MultiAssetDataWithRecursiveDecoding,      AssetProxyId,      SignatureType,      OrderStateValid, diff --git a/packages/pipeline/package.json b/packages/pipeline/package.json index a40f3d21c..ab73642ec 100644 --- a/packages/pipeline/package.json +++ b/packages/pipeline/package.json @@ -44,7 +44,7 @@          "@0x/contract-artifacts": "^1.0.1",          "@0x/contract-wrappers": "^3.0.0",          "@0x/dev-utils": "^1.0.21", -        "@0x/order-utils": "^2.0.0", +        "@0x/order-utils": "^3.0.7",          "@0x/subproviders": "^2.1.8",          "@0x/types": "^1.4.1",          "@0x/utils": "^2.0.8", diff --git a/packages/pipeline/src/parsers/events/exchange_events.ts b/packages/pipeline/src/parsers/events/exchange_events.ts index 16b05260b..50fad7e00 100644 --- a/packages/pipeline/src/parsers/events/exchange_events.ts +++ b/packages/pipeline/src/parsers/events/exchange_events.ts @@ -1,6 +1,6 @@  import { ExchangeCancelEventArgs, ExchangeCancelUpToEventArgs, ExchangeFillEventArgs } from '@0x/contract-wrappers';  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 * 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      exchangeFillEvent.makerTokenAddress =          makerAssetData.assetProxyId === AssetProxyId.MultiAsset -            ? '0x' -            : (makerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress; +            ? assetDataUtils.decodeMultiAssetDataRecursively(eventLog.args.makerAssetData).nestedAssetData[0] +                  .tokenAddress +            : (makerAssetData as SingleAssetData).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); @@ -72,9 +73,10 @@ export function _convertToExchangeFillEvent(eventLog: LogWithDecodedArgs<Exchang      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      exchangeFillEvent.takerTokenAddress = -        makerAssetData.assetProxyId === AssetProxyId.MultiAsset -            ? '0x' -            : (takerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress; +        takerAssetData.assetProxyId === AssetProxyId.MultiAsset +            ? assetDataUtils.decodeMultiAssetDataRecursively(eventLog.args.takerAssetData).nestedAssetData[0] +                  .tokenAddress +            : (takerAssetData as SingleAssetData).tokenAddress;      // tslint:disable-next-line:no-unnecessary-type-assertion      exchangeFillEvent.takerTokenId = bigNumbertoStringOrNull((takerAssetData as ERC721AssetData).tokenId);      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      exchangeCancelEvent.makerTokenAddress =          makerAssetData.assetProxyId === AssetProxyId.MultiAsset -            ? '0x' -            : (makerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress; +            ? assetDataUtils.decodeMultiAssetDataRecursively(eventLog.args.makerAssetData).nestedAssetData[0] +                  .tokenAddress +            : (makerAssetData as SingleAssetData).tokenAddress;      // tslint:disable-next-line:no-unnecessary-type-assertion      exchangeCancelEvent.makerTokenId = bigNumbertoStringOrNull((makerAssetData as ERC721AssetData).tokenId);      exchangeCancelEvent.rawTakerAssetData = eventLog.args.takerAssetData; @@ -116,9 +119,10 @@ export function _convertToExchangeCancelEvent(      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      exchangeCancelEvent.takerTokenAddress = -        makerAssetData.assetProxyId === AssetProxyId.MultiAsset -            ? '0x' -            : (takerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress; +        takerAssetData.assetProxyId === AssetProxyId.MultiAsset +            ? assetDataUtils.decodeMultiAssetDataRecursively(eventLog.args.takerAssetData).nestedAssetData[0] +                  .tokenAddress +            : (takerAssetData as SingleAssetData).tokenAddress;      // tslint:disable-next-line:no-unnecessary-type-assertion      exchangeCancelEvent.takerTokenId = bigNumbertoStringOrNull((takerAssetData as ERC721AssetData).tokenId);      return exchangeCancelEvent; diff --git a/packages/pipeline/src/parsers/sra_orders/index.ts b/packages/pipeline/src/parsers/sra_orders/index.ts index 2d3e5381d..663b8f509 100644 --- a/packages/pipeline/src/parsers/sra_orders/index.ts +++ b/packages/pipeline/src/parsers/sra_orders/index.ts @@ -1,6 +1,6 @@  import { APIOrder, OrdersResponse } from '@0x/connect';  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 { 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      sraOrder.makerTokenAddress =          makerAssetData.assetProxyId === AssetProxyId.MultiAsset -            ? '0x' -            : (makerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress; +            ? assetDataUtils.decodeMultiAssetDataRecursively(apiOrder.order.makerAssetData).nestedAssetData[0] +                  .tokenAddress +            : (makerAssetData as SingleAssetData).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); @@ -56,9 +57,10 @@ export function _convertToEntity(apiOrder: APIOrder): SraOrder {      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      sraOrder.takerTokenAddress = -        makerAssetData.assetProxyId === AssetProxyId.MultiAsset -            ? '0x' -            : (takerAssetData as ERC20AssetData | ERC721AssetData).tokenAddress; +        takerAssetData.assetProxyId === AssetProxyId.MultiAsset +            ? assetDataUtils.decodeMultiAssetDataRecursively(apiOrder.order.takerAssetData).nestedAssetData[0] +                  .tokenAddress +            : (takerAssetData as SingleAssetData).tokenAddress;      // tslint:disable-next-line:no-unnecessary-type-assertion      sraOrder.takerTokenId = bigNumbertoStringOrNull((takerAssetData as ERC721AssetData).tokenId); diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 2e8ce6629..71fcbf9db 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -171,13 +171,19 @@ export interface ERC721AssetData {      tokenId: BigNumber;  } +export type SingleAssetData = ERC20AssetData | ERC721AssetData; +  export interface MultiAssetData {      assetProxyId: string;      amounts: BigNumber[];      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.  export enum RevertReason { @@ -507,7 +507,7 @@      lodash "^4.17.5"      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"    resolved "https://registry.yarnpkg.com/@0x/order-utils/-/order-utils-2.0.1.tgz#8c46d7aeb9e2cce54a0822824c12427cbe5f7eb4"    dependencies: @@ -7339,7 +7339,7 @@ ganache-core@0xProject/ganache-core#monorepo-dep:      ethereumjs-tx "0xProject/ethereumjs-tx#fake-tx-include-signature-by-default"      ethereumjs-util "^5.2.0"      ethereumjs-vm "2.3.5" -    ethereumjs-wallet "~0.6.0" +    ethereumjs-wallet "0.6.0"      fake-merkle-patricia-tree "~1.0.1"      heap "~0.2.6"      js-scrypt "^0.2.0"  | 
