Remove proxyId argument from dispatchTransferFrom
This commit is contained in:
parent
9341afe764
commit
f7337c1a05
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user