Removed ERC20 V1 Proxy + TokenTransferProxy
This commit is contained in:
committed by
Amir Bandeali
parent
436a6605fb
commit
c19fb1dffc
@@ -1,90 +0,0 @@
|
||||
/*
|
||||
|
||||
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 "../IAssetProxy.sol";
|
||||
import "../../../utils/LibBytes/LibBytes.sol";
|
||||
import "../../../utils/Authorizable/Authorizable.sol";
|
||||
import { ITokenTransferProxy as ITokenTransferProxy_v1 } from "../../TokenTransferProxy/ITokenTransferProxy.sol";
|
||||
|
||||
contract ERC20Proxy_v1 is
|
||||
LibBytes,
|
||||
Authorizable,
|
||||
IAssetProxy
|
||||
{
|
||||
ITokenTransferProxy_v1 TRANSFER_PROXY;
|
||||
|
||||
/// @dev Contract constructor.
|
||||
/// @param tokenTransferProxyContract erc20 token transfer proxy contract.
|
||||
function ERC20Proxy_v1(ITokenTransferProxy_v1 tokenTransferProxyContract)
|
||||
public
|
||||
{
|
||||
// TODO: Hardcode this address for production.
|
||||
TRANSFER_PROXY = tokenTransferProxyContract;
|
||||
}
|
||||
|
||||
/// @dev Transfers ERC20 tokens via the v1 TokenTransferProxy. 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,
|
||||
address from,
|
||||
address to,
|
||||
uint256 amount)
|
||||
external
|
||||
onlyAuthorized
|
||||
{
|
||||
address token = decodeMetadata(assetMetadata);
|
||||
bool success = TRANSFER_PROXY.transferFrom(token, from, to, amount);
|
||||
require(success == true);
|
||||
}
|
||||
|
||||
/// @dev Decodes ERC20-encoded byte array.
|
||||
/// @param assetMetadata ERC20-encoded byte array.
|
||||
/// @return tokenAddress Address of ERC20 token.
|
||||
function decodeMetadata(bytes memory assetMetadata)
|
||||
public pure
|
||||
returns (address tokenAddress)
|
||||
{
|
||||
require(assetMetadata.length == 21);
|
||||
return readAddress(assetMetadata, 1);
|
||||
}
|
||||
|
||||
/// @dev Encodes ERC20 byte array.
|
||||
/// @param assetProxyId Id of the asset proxy.
|
||||
/// @param tokenAddress Address of the asset.
|
||||
/// @return assetMetadata ERC20-encoded byte.
|
||||
function encodeMetadata(
|
||||
uint8 assetProxyId,
|
||||
address tokenAddress)
|
||||
public pure
|
||||
returns (bytes memory assetMetadata)
|
||||
{
|
||||
// 0 is reserved as invalid proxy id
|
||||
require(assetProxyId != 0);
|
||||
|
||||
// Encode fields into a byte array
|
||||
assetMetadata = new bytes(21);
|
||||
assetMetadata[0] = byte(assetProxyId);
|
||||
writeAddress(assetMetadata, 1, tokenAddress);
|
||||
return assetMetadata;
|
||||
}
|
||||
}
|
@@ -24,7 +24,6 @@ import "./MixinSignatureValidator.sol";
|
||||
import "./MixinSettlementProxy.sol";
|
||||
import "./MixinWrapperFunctions.sol";
|
||||
import "../AssetProxyDispatcher/IAssetProxyDispatcher.sol";
|
||||
import "../TokenTransferProxy/ITokenTransferProxy.sol";
|
||||
|
||||
contract Exchange is
|
||||
MixinExchangeCore,
|
||||
|
@@ -58,10 +58,6 @@ contract IExchange {
|
||||
public view
|
||||
returns (address);
|
||||
|
||||
function TOKEN_TRANSFER_PROXY_CONTRACT()
|
||||
public view
|
||||
returns (address);
|
||||
|
||||
function EXTERNAL_QUERY_GAS_LIMIT()
|
||||
public view
|
||||
returns (uint16);
|
||||
|
@@ -1,72 +0,0 @@
|
||||
/*
|
||||
|
||||
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 { IOwnable_v1 as IOwnable } from "../../../previous/Ownable/IOwnable_v1.sol";
|
||||
|
||||
/// @title TokenTransferProxy - Transfers tokens on behalf of contracts that have been approved via decentralized governance.
|
||||
/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
|
||||
contract ITokenTransferProxy is IOwnable {
|
||||
|
||||
function authorized(address addr)
|
||||
public view
|
||||
returns (bool);
|
||||
|
||||
function authorities(uint256 index)
|
||||
public view
|
||||
returns (address);
|
||||
|
||||
/// @dev Gets all authorized addresses.
|
||||
/// @return Array of authorized addresses.
|
||||
function getAuthorizedAddresses()
|
||||
public view
|
||||
returns (address[]);
|
||||
|
||||
/// @dev Authorizes an address.
|
||||
/// @param target Address to authorize.
|
||||
function addAuthorizedAddress(address target)
|
||||
public;
|
||||
|
||||
/// @dev Removes authorizion of an address.
|
||||
/// @param target Address to remove authorization from.
|
||||
function removeAuthorizedAddress(address target)
|
||||
public;
|
||||
|
||||
/// @dev Calls into ERC20 Token contract, invoking transferFrom.
|
||||
/// @param token Address of token to transfer.
|
||||
/// @param from Address to transfer token from.
|
||||
/// @param to Address to transfer token to.
|
||||
/// @param value Amount of token to transfer.
|
||||
/// @return Success of transfer.
|
||||
function transferFrom(
|
||||
address token,
|
||||
address from,
|
||||
address to,
|
||||
uint value)
|
||||
public
|
||||
returns (bool);
|
||||
|
||||
event LogAuthorizedAddressAdded(
|
||||
address indexed target,
|
||||
address indexed caller);
|
||||
|
||||
event LogAuthorizedAddressRemoved(
|
||||
address indexed target,
|
||||
address indexed caller);
|
||||
}
|
@@ -1,115 +0,0 @@
|
||||
/*
|
||||
|
||||
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.11;
|
||||
|
||||
import { Token_v1 as Token } from "../../../previous/Token/Token_v1.sol";
|
||||
import { Ownable_v1 as Ownable } from "../../../previous/Ownable/Ownable_v1.sol";
|
||||
|
||||
/// @title TokenTransferProxy - Transfers tokens on behalf of contracts that have been approved via decentralized governance.
|
||||
/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
|
||||
contract TokenTransferProxy is Ownable {
|
||||
|
||||
/// @dev Only authorized addresses can invoke functions with this modifier.
|
||||
modifier onlyAuthorized {
|
||||
require(authorized[msg.sender]);
|
||||
_;
|
||||
}
|
||||
|
||||
modifier targetAuthorized(address target) {
|
||||
require(authorized[target]);
|
||||
_;
|
||||
}
|
||||
|
||||
modifier targetNotAuthorized(address target) {
|
||||
require(!authorized[target]);
|
||||
_;
|
||||
}
|
||||
|
||||
mapping (address => bool) public authorized;
|
||||
address[] public authorities;
|
||||
|
||||
event LogAuthorizedAddressAdded(address indexed target, address indexed caller);
|
||||
event LogAuthorizedAddressRemoved(address indexed target, address indexed caller);
|
||||
|
||||
/*
|
||||
* Public functions
|
||||
*/
|
||||
|
||||
/// @dev Authorizes an address.
|
||||
/// @param target Address to authorize.
|
||||
function addAuthorizedAddress(address target)
|
||||
public
|
||||
onlyOwner
|
||||
targetNotAuthorized(target)
|
||||
{
|
||||
authorized[target] = true;
|
||||
authorities.push(target);
|
||||
LogAuthorizedAddressAdded(target, msg.sender);
|
||||
}
|
||||
|
||||
/// @dev Removes authorizion of an address.
|
||||
/// @param target Address to remove authorization from.
|
||||
function removeAuthorizedAddress(address target)
|
||||
public
|
||||
onlyOwner
|
||||
targetAuthorized(target)
|
||||
{
|
||||
delete authorized[target];
|
||||
for (uint i = 0; i < authorities.length; i++) {
|
||||
if (authorities[i] == target) {
|
||||
authorities[i] = authorities[authorities.length - 1];
|
||||
authorities.length -= 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
LogAuthorizedAddressRemoved(target, msg.sender);
|
||||
}
|
||||
|
||||
/// @dev Calls into ERC20 Token contract, invoking transferFrom.
|
||||
/// @param token Address of token to transfer.
|
||||
/// @param from Address to transfer token from.
|
||||
/// @param to Address to transfer token to.
|
||||
/// @param value Amount of token to transfer.
|
||||
/// @return Success of transfer.
|
||||
function transferFrom(
|
||||
address token,
|
||||
address from,
|
||||
address to,
|
||||
uint value)
|
||||
public
|
||||
onlyAuthorized
|
||||
returns (bool)
|
||||
{
|
||||
return Token(token).transferFrom(from, to, value);
|
||||
}
|
||||
|
||||
/*
|
||||
* Public constant functions
|
||||
*/
|
||||
|
||||
/// @dev Gets all authorized addresses.
|
||||
/// @return Array of authorized addresses.
|
||||
function getAuthorizedAddresses()
|
||||
public
|
||||
constant
|
||||
returns (address[])
|
||||
{
|
||||
return authorities;
|
||||
}
|
||||
}
|
@@ -18,7 +18,6 @@
|
||||
|
||||
pragma solidity ^0.4.21;
|
||||
|
||||
/// @title TokenTransferProxy - Transfers tokens on behalf of contracts that have been approved via decentralized governance.
|
||||
contract IAuthorizable {
|
||||
|
||||
/// @dev Gets all authorized addresses.
|
||||
|
@@ -5,7 +5,6 @@ import * as MultiSigWalletWithTimeLockArtifact from '../artifacts/MultiSigWallet
|
||||
import * as MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressArtifact from '../artifacts/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.json';
|
||||
import * as TokenArtifact from '../artifacts/Token.json';
|
||||
import * as TokenRegistryArtifact from '../artifacts/TokenRegistry.json';
|
||||
import * as TokenTransferProxyArtifact from '../artifacts/TokenTransferProxy.json';
|
||||
import * as EtherTokenArtifact from '../artifacts/WETH9.json';
|
||||
import * as ZRXArtifact from '../artifacts/ZRXToken.json';
|
||||
|
||||
@@ -19,7 +18,6 @@ export const artifacts = {
|
||||
EtherTokenArtifact: (EtherTokenArtifact as any) as Artifact,
|
||||
TokenRegistryArtifact: (TokenRegistryArtifact as any) as Artifact,
|
||||
MaliciousTokenArtifact: (MaliciousTokenArtifact as any) as Artifact,
|
||||
TokenTransferProxyArtifact: (TokenTransferProxyArtifact as any) as Artifact,
|
||||
MultiSigWalletWithTimeLockArtifact: (MultiSigWalletWithTimeLockArtifact as any) as Artifact,
|
||||
MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressArtifact: (MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressArtifact as any) as Artifact,
|
||||
};
|
||||
|
@@ -22,14 +22,6 @@ export function encodeUint256(value: BigNumber): Buffer {
|
||||
return encodedValue;
|
||||
}
|
||||
|
||||
export function encodeERC20V1ProxyData(tokenAddress: string): string {
|
||||
const encodedAssetProxyId = encodeAssetProxyId(AssetProxyId.ERC20V1);
|
||||
const encodedAddress = encodeAddress(tokenAddress);
|
||||
const encodedMetadata = Buffer.concat([encodedAssetProxyId, encodedAddress]);
|
||||
const encodedMetadataHex = ethUtil.bufferToHex(encodedMetadata);
|
||||
return encodedMetadataHex;
|
||||
}
|
||||
|
||||
export function encodeERC20ProxyData(tokenAddress: string): string {
|
||||
const encodedAssetProxyId = encodeAssetProxyId(AssetProxyId.ERC20);
|
||||
const encodedAddress = encodeAddress(tokenAddress);
|
||||
|
@@ -39,7 +39,6 @@ export interface CancelOrdersBefore {
|
||||
|
||||
export enum AssetProxyId {
|
||||
INVALID,
|
||||
ERC20V1,
|
||||
ERC20,
|
||||
ERC721,
|
||||
}
|
||||
@@ -97,7 +96,6 @@ export enum ExchangeContractErrs {
|
||||
}
|
||||
|
||||
export enum ContractName {
|
||||
TokenTransferProxy = 'TokenTransferProxy',
|
||||
TokenRegistry = 'TokenRegistry',
|
||||
MultiSigWalletWithTimeLock = 'MultiSigWalletWithTimeLock',
|
||||
Exchange = 'Exchange',
|
||||
@@ -111,7 +109,6 @@ export enum ContractName {
|
||||
Arbitrage = 'Arbitrage',
|
||||
AssetProxyDispatcher = 'AssetProxyDispatcher',
|
||||
ERC20Proxy = 'ERC20Proxy',
|
||||
ERC20V1Proxy = 'ERC20Proxy_v1',
|
||||
ERC721Proxy = 'ERC721Proxy',
|
||||
DummyERC721Token = 'DummyERC721Token',
|
||||
}
|
||||
|
Reference in New Issue
Block a user