ERC1155 Asset Data tests + types
This commit is contained in:
		@@ -1,4 +1,13 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
    "version": "7.1.0",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Added `encodeERC721AssetData` and `decodeERC721AssetData`",
 | 
			
		||||
                "pr": 1661
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "timestamp": 1551479279,
 | 
			
		||||
        "version": "7.0.2",
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,9 @@ import {
 | 
			
		||||
    AssetProxyId,
 | 
			
		||||
    ERC20AssetData,
 | 
			
		||||
    ERC721AssetData,
 | 
			
		||||
    ERC1155AssetData,
 | 
			
		||||
    ERC1155AssetDataAbi,
 | 
			
		||||
    ERC1155AssetDataNoProxyId,
 | 
			
		||||
    MultiAssetData,
 | 
			
		||||
    MultiAssetDataWithRecursiveDecoding,
 | 
			
		||||
    SingleAssetData,
 | 
			
		||||
@@ -73,6 +76,46 @@ export const assetDataUtils = {
 | 
			
		||||
            tokenId: (decodedAssetData as any).tokenId,
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
    /**
 | 
			
		||||
     * Encodes a set of ERC1155 assets into an assetData string, usable in the makerAssetData or
 | 
			
		||||
     * takerAssetData fields of a 0x order.
 | 
			
		||||
     * @param tokenAddress The token address of the ERC1155 contract
 | 
			
		||||
     * @param tokenIds The Id's of the ERC1155 tokens to transfer
 | 
			
		||||
     * @param tokenValues The values of each respective token Id to transfer
 | 
			
		||||
     * @param callbackData The data forwarded to a receiver, if receiver is a contract.
 | 
			
		||||
     * @return The hex encoded assetData string
 | 
			
		||||
     */
 | 
			
		||||
    encodeERC1155AssetData(
 | 
			
		||||
        tokenAddress: string,
 | 
			
		||||
        tokenIds: BigNumber[],
 | 
			
		||||
        tokenValues: BigNumber[],
 | 
			
		||||
        callbackData: string,
 | 
			
		||||
    ): string {
 | 
			
		||||
        const abiEncoder = AbiEncoder.createMethod('ERC1155Token', ERC1155AssetDataAbi);
 | 
			
		||||
        const args = [tokenAddress, tokenIds, tokenValues, callbackData];
 | 
			
		||||
        const assetData = abiEncoder.encode(args, encodingRules);
 | 
			
		||||
        return assetData;
 | 
			
		||||
    },
 | 
			
		||||
    /**
 | 
			
		||||
     * Decodes an ERC1155 assetData hex string into it's corresponding ERC1155 components.
 | 
			
		||||
     * @param assetData Hex encoded assetData string to decode
 | 
			
		||||
     * @return An object containing the decoded tokenAddress, tokenIds, tokenValues, callbackData & assetProxyId
 | 
			
		||||
     */
 | 
			
		||||
    decodeERC1155AssetData(assetData: string): ERC1155AssetData {
 | 
			
		||||
        const assetProxyId = assetDataUtils.decodeAssetProxyId(assetData);
 | 
			
		||||
        if (assetProxyId !== AssetProxyId.ERC1155) {
 | 
			
		||||
            throw new Error(`Invalid assetProxyId. Expected '${AssetProxyId.ERC1155}', got '${assetProxyId}'`);
 | 
			
		||||
        }
 | 
			
		||||
        const abiEncoder = AbiEncoder.createMethod('ERC1155Token', ERC1155AssetDataAbi);
 | 
			
		||||
        const decodedAssetData = abiEncoder.decode(assetData, decodingRules) as ERC1155AssetDataNoProxyId;
 | 
			
		||||
        return {
 | 
			
		||||
            assetProxyId,
 | 
			
		||||
            tokenAddress: decodedAssetData.tokenAddress,
 | 
			
		||||
            tokenIds: decodedAssetData.tokenIds,
 | 
			
		||||
            tokenValues: decodedAssetData.tokenValues,
 | 
			
		||||
            callbackData: decodedAssetData.callbackData,
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
    /**
 | 
			
		||||
     * Encodes assetData for multiple AssetProxies into a single hex encoded assetData string, usable in the makerAssetData or
 | 
			
		||||
     * takerAssetData fields in a 0x order.
 | 
			
		||||
@@ -94,23 +137,6 @@ export const assetDataUtils = {
 | 
			
		||||
        const assetData = abiEncoder.encode(args, encodingRules);
 | 
			
		||||
        return assetData;
 | 
			
		||||
    },
 | 
			
		||||
    /**
 | 
			
		||||
     * Encodes assetData for multiple AssetProxies into a single hex encoded assetData string, usable in the makerAssetData or
 | 
			
		||||
     * takerAssetData fields in a 0x order.
 | 
			
		||||
 | 
			
		||||
     * @return The hex encoded assetData string
 | 
			
		||||
     */
 | 
			
		||||
    encodeERC1155AssetData(
 | 
			
		||||
        tokenAddress: string,
 | 
			
		||||
        tokenIds: BigNumber[],
 | 
			
		||||
        tokenValues: BigNumber[],
 | 
			
		||||
        callbackData: string,
 | 
			
		||||
    ): string {
 | 
			
		||||
        const abiEncoder = AbiEncoder.createMethod('ERC1155Token', ['address', 'uint256[]', 'uint256[]', 'bytes']);
 | 
			
		||||
        const args = [tokenAddress, tokenIds, tokenValues, callbackData];
 | 
			
		||||
        const assetData = abiEncoder.encode(args, encodingRules);
 | 
			
		||||
        return assetData;
 | 
			
		||||
    },
 | 
			
		||||
    /**
 | 
			
		||||
     * Decodes a MultiAsset assetData hex string into it's corresponding amounts and nestedAssetData
 | 
			
		||||
     * @param assetData Hex encoded assetData string to decode
 | 
			
		||||
@@ -212,6 +238,13 @@ export const assetDataUtils = {
 | 
			
		||||
    isERC721AssetData(decodedAssetData: SingleAssetData | MultiAssetData): decodedAssetData is ERC721AssetData {
 | 
			
		||||
        return decodedAssetData.assetProxyId === AssetProxyId.ERC721;
 | 
			
		||||
    },
 | 
			
		||||
    /**
 | 
			
		||||
     * Checks if the decoded asset data is valid ERC1155 data
 | 
			
		||||
     * @param decodedAssetData The decoded asset data to check
 | 
			
		||||
     */
 | 
			
		||||
    isERC1155AssetData(decodedAssetData: SingleAssetData | MultiAssetData): decodedAssetData is ERC1155AssetData {
 | 
			
		||||
        return decodedAssetData.assetProxyId === AssetProxyId.ERC1155;
 | 
			
		||||
    },
 | 
			
		||||
    /**
 | 
			
		||||
     * Checks if the decoded asset data is valid MultiAsset data
 | 
			
		||||
     * @param decodedAssetData The decoded asset data to check
 | 
			
		||||
@@ -219,9 +252,6 @@ export const assetDataUtils = {
 | 
			
		||||
    isMultiAssetData(decodedAssetData: SingleAssetData | MultiAssetData): decodedAssetData is MultiAssetData {
 | 
			
		||||
        return decodedAssetData.assetProxyId === AssetProxyId.MultiAsset;
 | 
			
		||||
    },
 | 
			
		||||
    isER1155AssetData(decodedAssetData: SingleAssetData | MultiAssetData): decodedAssetData is MultiAssetData {
 | 
			
		||||
        return decodedAssetData.assetProxyId === AssetProxyId.MultiAsset;
 | 
			
		||||
    },
 | 
			
		||||
    /**
 | 
			
		||||
     * Throws if the length or assetProxyId are invalid for the ERC20Proxy.
 | 
			
		||||
     * @param assetData Hex encoded assetData string
 | 
			
		||||
@@ -264,6 +294,14 @@ export const assetDataUtils = {
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    /**
 | 
			
		||||
     * Throws if the assetData is not ERC1155.
 | 
			
		||||
     * @param assetData Hex encoded assetData string
 | 
			
		||||
     */
 | 
			
		||||
    assertIsERC1155AssetData(assetData: string): void {
 | 
			
		||||
        // If the asset data is correctly decoded then it is valid.
 | 
			
		||||
        assetDataUtils.decodeERC1155AssetData(assetData);
 | 
			
		||||
    },
 | 
			
		||||
    /**
 | 
			
		||||
     * Throws if the length or assetProxyId are invalid for the MultiAssetProxy.
 | 
			
		||||
     * @param assetData Hex encoded assetData string
 | 
			
		||||
@@ -298,6 +336,9 @@ export const assetDataUtils = {
 | 
			
		||||
            case AssetProxyId.ERC721:
 | 
			
		||||
                assetDataUtils.assertIsERC721AssetData(assetData);
 | 
			
		||||
                break;
 | 
			
		||||
            case AssetProxyId.ERC1155:
 | 
			
		||||
                assetDataUtils.assertIsERC1155AssetData(assetData);
 | 
			
		||||
                break;
 | 
			
		||||
            case AssetProxyId.MultiAsset:
 | 
			
		||||
                assetDataUtils.assertIsMultiAssetData(assetData);
 | 
			
		||||
                break;
 | 
			
		||||
@@ -308,7 +349,7 @@ export const assetDataUtils = {
 | 
			
		||||
    /**
 | 
			
		||||
     * Decode any assetData into it's corresponding assetData object
 | 
			
		||||
     * @param assetData Hex encoded assetData string to decode
 | 
			
		||||
     * @return Either a ERC20 or ERC721 assetData object
 | 
			
		||||
     * @return Either a ERC20, ERC721, ERC1155, or MultiAsset assetData object
 | 
			
		||||
     */
 | 
			
		||||
    decodeAssetDataOrThrow(assetData: string): SingleAssetData | MultiAssetData {
 | 
			
		||||
        const assetProxyId = assetDataUtils.decodeAssetProxyId(assetData);
 | 
			
		||||
@@ -319,6 +360,9 @@ export const assetDataUtils = {
 | 
			
		||||
            case AssetProxyId.ERC721:
 | 
			
		||||
                const erc721AssetData = assetDataUtils.decodeERC721AssetData(assetData);
 | 
			
		||||
                return erc721AssetData;
 | 
			
		||||
            case AssetProxyId.ERC1155:
 | 
			
		||||
                const erc1155AssetData = assetDataUtils.decodeERC1155AssetData(assetData);
 | 
			
		||||
                return erc1155AssetData;
 | 
			
		||||
            case AssetProxyId.MultiAsset:
 | 
			
		||||
                const multiAssetData = assetDataUtils.decodeMultiAssetData(assetData);
 | 
			
		||||
                return multiAssetData;
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,14 @@ const KNOWN_ERC721_ENCODING = {
 | 
			
		||||
    assetData:
 | 
			
		||||
        '0x025717920000000000000000000000001dc4c1cefef38a777b15aa20260a54e584b16c480000000000000000000000000000000000000000000000000000000000000001',
 | 
			
		||||
};
 | 
			
		||||
const KNOWN_ERC1155_ENCODING = {
 | 
			
		||||
    tokenAddress: '0x1dc4c1cefef38a777b15aa20260a54e584b16c48',
 | 
			
		||||
    tokenIds: [new BigNumber(100), new BigNumber(1001), new BigNumber(10001)],
 | 
			
		||||
    tokenValues: [new BigNumber(200), new BigNumber(2001), new BigNumber(20001)],
 | 
			
		||||
    callbackData: '0x025717920000000000000000000000001dc4c1cefef38a777b15aa20260a54e584b16c480000000000000000000000000000000000000000000000000000000000000001',
 | 
			
		||||
    assetData:
 | 
			
		||||
        '0x9645780d0000000000000000000000001dc4c1cefef38a777b15aa20260a54e584b16c480000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000003e90000000000000000000000000000000000000000000000000000000000002711000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000007d10000000000000000000000000000000000000000000000000000000000004e210000000000000000000000000000000000000000000000000000000000000044025717920000000000000000000000001dc4c1cefef38a777b15aa20260a54e584b16c48000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000',
 | 
			
		||||
};
 | 
			
		||||
const KNOWN_MULTI_ASSET_ENCODING = {
 | 
			
		||||
    amounts: [new BigNumber(1), new BigNumber(1)],
 | 
			
		||||
    nestedAssetData: [KNOWN_ERC20_ENCODING.assetData, KNOWN_ERC721_ENCODING.assetData],
 | 
			
		||||
@@ -50,6 +58,23 @@ describe('assetDataUtils', () => {
 | 
			
		||||
        expect(decodedAssetData.assetProxyId).to.equal(AssetProxyId.ERC721);
 | 
			
		||||
        expect(decodedAssetData.tokenId).to.be.bignumber.equal(KNOWN_ERC721_ENCODING.tokenId);
 | 
			
		||||
    });
 | 
			
		||||
    it('should encode ERC1155', () => {
 | 
			
		||||
        const assetData = assetDataUtils.encodeERC1155AssetData(
 | 
			
		||||
            KNOWN_ERC1155_ENCODING.tokenAddress,
 | 
			
		||||
            KNOWN_ERC1155_ENCODING.tokenIds,
 | 
			
		||||
            KNOWN_ERC1155_ENCODING.tokenValues,
 | 
			
		||||
            KNOWN_ERC1155_ENCODING.callbackData
 | 
			
		||||
        );
 | 
			
		||||
        expect(assetData).to.equal(KNOWN_ERC1155_ENCODING.assetData);
 | 
			
		||||
    });
 | 
			
		||||
    it('should decode ERC1155', () => {
 | 
			
		||||
        const decodedAssetData = assetDataUtils.decodeERC1155AssetData(KNOWN_ERC1155_ENCODING.assetData);
 | 
			
		||||
        expect(decodedAssetData.assetProxyId).to.be.equal(AssetProxyId.ERC1155);
 | 
			
		||||
        expect(decodedAssetData.tokenAddress).to.be.equal(KNOWN_ERC1155_ENCODING.tokenAddress);
 | 
			
		||||
        expect(decodedAssetData.tokenValues).to.be.deep.equal(KNOWN_ERC1155_ENCODING.tokenValues);
 | 
			
		||||
        expect(decodedAssetData.tokenIds).to.be.deep.equal(KNOWN_ERC1155_ENCODING.tokenIds);
 | 
			
		||||
        expect(decodedAssetData.callbackData).to.be.equal(KNOWN_ERC1155_ENCODING.callbackData);
 | 
			
		||||
    });
 | 
			
		||||
    it('should encode ERC20 and ERC721 multiAssetData', () => {
 | 
			
		||||
        const assetData = assetDataUtils.encodeMultiAssetData(
 | 
			
		||||
            KNOWN_MULTI_ASSET_ENCODING.amounts,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,13 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "version": "2.2.3",
 | 
			
		||||
        "changes": [
 | 
			
		||||
            {
 | 
			
		||||
                "note": "Added `ERC1155AssetData`, `ERC1155AssetDataNoProxyId`, and `ERC1155AssetDataAbi`",
 | 
			
		||||
                "pr": 1661
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    },        
 | 
			
		||||
    {
 | 
			
		||||
        "version": "2.2.2",
 | 
			
		||||
        "changes": [
 | 
			
		||||
 
 | 
			
		||||
@@ -185,6 +185,20 @@ export interface ERC1155AssetData {
 | 
			
		||||
    callbackData: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface ERC1155AssetDataNoProxyId {
 | 
			
		||||
    tokenAddress: string,
 | 
			
		||||
    tokenValues: BigNumber[],
 | 
			
		||||
    tokenIds: BigNumber[],
 | 
			
		||||
    callbackData: string
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const ERC1155AssetDataAbi = [
 | 
			
		||||
    {name: 'tokenAddress', type: 'address'},
 | 
			
		||||
    {name: 'tokenIds', type: 'uint256[]'},
 | 
			
		||||
    {name: 'tokenValues', type: 'uint256[]'},
 | 
			
		||||
    {name: 'callbackData', type: 'bytes'},
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
export type SingleAssetData = ERC20AssetData | ERC721AssetData | ERC1155AssetData;
 | 
			
		||||
 | 
			
		||||
export interface MultiAssetData {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user