diff options
-rw-r--r-- | packages/contracts/package.json | 6 | ||||
-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.sol | 12 | ||||
-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.sol | 33 | ||||
-rw-r--r-- | packages/contracts/src/utils/exchange_wrapper.ts | 21 | ||||
-rw-r--r-- | packages/contracts/src/utils/types.ts | 3 | ||||
-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.ts | 68 | ||||
-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.ts | 5 | ||||
-rw-r--r-- | packages/contracts/test/exchange/wrapper.ts | 39 |
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; |