Add interfaces for Exchange, TokenRegistery and TokenTransferProxy

This commit is contained in:
Remco Bloemen
2018-02-06 11:46:00 -08:00
committed by Amir Bandeali
parent d08bfbf705
commit b06ba55be3
5 changed files with 563 additions and 0 deletions

View File

@@ -0,0 +1,226 @@
pragma solidity ^0.4.19;
contract IExchange {
// Error Codes
enum Errors {
ORDER_EXPIRED, // Order has already expired
ORDER_FULLY_FILLED_OR_CANCELLED, // Order has already been fully filled or cancelled
ROUNDING_ERROR_TOO_LARGE, // Rounding error too large
INSUFFICIENT_BALANCE_OR_ALLOWANCE // Insufficient balance or allowance for token transfer
}
event LogError(uint8 indexed errorId, bytes32 indexed orderHash);
event LogFill(
address indexed maker,
address taker,
address indexed feeRecipient,
address makerToken,
address takerToken,
uint filledMakerTokenAmount,
uint filledTakerTokenAmount,
uint paidMakerFee,
uint paidTakerFee,
bytes32 indexed tokens, // keccak256(makerToken, takerToken), allows subscribing to a token pair
bytes32 orderHash
);
event LogCancel(
address indexed maker,
address indexed feeRecipient,
address makerToken,
address takerToken,
uint cancelledMakerTokenAmount,
uint cancelledTakerTokenAmount,
bytes32 indexed tokens,
bytes32 orderHash
);
function ZRX_TOKEN_CONTRACT()
public view
returns (address);
function TOKEN_TRANSFER_PROXY_CONTRACT()
public view
returns (address);
function EXTERNAL_QUERY_GAS_LIMIT()
public view
returns (uint16);
function VERSION()
public view
returns (string);
function filled(bytes32)
public view
returns (uint256);
function cancelled(bytes32)
public view
returns (uint256);
/// @dev Calculates the sum of values already filled and cancelled for a given order.
/// @param orderHash The Keccak-256 hash of the given order.
/// @return Sum of values already filled and cancelled.
function getUnavailableTakerTokenAmount(bytes32 orderHash)
public constant
returns (uint);
/// @dev Calculates partial value given a numerator and denominator.
/// @param numerator Numerator.
/// @param denominator Denominator.
/// @param target Value to calculate partial of.
/// @return Partial value of target.
function getPartialAmount(uint numerator, uint denominator, uint target)
public constant
returns (uint);
/// @dev Checks if rounding error > 0.1%.
/// @param numerator Numerator.
/// @param denominator Denominator.
/// @param target Value to multiply with numerator/denominator.
/// @return Rounding error is present.
function isRoundingError(uint numerator, uint denominator, uint target)
public constant
returns (bool);
/// @dev Calculates Keccak-256 hash of order with specified parameters.
/// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
/// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
/// @return Keccak-256 hash of order.
function getOrderHash(address[5] orderAddresses, uint[6] orderValues)
public
constant
returns (bytes32);
/// @dev Verifies that an order signature is valid.
/// @param signer address of signer.
/// @param hash Signed Keccak-256 hash.
/// @param v ECDSA signature parameter v.
/// @param r ECDSA signature parameters r.
/// @param s ECDSA signature parameters s.
/// @return Validity of order signature.
function isValidSignature(
address signer,
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s)
public constant
returns (bool);
/// @dev Fills the input order.
/// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
/// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
/// @param fillTakerTokenAmount Desired amount of takerToken to fill.
/// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfer will fail before attempting.
/// @param v ECDSA signature parameter v.
/// @param r ECDSA signature parameters r.
/// @param s ECDSA signature parameters s.
/// @return Total amount of takerToken filled in trade.
function fillOrder(
address[5] orderAddresses,
uint[6] orderValues,
uint fillTakerTokenAmount,
bool shouldThrowOnInsufficientBalanceOrAllowance,
uint8 v,
bytes32 r,
bytes32 s)
public
returns (uint filledTakerTokenAmount);
/// @dev Cancels the input order.
/// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
/// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
/// @param cancelTakerTokenAmount Desired amount of takerToken to cancel in order.
/// @return Amount of takerToken cancelled.
function cancelOrder(
address[5] orderAddresses,
uint[6] orderValues,
uint cancelTakerTokenAmount)
public
returns (uint);
/// @dev Fills an order with specified parameters and ECDSA signature, throws if specified amount not filled entirely.
/// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
/// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
/// @param fillTakerTokenAmount Desired amount of takerToken to fill.
/// @param v ECDSA signature parameter v.
/// @param r ECDSA signature parameters r.
/// @param s ECDSA signature parameters s.
function fillOrKillOrder(
address[5] orderAddresses,
uint[6] orderValues,
uint fillTakerTokenAmount,
uint8 v,
bytes32 r,
bytes32 s)
public;
/// @dev Synchronously executes multiple fill orders in a single transaction.
/// @param orderAddresses Array of address arrays containing individual order addresses.
/// @param orderValues Array of uint arrays containing individual order values.
/// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
/// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
/// @param v Array ECDSA signature v parameters.
/// @param r Array of ECDSA signature r parameters.
/// @param s Array of ECDSA signature s parameters.
function batchFillOrders(
address[5][] orderAddresses,
uint[6][] orderValues,
uint[] fillTakerTokenAmounts,
bool shouldThrowOnInsufficientBalanceOrAllowance,
uint8[] v,
bytes32[] r,
bytes32[] s)
public;
/// @dev Synchronously executes multiple fillOrKill orders in a single transaction.
/// @param orderAddresses Array of address arrays containing individual order addresses.
/// @param orderValues Array of uint arrays containing individual order values.
/// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
/// @param v Array ECDSA signature v parameters.
/// @param r Array of ECDSA signature r parameters.
/// @param s Array of ECDSA signature s parameters.
function batchFillOrKillOrders(
address[5][] orderAddresses,
uint[6][] orderValues,
uint[] fillTakerTokenAmounts,
uint8[] v,
bytes32[] r,
bytes32[] s)
public;
/// @dev Synchronously executes multiple fill orders in a single transaction until total fillTakerTokenAmount filled.
/// @param orderAddresses Array of address arrays containing individual order addresses.
/// @param orderValues Array of uint arrays containing individual order values.
/// @param fillTakerTokenAmount Desired total amount of takerToken to fill in orders.
/// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
/// @param v Array ECDSA signature v parameters.
/// @param r Array of ECDSA signature r parameters.
/// @param s Array of ECDSA signature s parameters.
/// @return Total amount of fillTakerTokenAmount filled in orders.
function fillOrdersUpTo(
address[5][] orderAddresses,
uint[6][] orderValues,
uint fillTakerTokenAmount,
bool shouldThrowOnInsufficientBalanceOrAllowance,
uint8[] v,
bytes32[] r,
bytes32[] s)
public
returns (uint);
/// @dev Synchronously cancels multiple orders in a single transaction.
/// @param orderAddresses Array of address arrays containing individual order addresses.
/// @param orderValues Array of uint arrays containing individual order values.
/// @param cancelTakerTokenAmounts Array of desired amounts of takerToken to cancel in orders.
function batchCancelOrders(
address[5][] orderAddresses,
uint[6][] orderValues,
uint[] cancelTakerTokenAmounts)
public;
}

