Inlined decodeMetadata in the proxies and removed encodeMetadata (already exists in Typescript). This simplifies the code.

This commit is contained in:
Greg Hysen
2018-04-17 13:36:11 -07:00
committed by Amir Bandeali
parent dbd65cdb04
commit e80f203efc
3 changed files with 5 additions and 132 deletions

View File

@@ -42,39 +42,9 @@ contract ERC20Proxy is
external
onlyAuthorized
{
address token = decodeMetadata(assetMetadata);
require(assetMetadata.length == 21);
address token = readAddress(assetMetadata, 1);
bool success = ERC20Token(token).transferFrom(from, to, amount);
require(success == true);
}
/// @dev Decodes ERC20-encoded byte array.
/// @param assetMetadata ERC20-encoded byte array.
/// @return tokenAddress Address of ERC20 token.
function decodeMetadata(bytes memory assetMetadata)
public pure
returns (address tokenAddress)
{
require(assetMetadata.length == 21);
return readAddress(assetMetadata, 1);
}
/// @dev Encodes ERC20 byte array.
/// @param assetProxyId Id of the asset proxy.
/// @param tokenAddress Address of the asset.
/// @return assetMetadata ERC20-encoded byte.
function encodeMetadata(
uint8 assetProxyId,
address tokenAddress)
public pure
returns (bytes memory assetMetadata)
{
// 0 is reserved as invalid proxy id
require(assetProxyId != 0);
// Encode fields into a byte array
assetMetadata = new bytes(21);
assetMetadata[0] = byte(assetProxyId);
writeAddress(assetMetadata, 1, tokenAddress);
return assetMetadata;
}
}

View File

@@ -46,50 +46,13 @@ contract ERC721Proxy is
require(amount == 1);
// Decode metadata
address token;
uint256 tokenId;
(token, tokenId) = decodeMetadata(assetMetadata);
require(assetMetadata.length == 53);
address token = readAddress(assetMetadata, 1);
uint256 tokenId = readUint256(assetMetadata, 21);
// Either succeeds or throws.
// @TODO: Call safeTransferFrom if there is additional
// data stored in `assetMetadata`.
ERC721Token(token).transferFrom(from, to, tokenId);
}
/// @dev Decodes ERC721-encoded byte array.
/// @param assetMetadata ERC721-encoded byte array.
/// @return tokenAddress Address of ERC721 token.
/// @return tokenId Id of ERC721 token.
function decodeMetadata(bytes memory assetMetadata)
public pure
returns (address tokenAddress, uint256 tokenId)
{
require(assetMetadata.length == 53);
tokenAddress = readAddress(assetMetadata, 1);
tokenId = readUint256(assetMetadata, 21);
return (tokenAddress, tokenId);
}
/// @dev Encodes ERC721 byte array.
/// @param assetProxyId Id of the asset proxy.
/// @param tokenAddress Address of the asset.
/// @param tokenId Id of ERC721 token.
/// @return assetMetadata ERC721-encoded byte array.
function encodeMetadata(
uint8 assetProxyId,
address tokenAddress,
uint256 tokenId)
public pure
returns (bytes memory assetMetadata)
{
// 0 is reserved as invalid proxy id
require(assetProxyId != 0);
// Encode fields into a byte array
assetMetadata = new bytes(53);
assetMetadata[0] = byte(assetProxyId);
writeAddress(assetMetadata, 1, tokenAddress);
writeUint256(assetMetadata, 21, tokenId);
return assetMetadata;
}
}

View File

@@ -91,30 +91,6 @@ describe('Asset Transfer Proxies', () => {
await blockchainLifecycle.revertAsync();
});
describe('Transfer Proxy - ERC20', () => {
it('should successfully encode/decode metadata', async () => {
const metadata = await erc20Proxy.encodeMetadata.callAsync(AssetProxyId.ERC20, zrx.address);
const address = await erc20Proxy.decodeMetadata.callAsync(metadata);
expect(address).to.be.equal(zrx.address);
});
it('should successfully decode metadata encoded by typescript helpers', async () => {
const metadata = encodeERC20ProxyData(zrx.address);
const address = await erc20Proxy.decodeMetadata.callAsync(metadata);
expect(address).to.be.equal(zrx.address);
});
it('should successfully encode/decode metadata padded with zeros', async () => {
const metadata = await erc20Proxy.encodeMetadata.callAsync(AssetProxyId.ERC20, testAddressPaddedWithZeros);
const address = await erc20Proxy.decodeMetadata.callAsync(metadata);
expect(address).to.be.equal(testAddressPaddedWithZeros);
});
it('should successfully decode metadata encoded padded with zeros by typescript helpers', async () => {
const metadata = encodeERC20ProxyData(testAddressPaddedWithZeros);
const address = await erc20Proxy.decodeMetadata.callAsync(metadata);
expect(address).to.be.equal(testAddressPaddedWithZeros);
});
it('should successfully transfer tokens', async () => {
// Construct metadata for ERC20 proxy
const encodedProxyMetadata = encodeERC20ProxyData(zrx.address);
@@ -192,42 +168,6 @@ describe('Asset Transfer Proxies', () => {
});
describe('Transfer Proxy - ERC721', () => {
it('should successfully encode/decode metadata', async () => {
const metadata = await erc721Proxy.encodeMetadata.callAsync(
AssetProxyId.ERC721,
erc721Token.address,
makerTokenId,
);
const [address, tokenId] = await erc721Proxy.decodeMetadata.callAsync(metadata);
expect(address).to.be.equal(erc721Token.address);
expect(tokenId).to.be.bignumber.equal(makerTokenId);
});
it('should successfully decode metadata encoded by typescript helpers', async () => {
const metadata = encodeERC721ProxyData(erc721Token.address, makerTokenId);
const [address, tokenId] = await erc721Proxy.decodeMetadata.callAsync(metadata);
expect(address).to.be.equal(erc721Token.address);
expect(tokenId).to.be.bignumber.equal(makerTokenId);
});
it('should successfully encode/decode metadata padded with zeros', async () => {
const metadata = await erc721Proxy.encodeMetadata.callAsync(
AssetProxyId.ERC721,
testAddressPaddedWithZeros,
makerTokenId,
);
const [address, tokenId] = await erc721Proxy.decodeMetadata.callAsync(metadata);
expect(address).to.be.equal(testAddressPaddedWithZeros);
expect(tokenId).to.be.bignumber.equal(makerTokenId);
});
it('should successfully decode metadata encoded padded with zeros by typescript helpers', async () => {
const metadata = encodeERC721ProxyData(testAddressPaddedWithZeros, makerTokenId);
const [address, tokenId] = await erc721Proxy.decodeMetadata.callAsync(metadata);
expect(address).to.be.equal(testAddressPaddedWithZeros);
expect(tokenId).to.be.bignumber.equal(makerTokenId);
});
it('should successfully transfer tokens', async () => {
// Construct metadata for ERC721 proxy
const encodedProxyMetadata = encodeERC721ProxyData(erc721Token.address, makerTokenId);