Combine Exchange with AssetProxyDispatcher
This commit is contained in:
@@ -21,24 +21,26 @@ pragma experimental ABIEncoderV2;
|
||||
|
||||
import "./MixinExchangeCore.sol";
|
||||
import "./MixinSignatureValidator.sol";
|
||||
import "./MixinSettlementProxy.sol";
|
||||
import "./MixinSettlement.sol";
|
||||
import "./MixinWrapperFunctions.sol";
|
||||
import "./MixinAssetProxyDispatcher.sol";
|
||||
|
||||
contract Exchange is
|
||||
MixinExchangeCore,
|
||||
MixinSignatureValidator,
|
||||
MixinSettlementProxy,
|
||||
MixinWrapperFunctions
|
||||
MixinSettlement,
|
||||
MixinWrapperFunctions,
|
||||
MixinAssetProxyDispatcher
|
||||
{
|
||||
string constant public VERSION = "2.0.1-alpha";
|
||||
|
||||
function Exchange(
|
||||
address _assetProxyDispatcher,
|
||||
bytes memory _zrxProxyData)
|
||||
public
|
||||
MixinExchangeCore()
|
||||
MixinSignatureValidator()
|
||||
MixinSettlementProxy(_assetProxyDispatcher, _zrxProxyData)
|
||||
MixinSettlement(_zrxProxyData)
|
||||
MixinWrapperFunctions()
|
||||
MixinAssetProxyDispatcher()
|
||||
{}
|
||||
}
|
||||
|
||||
@@ -18,39 +18,39 @@
|
||||
|
||||
pragma solidity ^0.4.21;
|
||||
|
||||
import "./IAssetProxyDispatcher.sol";
|
||||
import "./IAssetProxy.sol";
|
||||
import "./mixins/MAssetProxyDispatcher.sol";
|
||||
import "../AssetProxy/IAssetProxy.sol";
|
||||
import "../../utils/Ownable/Ownable.sol";
|
||||
import "../../utils/Authorizable/Authorizable.sol";
|
||||
|
||||
contract AssetProxyDispatcher is
|
||||
contract MixinAssetProxyDispatcher is
|
||||
Ownable,
|
||||
Authorizable,
|
||||
IAssetProxyDispatcher
|
||||
MAssetProxyDispatcher
|
||||
{
|
||||
// Mapping from Asset Proxy Id's to their respective Asset Proxy
|
||||
mapping (uint8 => IAssetProxy) public assetProxies;
|
||||
|
||||
/// @dev Transfers assets. Either succeeds or throws.
|
||||
/// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.
|
||||
/// @param assetMetadata Byte array encoded for the respective asset proxy.
|
||||
/// @param from Address to transfer token from.
|
||||
/// @param to Address to transfer token to.
|
||||
/// @param amount Amount of token to transfer.
|
||||
function transferFrom(
|
||||
bytes assetMetadata,
|
||||
function dispatchTransferFrom(
|
||||
bytes memory assetMetadata,
|
||||
address from,
|
||||
address to,
|
||||
uint256 amount)
|
||||
external
|
||||
onlyAuthorized
|
||||
internal
|
||||
{
|
||||
// Lookup asset proxy
|
||||
require(assetMetadata.length >= 1);
|
||||
uint8 assetProxyId = uint8(assetMetadata[0]);
|
||||
IAssetProxy assetProxy = assetProxies[assetProxyId];
|
||||
// Do nothing if no amount should be transferred.
|
||||
if (amount > 0) {
|
||||
// Lookup asset proxy
|
||||
require(assetMetadata.length >= 1);
|
||||
uint8 assetProxyId = uint8(assetMetadata[0]);
|
||||
IAssetProxy assetProxy = assetProxies[assetProxyId];
|
||||
|
||||
// transferFrom will either succeed or throw.
|
||||
assetProxy.transferFrom(assetMetadata, from, to, amount);
|
||||
// transferFrom will either succeed or throw.
|
||||
assetProxy.transferFrom(assetMetadata, from, to, amount);
|
||||
}
|
||||
}
|
||||
|
||||
/// @dev Registers an asset proxy to an asset proxy id.
|
||||
@@ -20,24 +20,18 @@ pragma solidity ^0.4.21;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import "./mixins/MSettlement.sol";
|
||||
import "./mixins/MAssetProxyDispatcher.sol";
|
||||
import "./LibPartialAmount.sol";
|
||||
import "../AssetProxyDispatcher/IAssetProxy.sol";
|
||||
import "../AssetProxy/IAssetProxy.sol";
|
||||
|
||||
/// @dev Provides MixinSettlement
|
||||
contract MixinSettlementProxy is
|
||||
contract MixinSettlement is
|
||||
MSettlement,
|
||||
MAssetProxyDispatcher,
|
||||
LibPartialAmount
|
||||
{
|
||||
IAssetProxy ASSET_PROXY_DISPATCHER;
|
||||
bytes ZRX_PROXY_DATA;
|
||||
|
||||
function assetProxyDispatcher()
|
||||
public view
|
||||
returns (address)
|
||||
{
|
||||
return address(ASSET_PROXY_DISPATCHER);
|
||||
}
|
||||
|
||||
function zrxProxyData()
|
||||
external view
|
||||
returns (bytes memory)
|
||||
@@ -45,12 +39,9 @@ contract MixinSettlementProxy is
|
||||
return ZRX_PROXY_DATA;
|
||||
}
|
||||
|
||||
function MixinSettlementProxy(
|
||||
address _assetProxyDispatcher,
|
||||
bytes memory _zrxProxyData)
|
||||
function MixinSettlement(bytes memory _zrxProxyData)
|
||||
public
|
||||
{
|
||||
ASSET_PROXY_DISPATCHER = IAssetProxy(_assetProxyDispatcher);
|
||||
ZRX_PROXY_DATA = _zrxProxyData;
|
||||
}
|
||||
|
||||
@@ -66,38 +57,32 @@ contract MixinSettlementProxy is
|
||||
)
|
||||
{
|
||||
makerAssetFilledAmount = getPartialAmount(takerAssetFilledAmount, order.takerAssetAmount, order.makerAssetAmount);
|
||||
ASSET_PROXY_DISPATCHER.transferFrom(
|
||||
dispatchTransferFrom(
|
||||
order.makerAssetData,
|
||||
order.makerAddress,
|
||||
takerAddress,
|
||||
makerAssetFilledAmount
|
||||
);
|
||||
ASSET_PROXY_DISPATCHER.transferFrom(
|
||||
dispatchTransferFrom(
|
||||
order.takerAssetData,
|
||||
takerAddress,
|
||||
order.makerAddress,
|
||||
takerAssetFilledAmount
|
||||
);
|
||||
if (order.feeRecipientAddress != address(0)) {
|
||||
if (order.makerFee > 0) {
|
||||
makerFeePaid = getPartialAmount(takerAssetFilledAmount, order.takerAssetAmount, order.makerFee);
|
||||
ASSET_PROXY_DISPATCHER.transferFrom(
|
||||
ZRX_PROXY_DATA,
|
||||
order.makerAddress,
|
||||
order.feeRecipientAddress,
|
||||
makerFeePaid
|
||||
);
|
||||
}
|
||||
if (order.takerFee > 0) {
|
||||
takerFeePaid = getPartialAmount(takerAssetFilledAmount, order.takerAssetAmount, order.takerFee);
|
||||
ASSET_PROXY_DISPATCHER.transferFrom(
|
||||
ZRX_PROXY_DATA,
|
||||
takerAddress,
|
||||
order.feeRecipientAddress,
|
||||
takerFeePaid
|
||||
);
|
||||
}
|
||||
}
|
||||
makerFeePaid = getPartialAmount(takerAssetFilledAmount, order.takerAssetAmount, order.makerFee);
|
||||
dispatchTransferFrom(
|
||||
ZRX_PROXY_DATA,
|
||||
order.makerAddress,
|
||||
order.feeRecipientAddress,
|
||||
makerFeePaid
|
||||
);
|
||||
takerFeePaid = getPartialAmount(takerAssetFilledAmount, order.takerAssetAmount, order.takerFee);
|
||||
dispatchTransferFrom(
|
||||
ZRX_PROXY_DATA,
|
||||
takerAddress,
|
||||
order.feeRecipientAddress,
|
||||
takerFeePaid
|
||||
);
|
||||
return (makerAssetFilledAmount, makerFeePaid, takerFeePaid);
|
||||
}
|
||||
}
|
||||
@@ -18,15 +18,7 @@
|
||||
|
||||
pragma solidity ^0.4.21;
|
||||
|
||||
import "../../utils/Ownable/IOwnable.sol";
|
||||
import "../../utils/Authorizable/IAuthorizable.sol";
|
||||
import "./IAssetProxy.sol";
|
||||
|
||||
contract IAssetProxyDispatcher is
|
||||
IOwnable,
|
||||
IAuthorizable,
|
||||
IAssetProxy
|
||||
{
|
||||
contract MAssetProxyDispatcher {
|
||||
|
||||
// Logs registration of new asset proxy
|
||||
event AssetProxySet(
|
||||
@@ -35,6 +27,18 @@ contract IAssetProxyDispatcher is
|
||||
address oldAssetProxy
|
||||
);
|
||||
|
||||
/// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.
|
||||
/// @param assetMetadata Byte array encoded for the respective asset proxy.
|
||||
/// @param from Address to transfer token from.
|
||||
/// @param to Address to transfer token to.
|
||||
/// @param amount Amount of token to transfer.
|
||||
function dispatchTransferFrom(
|
||||
bytes memory assetMetadata,
|
||||
address from,
|
||||
address to,
|
||||
uint256 amount)
|
||||
internal;
|
||||
|
||||
/// @dev Registers an asset proxy to an asset proxy id.
|
||||
/// An id can only be assigned to a single proxy at a given time,
|
||||
/// however, an asset proxy may be registered to multiple ids.
|
||||
Reference in New Issue
Block a user