View File

@@ -0,0 +1,195 @@
/*
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.19;
import { IOwnable_v1 as IOwnable } from "../../../previous/Ownable/IOwnable_v1.sol";
/// @title Token Registry - Stores metadata associated with ERC20 tokens. See ERC22 https://github.com/ethereum/EIPs/issues/22
/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
contract ITokenRegistery is IOwnable {
event LogAddToken(
address indexed token,
string name,
string symbol,
uint8 decimals,
bytes ipfsHash,
bytes swarmHash
);
event LogRemoveToken(
address indexed token,
string name,
string symbol,
uint8 decimals,
bytes ipfsHash,
bytes swarmHash
);
event LogTokenNameChange(
address indexed token,
string oldName,
string newName
);
event LogTokenSymbolChange(
address indexed token,
string oldSymbol,
string newSymbol
);
event LogTokenIpfsHashChange(
address indexed token,
bytes oldIpfsHash,
bytes newIpfsHash
);
event LogTokenSwarmHashChange(
address indexed token,
bytes oldSwarmHash,
bytes newSwarmHash
);
function tokens(address tokenAddress)
public view
returns (
address token,
string name,
string symbol,
uint8 decimals,
bytes ipfsHash,
bytes swarmHash
);
function tokenAddresses(uint256 index)
public view
returns (address);
/// @dev Allows owner to add a new token to the registry.
/// @param _token Address of new token.
/// @param _name Name of new token.
/// @param _symbol Symbol for new token.
/// @param _decimals Number of decimals, divisibility of new token.
/// @param _ipfsHash IPFS hash of token icon.
/// @param _swarmHash Swarm hash of token icon.
function addToken(
address _token,
string _name,
string _symbol,
uint8 _decimals,
bytes _ipfsHash,
bytes _swarmHash)
public;
/// @dev Allows owner to remove an existing token from the registry.
/// @param _token Address of existing token.
function removeToken(address _token, uint _index)
public;
/// @dev Allows owner to modify an existing token's name.
/// @param _token Address of existing token.
/// @param _name New name.
function setTokenName(address _token, string _name)
public;
/// @dev Allows owner to modify an existing token's symbol.
/// @param _token Address of existing token.
/// @param _symbol New symbol.
function setTokenSymbol(address _token, string _symbol)
public;
/// @dev Allows owner to modify an existing token's IPFS hash.
/// @param _token Address of existing token.
/// @param _ipfsHash New IPFS hash.
function setTokenIpfsHash(address _token, bytes _ipfsHash)
public;
/// @dev Allows owner to modify an existing token's Swarm hash.
/// @param _token Address of existing token.
/// @param _swarmHash New Swarm hash.
function setTokenSwarmHash(address _token, bytes _swarmHash)
public;
/*
* Web3 call functions
*/
/// @dev Provides a registered token's address when given the token symbol.
/// @param _symbol Symbol of registered token.
/// @return Token's address.
function getTokenAddressBySymbol(string _symbol)
public constant
returns (address);
/// @dev Provides a registered token's address when given the token name.
/// @param _name Name of registered token.
/// @return Token's address.
function getTokenAddressByName(string _name)
public constant
returns (address);
/// @dev Provides a registered token's metadata, looked up by address.
/// @param _token Address of registered token.
/// @return Token metadata.
function getTokenMetaData(address _token)
public constant
returns (
address, //tokenAddress
string, //name
string, //symbol
uint8, //decimals
bytes, //ipfsHash
bytes //swarmHash
);
/// @dev Provides a registered token's metadata, looked up by name.
/// @param _name Name of registered token.
/// @return Token metadata.
function getTokenByName(string _name)
public constant
returns (
address, //tokenAddress
string, //name
string, //symbol
uint8, //decimals
bytes, //ipfsHash
bytes //swarmHash
);
/// @dev Provides a registered token's metadata, looked up by symbol.
/// @param _symbol Symbol of registered token.
/// @return Token metadata.
function getTokenBySymbol(string _symbol)
public constant
returns (
address, //tokenAddress
string, //name
string, //symbol
uint8, //decimals
bytes, //ipfsHash
bytes //swarmHash
);
/// @dev Returns an array containing all token addresses.
/// @return Array of token addresses.
function getTokenAddresses()
public constant
returns (address[]);
}

