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:
@@ -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}`);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user