diff options
author | Brandon Millman <brandon.millman@gmail.com> | 2018-02-06 05:16:46 +0800 |
---|---|---|
committer | Brandon Millman <brandon.millman@gmail.com> | 2018-02-06 05:16:46 +0800 |
commit | 99b1f81e89e3ac929c7829552ea7ae19998524e9 (patch) | |
tree | 534161a9fa8bcf8bb5572d7ef0aa311fe9b9d116 /packages/contracts/src/current/protocol/TokenTransferProxy/TokenTransferProxy.sol | |
parent | 6577d607332e2fb1a442d663e260ecb969457c36 (diff) | |
parent | 46ad7b1b38df0f302821258629ffa749e7dd00b9 (diff) | |
download | dexon-sol-tools-99b1f81e89e3ac929c7829552ea7ae19998524e9.tar dexon-sol-tools-99b1f81e89e3ac929c7829552ea7ae19998524e9.tar.gz dexon-sol-tools-99b1f81e89e3ac929c7829552ea7ae19998524e9.tar.bz2 dexon-sol-tools-99b1f81e89e3ac929c7829552ea7ae19998524e9.tar.lz dexon-sol-tools-99b1f81e89e3ac929c7829552ea7ae19998524e9.tar.xz dexon-sol-tools-99b1f81e89e3ac929c7829552ea7ae19998524e9.tar.zst dexon-sol-tools-99b1f81e89e3ac929c7829552ea7ae19998524e9.zip |
Merge branch 'development' into feature/testnet-faucets/order-dispenser
* development: (37 commits)
Add dates to CHANGELOGs
Change CHANGELOGs
Add .editorconfig
Fix a typo
Temp
Use forEach instead of map
Add PR number
Fix an exception when a signature collision happens
Fix prettier
Add regression tests
Improve the comment and fix an exception
Add missing comas
Lerna-ignore tslint and tsconfig
Update contract versions, fix tests
Rename directories
Rename previous contracts, fix imports, add nested file structure
Move all contracts into a single directory
Update import
Fix import
Get rid of suffixed contract versioning and replace it with a poor-mans package manager. Versions are stored locally, and are generated in a copy-on-write basis as required
...
Diffstat (limited to 'packages/contracts/src/current/protocol/TokenTransferProxy/TokenTransferProxy.sol')
-rw-r--r-- | packages/contracts/src/current/protocol/TokenTransferProxy/TokenTransferProxy.sol | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/packages/contracts/src/current/protocol/TokenTransferProxy/TokenTransferProxy.sol b/packages/contracts/src/current/protocol/TokenTransferProxy/TokenTransferProxy.sol new file mode 100644 index 000000000..1ce949fa6 --- /dev/null +++ b/packages/contracts/src/current/protocol/TokenTransferProxy/TokenTransferProxy.sol @@ -0,0 +1,115 @@ +/* + + Copyright 2017 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; + } +} |