View File

@@ -0,0 +1,72 @@
/*
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.19;
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);
}

View File

@@ -0,0 +1,18 @@
pragma solidity ^0.4.19;
/*
* Ownable
*
* Base contract with an owner.
* Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.
*/
contract IOwnable_v1 {
function owner()
public view
returns (address);
function transferOwnership(address newOwner)
public;
}

View File

@@ -0,0 +1,52 @@
pragma solidity ^0.4.18;
contract IToken_v1 {
/// @notice send `value` token to `to` from `msg.sender`
/// @param to The address of the recipient
/// @param value The amount of token to be transferred
/// @return Whether the transfer was successful or not
function transfer(address to, uint value)
public
returns (bool);
/// @notice send `value` token to `to` from `from` on the condition it is approved by `from`
/// @param from The address of the sender
/// @param to The address of the recipient
/// @param value The amount of token to be transferred
/// @return Whether the transfer was successful or not
function transferFrom(address from, address to, uint value)
public
returns (bool);
/// @notice `msg.sender` approves `addr` to spend `value` tokens
/// @param spender The address of the account able to transfer the tokens
/// @param value The amount of wei to be approved for transfer
/// @return Whether the approval was successful or not
function approve(address spender, uint value)
public
returns (bool);
/// @param owner The address from which the balance will be retrieved
/// @return The balance
function balanceOf(address owner)
public view
returns (uint);
/// @param owner The address of the account owning tokens
/// @param spender The address of the account able to transfer the tokens
/// @return Amount of remaining tokens allowed to spent
function allowance(address owner, address spender)
public view
returns (uint);
event Transfer(
address indexed from,
address indexed to,
uint value);
event Approval(
address indexed owner,
address indexed spender,
uint value);
}