aboutsummaryrefslogtreecommitdiffstats
path: root/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol
diff options
context:
space:
mode:
Diffstat (limited to 'packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol')
-rw-r--r--packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol48
1 files changed, 35 insertions, 13 deletions
diff --git a/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol b/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol
index 2c321e134..dd25bf41a 100644
--- a/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol
+++ b/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol
@@ -34,34 +34,30 @@ contract ERC20Proxy is
uint8 constant PROXY_ID = 1;
/// @dev Internal version of `transferFrom`.
- /// @param assetMetadata Encoded byte array.
+ /// @param assetData Encoded byte array.
/// @param from Address to transfer asset from.
/// @param to Address to transfer asset to.
/// @param amount Amount of asset to transfer.
function transferFromInternal(
- bytes memory assetMetadata,
+ bytes memory assetData,
address from,
address to,
uint256 amount
)
internal
{
- // Data must be intended for this proxy.
- uint256 length = assetMetadata.length;
+ // Decode asset data.
+ (
+ uint8 proxyId,
+ address token
+ ) = decodeERC20AssetData(assetData);
+ // Data must be intended for this proxy.
require(
- length == 21,
- LENGTH_21_REQUIRED
- );
- // TODO: Is this too inflexible in the future?
- require(
- uint8(assetMetadata[length - 1]) == PROXY_ID,
+ proxyId == PROXY_ID,
ASSET_PROXY_ID_MISMATCH
);
- // Decode metadata.
- address token = readAddress(assetMetadata, 0);
-
// Transfer tokens.
bool success = IERC20Token(token).transferFrom(from, to, amount);
require(
@@ -79,4 +75,30 @@ contract ERC20Proxy is
{
return PROXY_ID;
}
+
+ /// @dev Decodes ERC20 Asset data.
+ /// @param assetData Encoded byte array.
+ /// @return proxyId Intended ERC20 proxy id.
+ /// @return token ERC20 token address.
+ function decodeERC20AssetData(bytes memory assetData)
+ internal
+ pure
+ returns (
+ uint8 proxyId,
+ address token
+ )
+ {
+ // Validate encoded data length
+ uint256 length = assetData.length;
+ require(
+ length == 21,
+ LENGTH_21_REQUIRED
+ );
+
+ // Decode data
+ token = readAddress(assetData, 0);
+ proxyId = uint8(assetData[length - 1]);
+
+ return (proxyId, token);
+ }
}