Remove proxyId argument from dispatchTransferFrom

This commit is contained in:
Remco Bloemen 2018-06-21 18:46:59 +02:00 committed by Amir Bandeali
parent 9341afe764
commit f7337c1a05
8 changed files with 20 additions and 41 deletions

View File

@ -19,6 +19,7 @@
pragma solidity ^0.4.24; pragma solidity ^0.4.24;
import "../../utils/Ownable/Ownable.sol"; import "../../utils/Ownable/Ownable.sol";
import "../../utils/LibBytes/LibBytes.sol";
import "./libs/LibExchangeErrors.sol"; import "./libs/LibExchangeErrors.sol";
import "./mixins/MAssetProxyDispatcher.sol"; import "./mixins/MAssetProxyDispatcher.sol";
import "../AssetProxy/interfaces/IAssetProxy.sol"; import "../AssetProxy/interfaces/IAssetProxy.sol";
@ -28,6 +29,8 @@ contract MixinAssetProxyDispatcher is
LibExchangeErrors, LibExchangeErrors,
MAssetProxyDispatcher MAssetProxyDispatcher
{ {
using LibBytes for bytes;
// Mapping from Asset Proxy Id's to their respective Asset Proxy // Mapping from Asset Proxy Id's to their respective Asset Proxy
mapping (uint8 => IAssetProxy) public assetProxies; mapping (uint8 => IAssetProxy) public assetProxies;
@ -83,14 +86,12 @@ contract MixinAssetProxyDispatcher is
} }
/// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws. /// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.
/// @param assetData Byte array encoded for the respective asset proxy. /// @param assetData Byte array encoded for the asset.
/// @param assetProxyId Id of assetProxy to dispach to.
/// @param from Address to transfer token from. /// @param from Address to transfer token from.
/// @param to Address to transfer token to. /// @param to Address to transfer token to.
/// @param amount Amount of token to transfer. /// @param amount Amount of token to transfer.
function dispatchTransferFrom( function dispatchTransferFrom(
bytes memory assetData, bytes memory assetData,
uint8 assetProxyId,
address from, address from,
address to, address to,
uint256 amount uint256 amount
@ -100,6 +101,15 @@ contract MixinAssetProxyDispatcher is
// Do nothing if no amount should be transferred. // Do nothing if no amount should be transferred.
if (amount > 0) { if (amount > 0) {
// Lookup assetProxy // Lookup assetProxy
uint8 assetProxyId = uint8(assetData[assetData.length - 1]);
bytes memory assetDataP = new bytes(assetData.length - 1);
LibBytes.memCopy(
assetDataP.contentAddress(),
assetData.contentAddress(),
assetDataP.length
);
IAssetProxy assetProxy = assetProxies[assetProxyId]; IAssetProxy assetProxy = assetProxies[assetProxyId];
// Ensure that assetProxy exists // Ensure that assetProxy exists
require( require(
@ -108,7 +118,7 @@ contract MixinAssetProxyDispatcher is
); );
// transferFrom will either succeed or throw. // transferFrom will either succeed or throw.
assetProxy.transferFrom( assetProxy.transferFrom(
assetData, assetDataP,
from, from,
to, to,
amount amount

View File

@ -20,7 +20,6 @@ pragma solidity ^0.4.24;
pragma experimental ABIEncoderV2; pragma experimental ABIEncoderV2;
import "./libs/LibConstants.sol"; import "./libs/LibConstants.sol";
import "../../utils/LibBytes/LibBytes.sol";
import "./libs/LibFillResults.sol"; import "./libs/LibFillResults.sol";
import "./libs/LibOrder.sol"; import "./libs/LibOrder.sol";
import "./libs/LibMath.sol"; import "./libs/LibMath.sol";
@ -41,8 +40,6 @@ contract MixinExchangeCore is
MSignatureValidator, MSignatureValidator,
MTransactions MTransactions
{ {
using LibBytes for bytes;
// Mapping of orderHash => amount of takerAsset already bought by maker // Mapping of orderHash => amount of takerAsset already bought by maker
mapping (bytes32 => uint256) public filled; mapping (bytes32 => uint256) public filled;
@ -412,33 +409,27 @@ contract MixinExchangeCore is
) )
private private
{ {
uint8 makerAssetProxyId = uint8(order.makerAssetData.popLastByte());
uint8 takerAssetProxyId = uint8(order.takerAssetData.popLastByte());
bytes memory zrxAssetData = ZRX_ASSET_DATA; bytes memory zrxAssetData = ZRX_ASSET_DATA;
dispatchTransferFrom( dispatchTransferFrom(
order.makerAssetData, order.makerAssetData,
makerAssetProxyId,
order.makerAddress, order.makerAddress,
takerAddress, takerAddress,
fillResults.makerAssetFilledAmount fillResults.makerAssetFilledAmount
); );
dispatchTransferFrom( dispatchTransferFrom(
order.takerAssetData, order.takerAssetData,
takerAssetProxyId,
takerAddress, takerAddress,
order.makerAddress, order.makerAddress,
fillResults.takerAssetFilledAmount fillResults.takerAssetFilledAmount
); );
dispatchTransferFrom( dispatchTransferFrom(
zrxAssetData, zrxAssetData,
ZRX_PROXY_ID,
order.makerAddress, order.makerAddress,
order.feeRecipientAddress, order.feeRecipientAddress,
fillResults.makerFeePaid fillResults.makerFeePaid
); );
dispatchTransferFrom( dispatchTransferFrom(
zrxAssetData, zrxAssetData,
ZRX_PROXY_ID,
takerAddress, takerAddress,
order.feeRecipientAddress, order.feeRecipientAddress,
fillResults.takerFeePaid fillResults.takerFeePaid

View File

@ -15,7 +15,6 @@ pragma solidity ^0.4.24;
pragma experimental ABIEncoderV2; pragma experimental ABIEncoderV2;
import "./libs/LibConstants.sol"; import "./libs/LibConstants.sol";
import "../../utils/LibBytes/LibBytes.sol";
import "./libs/LibMath.sol"; import "./libs/LibMath.sol";
import "./libs/LibOrder.sol"; import "./libs/LibOrder.sol";
import "./libs/LibFillResults.sol"; import "./libs/LibFillResults.sol";
@ -34,8 +33,6 @@ contract MixinMatchOrders is
MMatchOrders, MMatchOrders,
MTransactions MTransactions
{ {
using LibBytes for bytes;
/// @dev Match two complementary orders that have a profitable spread. /// @dev Match two complementary orders that have a profitable spread.
/// Each order is filled at their respective price point. However, the calculations are /// Each order is filled at their respective price point. However, the calculations are
/// carried out as though the orders are both being filled at the right order's price point. /// carried out as though the orders are both being filled at the right order's price point.
@ -242,27 +239,22 @@ contract MixinMatchOrders is
) )
private private
{ {
uint8 leftMakerAssetProxyId = uint8(leftOrder.makerAssetData.popLastByte());
uint8 rightMakerAssetProxyId = uint8(rightOrder.makerAssetData.popLastByte());
bytes memory zrxAssetData = ZRX_ASSET_DATA; bytes memory zrxAssetData = ZRX_ASSET_DATA;
// Order makers and taker // Order makers and taker
dispatchTransferFrom( dispatchTransferFrom(
leftOrder.makerAssetData, leftOrder.makerAssetData,
leftMakerAssetProxyId,
leftOrder.makerAddress, leftOrder.makerAddress,
rightOrder.makerAddress, rightOrder.makerAddress,
matchedFillResults.right.takerAssetFilledAmount matchedFillResults.right.takerAssetFilledAmount
); );
dispatchTransferFrom( dispatchTransferFrom(
rightOrder.makerAssetData, rightOrder.makerAssetData,
rightMakerAssetProxyId,
rightOrder.makerAddress, rightOrder.makerAddress,
leftOrder.makerAddress, leftOrder.makerAddress,
matchedFillResults.left.takerAssetFilledAmount matchedFillResults.left.takerAssetFilledAmount
); );
dispatchTransferFrom( dispatchTransferFrom(
leftOrder.makerAssetData, leftOrder.makerAssetData,
leftMakerAssetProxyId,
leftOrder.makerAddress, leftOrder.makerAddress,
takerAddress, takerAddress,
matchedFillResults.leftMakerAssetSpreadAmount matchedFillResults.leftMakerAssetSpreadAmount
@ -271,14 +263,12 @@ contract MixinMatchOrders is
// Maker fees // Maker fees
dispatchTransferFrom( dispatchTransferFrom(
zrxAssetData, zrxAssetData,
ZRX_PROXY_ID,
leftOrder.makerAddress, leftOrder.makerAddress,
leftOrder.feeRecipientAddress, leftOrder.feeRecipientAddress,
matchedFillResults.left.makerFeePaid matchedFillResults.left.makerFeePaid
); );
dispatchTransferFrom( dispatchTransferFrom(
zrxAssetData, zrxAssetData,
ZRX_PROXY_ID,
rightOrder.makerAddress, rightOrder.makerAddress,
rightOrder.feeRecipientAddress, rightOrder.feeRecipientAddress,
matchedFillResults.right.makerFeePaid matchedFillResults.right.makerFeePaid
@ -288,7 +278,6 @@ contract MixinMatchOrders is
if (leftOrder.feeRecipientAddress == rightOrder.feeRecipientAddress) { if (leftOrder.feeRecipientAddress == rightOrder.feeRecipientAddress) {
dispatchTransferFrom( dispatchTransferFrom(
zrxAssetData, zrxAssetData,
ZRX_PROXY_ID,
takerAddress, takerAddress,
leftOrder.feeRecipientAddress, leftOrder.feeRecipientAddress,
safeAdd( safeAdd(
@ -299,14 +288,12 @@ contract MixinMatchOrders is
} else { } else {
dispatchTransferFrom( dispatchTransferFrom(
zrxAssetData, zrxAssetData,
ZRX_PROXY_ID,
takerAddress, takerAddress,
leftOrder.feeRecipientAddress, leftOrder.feeRecipientAddress,
matchedFillResults.left.takerFeePaid matchedFillResults.left.takerFeePaid
); );
dispatchTransferFrom( dispatchTransferFrom(
zrxAssetData, zrxAssetData,
ZRX_PROXY_ID,
takerAddress, takerAddress,
rightOrder.feeRecipientAddress, rightOrder.feeRecipientAddress,
matchedFillResults.right.takerFeePaid matchedFillResults.right.takerFeePaid

View File

@ -25,9 +25,6 @@ contract LibConstants {
// not constant to make testing easier. // not constant to make testing easier.
bytes public ZRX_ASSET_DATA; bytes public ZRX_ASSET_DATA;
// Proxy Id for ZRX token.
uint8 constant ZRX_PROXY_ID = 1;
// @TODO: Remove when we deploy. // @TODO: Remove when we deploy.
constructor (bytes memory zrxAssetData) constructor (bytes memory zrxAssetData)
public public

View File

@ -33,14 +33,12 @@ contract MAssetProxyDispatcher is
); );
/// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws. /// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.
/// @param assetData Byte array encoded for the respective asset proxy. /// @param assetData Byte array encoded for the asset.
/// @param assetProxyId Id of assetProxy to dispach to.
/// @param from Address to transfer token from. /// @param from Address to transfer token from.
/// @param to Address to transfer token to. /// @param to Address to transfer token to.
/// @param amount Amount of token to transfer. /// @param amount Amount of token to transfer.
function dispatchTransferFrom( function dispatchTransferFrom(
bytes memory assetData, bytes memory assetData,
uint8 assetProxyId,
address from, address from,
address to, address to,
uint256 amount uint256 amount

View File

@ -24,12 +24,11 @@ import "../../protocol/Exchange/MixinAssetProxyDispatcher.sol";
contract TestAssetProxyDispatcher is MixinAssetProxyDispatcher { contract TestAssetProxyDispatcher is MixinAssetProxyDispatcher {
function publicDispatchTransferFrom( function publicDispatchTransferFrom(
bytes memory assetData, bytes memory assetData,
uint8 assetProxyId,
address from, address from,
address to, address to,
uint256 amount) uint256 amount)
public public
{ {
dispatchTransferFrom(assetData, assetProxyId, from, to, amount); dispatchTransferFrom(assetData, from, to, amount);
} }
} }

View File

@ -86,7 +86,7 @@ describe('Exchange core', () => {
artifacts.Exchange, artifacts.Exchange,
provider, provider,
txDefaults, txDefaults,
zrxToken.address, assetProxyUtils.encodeERC20AssetData(zrxToken.address),
); );
exchangeWrapper = new ExchangeWrapper(exchange, provider); exchangeWrapper = new ExchangeWrapper(exchange, provider);
await exchangeWrapper.registerAssetProxyAsync(AssetProxyId.ERC20, erc20Proxy.address, owner); await exchangeWrapper.registerAssetProxyAsync(AssetProxyId.ERC20, erc20Proxy.address, owner);

View File

@ -276,14 +276,13 @@ describe('AssetProxyDispatcher', () => {
); );
// Construct metadata for ERC20 proxy // Construct metadata for ERC20 proxy
const encodedAssetData = assetProxyUtils.encodeERC20AssetData(zrxToken.address); const encodedAssetData = assetProxyUtils.encodeERC20AssetData(zrxToken.address);
const encodedAssetDataWithoutProxyId = encodedAssetData.slice(0, -2);
// Perform a transfer from makerAddress to takerAddress // Perform a transfer from makerAddress to takerAddress
const erc20Balances = await erc20Wrapper.getBalancesAsync(); const erc20Balances = await erc20Wrapper.getBalancesAsync();
const amount = new BigNumber(10); const amount = new BigNumber(10);
await web3Wrapper.awaitTransactionSuccessAsync( await web3Wrapper.awaitTransactionSuccessAsync(
await assetProxyDispatcher.publicDispatchTransferFrom.sendTransactionAsync( await assetProxyDispatcher.publicDispatchTransferFrom.sendTransactionAsync(
encodedAssetDataWithoutProxyId, encodedAssetData,
AssetProxyId.ERC20,
makerAddress, makerAddress,
takerAddress, takerAddress,
amount, amount,
@ -304,13 +303,11 @@ describe('AssetProxyDispatcher', () => {
it('should throw if dispatching to unregistered proxy', async () => { it('should throw if dispatching to unregistered proxy', async () => {
// Construct metadata for ERC20 proxy // Construct metadata for ERC20 proxy
const encodedAssetData = assetProxyUtils.encodeERC20AssetData(zrxToken.address); const encodedAssetData = assetProxyUtils.encodeERC20AssetData(zrxToken.address);
const encodedAssetDataWithoutProxyId = encodedAssetData.slice(0, -2);
// Perform a transfer from makerAddress to takerAddress // Perform a transfer from makerAddress to takerAddress
const amount = new BigNumber(10); const amount = new BigNumber(10);
return expectRevertOrAlwaysFailingTransactionAsync( return expectRevertOrAlwaysFailingTransactionAsync(
assetProxyDispatcher.publicDispatchTransferFrom.sendTransactionAsync( assetProxyDispatcher.publicDispatchTransferFrom.sendTransactionAsync(
encodedAssetDataWithoutProxyId, encodedAssetData,
AssetProxyId.ERC20,
makerAddress, makerAddress,
takerAddress, takerAddress,
amount, amount,