aboutsummaryrefslogtreecommitdiffstats
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/contracts/package.json6
-rw-r--r--packages/contracts/src/contracts/current/protocol/AssetProxy/IAssetProxy.sol (renamed from packages/contracts/src/contracts/current/protocol/AssetProxyDispatcher/IAssetProxy.sol)0
-rw-r--r--packages/contracts/src/contracts/current/protocol/AssetProxy/proxies/ERC20Proxy.sol (renamed from packages/contracts/src/contracts/current/protocol/AssetProxyDispatcher/proxies/ERC20Proxy.sol)0
-rw-r--r--packages/contracts/src/contracts/current/protocol/AssetProxy/proxies/ERC721Proxy.sol (renamed from packages/contracts/src/contracts/current/protocol/AssetProxyDispatcher/proxies/ERC721Proxy.sol)0
-rw-r--r--packages/contracts/src/contracts/current/protocol/Exchange/Exchange.sol12
-rw-r--r--packages/contracts/src/contracts/current/protocol/Exchange/MixinAssetProxyDispatcher.sol (renamed from packages/contracts/src/contracts/current/protocol/AssetProxyDispatcher/AssetProxyDispatcher.sol)34
-rw-r--r--packages/contracts/src/contracts/current/protocol/Exchange/MixinSettlement.sol (renamed from packages/contracts/src/contracts/current/protocol/Exchange/MixinSettlementProxy.sol)57
-rw-r--r--packages/contracts/src/contracts/current/protocol/Exchange/mixins/MAssetProxyDispatcher.sol (renamed from packages/contracts/src/contracts/current/protocol/AssetProxyDispatcher/IAssetProxyDispatcher.sol)22
-rw-r--r--packages/contracts/src/contracts/current/test/TestAssetProxyDispatcher/TestAssetProxyDispatcher.sol33
-rw-r--r--packages/contracts/src/utils/exchange_wrapper.ts21
-rw-r--r--packages/contracts/src/utils/types.ts3
-rw-r--r--packages/contracts/test/asset_proxy/authorizable.ts (renamed from packages/contracts/test/asset_proxy_dispatcher/auth.ts)46
-rw-r--r--packages/contracts/test/asset_proxy/proxies.ts (renamed from packages/contracts/test/asset_proxy_dispatcher/proxies.ts)25
-rw-r--r--packages/contracts/test/exchange/core.ts68
-rw-r--r--packages/contracts/test/exchange/dispatcher.ts (renamed from packages/contracts/test/asset_proxy_dispatcher/dispatcher.ts)49
-rw-r--r--packages/contracts/test/exchange/helpers.ts5
-rw-r--r--packages/contracts/test/exchange/wrapper.ts39
17 files changed, 174 insertions, 246 deletions
diff --git a/packages/contracts/package.json b/packages/contracts/package.json
index 0cb6f3310..a85e9aa4f 100644
--- a/packages/contracts/package.json
+++ b/packages/contracts/package.json
@@ -19,7 +19,7 @@
"Yarn workspaces do not link binaries correctly so we need to reference them directly https://github.com/yarnpkg/yarn/issues/3846",
"compile":
"node ../deployer/lib/src/cli.js compile --contracts ${npm_package_config_contracts} --contracts-dir src/contracts --artifacts-dir ../migrations/src/artifacts",
- "clean": "shx rm -rf ./lib",
+ "clean": "shx rm -rf ./lib ./src/contract_wrappers/generated",
"generate_contract_wrappers":
"node ../abi-gen/lib/index.js --abis ${npm_package_config_abis} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated --backend ethers && prettier --write 'src/contract_wrappers/generated/**.ts'",
"lint": "tslint --project . 'migrations/**/*.ts' 'test/**/*.ts' 'util/**/*.ts' 'deploy/**/*.ts'",
@@ -30,9 +30,9 @@
},
"config": {
"abis":
- "../migrations/src/artifacts/@(DummyERC20Token|Exchange|TokenRegistry|MultiSigWallet|MultiSigWalletWithTimeLock|MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress|TokenRegistry|ZRXToken|AssetProxyDispatcher|ERC20Proxy|ERC721Proxy|DummyERC721Token|LibBytes).json",
+ "../migrations/src/artifacts/@(DummyERC20Token|Exchange|TokenRegistry|MultiSigWallet|MultiSigWalletWithTimeLock|MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress|TokenRegistry|ZRXToken|TestAssetProxyDispatcher|ERC20Proxy|ERC721Proxy|DummyERC721Token|LibBytes|Authorizable).json",
"contracts":
- "Exchange,DummyERC20Token,ZRXToken,WETH9,MultiSigWallet,MultiSigWalletWithTimeLock,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,TokenRegistry,AssetProxyDispatcher,ERC20Proxy,ERC721Proxy,DummyERC721Token,LibBytes"
+ "Exchange,DummyERC20Token,ZRXToken,WETH9,MultiSigWallet,MultiSigWalletWithTimeLock,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,TokenRegistry,TestAssetProxyDispatcher,ERC20Proxy,ERC721Proxy,DummyERC721Token,LibBytes,Authorizable"
},
"repository": {
"type": "git",
diff --git a/packages/contracts/src/contracts/current/protocol/AssetProxyDispatcher/IAssetProxy.sol b/packages/contracts/src/contracts/current/protocol/AssetProxy/IAssetProxy.sol
index 60e74723d..60e74723d 100644
--- a/packages/contracts/src/contracts/current/protocol/AssetProxyDispatcher/IAssetProxy.sol
+++ b/packages/contracts/src/contracts/current/protocol/AssetProxy/IAssetProxy.sol
diff --git a/packages/contracts/src/contracts/current/protocol/AssetProxyDispatcher/proxies/ERC20Proxy.sol b/packages/contracts/src/contracts/current/protocol/AssetProxy/proxies/ERC20Proxy.sol
index eef3a39db..eef3a39db 100644
--- a/packages/contracts/src/contracts/current/protocol/AssetProxyDispatcher/proxies/ERC20Proxy.sol
+++ b/packages/contracts/src/contracts/current/protocol/AssetProxy/proxies/ERC20Proxy.sol
diff --git a/packages/contracts/src/contracts/current/protocol/AssetProxyDispatcher/proxies/ERC721Proxy.sol b/packages/contracts/src/contracts/current/protocol/AssetProxy/proxies/ERC721Proxy.sol
index 466d0b871..466d0b871 100644
--- a/packages/contracts/src/contracts/current/protocol/AssetProxyDispatcher/proxies/ERC721Proxy.sol
+++ b/packages/contracts/src/contracts/current/protocol/AssetProxy/proxies/ERC721Proxy.sol
diff --git a/packages/contracts/src/contracts/current/protocol/Exchange/Exchange.sol b/packages/contracts/src/contracts/current/protocol/Exchange/Exchange.sol
index 995cbcf76..5ccb06b88 100644
--- a/packages/contracts/src/contracts/current/protocol/Exchange/Exchange.sol
+++ b/packages/contracts/src/contracts/current/protocol/Exchange/Exchange.sol
@@ -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()
{}
}
diff --git a/packages/contracts/src/contracts/current/protocol/AssetProxyDispatcher/AssetProxyDispatcher.sol b/packages/contracts/src/contracts/current/protocol/Exchange/MixinAssetProxyDispatcher.sol
index 43fd7596e..eab8e04a1 100644
--- a/packages/contracts/src/contracts/current/protocol/AssetProxyDispatcher/AssetProxyDispatcher.sol
+++ b/packages/contracts/src/contracts/current/protocol/Exchange/MixinAssetProxyDispatcher.sol
@@ -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.
diff --git a/packages/contracts/src/contracts/current/protocol/Exchange/MixinSettlementProxy.sol b/packages/contracts/src/contracts/current/protocol/Exchange/MixinSettlement.sol
index 5fff2cd60..ae41c7a86 100644
--- a/packages/contracts/src/contracts/current/protocol/Exchange/MixinSettlementProxy.sol
+++ b/packages/contracts/src/contracts/current/protocol/Exchange/MixinSettlement.sol
@@ -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);
}
}
diff --git a/packages/contracts/src/contracts/current/protocol/AssetProxyDispatcher/IAssetProxyDispatcher.sol b/packages/contracts/src/contracts/current/protocol/Exchange/mixins/MAssetProxyDispatcher.sol
index 88bc0d353..a46be9d0f 100644
--- a/packages/contracts/src/contracts/current/protocol/AssetProxyDispatcher/IAssetProxyDispatcher.sol
+++ b/packages/contracts/src/contracts/current/protocol/Exchange/mixins/MAssetProxyDispatcher.sol
@@ -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.
diff --git a/packages/contracts/src/contracts/current/test/TestAssetProxyDispatcher/TestAssetProxyDispatcher.sol b/packages/contracts/src/contracts/current/test/TestAssetProxyDispatcher/TestAssetProxyDispatcher.sol
new file mode 100644
index 000000000..8206b84bd
--- /dev/null
+++ b/packages/contracts/src/contracts/current/test/TestAssetProxyDispatcher/TestAssetProxyDispatcher.sol
@@ -0,0 +1,33 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity ^0.4.21;
+
+import "../../protocol/Exchange/MixinAssetProxyDispatcher.sol";
+
+contract TestAssetProxyDispatcher is MixinAssetProxyDispatcher {
+ function publicDispatchTransferFrom(
+ bytes memory assetMetadata,
+ address from,
+ address to,
+ uint256 amount)
+ public
+ {
+ dispatchTransferFrom(assetMetadata, from, to, amount);
+ }
+}
diff --git a/packages/contracts/src/utils/exchange_wrapper.ts b/packages/contracts/src/utils/exchange_wrapper.ts
index 26ce8b04e..7d06c321b 100644
--- a/packages/contracts/src/utils/exchange_wrapper.ts
+++ b/packages/contracts/src/utils/exchange_wrapper.ts
@@ -9,7 +9,7 @@ import { constants } from './constants';
import { formatters } from './formatters';
import { LogDecoder } from './log_decoder';
import { orderUtils } from './order_utils';
-import { SignedOrder } from './types';
+import { AssetProxyId, SignedOrder } from './types';
export class ExchangeWrapper {
private _exchange: ExchangeContract;
@@ -189,7 +189,24 @@ export class ExchangeWrapper {
const tx = await this._getTxWithDecodedExchangeLogsAsync(txHash);
return tx;
}
-
+ public async registerAssetProxyAsync(
+ assetProxyId: AssetProxyId,
+ assetProxyAddress: string,
+ from: string,
+ opts: { oldAssetProxyAddressIfExists?: string } = {},
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const oldAssetProxyAddress = _.isUndefined(opts.oldAssetProxyAddressIfExists)
+ ? ZeroEx.NULL_ADDRESS
+ : opts.oldAssetProxyAddressIfExists;
+ const txHash = await this._exchange.registerAssetProxy.sendTransactionAsync(
+ assetProxyId,
+ assetProxyAddress,
+ oldAssetProxyAddress,
+ { from },
+ );
+ const tx = await this._getTxWithDecodedExchangeLogsAsync(txHash);
+ return tx;
+ }
public async getOrderHashAsync(signedOrder: SignedOrder): Promise<string> {
const order = orderUtils.getOrderStruct(signedOrder);
const orderHash = await this._exchange.getOrderHash.callAsync(order);
diff --git a/packages/contracts/src/utils/types.ts b/packages/contracts/src/utils/types.ts
index 1e3cd5b9a..a23b6b876 100644
--- a/packages/contracts/src/utils/types.ts
+++ b/packages/contracts/src/utils/types.ts
@@ -93,11 +93,12 @@ export enum ContractName {
AccountLevels = 'AccountLevels',
EtherDelta = 'EtherDelta',
Arbitrage = 'Arbitrage',
- AssetProxyDispatcher = 'AssetProxyDispatcher',
+ TestAssetProxyDispatcher = 'TestAssetProxyDispatcher',
ERC20Proxy = 'ERC20Proxy',
ERC721Proxy = 'ERC721Proxy',
DummyERC721Token = 'DummyERC721Token',
LibBytes = 'LibBytes',
+ Authorizable = 'Authorizable',
}
export interface Artifact {
diff --git a/packages/contracts/test/asset_proxy_dispatcher/auth.ts b/packages/contracts/test/asset_proxy/authorizable.ts
index 9d8645ab7..cc4f78a31 100644
--- a/packages/contracts/test/asset_proxy_dispatcher/auth.ts
+++ b/packages/contracts/test/asset_proxy/authorizable.ts
@@ -3,7 +3,7 @@ import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as chai from 'chai';
import * as Web3 from 'web3';
-import { AssetProxyDispatcherContract } from '../../src/contract_wrappers/generated/asset_proxy_dispatcher';
+import { AuthorizableContract } from '../../src/contract_wrappers/generated/authorizable';
import { constants } from '../../src/utils/constants';
import { ContractName } from '../../src/utils/types';
import { chaiSetup } from '../utils/chai_setup';
@@ -14,21 +14,17 @@ chaiSetup.configure();
const expect = chai.expect;
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-describe('AssetProxyDispatcher (Authorization Methods)', () => {
+describe('Authorizable', () => {
let owner: string;
let notOwner: string;
let address: string;
- let assetProxyDispatcher: AssetProxyDispatcherContract;
+ let authorizable: AuthorizableContract;
before(async () => {
const accounts = await web3Wrapper.getAvailableAddressesAsync();
owner = address = accounts[0];
notOwner = accounts[1];
- const assetProxyDispatcherInstance = await deployer.deployAsync(ContractName.AssetProxyDispatcher);
- assetProxyDispatcher = new AssetProxyDispatcherContract(
- assetProxyDispatcherInstance.abi,
- assetProxyDispatcherInstance.address,
- provider,
- );
+ const authorizableInstance = await deployer.deployAsync(ContractName.Authorizable);
+ authorizable = new AuthorizableContract(authorizableInstance.abi, authorizableInstance.address, provider);
});
beforeEach(async () => {
await blockchainLifecycle.startAsync();
@@ -39,44 +35,44 @@ describe('AssetProxyDispatcher (Authorization Methods)', () => {
describe('addAuthorizedAddress', () => {
it('should throw if not called by owner', async () => {
return expect(
- assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(notOwner, { from: notOwner }),
+ authorizable.addAuthorizedAddress.sendTransactionAsync(notOwner, { from: notOwner }),
).to.be.rejectedWith(constants.REVERT);
});
it('should allow owner to add an authorized address', async () => {
- await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
- const isAuthorized = await assetProxyDispatcher.authorized.callAsync(address);
+ await authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
+ const isAuthorized = await authorizable.authorized.callAsync(address);
expect(isAuthorized).to.be.true();
});
it('should throw if owner attempts to authorize a duplicate address', async () => {
- await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
+ await authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
return expect(
- assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(address, { from: owner }),
+ authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner }),
).to.be.rejectedWith(constants.REVERT);
});
});
describe('removeAuthorizedAddress', () => {
it('should throw if not called by owner', async () => {
- await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
+ await authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
return expect(
- assetProxyDispatcher.removeAuthorizedAddress.sendTransactionAsync(address, {
+ authorizable.removeAuthorizedAddress.sendTransactionAsync(address, {
from: notOwner,
}),
).to.be.rejectedWith(constants.REVERT);
});
it('should allow owner to remove an authorized address', async () => {
- await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
- await assetProxyDispatcher.removeAuthorizedAddress.sendTransactionAsync(address, {
+ await authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
+ await authorizable.removeAuthorizedAddress.sendTransactionAsync(address, {
from: owner,
});
- const isAuthorized = await assetProxyDispatcher.authorized.callAsync(address);
+ const isAuthorized = await authorizable.authorized.callAsync(address);
expect(isAuthorized).to.be.false();
});
it('should throw if owner attempts to remove an address that is not authorized', async () => {
return expect(
- assetProxyDispatcher.removeAuthorizedAddress.sendTransactionAsync(address, {
+ authorizable.removeAuthorizedAddress.sendTransactionAsync(address, {
from: owner,
}),
).to.be.rejectedWith(constants.REVERT);
@@ -85,19 +81,19 @@ describe('AssetProxyDispatcher (Authorization Methods)', () => {
describe('getAuthorizedAddresses', () => {
it('should return all authorized addresses', async () => {
- const initial = await assetProxyDispatcher.getAuthorizedAddresses.callAsync();
+ const initial = await authorizable.getAuthorizedAddresses.callAsync();
expect(initial).to.have.length(0);
- await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(address, {
+ await authorizable.addAuthorizedAddress.sendTransactionAsync(address, {
from: owner,
});
- const afterAdd = await assetProxyDispatcher.getAuthorizedAddresses.callAsync();
+ const afterAdd = await authorizable.getAuthorizedAddresses.callAsync();
expect(afterAdd).to.have.length(1);
expect(afterAdd).to.include(address);
- await assetProxyDispatcher.removeAuthorizedAddress.sendTransactionAsync(address, {
+ await authorizable.removeAuthorizedAddress.sendTransactionAsync(address, {
from: owner,
});
- const afterRemove = await assetProxyDispatcher.getAuthorizedAddresses.callAsync();
+ const afterRemove = await authorizable.getAuthorizedAddresses.callAsync();
expect(afterRemove).to.have.length(0);
});
});
diff --git a/packages/contracts/test/asset_proxy_dispatcher/proxies.ts b/packages/contracts/test/asset_proxy/proxies.ts
index 14d96f023..6aefadee7 100644
--- a/packages/contracts/test/asset_proxy_dispatcher/proxies.ts
+++ b/packages/contracts/test/asset_proxy/proxies.ts
@@ -4,7 +4,6 @@ import { BigNumber } from '@0xproject/utils';
import * as chai from 'chai';
import * as Web3 from 'web3';
-import { AssetProxyDispatcherContract } from '../../src/contract_wrappers/generated/asset_proxy_dispatcher';
import { DummyERC20TokenContract } from '../../src/contract_wrappers/generated/dummy_e_r_c20_token';
import { DummyERC721TokenContract } from '../../src/contract_wrappers/generated/dummy_e_r_c721_token';
import { ERC20ProxyContract } from '../../src/contract_wrappers/generated/e_r_c20_proxy';
@@ -25,7 +24,7 @@ const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
describe('Asset Transfer Proxies', () => {
let owner: string;
let notAuthorized: string;
- let assetProxyDispatcherAddress: string;
+ let exchangeAddress: string;
let makerAddress: string;
let takerAddress: string;
@@ -40,13 +39,7 @@ describe('Asset Transfer Proxies', () => {
before(async () => {
const accounts = await web3Wrapper.getAvailableAddressesAsync();
- const usedAddresses = ([
- owner,
- notAuthorized,
- assetProxyDispatcherAddress,
- makerAddress,
- takerAddress,
- ] = accounts);
+ const usedAddresses = ([owner, notAuthorized, exchangeAddress, makerAddress, takerAddress] = accounts);
erc20Wrapper = new ERC20Wrapper(deployer, provider, usedAddresses, owner);
erc721Wrapper = new ERC721Wrapper(deployer, provider, usedAddresses, owner);
@@ -54,7 +47,7 @@ describe('Asset Transfer Proxies', () => {
[zrxToken] = await erc20Wrapper.deployDummyTokensAsync();
erc20Proxy = await erc20Wrapper.deployProxyAsync();
await erc20Wrapper.setBalancesAndAllowancesAsync();
- await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcherAddress, {
+ await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(exchangeAddress, {
from: owner,
});
@@ -63,7 +56,7 @@ describe('Asset Transfer Proxies', () => {
await erc721Wrapper.setBalancesAndAllowancesAsync();
const erc721Balances = await erc721Wrapper.getBalancesAsync();
erc721MakerTokenId = erc721Balances[makerAddress][erc721Token.address][0];
- await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcherAddress, {
+ await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(exchangeAddress, {
from: owner,
});
});
@@ -85,7 +78,7 @@ describe('Asset Transfer Proxies', () => {
makerAddress,
takerAddress,
amount,
- { from: assetProxyDispatcherAddress },
+ { from: exchangeAddress },
);
// Verify transfer was successful
const newBalances = await erc20Wrapper.getBalancesAsync();
@@ -108,7 +101,7 @@ describe('Asset Transfer Proxies', () => {
makerAddress,
takerAddress,
amount,
- { from: assetProxyDispatcherAddress },
+ { from: exchangeAddress },
);
// Verify transfer was successful
const newBalances = await erc20Wrapper.getBalancesAsync();
@@ -169,7 +162,7 @@ describe('Asset Transfer Proxies', () => {
makerAddress,
takerAddress,
amount,
- { from: assetProxyDispatcherAddress },
+ { from: exchangeAddress },
);
// Verify transfer was successful
const newOwnerMakerAsset = await erc721Token.ownerOf.callAsync(erc721MakerTokenId);
@@ -191,7 +184,7 @@ describe('Asset Transfer Proxies', () => {
makerAddress,
takerAddress,
amount,
- { from: assetProxyDispatcherAddress },
+ { from: exchangeAddress },
),
).to.be.rejectedWith(constants.REVERT);
});
@@ -211,7 +204,7 @@ describe('Asset Transfer Proxies', () => {
makerAddress,
takerAddress,
amount,
- { from: assetProxyDispatcherAddress },
+ { from: exchangeAddress },
),
).to.be.rejectedWith(constants.REVERT);
});
diff --git a/packages/contracts/test/exchange/core.ts b/packages/contracts/test/exchange/core.ts
index 666486cc3..13dbcef88 100644
--- a/packages/contracts/test/exchange/core.ts
+++ b/packages/contracts/test/exchange/core.ts
@@ -5,7 +5,6 @@ import * as chai from 'chai';
import ethUtil = require('ethereumjs-util');
import * as _ from 'lodash';
-import { AssetProxyDispatcherContract } from '../../src/contract_wrappers/generated/asset_proxy_dispatcher';
import { DummyERC20TokenContract } from '../../src/contract_wrappers/generated/dummy_e_r_c20_token';
import { DummyERC721TokenContract } from '../../src/contract_wrappers/generated/dummy_e_r_c721_token';
import { ERC20ProxyContract } from '../../src/contract_wrappers/generated/e_r_c20_proxy';
@@ -50,7 +49,6 @@ describe('Exchange core', () => {
let zrxToken: DummyERC20TokenContract;
let erc721Token: DummyERC721TokenContract;
let exchange: ExchangeContract;
- let assetProxyDispatcher: AssetProxyDispatcherContract;
let erc20Proxy: ERC20ProxyContract;
let erc721Proxy: ERC721ProxyContract;
@@ -87,44 +85,25 @@ describe('Exchange core', () => {
erc721MakerAssetIds = erc721Balances[makerAddress][erc721Token.address];
erc721TakerAssetIds = erc721Balances[takerAddress][erc721Token.address];
- const assetProxyDispatcherInstance = await deployer.deployAsync(ContractName.AssetProxyDispatcher);
- assetProxyDispatcher = new AssetProxyDispatcherContract(
- assetProxyDispatcherInstance.abi,
- assetProxyDispatcherInstance.address,
- provider,
- );
- const prevERC20ProxyAddress = ZeroEx.NULL_ADDRESS;
- await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(
- AssetProxyId.ERC20,
- erc20Proxy.address,
- prevERC20ProxyAddress,
- { from: owner },
- );
- const prevERC721ProxyAddress = ZeroEx.NULL_ADDRESS;
- await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(
- AssetProxyId.ERC721,
- erc721Proxy.address,
- prevERC721ProxyAddress,
- { from: owner },
- );
- await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcher.address, {
- from: owner,
- });
- await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcher.address, {
- from: owner,
- });
-
const exchangeInstance = await deployer.deployAsync(ContractName.Exchange, [
assetProxyDispatcher.address,
assetProxyUtils.encodeERC20ProxyData(zrxToken.address),
]);
exchange = new ExchangeContract(exchangeInstance.abi, exchangeInstance.address, provider);
- await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(exchange.address, { from: owner });
zeroEx = new ZeroEx(provider, {
exchangeContractAddress: exchange.address,
networkId: constants.TESTRPC_NETWORK_ID,
});
exchangeWrapper = new ExchangeWrapper(exchange, zeroEx);
+ await exchangeWrapper.registerAssetProxyAsync(AssetProxyId.ERC20, erc20Proxy.address, owner);
+ await exchangeWrapper.registerAssetProxyAsync(AssetProxyId.ERC721, erc721Proxy.address, owner);
+
+ await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
+ from: owner,
+ });
+ await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
+ from: owner,
+ });
defaultMakerAssetAddress = erc20TokenA.address;
defaultTakerAssetAddress = erc20TokenB.address;
@@ -468,35 +447,6 @@ describe('Exchange core', () => {
expect(orderUtils.getOrderHashHex(signedOrder)).to.be.equal(logArgs.orderHash);
});
- it('should log 1 event with the correct arguments when order has no feeRecipient', async () => {
- signedOrder = orderFactory.newSignedOrder({
- feeRecipientAddress: ZeroEx.NULL_ADDRESS,
- });
- const divisor = 2;
- const res = await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, {
- takerAssetFillAmount: signedOrder.takerAssetAmount.div(divisor),
- });
- expect(res.logs).to.have.length(1);
-
- const log = res.logs[0] as LogWithDecodedArgs<FillContractEventArgs>;
- const logArgs = log.args;
- const expectedFilledMakerAssetAmount = signedOrder.makerAssetAmount.div(divisor);
- const expectedFilledTakerAssetAmount = signedOrder.takerAssetAmount.div(divisor);
- const expectedFeeMPaid = new BigNumber(0);
- const expectedFeeTPaid = new BigNumber(0);
-
- expect(signedOrder.makerAddress).to.be.equal(logArgs.makerAddress);
- expect(takerAddress).to.be.equal(logArgs.takerAddress);
- expect(signedOrder.feeRecipientAddress).to.be.equal(logArgs.feeRecipientAddress);
- expect(signedOrder.makerAssetData).to.be.equal(logArgs.makerAssetData);
- expect(signedOrder.takerAssetData).to.be.equal(logArgs.takerAssetData);
- expect(expectedFilledMakerAssetAmount).to.be.bignumber.equal(logArgs.makerAssetFilledAmount);
- expect(expectedFilledTakerAssetAmount).to.be.bignumber.equal(logArgs.takerAssetFilledAmount);
- expect(expectedFeeMPaid).to.be.bignumber.equal(logArgs.makerFeePaid);
- expect(expectedFeeTPaid).to.be.bignumber.equal(logArgs.takerFeePaid);
- expect(orderUtils.getOrderHashHex(signedOrder)).to.be.equal(logArgs.orderHash);
- });
-
it('should throw when taker is specified and order is claimed by other', async () => {
signedOrder = orderFactory.newSignedOrder({
takerAddress: feeRecipientAddress,
diff --git a/packages/contracts/test/asset_proxy_dispatcher/dispatcher.ts b/packages/contracts/test/exchange/dispatcher.ts
index 6e0ec3dee..1c346c93f 100644
--- a/packages/contracts/test/asset_proxy_dispatcher/dispatcher.ts
+++ b/packages/contracts/test/exchange/dispatcher.ts
@@ -4,10 +4,10 @@ import { BigNumber } from '@0xproject/utils';
import * as chai from 'chai';
import * as Web3 from 'web3';
-import { AssetProxyDispatcherContract } from '../../src/contract_wrappers/generated/asset_proxy_dispatcher';
import { DummyERC20TokenContract } from '../../src/contract_wrappers/generated/dummy_e_r_c20_token';
import { ERC20ProxyContract } from '../../src/contract_wrappers/generated/e_r_c20_proxy';
import { ERC721ProxyContract } from '../../src/contract_wrappers/generated/e_r_c721_proxy';
+import { TestAssetProxyDispatcherContract } from '../../src/contract_wrappers/generated/test_asset_proxy_dispatcher';
import { assetProxyUtils } from '../../src/utils/asset_proxy_utils';
import { constants } from '../../src/utils/constants';
import { ERC20Wrapper } from '../../src/utils/erc20_wrapper';
@@ -25,14 +25,13 @@ describe('AssetProxyDispatcher', () => {
let owner: string;
let notOwner: string;
let notAuthorized: string;
- let exchangeAddress: string;
let makerAddress: string;
let takerAddress: string;
let zrxToken: DummyERC20TokenContract;
let erc20Proxy: ERC20ProxyContract;
let erc721Proxy: ERC721ProxyContract;
- let assetProxyDispatcher: AssetProxyDispatcherContract;
+ let assetProxyDispatcher: TestAssetProxyDispatcherContract;
let erc20Wrapper: ERC20Wrapper;
let erc721Wrapper: ERC721Wrapper;
@@ -40,7 +39,7 @@ describe('AssetProxyDispatcher', () => {
before(async () => {
// Setup accounts & addresses
const accounts = await web3Wrapper.getAvailableAddressesAsync();
- const usedAddresses = ([owner, notOwner, exchangeAddress, makerAddress, takerAddress] = accounts);
+ const usedAddresses = ([owner, notOwner, makerAddress, takerAddress] = accounts);
notAuthorized = notOwner;
erc20Wrapper = new ERC20Wrapper(deployer, provider, usedAddresses, owner);
@@ -52,15 +51,12 @@ describe('AssetProxyDispatcher', () => {
erc721Proxy = await erc721Wrapper.deployProxyAsync();
- const assetProxyDispatcherInstance = await deployer.deployAsync(ContractName.AssetProxyDispatcher);
- assetProxyDispatcher = new AssetProxyDispatcherContract(
+ const assetProxyDispatcherInstance = await deployer.deployAsync(ContractName.TestAssetProxyDispatcher);
+ assetProxyDispatcher = new TestAssetProxyDispatcherContract(
assetProxyDispatcherInstance.abi,
assetProxyDispatcherInstance.address,
provider,
);
- await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(exchangeAddress, {
- from: owner,
- });
await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcher.address, {
from: owner,
});
@@ -219,7 +215,7 @@ describe('AssetProxyDispatcher', () => {
});
});
- describe('transferFrom', () => {
+ describe('dispatchTransferFrom', () => {
it('should dispatch transfer to registered proxy', async () => {
// Register ERC20 proxy
const prevProxyAddress = ZeroEx.NULL_ADDRESS;
@@ -234,12 +230,12 @@ describe('AssetProxyDispatcher', () => {
// Perform a transfer from makerAddress to takerAddress
const erc20Balances = await erc20Wrapper.getBalancesAsync();
const amount = new BigNumber(10);
- await assetProxyDispatcher.transferFrom.sendTransactionAsync(
+ await assetProxyDispatcher.publicDispatchTransferFrom.sendTransactionAsync(
encodedProxyMetadata,
makerAddress,
takerAddress,
amount,
- { from: exchangeAddress },
+ { from: owner },
);
// Verify transfer was successful
const newBalances = await erc20Wrapper.getBalancesAsync();
@@ -258,37 +254,12 @@ describe('AssetProxyDispatcher', () => {
const erc20Balances = await erc20Wrapper.getBalancesAsync();
const amount = new BigNumber(10);
return expect(
- assetProxyDispatcher.transferFrom.sendTransactionAsync(
- encodedProxyMetadata,
- makerAddress,
- takerAddress,
- amount,
- { from: exchangeAddress },
- ),
- ).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should throw on transfer if requesting address is not authorized', async () => {
- // Register ERC20 proxy
- const prevProxyAddress = ZeroEx.NULL_ADDRESS;
- await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(
- AssetProxyId.ERC20,
- erc20Proxy.address,
- prevProxyAddress,
- { from: owner },
- );
- // Construct metadata for ERC20 proxy
- const encodedProxyMetadata = assetProxyUtils.encodeERC20ProxyData(zrxToken.address);
- // Perform a transfer from makerAddress to takerAddress
- const erc20Balances = await erc20Wrapper.getBalancesAsync();
- const amount = new BigNumber(10);
- return expect(
- assetProxyDispatcher.transferFrom.sendTransactionAsync(
+ assetProxyDispatcher.publicDispatchTransferFrom.sendTransactionAsync(
encodedProxyMetadata,
makerAddress,
takerAddress,
amount,
- { from: notAuthorized },
+ { from: owner },
),
).to.be.rejectedWith(constants.REVERT);
});
diff --git a/packages/contracts/test/exchange/helpers.ts b/packages/contracts/test/exchange/helpers.ts
index a5c2ca8d5..f986665ff 100644
--- a/packages/contracts/test/exchange/helpers.ts
+++ b/packages/contracts/test/exchange/helpers.ts
@@ -29,10 +29,7 @@ describe('Exchange helpers', () => {
before(async () => {
const accounts = await web3Wrapper.getAvailableAddressesAsync();
const makerAddress = accounts[0];
- const exchangeInstance = await deployer.deployAsync(ContractName.Exchange, [
- ZeroEx.NULL_ADDRESS,
- AssetProxyId.ERC20,
- ]);
+ const exchangeInstance = await deployer.deployAsync(ContractName.Exchange, [AssetProxyId.ERC20]);
const exchange = new ExchangeContract(exchangeInstance.abi, exchangeInstance.address, provider);
const zeroEx = new ZeroEx(provider, { networkId: constants.TESTRPC_NETWORK_ID });
exchangeWrapper = new ExchangeWrapper(exchange, zeroEx);
diff --git a/packages/contracts/test/exchange/wrapper.ts b/packages/contracts/test/exchange/wrapper.ts
index d2d82f977..855c79b56 100644
--- a/packages/contracts/test/exchange/wrapper.ts
+++ b/packages/contracts/test/exchange/wrapper.ts
@@ -6,7 +6,6 @@ import * as chai from 'chai';
import * as _ from 'lodash';
import * as Web3 from 'web3';
-import { AssetProxyDispatcherContract } from '../../src/contract_wrappers/generated/asset_proxy_dispatcher';
import { DummyERC20TokenContract } from '../../src/contract_wrappers/generated/dummy_e_r_c20_token';
import { DummyERC721TokenContract } from '../../src/contract_wrappers/generated/dummy_e_r_c721_token';
import { ERC20ProxyContract } from '../../src/contract_wrappers/generated/e_r_c20_proxy';
@@ -39,7 +38,6 @@ describe('Exchange wrappers', () => {
let zrxToken: DummyERC20TokenContract;
let erc721Token: DummyERC721TokenContract;
let exchange: ExchangeContract;
- let assetProxyDispatcher: AssetProxyDispatcherContract;
let erc20Proxy: ERC20ProxyContract;
let erc721Proxy: ERC721ProxyContract;
@@ -75,44 +73,25 @@ describe('Exchange wrappers', () => {
erc721MakerAssetId = erc721Balances[makerAddress][erc721Token.address][0];
erc721TakerAssetId = erc721Balances[takerAddress][erc721Token.address][0];
- const assetProxyDispatcherInstance = await deployer.deployAsync(ContractName.AssetProxyDispatcher);
- assetProxyDispatcher = new AssetProxyDispatcherContract(
- assetProxyDispatcherInstance.abi,
- assetProxyDispatcherInstance.address,
- provider,
- );
- const prevERC20ProxyAddress = ZeroEx.NULL_ADDRESS;
- await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(
- AssetProxyId.ERC20,
- erc20Proxy.address,
- prevERC20ProxyAddress,
- { from: owner },
- );
- const prevERC721ProxyAddress = ZeroEx.NULL_ADDRESS;
- await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(
- AssetProxyId.ERC721,
- erc721Proxy.address,
- prevERC721ProxyAddress,
- { from: owner },
- );
- await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcher.address, {
- from: owner,
- });
- await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcher.address, {
- from: owner,
- });
-
const exchangeInstance = await deployer.deployAsync(ContractName.Exchange, [
assetProxyDispatcher.address,
assetProxyUtils.encodeERC20ProxyData(zrxToken.address),
]);
exchange = new ExchangeContract(exchangeInstance.abi, exchangeInstance.address, provider);
- await assetProxyDispatcher.addAuthorizedAddress.sendTransactionAsync(exchange.address, { from: owner });
zeroEx = new ZeroEx(provider, {
exchangeContractAddress: exchange.address,
networkId: constants.TESTRPC_NETWORK_ID,
});
exchangeWrapper = new ExchangeWrapper(exchange, zeroEx);
+ await exchangeWrapper.registerAssetProxyAsync(AssetProxyId.ERC20, erc20Proxy.address, owner);
+ await exchangeWrapper.registerAssetProxyAsync(AssetProxyId.ERC721, erc721Proxy.address, owner);
+
+ await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
+ from: owner,
+ });
+ await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
+ from: owner,
+ });
defaultMakerAssetAddress = erc20TokenA.address;
defaultTakerAssetAddress = erc20TokenB.address;