Add batchTransferFrom to asset proxies

This commit is contained in:
Amir Bandeali
2018-04-30 13:51:21 -07:00
parent b5c4b81aac
commit 668dcb7cf0
3 changed files with 111 additions and 9 deletions

View File

@@ -17,6 +17,7 @@
*/ */
pragma solidity ^0.4.21; pragma solidity ^0.4.21;
pragma experimental ABIEncoderV2;
import "../../utils/Authorizable/IAuthorizable.sol"; import "../../utils/Authorizable/IAuthorizable.sol";
@@ -24,9 +25,9 @@ contract IAssetProxy is IAuthorizable {
/// @dev Transfers assets. Either succeeds or throws. /// @dev Transfers assets. Either succeeds or throws.
/// @param assetMetadata Byte array encoded for the respective asset proxy. /// @param assetMetadata Byte array encoded for the respective asset proxy.
/// @param from Address to transfer token from. /// @param from Address to transfer asset from.
/// @param to Address to transfer token to. /// @param to Address to transfer asset to.
/// @param amount Amount of token to transfer. /// @param amount Amount of asset to transfer.
function transferFrom( function transferFrom(
bytes assetMetadata, bytes assetMetadata,
address from, address from,
@@ -34,6 +35,18 @@ contract IAssetProxy is IAuthorizable {
uint256 amount) uint256 amount)
external; external;
/// @dev Makes multiple transfers of assets. Either succeeds or throws.
/// @param assetMetadata Array of byte arrays encoded for the respective asset proxy.
/// @param from Array of addresses to transfer assets from.
/// @param to Array of addresses to transfer assets to.
/// @param amounts Array of amounts of assets to transfer.
function batchTransferFrom(
bytes[] memory assetMetadata,
address[] memory from,
address[] memory to,
uint256[] memory amounts)
public;
/// @dev Gets the proxy id associated with the proxy address. /// @dev Gets the proxy id associated with the proxy address.
/// @return Proxy id. /// @return Proxy id.
function getProxyId() function getProxyId()
@@ -41,3 +54,4 @@ contract IAssetProxy is IAuthorizable {
view view
returns (uint8); returns (uint8);
} }

View File

@@ -17,6 +17,7 @@
*/ */
pragma solidity ^0.4.21; pragma solidity ^0.4.21;
pragma experimental ABIEncoderV2;
import "../IAssetProxy.sol"; import "../IAssetProxy.sol";
import "../../../utils/LibBytes/LibBytes.sol"; import "../../../utils/LibBytes/LibBytes.sol";
@@ -33,9 +34,9 @@ contract ERC20Proxy is
/// @dev Transfers ERC20 tokens. Either succeeds or throws. /// @dev Transfers ERC20 tokens. Either succeeds or throws.
/// @param assetMetadata ERC20-encoded byte array. /// @param assetMetadata ERC20-encoded byte array.
/// @param from Address to transfer token from. /// @param from Address to transfer asset from.
/// @param to Address to transfer token to. /// @param to Address to transfer asset to.
/// @param amount Amount of token to transfer. /// @param amount Amount of asset to transfer.
function transferFrom( function transferFrom(
bytes assetMetadata, bytes assetMetadata,
address from, address from,
@@ -43,6 +44,49 @@ contract ERC20Proxy is
uint256 amount) uint256 amount)
external external
onlyAuthorized onlyAuthorized
{
transferFromInternal(
assetMetadata,
from,
to,
amount
);
}
/// @dev Makes multiple transfers of assets. Either succeeds or throws.
/// @param assetMetadata Array of byte arrays encoded for the respective asset proxy.
/// @param from Array of addresses to transfer assets from.
/// @param to Array of addresses to transfer assets to.
/// @param amounts Array of amounts of assets to transfer.
function batchTransferFrom(
bytes[] memory assetMetadata,
address[] memory from,
address[] memory to,
uint256[] memory amounts)
public
onlyAuthorized
{
for (uint256 i = 0; i < assetMetadata.length; i++) {
transferFromInternal(
assetMetadata[i],
from[i],
to[i],
amounts[i]
);
}
}
/// @dev Internal version of `transferFrom`.
/// @param assetMetadata ERC20-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,
address from,
address to,
uint256 amount)
internal
{ {
// Data must be intended for this proxy. // Data must be intended for this proxy.
require(uint8(assetMetadata[0]) == PROXY_ID); require(uint8(assetMetadata[0]) == PROXY_ID);

View File

@@ -17,6 +17,7 @@
*/ */
pragma solidity ^0.4.21; pragma solidity ^0.4.21;
pragma experimental ABIEncoderV2;
import "../IAssetProxy.sol"; import "../IAssetProxy.sol";
import "../../../utils/LibBytes/LibBytes.sol"; import "../../../utils/LibBytes/LibBytes.sol";
@@ -33,9 +34,9 @@ contract ERC721Proxy is
/// @dev Transfers ERC721 tokens. Either succeeds or throws. /// @dev Transfers ERC721 tokens. Either succeeds or throws.
/// @param assetMetadata ERC721-encoded byte array /// @param assetMetadata ERC721-encoded byte array
/// @param from Address to transfer token from. /// @param from Address to transfer asset from.
/// @param to Address to transfer token to. /// @param to Address to transfer asset to.
/// @param amount Amount of token to transfer. /// @param amount Amount of asset to transfer.
function transferFrom( function transferFrom(
bytes assetMetadata, bytes assetMetadata,
address from, address from,
@@ -43,6 +44,49 @@ contract ERC721Proxy is
uint256 amount) uint256 amount)
external external
onlyAuthorized onlyAuthorized
{
transferFromInternal(
assetMetadata,
from,
to,
amount
);
}
/// @dev Makes multiple transfers of assets. Either succeeds or throws.
/// @param assetMetadata Array of byte arrays encoded for the respective asset proxy.
/// @param from Array of addresses to transfer assets from.
/// @param to Array of addresses to transfer assets to.
/// @param amounts Array of amounts of assets to transfer.
function batchTransferFrom(
bytes[] memory assetMetadata,
address[] memory from,
address[] memory to,
uint256[] memory amounts)
public
onlyAuthorized
{
for (uint256 i = 0; i < assetMetadata.length; i++) {
transferFromInternal(
assetMetadata[i],
from[i],
to[i],
amounts[i]
);
}
}
/// @dev Internal version of `transferFrom`.
/// @param assetMetadata ERC20-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,
address from,
address to,
uint256 amount)
internal
{ {
// Data must be intended for this proxy. // Data must be intended for this proxy.
require(uint8(assetMetadata[0]) == PROXY_ID); require(uint8(assetMetadata[0]) == PROXY_ID);