Add hard coded proxyId into each AssetProxy

This commit is contained in:
Amir Bandeali
2018-04-26 14:51:45 -07:00
parent 63ad2ebf0b
commit bbb3d5bb67
6 changed files with 76 additions and 5 deletions

View File

@@ -33,4 +33,11 @@ contract IAssetProxy is IAuthorizable {
address to,
uint256 amount)
external;
/// @dev Gets the proxy id associated with the proxy address.
/// @return Proxy id.
function getProxyId()
external
view
returns (uint8);
}

View File

@@ -29,6 +29,8 @@ contract ERC20Proxy is
IAssetProxy
{
uint8 constant PROXY_ID = 1;
/// @dev Transfers ERC20 tokens. Either succeeds or throws.
/// @param assetMetadata ERC20-encoded byte array.
/// @param from Address to transfer token from.
@@ -42,9 +44,25 @@ contract ERC20Proxy is
external
onlyAuthorized
{
// Data must be intended for this proxy.
require(uint8(assetMetadata[0]) == PROXY_ID);
// Decode metadata.
require(assetMetadata.length == 21);
address token = readAddress(assetMetadata, 1);
// Transfer tokens.
bool success = IERC20Token(token).transferFrom(from, to, amount);
require(success == true);
}
/// @dev Gets the proxy id associated with the proxy address.
/// @return Proxy id.
function getProxyId()
external
view
returns (uint8)
{
return PROXY_ID;
}
}

View File

@@ -29,6 +29,8 @@ contract ERC721Proxy is
IAssetProxy
{
uint8 constant PROXY_ID = 2;
/// @dev Transfers ERC721 tokens. Either succeeds or throws.
/// @param assetMetadata ERC721-encoded byte array
/// @param from Address to transfer token from.
@@ -42,17 +44,31 @@ contract ERC721Proxy is
external
onlyAuthorized
{
// Data must be intended for this proxy.
require(uint8(assetMetadata[0]) == PROXY_ID);
// There exists only 1 of each token.
require(amount == 1);
// Decode metadata
// Decode metadata.
require(assetMetadata.length == 53);
address token = readAddress(assetMetadata, 1);
uint256 tokenId = readUint256(assetMetadata, 21);
// Transfer token.
// Either succeeds or throws.
// @TODO: Call safeTransferFrom if there is additional
// data stored in `assetMetadata`.
ERC721Token(token).transferFrom(from, to, tokenId);
}
/// @dev Gets the proxy id associated with the proxy address.
/// @return Proxy id.
function getProxyId()
external
view
returns (uint8)
{
return PROXY_ID;
}
}

View File

@@ -43,7 +43,7 @@ contract MixinAssetProxyDispatcher is
{
// Do nothing if no amount should be transferred.
if (amount > 0) {
// Lookup asset proxy
// Lookup asset proxy.
require(assetMetadata.length >= 1);
uint8 assetProxyId = uint8(assetMetadata[0]);
IAssetProxy assetProxy = assetProxies[assetProxyId];
@@ -66,11 +66,19 @@ contract MixinAssetProxyDispatcher is
external
onlyOwner
{
// Ensure the existing asset proxy is not unintentionally overwritten
// Ensure the existing asset proxy is not unintentionally overwritten.
require(oldAssetProxy == address(assetProxies[assetProxyId]));
// Add asset proxy and log registration
assetProxies[assetProxyId] = IAssetProxy(newAssetProxy);
IAssetProxy assetProxy = IAssetProxy(newAssetProxy);
// Ensure that the id of newAssetProxy matches the passed in assetProxyId, unless it is being reset to 0.
if (newAssetProxy != address(0)) {
uint8 newAssetProxyId = assetProxy.getProxyId();
require(newAssetProxyId == assetProxyId);
}
// Add asset proxy and log registration.
assetProxies[assetProxyId] = assetProxy;
emit AssetProxySet(assetProxyId, newAssetProxy, oldAssetProxy);
}