Add tests for recursive MAP decoding
This commit is contained in:
parent
70508f52a1
commit
5720589515
@ -128,16 +128,32 @@ export const assetDataUtils = {
|
|||||||
*/
|
*/
|
||||||
decodeMultiAssetDataRecursively(assetData: string): MultiAssetDataWithRecursiveDecoding {
|
decodeMultiAssetDataRecursively(assetData: string): MultiAssetDataWithRecursiveDecoding {
|
||||||
const decodedAssetData = assetDataUtils.decodeMultiAssetData(assetData);
|
const decodedAssetData = assetDataUtils.decodeMultiAssetData(assetData);
|
||||||
const decodedNestedAssetData = _.map(decodedAssetData.nestedAssetData as string[], nestedAssetDataElement => {
|
const amounts: any[] = [];
|
||||||
const decodedNestedAssetDataElement = assetDataUtils.decodeAssetDataOrThrow(nestedAssetDataElement);
|
const decodedNestedAssetData = _.map(
|
||||||
return decodedNestedAssetDataElement.assetProxyId === AssetProxyId.MultiAsset
|
decodedAssetData.nestedAssetData as string[],
|
||||||
? assetDataUtils.decodeMultiAssetDataRecursively(nestedAssetDataElement).nestedAssetData
|
(nestedAssetDataElement, index) => {
|
||||||
: (decodedNestedAssetDataElement as SingleAssetData);
|
const decodedNestedAssetDataElement = assetDataUtils.decodeAssetDataOrThrow(nestedAssetDataElement);
|
||||||
});
|
if (decodedNestedAssetDataElement.assetProxyId === AssetProxyId.MultiAsset) {
|
||||||
|
const recursivelyDecodedAssetData = assetDataUtils.decodeMultiAssetDataRecursively(
|
||||||
|
nestedAssetDataElement,
|
||||||
|
);
|
||||||
|
amounts.push(
|
||||||
|
_.map(recursivelyDecodedAssetData.amounts as BigNumber[], amountElement =>
|
||||||
|
amountElement.times(decodedAssetData.amounts[index]),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return recursivelyDecodedAssetData.nestedAssetData;
|
||||||
|
} else {
|
||||||
|
amounts.push(decodedAssetData.amounts[index]);
|
||||||
|
return decodedNestedAssetDataElement as SingleAssetData;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
const flattenedAmounts = _.flattenDeep(amounts);
|
||||||
const flattenedDecodedNestedAssetData = _.flattenDeep(decodedNestedAssetData);
|
const flattenedDecodedNestedAssetData = _.flattenDeep(decodedNestedAssetData);
|
||||||
return {
|
return {
|
||||||
assetProxyId: decodedAssetData.assetProxyId,
|
assetProxyId: decodedAssetData.assetProxyId,
|
||||||
amounts: decodedAssetData.amounts,
|
amounts: flattenedAmounts,
|
||||||
nestedAssetData: flattenedDecodedNestedAssetData as SingleAssetData[],
|
nestedAssetData: flattenedDecodedNestedAssetData as SingleAssetData[],
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
@ -3,6 +3,7 @@ import { BigNumber } from '@0x/utils';
|
|||||||
export const constants = {
|
export const constants = {
|
||||||
NULL_ADDRESS: '0x0000000000000000000000000000000000000000',
|
NULL_ADDRESS: '0x0000000000000000000000000000000000000000',
|
||||||
NULL_BYTES: '0x',
|
NULL_BYTES: '0x',
|
||||||
|
NULL_ERC20_ASSET_DATA: '0xf47261b00000000000000000000000000000000000000000000000000000000000000000',
|
||||||
// tslint:disable-next-line:custom-no-magic-numbers
|
// tslint:disable-next-line:custom-no-magic-numbers
|
||||||
UNLIMITED_ALLOWANCE_IN_BASE_UNITS: new BigNumber(2).pow(256).minus(1),
|
UNLIMITED_ALLOWANCE_IN_BASE_UNITS: new BigNumber(2).pow(256).minus(1),
|
||||||
TESTRPC_NETWORK_ID: 50,
|
TESTRPC_NETWORK_ID: 50,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import * as chai from 'chai';
|
import * as chai from 'chai';
|
||||||
|
|
||||||
import { AssetProxyId } from '@0x/types';
|
import { AssetProxyId, ERC721AssetData } from '@0x/types';
|
||||||
import { BigNumber } from '@0x/utils';
|
import { BigNumber } from '@0x/utils';
|
||||||
|
|
||||||
import { assetDataUtils } from '../src/asset_data_utils';
|
import { assetDataUtils } from '../src/asset_data_utils';
|
||||||
@ -63,4 +63,45 @@ describe('assetDataUtils', () => {
|
|||||||
expect(decodedAssetData.amounts).to.deep.equal(KNOWN_MULTI_ASSET_ENCODING.amounts);
|
expect(decodedAssetData.amounts).to.deep.equal(KNOWN_MULTI_ASSET_ENCODING.amounts);
|
||||||
expect(decodedAssetData.nestedAssetData).to.deep.equal(KNOWN_MULTI_ASSET_ENCODING.nestedAssetData);
|
expect(decodedAssetData.nestedAssetData).to.deep.equal(KNOWN_MULTI_ASSET_ENCODING.nestedAssetData);
|
||||||
});
|
});
|
||||||
|
it('should recursively decode ERC20 and ERC721 multiAssetData', () => {
|
||||||
|
const decodedAssetData = assetDataUtils.decodeMultiAssetDataRecursively(KNOWN_MULTI_ASSET_ENCODING.assetData);
|
||||||
|
expect(decodedAssetData.assetProxyId).to.equal(AssetProxyId.MultiAsset);
|
||||||
|
expect(decodedAssetData.amounts).to.deep.equal(KNOWN_MULTI_ASSET_ENCODING.amounts);
|
||||||
|
const decodedErc20AssetData = decodedAssetData.nestedAssetData[0];
|
||||||
|
const decodedErc721AssetData = decodedAssetData.nestedAssetData[1] as ERC721AssetData;
|
||||||
|
expect(decodedErc20AssetData.tokenAddress).to.equal(KNOWN_ERC20_ENCODING.address);
|
||||||
|
expect(decodedErc20AssetData.assetProxyId).to.equal(AssetProxyId.ERC20);
|
||||||
|
expect(decodedErc721AssetData.tokenAddress).to.equal(KNOWN_ERC721_ENCODING.address);
|
||||||
|
expect(decodedErc721AssetData.assetProxyId).to.equal(AssetProxyId.ERC721);
|
||||||
|
expect(decodedErc721AssetData.tokenId).to.be.bignumber.equal(KNOWN_ERC721_ENCODING.tokenId);
|
||||||
|
});
|
||||||
|
it('should recursively decode nested assetData within multiAssetData', () => {
|
||||||
|
const amounts = [new BigNumber(1), new BigNumber(1), new BigNumber(2)];
|
||||||
|
const nestedAssetData = [
|
||||||
|
KNOWN_ERC20_ENCODING.assetData,
|
||||||
|
KNOWN_ERC721_ENCODING.assetData,
|
||||||
|
KNOWN_MULTI_ASSET_ENCODING.assetData,
|
||||||
|
];
|
||||||
|
const assetData = assetDataUtils.encodeMultiAssetData(amounts, nestedAssetData);
|
||||||
|
const decodedAssetData = assetDataUtils.decodeMultiAssetDataRecursively(assetData);
|
||||||
|
expect(decodedAssetData.assetProxyId).to.equal(AssetProxyId.MultiAsset);
|
||||||
|
const expectedAmounts = [new BigNumber(1), new BigNumber(1), new BigNumber(2), new BigNumber(2)];
|
||||||
|
expect(decodedAssetData.amounts).to.deep.equal(expectedAmounts);
|
||||||
|
const expectedLength = 4;
|
||||||
|
expect(decodedAssetData.nestedAssetData.length).to.be.equal(expectedLength);
|
||||||
|
const decodedErc20AssetData1 = decodedAssetData.nestedAssetData[0];
|
||||||
|
const decodedErc721AssetData1 = decodedAssetData.nestedAssetData[1] as ERC721AssetData;
|
||||||
|
const decodedErc20AssetData2 = decodedAssetData.nestedAssetData[2];
|
||||||
|
const decodedErc721AssetData2 = decodedAssetData.nestedAssetData[3] as ERC721AssetData;
|
||||||
|
expect(decodedErc20AssetData1.tokenAddress).to.equal(KNOWN_ERC20_ENCODING.address);
|
||||||
|
expect(decodedErc20AssetData1.assetProxyId).to.equal(AssetProxyId.ERC20);
|
||||||
|
expect(decodedErc721AssetData1.tokenAddress).to.equal(KNOWN_ERC721_ENCODING.address);
|
||||||
|
expect(decodedErc721AssetData1.assetProxyId).to.equal(AssetProxyId.ERC721);
|
||||||
|
expect(decodedErc721AssetData1.tokenId).to.be.bignumber.equal(KNOWN_ERC721_ENCODING.tokenId);
|
||||||
|
expect(decodedErc20AssetData2.tokenAddress).to.equal(KNOWN_ERC20_ENCODING.address);
|
||||||
|
expect(decodedErc20AssetData2.assetProxyId).to.equal(AssetProxyId.ERC20);
|
||||||
|
expect(decodedErc721AssetData2.tokenAddress).to.equal(KNOWN_ERC721_ENCODING.address);
|
||||||
|
expect(decodedErc721AssetData2.assetProxyId).to.equal(AssetProxyId.ERC721);
|
||||||
|
expect(decodedErc721AssetData2.tokenId).to.be.bignumber.equal(KNOWN_ERC721_ENCODING.tokenId);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -7,9 +7,9 @@ import { orderFactory } from '../../src/order_factory';
|
|||||||
const BASE_TEST_ORDER: Order = orderFactory.createOrder(
|
const BASE_TEST_ORDER: Order = orderFactory.createOrder(
|
||||||
constants.NULL_ADDRESS,
|
constants.NULL_ADDRESS,
|
||||||
constants.ZERO_AMOUNT,
|
constants.ZERO_AMOUNT,
|
||||||
constants.NULL_ADDRESS,
|
constants.NULL_ERC20_ASSET_DATA,
|
||||||
constants.ZERO_AMOUNT,
|
constants.ZERO_AMOUNT,
|
||||||
constants.NULL_ADDRESS,
|
constants.NULL_ERC20_ASSET_DATA,
|
||||||
constants.NULL_ADDRESS,
|
constants.NULL_ADDRESS,
|
||||||
);
|
);
|
||||||
const BASE_TEST_SIGNED_ORDER: SignedOrder = {
|
const BASE_TEST_SIGNED_ORDER: SignedOrder = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user