Cleaned up interface for decoding proxy data. Added a general decoder, which should be useful for the forwarding contract code.

This commit is contained in:
Greg Hysen
2018-05-16 17:55:50 -07:00
parent e748e1891b
commit 2eb5819851
3 changed files with 63 additions and 17 deletions

View File

@@ -2,7 +2,7 @@ import { BigNumber } from '@0xproject/utils';
import BN = require('bn.js');
import ethUtil = require('ethereumjs-util');
import { AssetProxyId } from './types';
import { AssetProxyId, ERC20ProxyData, ERC721ProxyData, ProxyData } from './types';
export const assetProxyUtils = {
encodeAssetProxyId(assetProxyId: AssetProxyId): Buffer {
@@ -43,7 +43,7 @@ export const assetProxyUtils = {
const encodedMetadataHex = ethUtil.bufferToHex(encodedMetadata);
return encodedMetadataHex;
},
decodeERC20ProxyData(proxyData: string): string /* tokenAddress */ {
decodeERC20ProxyData(proxyData: string): ERC20ProxyData {
const encodedProxyMetadata = ethUtil.toBuffer(proxyData);
if (encodedProxyMetadata.byteLength !== 21) {
throw new Error(
@@ -63,7 +63,11 @@ export const assetProxyUtils = {
}
const encodedTokenAddress = encodedProxyMetadata.slice(1, 21);
const tokenAddress = assetProxyUtils.decodeAddress(encodedTokenAddress);
return tokenAddress;
const erc20ProxyData = {
assetProxyId,
tokenAddress,
};
return erc20ProxyData;
},
encodeERC721ProxyData(tokenAddress: string, tokenId: BigNumber): string {
const encodedAssetProxyId = assetProxyUtils.encodeAssetProxyId(AssetProxyId.ERC721);
@@ -73,7 +77,7 @@ export const assetProxyUtils = {
const encodedMetadataHex = ethUtil.bufferToHex(encodedMetadata);
return encodedMetadataHex;
},
decodeERC721ProxyData(proxyData: string): [string /* tokenAddress */, BigNumber /* tokenId */] {
decodeERC721ProxyData(proxyData: string): ERC721ProxyData {
const encodedProxyMetadata = ethUtil.toBuffer(proxyData);
if (encodedProxyMetadata.byteLength !== 53) {
throw new Error(
@@ -95,7 +99,12 @@ export const assetProxyUtils = {
const tokenAddress = assetProxyUtils.decodeAddress(encodedTokenAddress);
const encodedTokenId = encodedProxyMetadata.slice(21, 53);
const tokenId = assetProxyUtils.decodeUint256(encodedTokenId);
return [tokenAddress, tokenId];
const erc721ProxyData = {
assetProxyId,
tokenAddress,
tokenId,
};
return erc721ProxyData;
},
decodeProxyDataId(proxyData: string): AssetProxyId {
const encodedProxyMetadata = ethUtil.toBuffer(proxyData);
@@ -110,4 +119,26 @@ export const assetProxyUtils = {
const assetProxyId = assetProxyUtils.decodeAssetProxyId(encodedAssetProxyId);
return assetProxyId;
},
decodeProxyData(proxyData: string): ProxyData {
const assetProxyId = assetProxyUtils.decodeProxyDataId(proxyData);
switch (assetProxyId) {
case AssetProxyId.ERC20:
const erc20ProxyData = assetProxyUtils.decodeERC20ProxyData(proxyData);
const generalizedERC20ProxyData = {
assetProxyId,
tokenAddress: erc20ProxyData.tokenAddress,
};
return generalizedERC20ProxyData;
case AssetProxyId.ERC721:
const erc721ProxyData = assetProxyUtils.decodeERC721ProxyData(proxyData);
const generaliedERC721ProxyData = {
assetProxyId,
tokenAddress: erc721ProxyData.tokenAddress,
data: erc721ProxyData.tokenId,
};
return generaliedERC721ProxyData;
default:
throw new Error(`Unrecognized asset proxy id: ${assetProxyId}`);
}
},
};

View File

@@ -180,3 +180,20 @@ export interface OrderInfo {
orderHash: string;
orderFilledAmount: BigNumber;
}
export interface ERC20ProxyData {
assetProxyId: AssetProxyId;
tokenAddress: string;
}
export interface ERC721ProxyData {
assetProxyId: AssetProxyId;
tokenAddress: string;
tokenId: BigNumber;
}
export interface ProxyData {
assetProxyId: AssetProxyId;
tokenAddress?: string;
data?: any;
}

View File

@@ -73,7 +73,8 @@ export class MatchOrderTester {
const makerAssetProxyIdLeft = assetProxyUtils.decodeProxyDataId(signedOrderLeft.makerAssetData);
if (makerAssetProxyIdLeft === AssetProxyId.ERC20) {
// Decode asset data
const makerAssetAddressLeft = assetProxyUtils.decodeERC20ProxyData(signedOrderLeft.makerAssetData);
const erc20ProxyData = assetProxyUtils.decodeERC20ProxyData(signedOrderLeft.makerAssetData);
const makerAssetAddressLeft = erc20ProxyData.tokenAddress;
const takerAssetAddressRight = makerAssetAddressLeft;
// Left Maker
expectedNewERC20BalancesByOwner[makerAddressLeft][makerAssetAddressLeft] = expectedNewERC20BalancesByOwner[
@@ -91,11 +92,9 @@ export class MatchOrderTester {
][makerAssetAddressLeft].add(expectedTransferAmounts.amountReceivedByTaker);
} else if (makerAssetProxyIdLeft === AssetProxyId.ERC721) {
// Decode asset data
let makerAssetAddressLeft;
let makerAssetIdLeft;
[makerAssetAddressLeft, makerAssetIdLeft] = assetProxyUtils.decodeERC721ProxyData(
signedOrderLeft.makerAssetData,
);
const erc721ProxyData = assetProxyUtils.decodeERC721ProxyData(signedOrderLeft.makerAssetData);
const makerAssetAddressLeft = erc721ProxyData.tokenAddress;
const makerAssetIdLeft = erc721ProxyData.tokenId;
const takerAssetAddressRight = makerAssetAddressLeft;
const takerAssetIdRight = makerAssetIdLeft;
// Left Maker
@@ -109,7 +108,8 @@ export class MatchOrderTester {
const takerAssetProxyIdLeft = assetProxyUtils.decodeProxyDataId(signedOrderLeft.takerAssetData);
if (takerAssetProxyIdLeft === AssetProxyId.ERC20) {
// Decode asset data
const takerAssetAddressLeft = assetProxyUtils.decodeERC20ProxyData(signedOrderLeft.takerAssetData);
const erc20ProxyData = assetProxyUtils.decodeERC20ProxyData(signedOrderLeft.takerAssetData);
const takerAssetAddressLeft = erc20ProxyData.tokenAddress;
const makerAssetAddressRight = takerAssetAddressLeft;
// Left Maker
expectedNewERC20BalancesByOwner[makerAddressLeft][takerAssetAddressLeft] = expectedNewERC20BalancesByOwner[
@@ -123,11 +123,9 @@ export class MatchOrderTester {
);
} else if (takerAssetProxyIdLeft === AssetProxyId.ERC721) {
// Decode asset data
let makerAssetAddressRight;
let makerAssetIdRight;
[makerAssetAddressRight, makerAssetIdRight] = assetProxyUtils.decodeERC721ProxyData(
signedOrderRight.makerAssetData,
);
const erc721ProxyData = assetProxyUtils.decodeERC721ProxyData(signedOrderRight.makerAssetData);
const makerAssetAddressRight = erc721ProxyData.tokenAddress;
const makerAssetIdRight = erc721ProxyData.tokenId;
const takerAssetAddressLeft = makerAssetAddressRight;
const takerAssetIdLeft = makerAssetIdRight;
// Right Maker