aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEttore Perazzoli <ettore@src.gnome.org>2002-07-09 03:01:37 +0800
committerEttore Perazzoli <ettore@src.gnome.org>2002-07-09 03:01:37 +0800
commita3a512a3e5756adb9b5ec097b4e97a7c373a90bd (patch)
tree3d840e91f54dcc2f62495ddedba352adaf1c913e
parent4700cd0784eb9eef49ada22323f6a2060aa63dd6 (diff)
downloadgsoc2013-evolution-a3a512a3e5756adb9b5ec097b4e97a7c373a90bd.tar.gz
gsoc2013-evolution-a3a512a3e5756adb9b5ec097b4e97a7c373a90bd.tar.zst
gsoc2013-evolution-a3a512a3e5756adb9b5ec097b4e97a7c373a90bd.zip
New helper function. (e_folder_to_corba): Use it here.
* e-folder.c (safe_corba_string_dup): New helper function. (e_folder_to_corba): Use it here. * Makefile.am (libeshell_la_SOURCES): Move e-folder.c here, from evolution_SOURCES. (eshellinclude_HEADERS): Likewise, move e-folder.h here. * evolution-storage.c (impl_Storage_getFolderAtPath): New, implementation for Evoluiton::Storage::getFolderAtPath. (evolution_storage_get_epv): Install CORBA method here. * Evolution-Storage.idl (getFolderAtPath): New method in Evolution::Storage. svn path=/trunk/; revision=17383
-rw-r--r--shell/ChangeLog16
-rw-r--r--shell/Evolution-Storage.idl6
-rw-r--r--shell/Makefile.am4
-rw-r--r--shell/e-folder.c19
-rw-r--r--shell/e-local-storage.c3
-rw-r--r--shell/evolution-storage.c29
6 files changed, 67 insertions, 10 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog
index 1542e8a4cf..2a7e916a78 100644
--- a/shell/ChangeLog
+++ b/shell/ChangeLog
@@ -1,3 +1,19 @@
+2002-07-08 Ettore Perazzoli <ettore@ximian.com>
+
+ * e-folder.c (safe_corba_string_dup): New helper function.
+ (e_folder_to_corba): Use it here.
+
+ * Makefile.am (libeshell_la_SOURCES): Move e-folder.c here, from
+ evolution_SOURCES.
+ (eshellinclude_HEADERS): Likewise, move e-folder.h here.
+
+ * evolution-storage.c (impl_Storage_getFolderAtPath): New,
+ implementation for Evoluiton::Storage::getFolderAtPath.
+ (evolution_storage_get_epv): Install CORBA method here.
+
+ * Evolution-Storage.idl (getFolderAtPath): New method in
+ Evolution::Storage.
+
2002-07-05 Ettore Perazzoli <ettore@ximian.com>
[Fix #22047, Crash after running the start-up wizard. The patch
diff --git a/shell/Evolution-Storage.idl b/shell/Evolution-Storage.idl
index dcc87ca6dd..e4ce3f1f1a 100644
--- a/shell/Evolution-Storage.idl
+++ b/shell/Evolution-Storage.idl
@@ -42,6 +42,12 @@ module Evolution {
/* Whether the storage has folders from other user's. */
readonly attribute boolean hasSharedFolders;
+
+ /* Get informatino for a folder. NOTE: evolutionUri in the
+ returned Folder is going to be an empty string if you use
+ this function. */
+ Folder getFolderAtPath (in string path)
+ raises (NotFound);
/* Flat list of the folders in the storage. */
readonly attribute FolderList folderList;
diff --git a/shell/Makefile.am b/shell/Makefile.am
index 95854f4f5a..7e79c317d4 100644
--- a/shell/Makefile.am
+++ b/shell/Makefile.am
@@ -73,6 +73,7 @@ eshellincludedir = $(includedir)/evolution/shell
eshellinclude_HEADERS = \
Evolution.h \
+ e-folder.h \
e-folder-list.h \
e-folder-tree.h \
evolution-activity-client.h \
@@ -91,6 +92,7 @@ eshellinclude_HEADERS = \
libeshell_la_SOURCES = \
$(IDL_GENERATED) \
+ e-folder.c \
e-folder-list.c \
e-folder-tree.c \
e-shell-corba-icon-utils.c \
@@ -136,8 +138,6 @@ evolution_SOURCES = \
e-folder-dnd-bridge.h \
e-folder-type-registry.c \
e-folder-type-registry.h \
- e-folder.c \
- e-folder.h \
e-gray-bar.c \
e-gray-bar.h \
e-history.c \
diff --git a/shell/e-folder.c b/shell/e-folder.c
index 3c2669f0bd..6f78e48db3 100644
--- a/shell/e-folder.c
+++ b/shell/e-folder.c
@@ -391,6 +391,15 @@ e_folder_get_can_sync_offline (EFolder *folder)
/* Gotta love CORBA. */
+static CORBA_char *
+safe_corba_string_dup (const char *s)
+{
+ if (s == NULL)
+ return CORBA_string_dup ("");
+
+ return CORBA_string_dup (s);
+}
+
void
e_folder_to_corba (EFolder *folder,
const char *evolution_uri,
@@ -399,11 +408,11 @@ e_folder_to_corba (EFolder *folder,
g_return_if_fail (E_IS_FOLDER (folder));
g_return_if_fail (folder_return != NULL);
- folder_return->type = e_safe_corba_string_dup (e_folder_get_type_string (folder));
- folder_return->description = e_safe_corba_string_dup (e_folder_get_description (folder));
- folder_return->displayName = e_safe_corba_string_dup (e_folder_get_name (folder));
- folder_return->physicalUri = e_safe_corba_string_dup (e_folder_get_physical_uri (folder));
- folder_return->evolutionUri = e_safe_corba_string_dup (evolution_uri);
+ folder_return->type = safe_corba_string_dup (e_folder_get_type_string (folder));
+ folder_return->description = safe_corba_string_dup (e_folder_get_description (folder));
+ folder_return->displayName = safe_corba_string_dup (e_folder_get_name (folder));
+ folder_return->physicalUri = safe_corba_string_dup (e_folder_get_physical_uri (folder));
+ folder_return->evolutionUri = safe_corba_string_dup (evolution_uri);
folder_return->unreadCount = e_folder_get_unread_count (folder);
folder_return->canSyncOffline = e_folder_get_can_sync_offline (folder);
}
diff --git a/shell/e-local-storage.c b/shell/e-local-storage.c
index 882a52e5bb..ee8b09cb5c 100644
--- a/shell/e-local-storage.c
+++ b/shell/e-local-storage.c
@@ -520,9 +520,6 @@ component_async_remove_folder_callback (EvolutionShellComponentClient *shell_com
if (result == EVOLUTION_SHELL_COMPONENT_OK) {
result = remove_folder_directory (E_LOCAL_STORAGE (callback_data->storage), path);
e_storage_removed_folder (E_STORAGE (callback_data->storage), path);
-
- g_print ("...Removed %s!\n", path);
-
evolution_storage_removed_folder (EVOLUTION_STORAGE (priv->bonobo_interface), path);
} else {
/* FIXME: Handle errors. */
diff --git a/shell/evolution-storage.c b/shell/evolution-storage.c
index 6648f61434..ebc514f774 100644
--- a/shell/evolution-storage.c
+++ b/shell/evolution-storage.c
@@ -33,6 +33,7 @@
#include "Evolution.h"
+#include "e-folder.h"
#include "e-folder-tree.h"
#include "evolution-storage.h"
@@ -271,6 +272,33 @@ impl_Storage__get_hasSharedFolders (PortableServer_Servant servant,
return priv->has_shared_folders;
}
+static GNOME_Evolution_Folder *
+impl_Storage_getFolderAtPath (PortableServer_Servant servant,
+ const CORBA_char *path,
+ CORBA_Environment *ev)
+{
+ BonoboObject *bonobo_object;
+ EvolutionStorage *storage;
+ EvolutionStoragePrivate *priv;
+ EFolder *folder;
+ GNOME_Evolution_Folder *corba_folder;
+
+ bonobo_object = bonobo_object_from_servant (servant);
+ storage = EVOLUTION_STORAGE (bonobo_object);
+ priv = storage->priv;
+
+ folder = e_folder_tree_get_folder (priv->folder_tree, path);
+ if (folder == NULL) {
+ CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Storage_NotFound, NULL);
+ return NULL;
+ }
+
+ corba_folder = GNOME_Evolution_Folder__alloc ();
+ e_folder_to_corba (folder, "", corba_folder);
+
+ return corba_folder;
+}
+
static void
get_folder_list_foreach (EFolderTree *tree,
const char *path,
@@ -699,6 +727,7 @@ evolution_storage_get_epv (void)
epv = g_new0 (POA_GNOME_Evolution_Storage__epv, 1);
epv->_get_name = impl_Storage__get_name;
epv->_get_hasSharedFolders = impl_Storage__get_hasSharedFolders;
+ epv->getFolderAtPath = impl_Storage_getFolderAtPath;
epv->_get_folderList = impl_Storage__get_folderList;
epv->asyncCreateFolder = impl_Storage_asyncCreateFolder;
epv->asyncRemoveFolder = impl_Storage_asyncRemoveFolder;
dth='100%'> -rw-r--r--packages/asset-buyer/src/utils/order_provider_response_processor.ts202
-rw-r--r--packages/asset-buyer/src/utils/order_utils.ts30
-rw-r--r--packages/asset-buyer/test/utils/chai_setup.ts (renamed from packages/forwarder-helper/test/utils/chai_setup.ts)0
-rw-r--r--packages/asset-buyer/tsconfig.json8
-rw-r--r--packages/asset-buyer/tslint.json (renamed from packages/forwarder-helper/tslint.json)0
-rw-r--r--packages/asset-buyer/typedoc-tsconfig.json7
-rw-r--r--packages/base-contract/CHANGELOG.json49
-rw-r--r--packages/base-contract/CHANGELOG.md16
-rw-r--r--packages/base-contract/package.json17
-rw-r--r--packages/base-contract/src/index.ts22
-rw-r--r--packages/base-contract/tsconfig.json3
-rw-r--r--packages/connect/CHANGELOG.json56
-rw-r--r--packages/connect/CHANGELOG.md20
-rw-r--r--packages/connect/package.json20
-rw-r--r--packages/connect/src/http_client.ts20
-rw-r--r--packages/connect/src/index.ts25
-rw-r--r--packages/connect/src/types.ts145
-rw-r--r--packages/connect/src/utils/orders_channel_message_parser.ts2
-rw-r--r--packages/connect/src/utils/relayer_response_json_parsers.ts7
-rw-r--r--packages/connect/src/utils/type_converters.ts28
-rw-r--r--packages/connect/src/ws_orders_channel.ts3
-rw-r--r--packages/connect/test/fixtures/standard_relayer_api/asset_pairs.ts2
-rw-r--r--packages/connect/test/fixtures/standard_relayer_api/fee_recipients.ts2
-rw-r--r--packages/connect/test/fixtures/standard_relayer_api/order_config.ts2
-rw-r--r--packages/connect/test/fixtures/standard_relayer_api/orderbook.ts2
-rw-r--r--packages/connect/test/fixtures/standard_relayer_api/orders.ts2
-rw-r--r--packages/connect/test/http_client_test.ts7
-rw-r--r--packages/connect/tsconfig.json3
-rw-r--r--packages/connect/typedoc-tsconfig.json7
-rw-r--r--packages/contract-wrappers/CHANGELOG.json76
-rw-r--r--packages/contract-wrappers/CHANGELOG.md28
-rw-r--r--packages/contract-wrappers/package.json54
-rw-r--r--packages/contract-wrappers/src/artifacts.ts2
-rw-r--r--packages/contract-wrappers/src/contract_wrappers.ts8
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts48
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts79
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/forwarder_wrapper.ts17
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/order_validator_wrapper.ts187
-rw-r--r--packages/contract-wrappers/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts (renamed from packages/order-watcher/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts)5
-rw-r--r--packages/contract-wrappers/src/fetchers/order_filled_cancelled_fetcher.ts (renamed from packages/order-watcher/src/fetchers/order_filled_cancelled_fetcher.ts)5
-rw-r--r--packages/contract-wrappers/src/index.ts10
-rw-r--r--packages/contract-wrappers/src/types.ts21
-rw-r--r--packages/contract-wrappers/src/utils/constants.ts2
-rw-r--r--packages/contract-wrappers/src/utils/decorators.ts2
-rw-r--r--packages/contract-wrappers/src/utils/utils.ts6
-rw-r--r--packages/contract-wrappers/test/exchange_wrapper_test.ts2
-rw-r--r--packages/contract-wrappers/test/forwarder_wrapper_test.ts3
-rw-r--r--packages/contract-wrappers/test/order_validator_wrapper_test.ts142
-rw-r--r--packages/contract-wrappers/test/revert_validation_test.ts122
-rw-r--r--packages/contract-wrappers/test/subscription_test.ts2
-rw-r--r--packages/contract-wrappers/test/transaction_encoder_test.ts2
-rw-r--r--packages/contract-wrappers/test/utils/constants.ts1
-rw-r--r--packages/contract-wrappers/tsconfig.json3
-rw-r--r--packages/contract-wrappers/typedoc-tsconfig.json7
-rw-r--r--packages/contract_templates/contract.handlebars6
-rw-r--r--packages/contract_templates/partials/callAsync.handlebars9
-rw-r--r--packages/contract_templates/partials/tx.handlebars12
-rw-r--r--packages/contracts/README.md33
-rw-r--r--packages/contracts/compiler.json3
-rw-r--r--packages/contracts/package.json39
-rw-r--r--packages/contracts/src/2.0.0/extensions/Forwarder/Forwarder.sol1
-rw-r--r--packages/contracts/src/2.0.0/extensions/Forwarder/MixinAssets.sol1
-rw-r--r--packages/contracts/src/2.0.0/extensions/Forwarder/MixinExchangeWrapper.sol3
-rw-r--r--packages/contracts/src/2.0.0/extensions/Forwarder/MixinForwarderCore.sol11
-rw-r--r--packages/contracts/src/2.0.0/extensions/Forwarder/MixinWeth.sol1
-rw-r--r--packages/contracts/src/2.0.0/extensions/Forwarder/mixins/MAssets.sol1
-rw-r--r--packages/contracts/src/2.0.0/extensions/OrderValidator/OrderValidator.sol4
-rw-r--r--packages/contracts/src/2.0.0/multisig/MultiSigWallet.sol90
-rw-r--r--packages/contracts/src/2.0.0/multisig/MultiSigWalletWithTimeLock.sol99
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxy/ERC20Proxy.sol68
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxy/ERC721Proxy.sol3
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxy/MixinAuthorizable.sol1
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxy/interfaces/IAssetProxy.sol1
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol1
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxy/mixins/MAuthorizable.sol1
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.sol61
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/Exchange.sol1
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/MixinAssetProxyDispatcher.sol5
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/MixinExchangeCore.sol57
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/MixinMatchOrders.sol16
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/MixinSignatureValidator.sol4
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/MixinTransactions.sol10
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/MixinWrapperFunctions.sol6
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/libs/LibEIP712.sol1
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/libs/LibFillResults.sol1
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/libs/LibMath.sol94
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/libs/LibOrder.sol1
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/mixins/MAssetProxyDispatcher.sol1
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/mixins/MExchangeCore.sol5
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/mixins/MMatchOrders.sol1
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/mixins/MTransactions.sol22
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/mixins/MWrapperFunctions.sol5
-rw-r--r--packages/contracts/src/2.0.0/test/DummyERC20Token/DummyMultipleReturnERC20Token.sol69
-rw-r--r--packages/contracts/src/2.0.0/test/DummyERC20Token/DummyNoReturnERC20Token.sol1
-rw-r--r--packages/contracts/src/2.0.0/test/DummyERC721Receiver/DummyERC721Receiver.sol1
-rw-r--r--packages/contracts/src/2.0.0/test/ReentrantERC20Token/ReentrantERC20Token.sol8
-rw-r--r--packages/contracts/src/2.0.0/test/TestAssetProxyOwner/TestAssetProxyOwner.sol24
-rw-r--r--packages/contracts/src/2.0.0/test/TestExchangeInternals/TestExchangeInternals.sol36
-rw-r--r--packages/contracts/src/2.0.0/test/TestLibs/TestLibs.sol1
-rw-r--r--packages/contracts/src/2.0.0/test/TestSignatureValidator/TestSignatureValidator.sol1
-rw-r--r--packages/contracts/src/2.0.0/tokens/ERC20Token/ERC20Token.sol1
-rw-r--r--packages/contracts/src/2.0.0/tokens/ERC20Token/MintableERC20Token.sol1
-rw-r--r--packages/contracts/src/2.0.0/tokens/ERC20Token/UnlimitedAllowanceERC20Token.sol1
-rw-r--r--packages/contracts/src/2.0.0/tokens/ERC721Token/MintableERC721Token.sol1
-rw-r--r--packages/contracts/src/2.0.0/tokens/ZRXToken/ZRXToken.sol6
-rw-r--r--packages/contracts/src/2.0.0/utils/LibBytes/LibBytes.sol13
-rw-r--r--packages/contracts/src/2.0.0/utils/Ownable/IOwnable.sol7
-rw-r--r--packages/contracts/src/2.0.0/utils/Ownable/Ownable.sol11
-rw-r--r--packages/contracts/src/2.0.0/utils/ReentrancyGuard/ReentrancyGuard.sol1
-rw-r--r--packages/contracts/src/2.0.0/utils/SafeMath/SafeMath.sol1
-rw-r--r--packages/contracts/test/asset_proxy/authorizable.ts4
-rw-r--r--packages/contracts/test/asset_proxy/proxies.ts237
-rw-r--r--packages/contracts/test/exchange/core.ts39
-rw-r--r--packages/contracts/test/exchange/dispatcher.ts54
-rw-r--r--packages/contracts/test/exchange/internal.ts201
-rw-r--r--packages/contracts/test/exchange/match_orders.ts314
-rw-r--r--packages/contracts/test/exchange/signature_validator.ts14
-rw-r--r--packages/contracts/test/extensions/forwarder.ts33
-rw-r--r--packages/contracts/test/libraries/lib_bytes.ts95
-rw-r--r--packages/contracts/test/multisig/asset_proxy_owner.ts100
-rw-r--r--packages/contracts/test/multisig/multi_sig_with_time_lock.ts189
-rw-r--r--packages/contracts/test/tokens/unlimited_allowance_token.ts8
-rw-r--r--packages/contracts/test/utils/artifacts.ts2
-rw-r--r--packages/contracts/test/utils/assertions.ts17
-rw-r--r--packages/contracts/test/utils/block_timestamp.ts7
-rw-r--r--packages/contracts/test/utils/constants.ts1
-rw-r--r--packages/contracts/test/utils/multi_sig_wrapper.ts15
-rw-r--r--packages/contracts/test/utils/web3_wrapper.ts4
-rw-r--r--packages/contracts/tsconfig.json6
-rw-r--r--packages/dev-utils/CHANGELOG.json36
-rw-r--r--packages/dev-utils/CHANGELOG.md16
-rw-r--r--packages/dev-utils/package.json19
-rw-r--r--packages/dev-utils/src/web3_factory.ts7
-rw-r--r--packages/dev-utils/tsconfig.json3
-rw-r--r--packages/ethereum-types/CHANGELOG.json27
-rw-r--r--packages/ethereum-types/CHANGELOG.md12
-rw-r--r--packages/ethereum-types/package.json11
-rw-r--r--packages/ethereum-types/src/index.ts65
-rw-r--r--packages/ethereum-types/tsconfig.json3
-rw-r--r--packages/ethereum-types/typedoc-tsconfig.json8
-rw-r--r--packages/fill-scenarios/CHANGELOG.json45
-rw-r--r--packages/fill-scenarios/CHANGELOG.md20
-rw-r--r--packages/fill-scenarios/package.json27
-rw-r--r--packages/fill-scenarios/tsconfig.json3
-rw-r--r--packages/forwarder-helper/CHANGELOG.json21
-rw-r--r--packages/forwarder-helper/README.md83
-rw-r--r--packages/forwarder-helper/src/constants.ts5
-rw-r--r--packages/forwarder-helper/src/forwarder_helper_factory.ts25
-rw-r--r--packages/forwarder-helper/src/forwarder_helper_impl.ts64
-rw-r--r--packages/forwarder-helper/src/index.ts2
-rw-r--r--packages/forwarder-helper/src/types.ts43
-rw-r--r--packages/forwarder-helper/src/utils/forwarder_helper_impl_config_utils.ts92
-rw-r--r--packages/forwarder-helper/test/forwarder_helper_impl_test.ts136
-rw-r--r--packages/json-schemas/CHANGELOG.json36
-rw-r--r--packages/json-schemas/CHANGELOG.md16
-rw-r--r--packages/json-schemas/package.json15
-rw-r--r--packages/json-schemas/tsconfig.json5
-rw-r--r--packages/json-schemas/typedoc-tsconfig.json7
-rw-r--r--packages/metacoin/package.json31
-rw-r--r--packages/metacoin/tsconfig.json4
-rw-r--r--packages/migrations/.gitignore1
-rw-r--r--packages/migrations/CHANGELOG.json54
-rw-r--r--packages/migrations/CHANGELOG.md24
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/AssetProxyOwner.json44483
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/DummyERC20Token.json393
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/DummyERC721Receiver.json115
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/DummyERC721Token.json440
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/DummyNoReturnERC20Token.json397
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/ERC20Proxy.json267
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/ERC20Token.json230
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/ERC721Proxy.json267
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/ERC721Token.json317
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/Exchange.json2244
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/ExchangeWrapper.json210
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/Forwarder.json696
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/IAssetData.json89
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/IAssetProxy.json175
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/IValidator.json80
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/IWallet.json76
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/InvalidERC721Receiver.json115
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/MixinAuthorizable.json229
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/MultiSigWallet.json584
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/MultiSigWalletWithTimeLock.json668
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/TestAssetProxyDispatcher.json208
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/TestAssetProxyOwner.json48173
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/TestConstants.json85
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/TestExchangeInternals.json2461
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/TestLibBytes.json426
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/TestLibs.json396
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/TestSignatureValidator.json332
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/TestValidator.json95
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/TestWallet.json95
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/TokenRegistry.json598
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/Validator.json95
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/Wallet.json95
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/Whitelist.json284
-rw-r--r--packages/migrations/artifacts/2.0.0-testnet/AssetProxyOwner.json1012
-rw-r--r--packages/migrations/artifacts/2.0.0-testnet/DummyERC20Token.json641
-rw-r--r--packages/migrations/artifacts/2.0.0-testnet/DummyERC721Token.json672
-rw-r--r--packages/migrations/artifacts/2.0.0-testnet/ERC20Proxy.json508
-rw-r--r--packages/migrations/artifacts/2.0.0-testnet/ERC20Token.json486
-rw-r--r--packages/migrations/artifacts/2.0.0-testnet/ERC721Proxy.json508
-rw-r--r--packages/migrations/artifacts/2.0.0-testnet/ERC721Token.json565
-rw-r--r--packages/migrations/artifacts/2.0.0-testnet/Exchange.json2294
-rw-r--r--packages/migrations/artifacts/2.0.0-testnet/Forwarder.json761
-rw-r--r--packages/migrations/artifacts/2.0.0-testnet/IValidator.json (renamed from packages/migrations/artifacts/2.0.0-beta-testnet/OrderValidator.json)662
-rw-r--r--packages/migrations/artifacts/2.0.0-testnet/IWallet.json316
-rw-r--r--packages/migrations/artifacts/2.0.0-testnet/OrderValidator.json885
-rw-r--r--packages/migrations/artifacts/2.0.0-testnet/WETH9.json (renamed from packages/migrations/artifacts/2.0.0-beta-testnet/WETH9.json)7
-rw-r--r--packages/migrations/artifacts/2.0.0-testnet/ZRXToken.json (renamed from packages/migrations/artifacts/2.0.0-beta-testnet/ZRXToken.json)1155
-rw-r--r--packages/migrations/artifacts/2.0.0-trimmed/AssetProxyOwner.json724
-rw-r--r--packages/migrations/artifacts/2.0.0-trimmed/DummyERC20Token.json345
-rw-r--r--packages/migrations/artifacts/2.0.0-trimmed/DummyERC721Token.json375
-rw-r--r--packages/migrations/artifacts/2.0.0-trimmed/ERC20Proxy.json216
-rw-r--r--packages/migrations/artifacts/2.0.0-trimmed/ERC20Token.json189
-rw-r--r--packages/migrations/artifacts/2.0.0-trimmed/ERC721Proxy.json216
-rw-r--r--packages/migrations/artifacts/2.0.0-trimmed/ERC721Token.json268
-rw-r--r--packages/migrations/artifacts/2.0.0-trimmed/Exchange.json1997
-rw-r--r--packages/migrations/artifacts/2.0.0-trimmed/Forwarder.json473
-rw-r--r--packages/migrations/artifacts/2.0.0-trimmed/IValidator.json41
-rw-r--r--packages/migrations/artifacts/2.0.0-trimmed/IWallet.json37
-rw-r--r--packages/migrations/artifacts/2.0.0-trimmed/OrderValidator.json597
-rw-r--r--packages/migrations/artifacts/2.0.0-trimmed/WETH9.json314
-rw-r--r--packages/migrations/artifacts/2.0.0-trimmed/ZRXToken.json248
-rw-r--r--packages/migrations/artifacts/2.0.0/AssetProxyOwner.json985
-rw-r--r--packages/migrations/artifacts/2.0.0/DummyERC20Token.json641
-rw-r--r--packages/migrations/artifacts/2.0.0/DummyERC721Token.json672
-rw-r--r--packages/migrations/artifacts/2.0.0/ERC20Proxy.json481
-rw-r--r--packages/migrations/artifacts/2.0.0/ERC20Token.json486
-rw-r--r--packages/migrations/artifacts/2.0.0/ERC721Proxy.json481
-rw-r--r--packages/migrations/artifacts/2.0.0/ERC721Token.json565
-rw-r--r--packages/migrations/artifacts/2.0.0/Exchange.json2262
-rw-r--r--packages/migrations/artifacts/2.0.0/Forwarder.json734
-rw-r--r--packages/migrations/artifacts/2.0.0/IValidator.json320
-rw-r--r--packages/migrations/artifacts/2.0.0/IWallet.json316
-rw-r--r--packages/migrations/artifacts/2.0.0/OrderValidator.json858
-rw-r--r--packages/migrations/artifacts/2.0.0/WETH9.json351
-rw-r--r--packages/migrations/artifacts/2.0.0/ZRXToken.json10046
-rw-r--r--packages/migrations/package.json47
-rw-r--r--packages/migrations/src/2.0.0-beta-testnet/artifacts.ts15
-rw-r--r--packages/migrations/src/2.0.0-beta-testnet/migration.ts115
-rw-r--r--packages/migrations/src/2.0.0/migration.ts7
-rw-r--r--packages/migrations/src/index.ts1
-rw-r--r--packages/migrations/src/migrate.ts15
-rw-r--r--packages/migrations/src/utils/constants.ts2
-rw-r--r--packages/migrations/src/utils/provider_factory.ts14
-rw-r--r--packages/migrations/src/utils/token_info.ts18
-rw-r--r--packages/migrations/tsconfig.json3
-rw-r--r--packages/monorepo-scripts/package.json7
-rw-r--r--packages/monorepo-scripts/src/doc_gen_configs.ts7
-rw-r--r--packages/monorepo-scripts/src/publish_release_notes.ts20
-rw-r--r--packages/monorepo-scripts/src/utils/utils.ts7
-rw-r--r--packages/monorepo-scripts/tsconfig.json3
-rw-r--r--packages/order-utils/CHANGELOG.json56
-rw-r--r--packages/order-utils/CHANGELOG.md20
-rw-r--r--packages/order-utils/package.json38
-rw-r--r--packages/order-utils/src/index.ts1
-rw-r--r--packages/order-utils/src/market_utils.ts39
-rw-r--r--packages/order-utils/src/order_state_utils.ts4
-rw-r--r--packages/order-utils/src/parsing_utils.ts27
-rw-r--r--packages/order-utils/src/signature_utils.ts4
-rw-r--r--packages/order-utils/src/types.ts2
-rw-r--r--packages/order-utils/test/order_state_utils_test.ts20
-rw-r--r--packages/order-utils/tsconfig.json3
-rw-r--r--packages/order-utils/typedoc-tsconfig.json7
-rw-r--r--packages/order-watcher/CHANGELOG.json75
-rw-r--r--packages/order-watcher/CHANGELOG.md26
-rw-r--r--packages/order-watcher/package.json47
-rw-r--r--packages/order-watcher/src/index.ts1
-rw-r--r--packages/order-watcher/src/order_watcher/event_watcher.ts46
-rw-r--r--packages/order-watcher/src/order_watcher/order_watcher.ts29
-rw-r--r--packages/order-watcher/test/order_watcher_test.ts26
-rw-r--r--packages/order-watcher/tsconfig.json3
-rw-r--r--packages/order-watcher/typedoc-tsconfig.json7
-rw-r--r--packages/react-docs/CHANGELOG.json36
-rw-r--r--packages/react-docs/CHANGELOG.md16
-rw-r--r--packages/react-docs/README.md4
-rw-r--r--packages/react-docs/package.json26
-rw-r--r--packages/react-docs/src/components/custom_enum.tsx2
-rw-r--r--packages/react-docs/src/components/documentation.tsx19
-rw-r--r--packages/react-docs/src/components/event_definition.tsx2
-rw-r--r--packages/react-docs/src/components/interface.tsx3
-rw-r--r--packages/react-docs/src/components/property_block.tsx2
-rw-r--r--packages/react-docs/src/components/signature.tsx24
-rw-r--r--packages/react-docs/src/components/signature_block.tsx8
-rw-r--r--packages/react-docs/src/components/source_link.tsx3
-rw-r--r--packages/react-docs/src/components/type.tsx2
-rw-r--r--packages/react-docs/src/components/type_definition.tsx3
-rw-r--r--packages/react-docs/src/docs_info.ts16
-rw-r--r--packages/react-docs/src/index.ts13
-rw-r--r--packages/react-docs/src/types.ts260
-rw-r--r--packages/react-docs/src/utils/constants.ts2
-rw-r--r--packages/react-docs/src/utils/doxity_utils.ts176
-rw-r--r--packages/react-docs/src/utils/typedoc_utils.ts19
-rw-r--r--packages/react-docs/tsconfig.json5
-rw-r--r--packages/react-shared/CHANGELOG.json36
-rw-r--r--packages/react-shared/CHANGELOG.md16
-rw-r--r--packages/react-shared/package.json20
-rw-r--r--packages/react-shared/src/components/anchor_title.tsx1
-rw-r--r--packages/react-shared/src/components/version_drop_down.tsx22
-rw-r--r--packages/react-shared/tsconfig.json5
-rw-r--r--packages/sol-compiler/CHANGELOG.json36
-rw-r--r--packages/sol-compiler/CHANGELOG.md16
-rw-r--r--packages/sol-compiler/package.json27
-rw-r--r--packages/sol-compiler/src/compiler.ts114
-rw-r--r--packages/sol-compiler/src/index.ts20
-rw-r--r--packages/sol-compiler/src/utils/compiler.ts4
-rw-r--r--packages/sol-compiler/tsconfig.json1
-rw-r--r--packages/sol-compiler/typedoc-tsconfig.json8
-rw-r--r--packages/sol-cov/CHANGELOG.json36
-rw-r--r--packages/sol-cov/CHANGELOG.md16
-rw-r--r--packages/sol-cov/package.json28
-rw-r--r--packages/sol-cov/tsconfig.json3
-rw-r--r--packages/sol-cov/typedoc-tsconfig.json7
-rw-r--r--packages/sol-doc/CHANGELOG.json12
-rwxr-xr-xpackages/sol-doc/bin/sol-doc.js2
-rw-r--r--packages/sol-doc/coverage/.gitkeep0
-rw-r--r--packages/sol-doc/package.json49
-rw-r--r--packages/sol-doc/src/cli.ts28
-rw-r--r--packages/sol-doc/src/index.ts1
-rw-r--r--packages/sol-doc/src/solidity_doc_generator.ts306
-rw-r--r--packages/sol-doc/test/fixtures/contracts/MultipleReturnValues.sol7
-rw-r--r--packages/sol-doc/test/fixtures/contracts/NatspecEverything.sol40
-rw-r--r--packages/sol-doc/test/fixtures/contracts/TokenTransferProxy.sol115
-rw-r--r--packages/sol-doc/test/fixtures/contracts/TokenTransferProxyNoDevdoc.sol100
-rw-r--r--packages/sol-doc/test/solidity_doc_generator_test.ts237
-rw-r--r--packages/sol-doc/test/util/chai_setup.ts13
-rw-r--r--packages/sol-doc/tsconfig.json8
-rw-r--r--packages/sol-doc/tslint.json3
-rw-r--r--packages/sol-resolver/CHANGELOG.json36
-rw-r--r--packages/sol-resolver/CHANGELOG.md16
-rw-r--r--packages/sol-resolver/package.json11
-rw-r--r--packages/sol-resolver/tsconfig.json3
-rw-r--r--packages/sra-report/CHANGELOG.json36
-rw-r--r--packages/sra-report/CHANGELOG.md16
-rw-r--r--packages/sra-report/package.json16
-rw-r--r--packages/sra-report/tsconfig.json3
-rw-r--r--packages/sra-spec/CHANGELOG.json36
-rw-r--r--packages/sra-spec/CHANGELOG.md16
-rw-r--r--packages/sra-spec/package.json22
-rw-r--r--packages/sra-spec/src/api.ts2
-rw-r--r--packages/sra-spec/src/examples/relayerApiAssetDataPairsResponse.ts7
-rw-r--r--packages/sra-spec/src/examples/relayerApiOrder.ts7
-rw-r--r--packages/sra-spec/src/examples/relayerApiOrderConfigPayload.ts7
-rw-r--r--packages/sra-spec/src/examples/relayerApiOrderbookResponse.ts14
-rw-r--r--packages/sra-spec/src/examples/relayerApiOrdersResponse.ts7
-rw-r--r--packages/sra-spec/src/examples/signedOrder.ts5
-rw-r--r--packages/sra-spec/src/md/introduction.md6
-rw-r--r--packages/sra-spec/tsconfig.json5
-rw-r--r--packages/subproviders/CHANGELOG.json36
-rw-r--r--packages/subproviders/CHANGELOG.md16
-rw-r--r--packages/subproviders/package.json26
-rw-r--r--packages/subproviders/src/globals.d.ts18
-rw-r--r--packages/subproviders/tsconfig.json3
-rw-r--r--packages/subproviders/typedoc-tsconfig.json7
-rw-r--r--packages/testnet-faucets/package.json17
-rw-r--r--packages/testnet-faucets/src/ts/dispense_asset_tasks.ts35
-rw-r--r--packages/testnet-faucets/src/ts/handler.ts111
-rw-r--r--packages/testnet-faucets/src/ts/rpc_urls.ts1
-rw-r--r--packages/testnet-faucets/src/ts/tokens.ts44
-rw-r--r--packages/testnet-faucets/tsconfig.json1
-rw-r--r--packages/tslint-config/CHANGELOG.json9
-rw-r--r--packages/tslint-config/CHANGELOG.md4
-rw-r--r--packages/tslint-config/package.json5
-rw-r--r--packages/tslint-config/tsconfig.json4
-rw-r--r--packages/tslint-config/tslint.json1
-rw-r--r--packages/types/CHANGELOG.json46
-rw-r--r--packages/types/CHANGELOG.md18
-rw-r--r--packages/types/package.json11
-rw-r--r--packages/types/src/index.ts365
-rw-r--r--packages/types/tsconfig.json4
-rw-r--r--packages/typescript-typings/CHANGELOG.json37
-rw-r--r--packages/typescript-typings/CHANGELOG.md12
-rw-r--r--packages/typescript-typings/package.json10
-rw-r--r--packages/typescript-typings/tsconfig.json3
-rw-r--r--packages/typescript-typings/types/detect-node/index.d.ts3
-rw-r--r--packages/typescript-typings/types/eth-lightwallet/index.d.ts54
-rw-r--r--packages/typescript-typings/types/ethers/index.d.ts55
-rw-r--r--packages/typescript-typings/types/ganache-core/index.d.ts16
-rw-r--r--packages/typescript-typings/types/newman/index.d.ts24
-rw-r--r--packages/typescript-typings/types/react-typist/index.d.ts1
-rw-r--r--packages/typescript-typings/types/solc/index.d.ts63
-rw-r--r--packages/typescript-typings/types/web3-provider-engine/index.d.ts62
-rw-r--r--packages/utils/CHANGELOG.json45
-rw-r--r--packages/utils/CHANGELOG.md16
-rw-r--r--packages/utils/package.json18
-rw-r--r--packages/utils/src/abi_decoder.ts4
-rw-r--r--packages/utils/src/abi_utils.ts15
-rw-r--r--packages/utils/tsconfig.json3
-rw-r--r--packages/verdaccio/Dockerfile3
-rw-r--r--packages/verdaccio/README.md18
-rw-r--r--packages/verdaccio/conf.yaml71
-rw-r--r--packages/web3-wrapper/CHANGELOG.json45
-rw-r--r--packages/web3-wrapper/CHANGELOG.md17
-rw-r--r--packages/web3-wrapper/package.json22
-rw-r--r--packages/web3-wrapper/src/web3_wrapper.ts106
-rw-r--r--packages/web3-wrapper/test/web3_wrapper_test.ts34
-rw-r--r--packages/web3-wrapper/tsconfig.json3
-rw-r--r--packages/web3-wrapper/typedoc-tsconfig.json7
-rw-r--r--packages/website/md/docs/0xjs/0.0.1/async.md (renamed from packages/website/md/docs/0xjs/1.0.0/async.md)0
-rw-r--r--packages/website/md/docs/0xjs/0.0.1/errors.md (renamed from packages/website/md/docs/0xjs/1.0.0/errors.md)0
-rw-r--r--packages/website/md/docs/0xjs/0.0.1/installation.md (renamed from packages/website/md/docs/0xjs/1.0.0/installation.md)0
-rw-r--r--packages/website/md/docs/0xjs/0.0.1/introduction.md (renamed from packages/website/md/docs/0xjs/1.0.0/introduction.md)0
-rw-r--r--packages/website/md/docs/0xjs/0.0.1/versioning.md (renamed from packages/website/md/docs/0xjs/1.0.0/versioning.md)0
-rw-r--r--packages/website/md/docs/0xjs/1.0.1/async.md31
-rw-r--r--packages/website/md/docs/0xjs/1.0.1/installation.md40
-rw-r--r--packages/website/md/docs/0xjs/1.0.1/introduction.md (renamed from packages/website/md/docs/0xjs/2.0.0/introduction.md)2
-rw-r--r--packages/website/md/docs/0xjs/1.0.1/versioning.md (renamed from packages/website/md/docs/0xjs/2.0.0/versioning.md)2
-rw-r--r--packages/website/md/docs/0xjs/2.0.0/async.md26
-rw-r--r--packages/website/md/docs/0xjs/2.0.0/installation.md38
-rw-r--r--packages/website/md/docs/connect/2.0.0/introduction.md2
-rw-r--r--packages/website/md/docs/contract_wrappers/introduction.md2
-rw-r--r--packages/website/md/docs/json_schemas/1.0.0/introduction.md2
-rw-r--r--packages/website/md/docs/smart_contracts/1.0.0/introduction.md9
-rw-r--r--packages/website/md/docs/smart_contracts/2.0.0/introduction.md6
-rw-r--r--packages/website/package.json42
-rw-r--r--packages/website/public/images/advisors/david.pngbin0 -> 29962 bytes-rw-r--r--packages/website/public/images/coinbase_wallet_logo.pngbin0 -> 103648 bytes-rw-r--r--packages/website/public/images/landing/0x_homepage.svg386
-rw-r--r--packages/website/public/images/landing/exchange_everywhere.pngbin0 -> 7084 bytes-rw-r--r--packages/website/public/images/team/gene.jpgbin0 -> 44173 bytes-rw-r--r--packages/website/public/images/team/rahul.pngbin0 -> 29636 bytes-rw-r--r--packages/website/public/images/team/weijie.pngbin0 -> 38401 bytes-rw-r--r--packages/website/translations/english.json26
-rw-r--r--packages/website/ts/artifacts/Exchange.json610
-rw-r--r--packages/website/ts/blockchain.ts209
-rw-r--r--packages/website/ts/components/dialogs/blockchain_err_dialog.tsx2
-rw-r--r--packages/website/ts/components/dialogs/eth_weth_conversion_dialog.tsx4
-rw-r--r--packages/website/ts/components/dialogs/ledger_config_dialog.tsx2
-rw-r--r--packages/website/ts/components/dialogs/portal_disclaimer_dialog.tsx2
-rw-r--r--packages/website/ts/components/dialogs/send_dialog.tsx4
-rw-r--r--packages/website/ts/components/dialogs/track_token_confirmation_dialog.tsx4
-rw-r--r--packages/website/ts/components/dialogs/u2f_not_supported_dialog.tsx2
-rw-r--r--packages/website/ts/components/dialogs/wrapped_eth_section_notice_dialog.tsx2
-rw-r--r--packages/website/ts/components/fill_order.tsx113
-rw-r--r--packages/website/ts/components/fill_order_json.tsx6
-rw-r--r--packages/website/ts/components/fill_warning_dialog.tsx4
-rw-r--r--packages/website/ts/components/generate_order/asset_picker.tsx4
-rw-r--r--packages/website/ts/components/generate_order/generate_order_form.tsx54
-rw-r--r--packages/website/ts/components/inputs/hash_input.tsx28
-rw-r--r--packages/website/ts/components/inputs/token_amount_input.tsx2
-rw-r--r--packages/website/ts/components/onboarding/install_wallet_onboarding_step.tsx4
-rw-r--r--packages/website/ts/components/order_json.tsx7
-rw-r--r--packages/website/ts/components/portal/portal.tsx10
-rw-r--r--packages/website/ts/components/relayer_index/relayer_index.tsx6
-rw-r--r--packages/website/ts/components/token_balances.tsx20
-rw-r--r--packages/website/ts/components/top_bar/top_bar.tsx14
-rw-r--r--packages/website/ts/components/ui/button.tsx1
-rw-r--r--packages/website/ts/components/ui/lifecycle_raised_button.tsx2
-rw-r--r--packages/website/ts/components/ui/text.tsx2
-rw-r--r--packages/website/ts/components/ui/typed_text.tsx75
-rw-r--r--packages/website/ts/components/wallet/body_overlay.tsx6
-rw-r--r--packages/website/ts/containers/connect_documentation.ts2
-rw-r--r--packages/website/ts/containers/contract_wrappers_documentation.ts3
-rw-r--r--packages/website/ts/containers/ethereum_types_documentation.ts1
-rw-r--r--packages/website/ts/containers/generate_order_form.ts5
-rw-r--r--packages/website/ts/containers/order_utils_documentation.ts1
-rw-r--r--packages/website/ts/containers/order_watcher_documentation.ts1
-rw-r--r--packages/website/ts/containers/portal.ts4
-rw-r--r--packages/website/ts/containers/smart_contracts_documentation.ts11
-rw-r--r--packages/website/ts/containers/sol_compiler_documentation.ts2
-rw-r--r--packages/website/ts/containers/sol_cov_documentation.ts2
-rw-r--r--packages/website/ts/containers/subproviders_documentation.ts3
-rw-r--r--packages/website/ts/containers/web3_wrapper_documentation.ts3
-rw-r--r--packages/website/ts/containers/zero_ex_js_documentation.ts36
-rw-r--r--packages/website/ts/globals.d.ts1
-rw-r--r--packages/website/ts/index.tsx3
-rw-r--r--packages/website/ts/pages/about/about.tsx44
-rw-r--r--packages/website/ts/pages/documentation/doc_page.tsx26
-rw-r--r--packages/website/ts/pages/landing/landing.tsx536
-rw-r--r--packages/website/ts/redux/dispatcher.ts11
-rw-r--r--packages/website/ts/redux/reducer.ts18
-rw-r--r--packages/website/ts/schemas/portal_order_schema.ts2
-rw-r--r--packages/website/ts/types.ts34
-rw-r--r--packages/website/ts/utils/analytics.ts18
-rw-r--r--packages/website/ts/utils/configs.ts27
-rw-r--r--packages/website/ts/utils/constants.ts7
-rw-r--r--packages/website/ts/utils/doc_utils.ts4
-rw-r--r--packages/website/ts/utils/order_parser.ts23
-rw-r--r--packages/website/ts/utils/token_address_overrides.ts24
-rw-r--r--packages/website/ts/utils/utils.ts71
-rw-r--r--packages/website/tsconfig.json5
514 files changed, 43684 insertions, 110757 deletions
diff --git a/packages/0x.js/CHANGELOG.json b/packages/0x.js/CHANGELOG.json
index 0a43abe89..391335390 100644
--- a/packages/0x.js/CHANGELOG.json
+++ b/packages/0x.js/CHANGELOG.json
@@ -1,5 +1,59 @@
[
{
+ "timestamp": 1537907159,
+ "version": "1.0.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1537875740,
+ "version": "1.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1537541580,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Drastically reduce the bundle size by removing unused parts of included contract artifacts."
+ }
+ ],
+ "timestamp": 1537369748
+ },
+ {
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Add ZRX & WETH mainnet contract addresses into the included artifacts"
+ }
+ ],
+ "timestamp": 1537265493
+ },
+ {
+ "timestamp": 1536142250,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"version": "1.0.1-rc.6",
"changes": [
{
diff --git a/packages/0x.js/CHANGELOG.md b/packages/0x.js/CHANGELOG.md
index 65cbbb8fe..b9b329085 100644
--- a/packages/0x.js/CHANGELOG.md
+++ b/packages/0x.js/CHANGELOG.md
@@ -5,6 +5,30 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v1.0.6 - _September 25, 2018_
+
+ * Dependencies updated
+
+## v1.0.5 - _September 25, 2018_
+
+ * Dependencies updated
+
+## v1.0.4 - _September 21, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _September 19, 2018_
+
+ * Drastically reduce the bundle size by removing unused parts of included contract artifacts.
+
+## v1.0.2 - _September 18, 2018_
+
+ * Add ZRX & WETH mainnet contract addresses into the included artifacts
+
+## v1.0.1 - _September 5, 2018_
+
+ * Dependencies updated
+
## v1.0.1-rc.6 - _August 27, 2018_
* Fix missing `BlockParamLiteral` type import issue
diff --git a/packages/0x.js/README.md b/packages/0x.js/README.md
index fd6217151..329037324 100644
--- a/packages/0x.js/README.md
+++ b/packages/0x.js/README.md
@@ -1,6 +1,6 @@
## 0x.js
-A TypeScript/Javascript library for interacting with the 0x protocol.
+A TypeScript/Javascript library for interacting with the 0x protocol. It is a high level package which combines a number of underlying packages such as order-utils and order-watcher.
### Read the [Documentation](https://0xproject.com/docs/0x.js).
@@ -19,7 +19,14 @@ npm install 0x.js --save
**Import**
```javascript
-import { ZeroEx } from '0x.js';
+import {
+ assetDataUtils,
+ BigNumber,
+ ContractWrappers,
+ generatePseudoRandomSalt,
+ orderHashUtils,
+ signatureUtils,
+} from '0x.js';
```
If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
diff --git a/packages/0x.js/package.json b/packages/0x.js/package.json
index c3adb496e..16650be3f 100644
--- a/packages/0x.js/package.json
+++ b/packages/0x.js/package.json
@@ -1,6 +1,6 @@
{
"name": "0x.js",
- "version": "1.0.1-rc.6",
+ "version": "1.0.6",
"engines": {
"node": ">=6.12"
},
@@ -15,7 +15,6 @@
"main": "lib/index.js",
"types": "lib/index.d.ts",
"scripts": {
- "watch_without_deps": "tsc -w",
"build": "yarn build:all",
"build:all": "run-p build:umd:prod build:commonjs",
"lint": "tslint --project . --exclude **/src/generated_contract_wrappers/**/*",
@@ -25,8 +24,8 @@
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
"clean": "shx rm -rf _bundles lib test_temp src/generated_contract_wrappers generated_docs",
"build:umd:prod": "NODE_ENV=production webpack",
- "build:commonjs": "tsc",
- "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES"
+ "build:commonjs": "tsc -b",
+ "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES"
},
"config": {
"postpublish": {
@@ -42,15 +41,16 @@
},
"license": "Apache-2.0",
"devDependencies": {
- "@0xproject/abi-gen": "^1.0.7",
- "@0xproject/dev-utils": "^1.0.6",
- "@0xproject/migrations": "^1.0.6",
- "@0xproject/monorepo-scripts": "^1.0.7",
- "@0xproject/tslint-config": "^1.0.6",
+ "@0xproject/abi-gen": "^1.0.11",
+ "@0xproject/dev-utils": "^1.0.10",
+ "@0xproject/migrations": "^1.0.12",
+ "@0xproject/monorepo-scripts": "^1.0.9",
+ "@0xproject/tslint-config": "^1.0.7",
"@types/lodash": "4.14.104",
"@types/mocha": "^2.2.42",
- "@types/node": "^8.0.53",
+ "@types/node": "*",
"@types/sinon": "^2.2.2",
+ "@types/web3-provider-engine": "^14.0.0",
"awesome-typescript-loader": "^3.1.3",
"chai": "^4.0.1",
"chai-as-promised": "^7.1.0",
@@ -73,18 +73,18 @@
"webpack": "^3.1.0"
},
"dependencies": {
- "@0xproject/assert": "^1.0.7",
- "@0xproject/base-contract": "^2.0.1",
- "@0xproject/contract-wrappers": "^1.0.1-rc.5",
- "@0xproject/order-utils": "^1.0.1-rc.6",
- "@0xproject/order-watcher": "^1.0.1-rc.5",
- "@0xproject/subproviders": "^2.0.1",
- "@0xproject/types": "^1.0.1-rc.6",
- "@0xproject/typescript-typings": "^1.0.5",
- "@0xproject/utils": "^1.0.7",
- "@0xproject/web3-wrapper": "^2.0.1",
- "ethereum-types": "^1.0.5",
- "ethers": "3.0.22",
+ "@0xproject/assert": "^1.0.11",
+ "@0xproject/base-contract": "^2.0.5",
+ "@0xproject/contract-wrappers": "^2.0.0",
+ "@0xproject/order-utils": "^1.0.5",
+ "@0xproject/order-watcher": "^2.0.0",
+ "@0xproject/subproviders": "^2.0.5",
+ "@0xproject/types": "^1.1.1",
+ "@0xproject/typescript-typings": "^2.0.2",
+ "@0xproject/utils": "^1.0.11",
+ "@0xproject/web3-wrapper": "^3.0.1",
+ "ethereum-types": "^1.0.8",
+ "ethers": "4.0.0-beta.14",
"lodash": "^4.17.5",
"web3-provider-engine": "14.0.6"
},
diff --git a/packages/0x.js/src/index.ts b/packages/0x.js/src/index.ts
index 7058a898f..d07bfcfc8 100644
--- a/packages/0x.js/src/index.ts
+++ b/packages/0x.js/src/index.ts
@@ -9,6 +9,7 @@ export {
ERC20ProxyWrapper,
ERC721ProxyWrapper,
ForwarderWrapper,
+ OrderValidatorWrapper,
IndexedFilterValues,
BlockRange,
ContractWrappersConfig,
@@ -42,6 +43,10 @@ export {
DecodedLogEvent,
ExchangeEventArgs,
TransactionEncoder,
+ BalanceAndAllowance,
+ OrderAndTraderInfo,
+ TraderInfo,
+ ValidateOrderFillableOpts,
} from '@0xproject/contract-wrappers';
export { OrderWatcher, OnOrderStateChangeCallback, OrderWatcherConfig } from '@0xproject/order-watcher';
diff --git a/packages/0x.js/tsconfig.json b/packages/0x.js/tsconfig.json
index e35816553..a96536716 100644
--- a/packages/0x.js/tsconfig.json
+++ b/packages/0x.js/tsconfig.json
@@ -1,7 +1,8 @@
{
"extends": "../../tsconfig",
"compilerOptions": {
- "outDir": "lib"
+ "outDir": "lib",
+ "rootDir": "src"
},
- "include": ["./src/**/*", "./test/**/*"]
+ "include": ["./src/**/*"]
}
diff --git a/packages/forwarder-helper/tsconfig.json b/packages/0x.js/typedoc-tsconfig.json
index e35816553..c9b0af1ae 100644
--- a/packages/forwarder-helper/tsconfig.json
+++ b/packages/0x.js/typedoc-tsconfig.json
@@ -1,5 +1,5 @@
{
- "extends": "../../tsconfig",
+ "extends": "../../typedoc-tsconfig",
"compilerOptions": {
"outDir": "lib"
},
diff --git a/packages/0x.js/webpack.config.js b/packages/0x.js/webpack.config.js
index 982e076ee..1ad0a79ec 100644
--- a/packages/0x.js/webpack.config.js
+++ b/packages/0x.js/webpack.config.js
@@ -47,8 +47,13 @@ module.exports = {
use: [
{
loader: 'awesome-typescript-loader',
+ // tsconfig.json contains some options required for
+ // project references which do not work with webback.
+ // We override those options here.
query: {
declaration: false,
+ declarationMap: false,
+ composite: false,
},
},
],
diff --git a/packages/abi-gen/CHANGELOG.json b/packages/abi-gen/CHANGELOG.json
index 46297a778..578557165 100644
--- a/packages/abi-gen/CHANGELOG.json
+++ b/packages/abi-gen/CHANGELOG.json
@@ -1,5 +1,41 @@
[
{
+ "timestamp": 1537907159,
+ "version": "1.0.11",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1537875740,
+ "version": "1.0.10",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1537541580,
+ "version": "1.0.9",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1536142250,
+ "version": "1.0.8",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1535377027,
"version": "1.0.7",
"changes": [
diff --git a/packages/abi-gen/CHANGELOG.md b/packages/abi-gen/CHANGELOG.md
index 61f124337..ee46ca2a9 100644
--- a/packages/abi-gen/CHANGELOG.md
+++ b/packages/abi-gen/CHANGELOG.md
@@ -5,6 +5,22 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v1.0.11 - _September 25, 2018_
+
+ * Dependencies updated
+
+## v1.0.10 - _September 25, 2018_
+
+ * Dependencies updated
+
+## v1.0.9 - _September 21, 2018_
+
+ * Dependencies updated
+
+## v1.0.8 - _September 5, 2018_
+
+ * Dependencies updated
+
## v1.0.7 - _August 27, 2018_
* Dependencies updated
diff --git a/packages/abi-gen/package.json b/packages/abi-gen/package.json
index 000e8cee0..314addf52 100644
--- a/packages/abi-gen/package.json
+++ b/packages/abi-gen/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/abi-gen",
- "version": "1.0.7",
+ "version": "1.0.11",
"engines": {
"node": ">=6.12"
},
@@ -8,10 +8,9 @@
"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",
"scripts": {
- "watch_without_deps": "tsc -w",
"lint": "tslint --project .",
"clean": "shx rm -rf lib",
- "build": "tsc",
+ "build": "tsc -b",
"test": "yarn run_mocha",
"run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js --bail --exit",
"test:circleci": "yarn test:coverage",
@@ -31,10 +30,10 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/abi-gen/README.md",
"dependencies": {
- "@0xproject/typescript-typings": "^1.0.5",
- "@0xproject/utils": "^1.0.7",
+ "@0xproject/typescript-typings": "^2.0.2",
+ "@0xproject/utils": "^1.0.11",
"chalk": "^2.3.0",
- "ethereum-types": "^1.0.5",
+ "ethereum-types": "^1.0.8",
"glob": "^7.1.2",
"handlebars": "^4.0.11",
"lodash": "^4.17.5",
@@ -45,11 +44,11 @@
"yargs": "^10.0.3"
},
"devDependencies": {
- "@0xproject/tslint-config": "^1.0.6",
+ "@0xproject/tslint-config": "^1.0.7",
"@types/glob": "5.0.35",
"@types/handlebars": "^4.0.36",
"@types/mkdirp": "^0.5.1",
- "@types/node": "^8.0.53",
+ "@types/node": "*",
"@types/sleep": "^0.0.7",
"@types/tmp": "^0.0.33",
"@types/yargs": "^10.0.0",
diff --git a/packages/abi-gen/tsconfig.json b/packages/abi-gen/tsconfig.json
index e35816553..2ee711adc 100644
--- a/packages/abi-gen/tsconfig.json
+++ b/packages/abi-gen/tsconfig.json
@@ -1,7 +1,8 @@
{
"extends": "../../tsconfig",
"compilerOptions": {
- "outDir": "lib"
+ "outDir": "lib",
+ "rootDir": "."
},
"include": ["./src/**/*", "./test/**/*"]
}
diff --git a/packages/assert/CHANGELOG.json b/packages/assert/CHANGELOG.json
index b624d56fd..0aa9038d8 100644
--- a/packages/assert/CHANGELOG.json
+++ b/packages/assert/CHANGELOG.json
@@ -1,5 +1,41 @@
[
{
+ "timestamp": 1537907159,
+ "version": "1.0.11",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1537875740,
+ "version": "1.0.10",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1537541580,
+ "version": "1.0.9",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1536142250,
+ "version": "1.0.8",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1535377027,
"version": "1.0.7",
"changes": [
diff --git a/packages/assert/CHANGELOG.md b/packages/assert/CHANGELOG.md
index fc932cbb3..dab9f933b 100644
--- a/packages/assert/CHANGELOG.md
+++ b/packages/assert/CHANGELOG.md
@@ -5,6 +5,22 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v1.0.11 - _September 25, 2018_
+
+ * Dependencies updated
+
+## v1.0.10 - _September 25, 2018_
+
+ * Dependencies updated
+
+## v1.0.9 - _September 21, 2018_
+
+ * Dependencies updated
+
+## v1.0.8 - _September 5, 2018_
+
+ * Dependencies updated
+
## v1.0.7 - _August 27, 2018_
* Dependencies updated
diff --git a/packages/assert/package.json b/packages/assert/package.json
index 2dea4b616..3726f4136 100644
--- a/packages/assert/package.json
+++ b/packages/assert/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/assert",
- "version": "1.0.7",
+ "version": "1.0.11",
"engines": {
"node": ">=6.12"
},
@@ -8,8 +8,7 @@
"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",
"scripts": {
- "watch_without_deps": "tsc -w",
- "build": "tsc",
+ "build": "tsc -b",
"clean": "shx rm -rf lib test_temp",
"lint": "tslint --project .",
"run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js --exit",
@@ -29,7 +28,7 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/assert/README.md",
"devDependencies": {
- "@0xproject/tslint-config": "^1.0.6",
+ "@0xproject/tslint-config": "^1.0.7",
"@types/lodash": "4.14.104",
"@types/mocha": "^2.2.42",
"@types/valid-url": "^1.0.2",
@@ -45,9 +44,9 @@
"typescript": "3.0.1"
},
"dependencies": {
- "@0xproject/json-schemas": "^1.0.1-rc.6",
- "@0xproject/typescript-typings": "^1.0.5",
- "@0xproject/utils": "^1.0.7",
+ "@0xproject/json-schemas": "^1.0.4",
+ "@0xproject/typescript-typings": "^2.0.2",
+ "@0xproject/utils": "^1.0.11",
"lodash": "^4.17.5",
"valid-url": "^1.0.9"
},
diff --git a/packages/assert/tsconfig.json b/packages/assert/tsconfig.json
index e35816553..2ee711adc 100644
--- a/packages/assert/tsconfig.json
+++ b/packages/assert/tsconfig.json
@@ -1,7 +1,8 @@
{
"extends": "../../tsconfig",
"compilerOptions": {
- "outDir": "lib"
+ "outDir": "lib",
+ "rootDir": "."
},
"include": ["./src/**/*", "./test/**/*"]
}
diff --git a/packages/forwarder-helper/.npmignore b/packages/asset-buyer/.npmignore
index 5333847e7..5333847e7 100644
--- a/packages/forwarder-helper/.npmignore
+++ b/packages/asset-buyer/.npmignore
diff --git a/packages/asset-buyer/CHANGELOG.json b/packages/asset-buyer/CHANGELOG.json
new file mode 100644
index 000000000..d673f0a45
--- /dev/null
+++ b/packages/asset-buyer/CHANGELOG.json
@@ -0,0 +1,28 @@
+[
+ {
+ "timestamp": 1537907159,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1537875740,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "1.0.0-rc.1",
+ "changes": [
+ {
+ "note": "Init"
+ }
+ ]
+ }
+]
diff --git a/packages/forwarder-helper/CHANGELOG.md b/packages/asset-buyer/CHANGELOG.md
index 5be6a6959..bea4a551b 100644
--- a/packages/forwarder-helper/CHANGELOG.md
+++ b/packages/asset-buyer/CHANGELOG.md
@@ -5,10 +5,14 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
-## v1.0.1-rc.2 - _August 27, 2018_
+## v1.0.1 - _September 25, 2018_
* Dependencies updated
-## v1.0.1-rc.1 - _August 24, 2018_
+## v1.0.0 - _September 25, 2018_
- * Add initial forwarderHelperFactory (#997)
+ * Dependencies updated
+
+## v1.0.0-rc.1 - _Invalid date_
+
+ * Init
diff --git a/packages/asset-buyer/README.md b/packages/asset-buyer/README.md
new file mode 100644
index 000000000..5f7f26f30
--- /dev/null
+++ b/packages/asset-buyer/README.md
@@ -0,0 +1,83 @@
+## @0xproject/asset-buyer
+
+Convenience package for buying assets represented on the Ethereum blockchain using 0x. In its simplest form, the package helps in the usage of the [0x forwarder contract](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/forwarder-specification.md), which allows users to execute [Wrapped Ether](https://weth.io/) based 0x orders without having to set allowances, wrap Ether or buy ZRX, meaning they can buy tokens with Ether alone. Given some liquidity (0x signed orders), it helps estimate the Ether cost of buying a certain asset (giving a range) and then buying that asset.
+
+In its more advanced and useful form, it integrates with the [Standard Relayer API](https://github.com/0xProject/standard-relayer-api) and takes care of sourcing liquidity for you given an SRA compliant endpoint. The final result is a library that tells you what assets are available, provides an Ether based quote for any asset desired, and allows you to buy that asset using Ether alone.
+
+## Installation
+
+```bash
+yarn add @0xproject/asset-buyer
+```
+
+**Import**
+
+```typescript
+import { AssetBuyer } from '@0xproject/asset-buyer';
+```
+
+or
+
+```javascript
+var AssetBuyer = require('@0xproject/asset-buyer').AssetBuyer;
+```
+
+If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
+
+```json
+"compilerOptions": {
+ "typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
+}
+```
+
+## Contributing
+
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
+
+Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
+
+### Install dependencies
+
+If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
+
+```bash
+yarn config set workspaces-experimental true
+```
+
+Then install dependencies
+
+```bash
+yarn install
+```
+
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/asset-buyer yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/asset-buyer yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
+```
+
+### Run Tests
+
+```bash
+yarn test
+```
diff --git a/packages/forwarder-helper/package.json b/packages/asset-buyer/package.json
index fccd7ccdd..ff0afb782 100644
--- a/packages/forwarder-helper/package.json
+++ b/packages/asset-buyer/package.json
@@ -1,10 +1,10 @@
{
- "name": "@0xproject/forwarder-helper",
- "version": "1.0.1-rc.2",
+ "name": "@0xproject/asset-buyer",
+ "version": "1.0.1",
"engines": {
"node": ">=6.12"
},
- "description": "Convenience object for working with the forwarder contract",
+ "description": "Convenience package for buying assets",
"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",
"scripts": {
@@ -18,10 +18,7 @@
"run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js --exit",
"clean": "shx rm -rf lib test_temp scripts",
"build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
- "manual:postpublish": "yarn build; node ./scripts/postpublish.js",
- "docs:stage": "node scripts/stage_docs.js",
- "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
- "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json"
+ "manual:postpublish": "yarn build; node ./scripts/postpublish.js"
},
"config": {
"postpublish": {
@@ -37,21 +34,26 @@
"bugs": {
"url": "https://github.com/0xProject/0x-monorepo/issues"
},
- "homepage": "https://github.com/0xProject/0x-monorepo/packages/forwarder-helper/README.md",
+ "homepage": "https://github.com/0xProject/0x-monorepo/packages/asset-buyer/README.md",
"dependencies": {
- "@0xproject/assert": "^1.0.7",
- "@0xproject/json-schemas": "^1.0.1-rc.6",
- "@0xproject/order-utils": "^1.0.1-rc.6",
- "@0xproject/types": "^1.0.1-rc.6",
- "@0xproject/typescript-typings": "^1.0.5",
- "@0xproject/utils": "^1.0.7",
- "@types/node": "^8.0.53",
+ "@0xproject/assert": "^1.0.11",
+ "@0xproject/connect": "^2.0.4",
+ "@0xproject/contract-wrappers": "^2.0.0",
+ "@0xproject/json-schemas": "^1.0.4",
+ "@0xproject/order-utils": "^1.0.5",
+ "@0xproject/subproviders": "^2.0.5",
+ "@0xproject/types": "^1.1.1",
+ "@0xproject/typescript-typings": "^2.0.2",
+ "@0xproject/utils": "^1.0.11",
+ "@0xproject/web3-wrapper": "^3.0.1",
+ "ethereum-types": "^1.0.8",
"lodash": "^4.17.10"
},
"devDependencies": {
- "@0xproject/tslint-config": "^1.0.6",
+ "@0xproject/tslint-config": "^1.0.7",
"@types/lodash": "^4.14.116",
"@types/mocha": "^2.2.42",
+ "@types/node": "*",
"chai": "^4.0.1",
"chai-as-promised": "^7.1.0",
"chai-bignumber": "^2.0.1",
@@ -63,7 +65,7 @@
"nyc": "^11.0.1",
"shx": "^0.2.2",
"tslint": "5.11.0",
- "typedoc": "0xProject/typedoc",
+ "typedoc": "0.12.0",
"typescript": "3.0.1"
},
"publishConfig": {
diff --git a/packages/asset-buyer/src/asset_buyer.ts b/packages/asset-buyer/src/asset_buyer.ts
new file mode 100644
index 000000000..409e34e74
--- /dev/null
+++ b/packages/asset-buyer/src/asset_buyer.ts
@@ -0,0 +1,324 @@
+import { ContractWrappers } from '@0xproject/contract-wrappers';
+import { schemas } from '@0xproject/json-schemas';
+import { SignedOrder } from '@0xproject/order-utils';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { constants } from './constants';
+import { BasicOrderProvider } from './order_providers/basic_order_provider';
+import { StandardRelayerAPIOrderProvider } from './order_providers/standard_relayer_api_order_provider';
+import {
+ AssetBuyerError,
+ AssetBuyerOrdersAndFillableAmounts,
+ BuyQuote,
+ BuyQuoteRequestOpts,
+ OrderProvider,
+ OrderProviderResponse,
+} from './types';
+
+import { assert } from './utils/assert';
+import { assetDataUtils } from './utils/asset_data_utils';
+import { buyQuoteCalculator } from './utils/buy_quote_calculator';
+import { orderProviderResponseProcessor } from './utils/order_provider_response_processor';
+
+export class AssetBuyer {
+ public readonly provider: Provider;
+ public readonly assetData: string;
+ public readonly orderProvider: OrderProvider;
+ public readonly networkId: number;
+ public readonly orderRefreshIntervalMs: number;
+ public readonly expiryBufferSeconds: number;
+ private readonly _contractWrappers: ContractWrappers;
+ private _lastRefreshTimeIfExists?: number;
+ private _currentOrdersAndFillableAmountsIfExists?: AssetBuyerOrdersAndFillableAmounts;
+ /**
+ * Instantiates a new AssetBuyer instance given existing liquidity in the form of orders and feeOrders.
+ * @param provider The Provider instance you would like to use for interacting with the Ethereum network.
+ * @param orders A non-empty array of objects that conform to SignedOrder. All orders must have the same makerAssetData and takerAssetData (WETH).
+ * @param feeOrders A array of objects that conform to SignedOrder. All orders must have the same makerAssetData (ZRX) and takerAssetData (WETH). Defaults to an empty array.
+ * @param networkId The ethereum network id. Defaults to 1 (mainnet).
+ * @param orderRefreshIntervalMs The interval in ms that getBuyQuoteAsync should trigger an refresh of orders and order states. Defaults to 10000ms (10s).
+ * @param expiryBufferSeconds The number of seconds to add when calculating whether an order is expired or not. Defaults to 15s.
+ *
+ * @return An instance of AssetBuyer
+ */
+ public static getAssetBuyerForProvidedOrders(
+ provider: Provider,
+ orders: SignedOrder[],
+ feeOrders: SignedOrder[] = [],
+ networkId: number = constants.MAINNET_NETWORK_ID,
+ orderRefreshIntervalMs: number = constants.DEFAULT_ORDER_REFRESH_INTERVAL_MS,
+ expiryBufferSeconds: number = constants.DEFAULT_EXPIRY_BUFFER_SECONDS,
+ ): AssetBuyer {
+ assert.isWeb3Provider('provider', provider);
+ assert.doesConformToSchema('orders', orders, schemas.signedOrdersSchema);
+ assert.doesConformToSchema('feeOrders', feeOrders, schemas.signedOrdersSchema);
+ assert.isNumber('networkId', networkId);
+ assert.isNumber('orderRefreshIntervalMs', orderRefreshIntervalMs);
+ assert.areValidProvidedOrders('orders', orders);
+ assert.areValidProvidedOrders('feeOrders', feeOrders);
+ assert.assert(orders.length !== 0, `Expected orders to contain at least one order`);
+ const assetData = orders[0].makerAssetData;
+ const orderProvider = new BasicOrderProvider(_.concat(orders, feeOrders));
+ const assetBuyer = new AssetBuyer(
+ provider,
+ assetData,
+ orderProvider,
+ networkId,
+ orderRefreshIntervalMs,
+ expiryBufferSeconds,
+ );
+ return assetBuyer;
+ }
+ /**
+ * Instantiates a new AssetBuyer instance given the desired assetData and a [Standard Relayer API](https://github.com/0xProject/standard-relayer-api) endpoint
+ * @param provider The Provider instance you would like to use for interacting with the Ethereum network.
+ * @param assetData The assetData that identifies the desired asset to buy.
+ * @param sraApiUrl The standard relayer API base HTTP url you would like to source orders from.
+ * @param networkId The ethereum network id. Defaults to 1 (mainnet).
+ * @param orderRefreshIntervalMs The interval in ms that getBuyQuoteAsync should trigger an refresh of orders and order states. Defaults to 10000ms (10s).
+ * @param expiryBufferSeconds The number of seconds to add when calculating whether an order is expired or not. Defaults to 15s.
+ *
+ * @return An instance of AssetBuyer
+ */
+ public static getAssetBuyerForAssetData(
+ provider: Provider,
+ assetData: string,
+ sraApiUrl: string,
+ networkId: number = constants.MAINNET_NETWORK_ID,
+ orderRefreshIntervalMs: number = constants.DEFAULT_ORDER_REFRESH_INTERVAL_MS,
+ expiryBufferSeconds: number = constants.DEFAULT_EXPIRY_BUFFER_SECONDS,
+ ): AssetBuyer {
+ assert.isWeb3Provider('provider', provider);
+ assert.isHexString('assetData', assetData);
+ assert.isWebUri('sraApiUrl', sraApiUrl);
+ assert.isNumber('networkId', networkId);
+ assert.isNumber('orderRefreshIntervalMs', orderRefreshIntervalMs);
+ const orderProvider = new StandardRelayerAPIOrderProvider(sraApiUrl);
+ const assetBuyer = new AssetBuyer(
+ provider,
+ assetData,
+ orderProvider,
+ networkId,
+ orderRefreshIntervalMs,
+ expiryBufferSeconds,
+ );
+ return assetBuyer;
+ }
+ /**
+ * Instantiates a new AssetBuyer instance given the desired ERC20 token address and a [Standard Relayer API](https://github.com/0xProject/standard-relayer-api) endpoint
+ * @param provider The Provider instance you would like to use for interacting with the Ethereum network.
+ * @param tokenAddress The ERC20 token address that identifies the desired asset to buy.
+ * @param sraApiUrl The standard relayer API base HTTP url you would like to source orders from.
+ * @param networkId The ethereum network id. Defaults to 1 (mainnet).
+ * @param orderRefreshIntervalMs The interval in ms that getBuyQuoteAsync should trigger an refresh of orders and order states. Defaults to 10000ms (10s).
+ * @param expiryBufferSeconds The number of seconds to add when calculating whether an order is expired or not. Defaults to 15s.
+ * @return An instance of AssetBuyer
+ */
+ public static getAssetBuyerForERC20TokenAddress(
+ provider: Provider,
+ tokenAddress: string,
+ sraApiUrl: string,
+ networkId: number = constants.MAINNET_NETWORK_ID,
+ orderRefreshIntervalMs: number = constants.DEFAULT_ORDER_REFRESH_INTERVAL_MS,
+ expiryBufferSeconds: number = constants.DEFAULT_EXPIRY_BUFFER_SECONDS,
+ ): AssetBuyer {
+ assert.isWeb3Provider('provider', provider);
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ assert.isWebUri('sraApiUrl', sraApiUrl);
+ assert.isNumber('networkId', networkId);
+ assert.isNumber('orderRefreshIntervalMs', orderRefreshIntervalMs);
+ const assetData = assetDataUtils.encodeERC20AssetData(tokenAddress);
+ const assetBuyer = AssetBuyer.getAssetBuyerForAssetData(
+ provider,
+ assetData,
+ sraApiUrl,
+ networkId,
+ orderRefreshIntervalMs,
+ expiryBufferSeconds,
+ );
+ return assetBuyer;
+ }
+ /**
+ * Instantiates a new AssetBuyer instance
+ * @param provider The Provider instance you would like to use for interacting with the Ethereum network.
+ * @param assetData The assetData of the desired asset to buy (for more info: https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md).
+ * @param orderProvider An object that conforms to OrderProvider, see type for definition.
+ * @param networkId The ethereum network id. Defaults to 1 (mainnet).
+ * @param orderRefreshIntervalMs The interval in ms that getBuyQuoteAsync should trigger an refresh of orders and order states. Defaults to 10000ms (10s).
+ * @param expiryBufferSeconds The number of seconds to add when calculating whether an order is expired or not. Defaults to 15s.
+ *
+ * @return An instance of AssetBuyer
+ */
+ constructor(
+ provider: Provider,
+ assetData: string,
+ orderProvider: OrderProvider,
+ networkId: number = constants.MAINNET_NETWORK_ID,
+ orderRefreshIntervalMs: number = constants.DEFAULT_ORDER_REFRESH_INTERVAL_MS,
+ expiryBufferSeconds: number = constants.DEFAULT_EXPIRY_BUFFER_SECONDS,
+ ) {
+ assert.isWeb3Provider('provider', provider);
+ assert.isString('assetData', assetData);
+ assert.isValidOrderProvider('orderProvider', orderProvider);
+ assert.isNumber('networkId', networkId);
+ assert.isNumber('orderRefreshIntervalMs', orderRefreshIntervalMs);
+ this.provider = provider;
+ this.assetData = assetData;
+ this.orderProvider = orderProvider;
+ this.networkId = networkId;
+ this.expiryBufferSeconds = expiryBufferSeconds;
+ this.orderRefreshIntervalMs = orderRefreshIntervalMs;
+ this._contractWrappers = new ContractWrappers(this.provider, {
+ networkId,
+ });
+ }
+ /**
+ * Get a `BuyQuote` containing all information relevant to fulfilling a buy.
+ * You can then pass the `BuyQuote` to `executeBuyQuoteAsync` to execute the buy.
+ * @param assetBuyAmount The amount of asset to buy.
+ * @param feePercentage The affiliate fee percentage. Defaults to 0.
+ * @param forceOrderRefresh If set to true, new orders and state will be fetched instead of waiting for
+ * the next orderRefreshIntervalMs. Defaults to false.
+ * @return An object that conforms to BuyQuote that satisfies the request. See type definition for more information.
+ */
+ public async getBuyQuoteAsync(assetBuyAmount: BigNumber, options: Partial<BuyQuoteRequestOpts>): Promise<BuyQuote> {
+ const { feePercentage, shouldForceOrderRefresh, slippagePercentage } = {
+ ...options,
+ ...constants.DEFAULT_BUY_QUOTE_REQUEST_OPTS,
+ };
+ assert.isBigNumber('assetBuyAmount', assetBuyAmount);
+ assert.isValidPercentage('feePercentage', feePercentage);
+ assert.isBoolean('shouldForceOrderRefresh', shouldForceOrderRefresh);
+ // we should refresh if:
+ // we do not have any orders OR
+ // we are forced to OR
+ // we have some last refresh time AND that time was sufficiently long ago
+ const shouldRefresh =
+ _.isUndefined(this._currentOrdersAndFillableAmountsIfExists) ||
+ shouldForceOrderRefresh ||
+ (!_.isUndefined(this._lastRefreshTimeIfExists) &&
+ this._lastRefreshTimeIfExists + this.orderRefreshIntervalMs < Date.now());
+ let ordersAndFillableAmounts: AssetBuyerOrdersAndFillableAmounts;
+ if (shouldRefresh) {
+ ordersAndFillableAmounts = await this._getLatestOrdersAndFillableAmountsAsync();
+ this._lastRefreshTimeIfExists = Date.now();
+ this._currentOrdersAndFillableAmountsIfExists = ordersAndFillableAmounts;
+ } else {
+ // it is safe to cast to AssetBuyerOrdersAndFillableAmounts because shouldRefresh catches the undefined case above
+ ordersAndFillableAmounts = this
+ ._currentOrdersAndFillableAmountsIfExists as AssetBuyerOrdersAndFillableAmounts;
+ }
+ const buyQuote = buyQuoteCalculator.calculate(
+ ordersAndFillableAmounts,
+ assetBuyAmount,
+ feePercentage,
+ slippagePercentage,
+ );
+ return buyQuote;
+ }
+ /**
+ * Given a BuyQuote and desired rate, attempt to execute the buy.
+ * @param buyQuote An object that conforms to BuyQuote. See type definition for more information.
+ * @param rate The desired rate to execute the buy at. Affects the amount of ETH sent with the transaction, defaults to buyQuote.maxRate.
+ * @param takerAddress The address to perform the buy. Defaults to the first available address from the provider.
+ * @param feeRecipient The address where affiliate fees are sent. Defaults to null address (0x000...000).
+ * @return A promise of the txHash.
+ */
+ public async executeBuyQuoteAsync(
+ buyQuote: BuyQuote,
+ rate?: BigNumber,
+ takerAddress?: string,
+ feeRecipient: string = constants.NULL_ADDRESS,
+ ): Promise<string> {
+ assert.isValidBuyQuote('buyQuote', buyQuote);
+ if (!_.isUndefined(rate)) {
+ assert.isBigNumber('rate', rate);
+ }
+ if (!_.isUndefined(takerAddress)) {
+ assert.isETHAddressHex('takerAddress', takerAddress);
+ }
+ assert.isETHAddressHex('feeRecipient', feeRecipient);
+ const { orders, feeOrders, feePercentage, assetBuyAmount, maxRate } = buyQuote;
+ // if no takerAddress is provided, try to get one from the provider
+ let finalTakerAddress;
+ if (!_.isUndefined(takerAddress)) {
+ finalTakerAddress = takerAddress;
+ } else {
+ const web3Wrapper = new Web3Wrapper(this.provider);
+ const availableAddresses = await web3Wrapper.getAvailableAddressesAsync();
+ const firstAvailableAddress = _.head(availableAddresses);
+ if (!_.isUndefined(firstAvailableAddress)) {
+ finalTakerAddress = firstAvailableAddress;
+ } else {
+ throw new Error(AssetBuyerError.NoAddressAvailable);
+ }
+ }
+ // if no rate is provided, default to the maxRate from buyQuote
+ const desiredRate = rate || maxRate;
+ // calculate how much eth is required to buy assetBuyAmount at the desired rate
+ const ethAmount = assetBuyAmount.dividedToIntegerBy(desiredRate);
+ const txHash = await this._contractWrappers.forwarder.marketBuyOrdersWithEthAsync(
+ orders,
+ assetBuyAmount,
+ finalTakerAddress,
+ ethAmount,
+ feeOrders,
+ feePercentage,
+ feeRecipient,
+ );
+ return txHash;
+ }
+ /**
+ * Ask the order Provider for orders and process them.
+ */
+ private async _getLatestOrdersAndFillableAmountsAsync(): Promise<AssetBuyerOrdersAndFillableAmounts> {
+ const etherTokenAssetData = this._getEtherTokenAssetDataOrThrow();
+ const zrxTokenAssetData = this._getZrxTokenAssetDataOrThrow();
+ // construct order Provider requests
+ const targetOrderProviderRequest = {
+ makerAssetData: this.assetData,
+ takerAssetData: etherTokenAssetData,
+ networkId: this.networkId,
+ };
+ const feeOrderProviderRequest = {
+ makerAssetData: zrxTokenAssetData,
+ takerAssetData: etherTokenAssetData,
+ networkId: this.networkId,
+ };
+ const requests = [targetOrderProviderRequest, feeOrderProviderRequest];
+ // fetch orders and possible fillable amounts
+ const [targetOrderProviderResponse, feeOrderProviderResponse] = await Promise.all(
+ _.map(requests, async request => this.orderProvider.getOrdersAsync(request)),
+ );
+ // since the order provider is an injected dependency, validate that it respects the API
+ // ie. it should only return maker/taker assetDatas that are specified
+ orderProviderResponseProcessor.throwIfInvalidResponse(targetOrderProviderResponse, targetOrderProviderRequest);
+ orderProviderResponseProcessor.throwIfInvalidResponse(feeOrderProviderResponse, feeOrderProviderRequest);
+ // process the responses into one object
+ const ordersAndFillableAmounts = await orderProviderResponseProcessor.processAsync(
+ targetOrderProviderResponse,
+ feeOrderProviderResponse,
+ zrxTokenAssetData,
+ this.expiryBufferSeconds,
+ this._contractWrappers.orderValidator,
+ );
+ return ordersAndFillableAmounts;
+ }
+ /**
+ * Get the assetData that represents the WETH token.
+ * Will throw if WETH does not exist for the current network.
+ */
+ private _getEtherTokenAssetDataOrThrow(): string {
+ return assetDataUtils.getEtherTokenAssetDataOrThrow(this._contractWrappers);
+ }
+ /**
+ * Get the assetData that represents the ZRX token.
+ * Will throw if ZRX does not exist for the current network.
+ */
+ private _getZrxTokenAssetDataOrThrow(): string {
+ return assetDataUtils.getZrxTokenAssetDataOrThrow(this._contractWrappers);
+ }
+}
diff --git a/packages/asset-buyer/src/constants.ts b/packages/asset-buyer/src/constants.ts
new file mode 100644
index 000000000..79b5d9052
--- /dev/null
+++ b/packages/asset-buyer/src/constants.ts
@@ -0,0 +1,20 @@
+import { BigNumber } from '@0xproject/utils';
+
+import { BuyQuoteRequestOpts } from './types';
+
+const DEFAULT_BUY_QUOTE_REQUEST_OPTS: BuyQuoteRequestOpts = {
+ feePercentage: 0,
+ shouldForceOrderRefresh: false,
+ slippagePercentage: 0.2, // 20% slippage protection
+};
+
+export const constants = {
+ ZERO_AMOUNT: new BigNumber(0),
+ NULL_ADDRESS: '0x0000000000000000000000000000000000000000',
+ MAINNET_NETWORK_ID: 1,
+ DEFAULT_ORDER_REFRESH_INTERVAL_MS: 10000, // 10 seconds
+ ETHER_TOKEN_DECIMALS: 18,
+ DEFAULT_BUY_QUOTE_REQUEST_OPTS,
+ MAX_PER_PAGE: 10000,
+ DEFAULT_EXPIRY_BUFFER_SECONDS: 15,
+};
diff --git a/packages/forwarder-helper/src/globals.d.ts b/packages/asset-buyer/src/globals.d.ts
index 94e63a32d..94e63a32d 100644
--- a/packages/forwarder-helper/src/globals.d.ts
+++ b/packages/asset-buyer/src/globals.d.ts
diff --git a/packages/asset-buyer/src/index.ts b/packages/asset-buyer/src/index.ts
new file mode 100644
index 000000000..8ef529ac0
--- /dev/null
+++ b/packages/asset-buyer/src/index.ts
@@ -0,0 +1,17 @@
+export { Provider } from 'ethereum-types';
+export { SignedOrder } from '@0xproject/types';
+export { BigNumber } from '@0xproject/utils';
+
+export { AssetBuyer } from './asset_buyer';
+export { BasicOrderProvider } from './order_providers/basic_order_provider';
+export { StandardRelayerAPIOrderProvider } from './order_providers/standard_relayer_api_order_provider';
+export { StandardRelayerAPIAssetBuyerManager } from './standard_relayer_api_asset_buyer_manager';
+export {
+ AssetBuyerError,
+ BuyQuote,
+ OrderProvider,
+ OrderProviderRequest,
+ OrderProviderResponse,
+ SignedOrderWithRemainingFillableMakerAssetAmount,
+ StandardRelayerApiAssetBuyerManagerError,
+} from './types';
diff --git a/packages/asset-buyer/src/order_providers/basic_order_provider.ts b/packages/asset-buyer/src/order_providers/basic_order_provider.ts
new file mode 100644
index 000000000..9bb2d90ac
--- /dev/null
+++ b/packages/asset-buyer/src/order_providers/basic_order_provider.ts
@@ -0,0 +1,32 @@
+import { schemas } from '@0xproject/json-schemas';
+import { SignedOrder } from '@0xproject/types';
+import * as _ from 'lodash';
+
+import { OrderProvider, OrderProviderRequest, OrderProviderResponse } from '../types';
+import { assert } from '../utils/assert';
+
+export class BasicOrderProvider implements OrderProvider {
+ public readonly orders: SignedOrder[];
+ /**
+ * Instantiates a new BasicOrderProvider instance
+ * @param orders An array of objects that conform to SignedOrder to fetch from.
+ * @return An instance of BasicOrderProvider
+ */
+ constructor(orders: SignedOrder[]) {
+ assert.doesConformToSchema('orders', orders, schemas.signedOrdersSchema);
+ this.orders = orders;
+ }
+ /**
+ * Given an object that conforms to OrderFetcherRequest, return the corresponding OrderProviderResponse that satisfies the request.
+ * @param orderProviderRequest An instance of OrderFetcherRequest. See type for more information.
+ * @return An instance of OrderProviderResponse. See type for more information.
+ */
+ public async getOrdersAsync(orderProviderRequest: OrderProviderRequest): Promise<OrderProviderResponse> {
+ assert.isValidOrderProviderRequest('orderProviderRequest', orderProviderRequest);
+ const { makerAssetData, takerAssetData } = orderProviderRequest;
+ const orders = _.filter(this.orders, order => {
+ return order.makerAssetData === makerAssetData && order.takerAssetData === takerAssetData;
+ });
+ return { orders };
+ }
+}
diff --git a/packages/asset-buyer/src/order_providers/standard_relayer_api_order_provider.ts b/packages/asset-buyer/src/order_providers/standard_relayer_api_order_provider.ts
new file mode 100644
index 000000000..31942c25b
--- /dev/null
+++ b/packages/asset-buyer/src/order_providers/standard_relayer_api_order_provider.ts
@@ -0,0 +1,79 @@
+import { HttpClient } from '@0xproject/connect';
+import { APIOrder, OrderbookResponse } from '@0xproject/types';
+import * as _ from 'lodash';
+
+import {
+ AssetBuyerError,
+ OrderProvider,
+ OrderProviderRequest,
+ OrderProviderResponse,
+ SignedOrderWithRemainingFillableMakerAssetAmount,
+} from '../types';
+import { assert } from '../utils/assert';
+import { orderUtils } from '../utils/order_utils';
+
+export class StandardRelayerAPIOrderProvider implements OrderProvider {
+ public readonly apiUrl: string;
+ private readonly _sraClient: HttpClient;
+ /**
+ * Given an array of APIOrder objects from a standard relayer api, return an array
+ * of SignedOrderWithRemainingFillableMakerAssetAmounts
+ */
+ private static _getSignedOrderWithRemainingFillableMakerAssetAmountFromApi(
+ apiOrders: APIOrder[],
+ ): SignedOrderWithRemainingFillableMakerAssetAmount[] {
+ const result = _.map(apiOrders, apiOrder => {
+ const { order, metaData } = apiOrder;
+ // calculate remainingFillableMakerAssetAmount from api metadata, else assume order is completely fillable
+ const remainingFillableTakerAssetAmount = _.get(
+ metaData,
+ 'remainingTakerAssetAmount',
+ order.takerAssetAmount,
+ );
+ const remainingFillableMakerAssetAmount = orderUtils.calculateRemainingMakerAssetAmount(
+ order,
+ remainingFillableTakerAssetAmount,
+ );
+ const newOrder = {
+ ...order,
+ remainingFillableMakerAssetAmount,
+ };
+ return newOrder;
+ });
+ return result;
+ }
+ /**
+ * Instantiates a new StandardRelayerAPIOrderProvider instance
+ * @param apiUrl The standard relayer API base HTTP url you would like to source orders from.
+ * @return An instance of StandardRelayerAPIOrderProvider
+ */
+ constructor(apiUrl: string) {
+ assert.isWebUri('apiUrl', apiUrl);
+ this.apiUrl = apiUrl;
+ this._sraClient = new HttpClient(apiUrl);
+ }
+ /**
+ * Given an object that conforms to OrderProviderRequest, return the corresponding OrderProviderResponse that satisfies the request.
+ * @param orderProviderRequest An instance of OrderProviderRequest. See type for more information.
+ * @return An instance of OrderProviderResponse. See type for more information.
+ */
+ public async getOrdersAsync(orderProviderRequest: OrderProviderRequest): Promise<OrderProviderResponse> {
+ assert.isValidOrderProviderRequest('orderProviderRequest', orderProviderRequest);
+ const { makerAssetData, takerAssetData, networkId } = orderProviderRequest;
+ const orderbookRequest = { baseAssetData: makerAssetData, quoteAssetData: takerAssetData };
+ const requestOpts = { networkId };
+ let orderbook: OrderbookResponse;
+ try {
+ orderbook = await this._sraClient.getOrderbookAsync(orderbookRequest, requestOpts);
+ } catch (err) {
+ throw new Error(AssetBuyerError.StandardRelayerApiError);
+ }
+ const apiOrders = orderbook.asks.records;
+ const orders = StandardRelayerAPIOrderProvider._getSignedOrderWithRemainingFillableMakerAssetAmountFromApi(
+ apiOrders,
+ );
+ return {
+ orders,
+ };
+ }
+}
diff --git a/packages/asset-buyer/src/standard_relayer_api_asset_buyer_manager.ts b/packages/asset-buyer/src/standard_relayer_api_asset_buyer_manager.ts
new file mode 100644
index 000000000..947c738a1
--- /dev/null
+++ b/packages/asset-buyer/src/standard_relayer_api_asset_buyer_manager.ts
@@ -0,0 +1,133 @@
+import { HttpClient } from '@0xproject/connect';
+import { ContractWrappers } from '@0xproject/contract-wrappers';
+import { ObjectMap } from '@0xproject/types';
+import { Provider } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { AssetBuyer } from './asset_buyer';
+import { constants } from './constants';
+import { assert } from './utils/assert';
+import { assetDataUtils } from './utils/asset_data_utils';
+
+import { OrderProvider, StandardRelayerApiAssetBuyerManagerError } from './types';
+
+export class StandardRelayerAPIAssetBuyerManager {
+ // Map of assetData to AssetBuyer for that assetData
+ private readonly _assetBuyerMap: ObjectMap<AssetBuyer>;
+ /**
+ * Returns an array of all assetDatas available at the provided sraApiUrl
+ * @param sraApiUrl The standard relayer API base HTTP url you would like to source orders from.
+ * @param pairedWithAssetData Optional filter argument to return assetDatas that only pair with this assetData value.
+ *
+ * @return An array of all assetDatas available at the provider sraApiUrl
+ */
+ public static async getAllAvailableAssetDatasAsync(
+ sraApiUrl: string,
+ pairedWithAssetData?: string,
+ ): Promise<string[]> {
+ const client = new HttpClient(sraApiUrl);
+ const params = {
+ assetDataA: pairedWithAssetData,
+ perPage: constants.MAX_PER_PAGE,
+ };
+ const assetPairsResponse = await client.getAssetPairsAsync(params);
+ return _.uniq(_.map(assetPairsResponse.records, pairsItem => pairsItem.assetDataB.assetData));
+ }
+ /**
+ * Instantiates a new StandardRelayerAPIAssetBuyerManager instance with all available assetDatas at the provided sraApiUrl
+ * @param provider The Provider instance you would like to use for interacting with the Ethereum network.
+ * @param sraApiUrl The standard relayer API base HTTP url you would like to source orders from.
+ * @param orderProvider An object that conforms to OrderProvider, see type for definition.
+ * @param networkId The ethereum network id. Defaults to 1 (mainnet).
+ * @param orderRefreshIntervalMs The interval in ms that getBuyQuoteAsync should trigger an refresh of orders and order states.
+ * Defaults to 10000ms (10s).
+ * @return An promise of an instance of StandardRelayerAPIAssetBuyerManager
+ */
+ public static async getAssetBuyerManagerWithAllAvailableAssetDatasAsync(
+ provider: Provider,
+ sraApiUrl: string,
+ orderProvider: OrderProvider,
+ networkId: number = constants.MAINNET_NETWORK_ID,
+ orderRefreshIntervalMs?: number,
+ ): Promise<StandardRelayerAPIAssetBuyerManager> {
+ const contractWrappers = new ContractWrappers(provider, { networkId });
+ const etherTokenAssetData = assetDataUtils.getEtherTokenAssetDataOrThrow(contractWrappers);
+ const assetDatas = await StandardRelayerAPIAssetBuyerManager.getAllAvailableAssetDatasAsync(
+ sraApiUrl,
+ etherTokenAssetData,
+ );
+ return new StandardRelayerAPIAssetBuyerManager(
+ provider,
+ assetDatas,
+ orderProvider,
+ networkId,
+ orderRefreshIntervalMs,
+ );
+ }
+ /**
+ * Instantiates a new StandardRelayerAPIAssetBuyerManager instance
+ * @param provider The Provider instance you would like to use for interacting with the Ethereum network.
+ * @param assetDatas The assetDatas of the desired assets to buy (for more info: https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md).
+ * @param orderProvider An object that conforms to OrderProvider, see type for definition.
+ * @param networkId The ethereum network id. Defaults to 1 (mainnet).
+ * @param orderRefreshIntervalMs The interval in ms that getBuyQuoteAsync should trigger an refresh of orders and order states.
+ * Defaults to 10000ms (10s).
+ * @return An instance of StandardRelayerAPIAssetBuyerManager
+ */
+ constructor(
+ provider: Provider,
+ assetDatas: string[],
+ orderProvider: OrderProvider,
+ networkId?: number,
+ orderRefreshIntervalMs?: number,
+ ) {
+ assert.assert(assetDatas.length > 0, `Expected 'assetDatas' to be a non-empty array.`);
+ this._assetBuyerMap = _.reduce(
+ assetDatas,
+ (accAssetBuyerMap: ObjectMap<AssetBuyer>, assetData: string) => {
+ accAssetBuyerMap[assetData] = new AssetBuyer(
+ provider,
+ assetData,
+ orderProvider,
+ networkId,
+ orderRefreshIntervalMs,
+ );
+ return accAssetBuyerMap;
+ },
+ {},
+ );
+ }
+ /**
+ * Get an AssetBuyer for the provided assetData
+ * @param assetData The desired assetData.
+ *
+ * @return An instance of AssetBuyer
+ */
+ public getAssetBuyerFromAssetData(assetData: string): AssetBuyer {
+ const assetBuyer = this._assetBuyerMap[assetData];
+ if (_.isUndefined(assetBuyer)) {
+ throw new Error(
+ `${StandardRelayerApiAssetBuyerManagerError.AssetBuyerNotFound}: For assetData ${assetData}`,
+ );
+ }
+ return assetBuyer;
+ }
+ /**
+ * Get an AssetBuyer for the provided ERC20 tokenAddress
+ * @param tokenAddress The desired tokenAddress.
+ *
+ * @return An instance of AssetBuyer
+ */
+ public getAssetBuyerFromERC20TokenAddress(tokenAddress: string): AssetBuyer {
+ const assetData = assetDataUtils.encodeERC20AssetData(tokenAddress);
+ return this.getAssetBuyerFromAssetData(assetData);
+ }
+ /**
+ * Get a list of all the assetDatas that the instance supports
+ *
+ * @return An array of assetData strings
+ */
+ public getAssetDatas(): string[] {
+ return _.keys(this._assetBuyerMap);
+ }
+}
diff --git a/packages/asset-buyer/src/types.ts b/packages/asset-buyer/src/types.ts
new file mode 100644
index 000000000..ee6858525
--- /dev/null
+++ b/packages/asset-buyer/src/types.ts
@@ -0,0 +1,86 @@
+import { SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+
+/**
+ * makerAssetData: The assetData representing the desired makerAsset.
+ * takerAssetData: The assetData representing the desired takerAsset.
+ * networkId: The networkId that the desired orders should be for.
+ */
+export interface OrderProviderRequest {
+ makerAssetData: string;
+ takerAssetData: string;
+ networkId: number;
+}
+
+/**
+ * orders: An array of orders with optional remaining fillable makerAsset amounts. See type for more info.
+ */
+export interface OrderProviderResponse {
+ orders: SignedOrderWithRemainingFillableMakerAssetAmount[];
+}
+
+/**
+ * A normal SignedOrder with one extra optional property `remainingFillableMakerAssetAmount`
+ * remainingFillableMakerAssetAmount: The amount of the makerAsset that is available to be filled
+ */
+export interface SignedOrderWithRemainingFillableMakerAssetAmount extends SignedOrder {
+ remainingFillableMakerAssetAmount?: BigNumber;
+}
+/**
+ * Given an OrderProviderRequest, get an OrderProviderResponse.
+ */
+export interface OrderProvider {
+ getOrdersAsync: (orderProviderRequest: OrderProviderRequest) => Promise<OrderProviderResponse>;
+}
+
+/**
+ * assetData: String that represents a specific asset (for more info: https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md).
+ * orders: An array of objects conforming to SignedOrder. These orders can be used to cover the requested assetBuyAmount plus slippage.
+ * feeOrders: An array of objects conforming to SignedOrder. These orders can be used to cover the fees for the orders param above.
+ * minRate: Min rate that needs to be paid in order to execute the buy.
+ * maxRate: Max rate that can be paid in order to execute the buy.
+ * assetBuyAmount: The amount of asset to buy.
+ * feePercentage: Optional affiliate fee percentage used to calculate the eth amounts above.
+ */
+export interface BuyQuote {
+ assetData: string;
+ orders: SignedOrder[];
+ feeOrders: SignedOrder[];
+ minRate: BigNumber;
+ maxRate: BigNumber;
+ assetBuyAmount: BigNumber;
+ feePercentage?: number;
+}
+
+export interface BuyQuoteRequestOpts {
+ feePercentage: number;
+ shouldForceOrderRefresh: boolean;
+ slippagePercentage: number;
+}
+
+/**
+ * Possible errors thrown by an AssetBuyer instance or associated static methods.
+ */
+export enum AssetBuyerError {
+ NoEtherTokenContractFound = 'NO_ETHER_TOKEN_CONTRACT_FOUND',
+ NoZrxTokenContractFound = 'NO_ZRX_TOKEN_CONTRACT_FOUND',
+ StandardRelayerApiError = 'STANDARD_RELAYER_API_ERROR',
+ InsufficientAssetLiquidity = 'INSUFFICIENT_ASSET_LIQUIDITY',
+ InsufficientZrxLiquidity = 'INSUFFICIENT_ZRX_LIQUIDITY',
+ NoAddressAvailable = 'NO_ADDRESS_AVAILABLE',
+ InvalidOrderProviderResponse = 'INVALID_ORDER_PROVIDER_RESPONSE',
+}
+
+/**
+ * Possible errors thrown by an StandardRelayerApiAssetBuyerManager instance or associated static methods.
+ */
+export enum StandardRelayerApiAssetBuyerManagerError {
+ AssetBuyerNotFound = 'ASSET_BUYER_NOT_FOUND',
+}
+
+export interface AssetBuyerOrdersAndFillableAmounts {
+ orders: SignedOrder[];
+ feeOrders: SignedOrder[];
+ remainingFillableMakerAssetAmounts: BigNumber[];
+ remainingFillableFeeAmounts: BigNumber[];
+}
diff --git a/packages/asset-buyer/src/utils/assert.ts b/packages/asset-buyer/src/utils/assert.ts
new file mode 100644
index 000000000..04f425237
--- /dev/null
+++ b/packages/asset-buyer/src/utils/assert.ts
@@ -0,0 +1,51 @@
+import { assert as sharedAssert } from '@0xproject/assert';
+import { schemas } from '@0xproject/json-schemas';
+import { SignedOrder } from '@0xproject/types';
+import * as _ from 'lodash';
+
+import { BuyQuote, OrderProvider, OrderProviderRequest } from '../types';
+
+export const assert = {
+ ...sharedAssert,
+ isValidBuyQuote(variableName: string, buyQuote: BuyQuote): void {
+ sharedAssert.isHexString(`${variableName}.assetData`, buyQuote.assetData);
+ sharedAssert.doesConformToSchema(`${variableName}.orders`, buyQuote.orders, schemas.signedOrdersSchema);
+ sharedAssert.doesConformToSchema(`${variableName}.feeOrders`, buyQuote.feeOrders, schemas.signedOrdersSchema);
+ sharedAssert.isBigNumber(`${variableName}.minRate`, buyQuote.minRate);
+ sharedAssert.isBigNumber(`${variableName}.maxRate`, buyQuote.maxRate);
+ sharedAssert.isBigNumber(`${variableName}.assetBuyAmount`, buyQuote.assetBuyAmount);
+ if (!_.isUndefined(buyQuote.feePercentage)) {
+ sharedAssert.isNumber(`${variableName}.feePercentage`, buyQuote.feePercentage);
+ }
+ },
+ isValidOrderProvider(variableName: string, orderFetcher: OrderProvider): void {
+ sharedAssert.isFunction(`${variableName}.getOrdersAsync`, orderFetcher.getOrdersAsync);
+ },
+ isValidOrderProviderRequest(variableName: string, orderFetcherRequest: OrderProviderRequest): void {
+ sharedAssert.isHexString(`${variableName}.makerAssetData`, orderFetcherRequest.makerAssetData);
+ sharedAssert.isHexString(`${variableName}.takerAssetData`, orderFetcherRequest.takerAssetData);
+ sharedAssert.isNumber(`${variableName}.networkId`, orderFetcherRequest.networkId);
+ },
+ areValidProvidedOrders(variableName: string, orders: SignedOrder[]): void {
+ if (orders.length === 0) {
+ return;
+ }
+ const makerAssetData = orders[0].makerAssetData;
+ const takerAssetData = orders[0].takerAssetData;
+ const filteredOrders = _.filter(
+ orders,
+ order => order.makerAssetData === makerAssetData && order.takerAssetData === takerAssetData,
+ );
+ sharedAssert.assert(
+ orders.length === filteredOrders.length,
+ `Expected all orders in ${variableName} to have the same makerAssetData and takerAssetData.`,
+ );
+ },
+ isValidPercentage(variableName: string, percentage: number): void {
+ assert.isNumber(variableName, percentage);
+ assert.assert(
+ percentage >= 0 && percentage <= 1,
+ `Expected ${variableName} to be between 0 and 1, but is ${percentage}`,
+ );
+ },
+};
diff --git a/packages/asset-buyer/src/utils/asset_data_utils.ts b/packages/asset-buyer/src/utils/asset_data_utils.ts
new file mode 100644
index 000000000..d05ff2504
--- /dev/null
+++ b/packages/asset-buyer/src/utils/asset_data_utils.ts
@@ -0,0 +1,26 @@
+import { ContractWrappers } from '@0xproject/contract-wrappers';
+import { assetDataUtils as sharedAssetDataUtils } from '@0xproject/order-utils';
+import * as _ from 'lodash';
+
+import { AssetBuyerError } from '../types';
+
+export const assetDataUtils = {
+ ...sharedAssetDataUtils,
+ getEtherTokenAssetDataOrThrow(contractWrappers: ContractWrappers): string {
+ const etherTokenAddressIfExists = contractWrappers.etherToken.getContractAddressIfExists();
+ if (_.isUndefined(etherTokenAddressIfExists)) {
+ throw new Error(AssetBuyerError.NoEtherTokenContractFound);
+ }
+ const etherTokenAssetData = sharedAssetDataUtils.encodeERC20AssetData(etherTokenAddressIfExists);
+ return etherTokenAssetData;
+ },
+ getZrxTokenAssetDataOrThrow(contractWrappers: ContractWrappers): string {
+ let zrxTokenAssetData: string;
+ try {
+ zrxTokenAssetData = contractWrappers.exchange.getZRXAssetData();
+ } catch (err) {
+ throw new Error(AssetBuyerError.NoZrxTokenContractFound);
+ }
+ return zrxTokenAssetData;
+ },
+};
diff --git a/packages/asset-buyer/src/utils/buy_quote_calculator.ts b/packages/asset-buyer/src/utils/buy_quote_calculator.ts
new file mode 100644
index 000000000..9946924ef
--- /dev/null
+++ b/packages/asset-buyer/src/utils/buy_quote_calculator.ts
@@ -0,0 +1,89 @@
+import { marketUtils } from '@0xproject/order-utils';
+import { BigNumber } from '@0xproject/utils';
+import * as _ from 'lodash';
+
+import { constants } from '../constants';
+import { AssetBuyerError, AssetBuyerOrdersAndFillableAmounts, BuyQuote } from '../types';
+
+import { orderUtils } from './order_utils';
+
+// Calculates a buy quote for orders that have WETH as the takerAsset
+export const buyQuoteCalculator = {
+ calculate(
+ ordersAndFillableAmounts: AssetBuyerOrdersAndFillableAmounts,
+ assetBuyAmount: BigNumber,
+ feePercentage: number,
+ slippagePercentage: number,
+ ): BuyQuote {
+ const {
+ orders,
+ feeOrders,
+ remainingFillableMakerAssetAmounts,
+ remainingFillableFeeAmounts,
+ } = ordersAndFillableAmounts;
+ const slippageBufferAmount = assetBuyAmount.mul(slippagePercentage).round();
+ const {
+ resultOrders,
+ remainingFillAmount,
+ ordersRemainingFillableMakerAssetAmounts,
+ } = marketUtils.findOrdersThatCoverMakerAssetFillAmount(orders, assetBuyAmount, {
+ remainingFillableMakerAssetAmounts,
+ slippageBufferAmount,
+ });
+ if (remainingFillAmount.gt(constants.ZERO_AMOUNT)) {
+ throw new Error(AssetBuyerError.InsufficientAssetLiquidity);
+ }
+ // TODO(bmillman): optimization
+ // update this logic to find the minimum amount of feeOrders to cover the worst case as opposed to
+ // finding order that cover all fees, this will help with estimating ETH and minimizing gas usage
+ const {
+ resultFeeOrders,
+ remainingFeeAmount,
+ feeOrdersRemainingFillableMakerAssetAmounts,
+ } = marketUtils.findFeeOrdersThatCoverFeesForTargetOrders(resultOrders, feeOrders, {
+ remainingFillableMakerAssetAmounts,
+ remainingFillableFeeAmounts,
+ });
+ if (remainingFeeAmount.gt(constants.ZERO_AMOUNT)) {
+ throw new Error(AssetBuyerError.InsufficientZrxLiquidity);
+ }
+ const assetData = orders[0].makerAssetData;
+
+ // calculate minRate and maxRate by calculating min and max eth usage and then dividing into
+ // assetBuyAmount to get assetData / WETH, needs to take into account feePercentage as well
+ // minEthAmount = (sum(takerAssetAmount[i]) until sum(makerAssetAmount[i]) >= assetBuyAmount ) * (1 + feePercentage)
+ // maxEthAmount = (sum(takerAssetAmount[i]) until i == orders.length) * (1 + feePercentage)
+ const allOrders = _.concat(resultOrders, resultFeeOrders);
+ const allRemainingAmounts = _.concat(
+ ordersRemainingFillableMakerAssetAmounts,
+ feeOrdersRemainingFillableMakerAssetAmounts,
+ );
+ let minEthAmount = constants.ZERO_AMOUNT;
+ let maxEthAmount = constants.ZERO_AMOUNT;
+ let cumulativeMakerAmount = constants.ZERO_AMOUNT;
+ _.forEach(allOrders, (order, index) => {
+ const remainingFillableMakerAssetAmount = allRemainingAmounts[index];
+ const claimableTakerAssetAmount = orderUtils.calculateRemainingTakerAssetAmount(
+ order,
+ remainingFillableMakerAssetAmount,
+ );
+ // taker asset is always assumed to be WETH
+ maxEthAmount = maxEthAmount.plus(claimableTakerAssetAmount);
+ if (cumulativeMakerAmount.lessThan(assetBuyAmount)) {
+ minEthAmount = minEthAmount.plus(claimableTakerAssetAmount);
+ }
+ cumulativeMakerAmount = cumulativeMakerAmount.plus(remainingFillableMakerAssetAmount);
+ });
+ const feeAdjustedMinRate = minEthAmount.mul(feePercentage + 1).div(assetBuyAmount);
+ const feeAdjustedMaxRate = minEthAmount.mul(feePercentage + 1).div(assetBuyAmount);
+ return {
+ assetData,
+ orders: resultOrders,
+ feeOrders: resultFeeOrders,
+ minRate: feeAdjustedMinRate,
+ maxRate: feeAdjustedMaxRate,
+ assetBuyAmount,
+ feePercentage,
+ };
+ },
+};
diff --git a/packages/asset-buyer/src/utils/order_provider_response_processor.ts b/packages/asset-buyer/src/utils/order_provider_response_processor.ts
new file mode 100644
index 000000000..31fdcc182
--- /dev/null
+++ b/packages/asset-buyer/src/utils/order_provider_response_processor.ts
@@ -0,0 +1,202 @@
+import { OrderAndTraderInfo, OrderStatus, OrderValidatorWrapper } from '@0xproject/contract-wrappers';
+import { sortingUtils } from '@0xproject/order-utils';
+import { RemainingFillableCalculator } from '@0xproject/order-utils/lib/src/remaining_fillable_calculator';
+import { SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as _ from 'lodash';
+
+import { constants } from '../constants';
+import {
+ AssetBuyerError,
+ AssetBuyerOrdersAndFillableAmounts,
+ OrderProviderRequest,
+ OrderProviderResponse,
+ SignedOrderWithRemainingFillableMakerAssetAmount,
+} from '../types';
+
+import { orderUtils } from './order_utils';
+
+interface OrdersAndRemainingFillableMakerAssetAmounts {
+ orders: SignedOrder[];
+ remainingFillableMakerAssetAmounts: BigNumber[];
+}
+
+export const orderProviderResponseProcessor = {
+ throwIfInvalidResponse(response: OrderProviderResponse, request: OrderProviderRequest): void {
+ const { makerAssetData, takerAssetData } = request;
+ _.forEach(response.orders, order => {
+ if (order.makerAssetData !== makerAssetData || order.takerAssetData !== takerAssetData) {
+ throw new Error(AssetBuyerError.InvalidOrderProviderResponse);
+ }
+ });
+ },
+ /**
+ * Take the responses for the target orders to buy and fee orders and process them.
+ * Processing includes:
+ * - Drop orders that are expired or not open orders (null taker address)
+ * - If shouldValidateOnChain, attempt to grab fillable amounts from on-chain otherwise assume completely fillable
+ * - Sort by rate
+ */
+ async processAsync(
+ targetOrderProviderResponse: OrderProviderResponse,
+ feeOrderProviderResponse: OrderProviderResponse,
+ zrxTokenAssetData: string,
+ expiryBufferSeconds: number,
+ orderValidator?: OrderValidatorWrapper,
+ ): Promise<AssetBuyerOrdersAndFillableAmounts> {
+ // drop orders that are expired or not open
+ const filteredTargetOrders = filterOutExpiredAndNonOpenOrders(
+ targetOrderProviderResponse.orders,
+ expiryBufferSeconds,
+ );
+ const filteredFeeOrders = filterOutExpiredAndNonOpenOrders(
+ feeOrderProviderResponse.orders,
+ expiryBufferSeconds,
+ );
+ // set the orders to be sorted equal to the filtered orders
+ let unsortedTargetOrders = filteredTargetOrders;
+ let unsortedFeeOrders = filteredFeeOrders;
+ // if an orderValidator is provided, use on chain information to calculate remaining fillable makerAsset amounts
+ if (!_.isUndefined(orderValidator)) {
+ // TODO(bmillman): improvement
+ // try/catch these requests and throw a more domain specific error
+ // TODO(bmillman): optimization
+ // reduce this to once RPC call buy combining orders into one array and then splitting up the response
+ const [targetOrdersAndTradersInfo, feeOrdersAndTradersInfo] = await Promise.all(
+ _.map([filteredTargetOrders, filteredFeeOrders], ordersToBeValidated => {
+ const takerAddresses = _.map(ordersToBeValidated, () => constants.NULL_ADDRESS);
+ return orderValidator.getOrdersAndTradersInfoAsync(ordersToBeValidated, takerAddresses);
+ }),
+ );
+ // take orders + on chain information and find the valid orders and remaining fillable maker asset amounts
+ unsortedTargetOrders = getValidOrdersWithRemainingFillableMakerAssetAmountsFromOnChain(
+ filteredTargetOrders,
+ targetOrdersAndTradersInfo,
+ zrxTokenAssetData,
+ );
+ // take orders + on chain information and find the valid orders and remaining fillable maker asset amounts
+ unsortedFeeOrders = getValidOrdersWithRemainingFillableMakerAssetAmountsFromOnChain(
+ filteredFeeOrders,
+ feeOrdersAndTradersInfo,
+ zrxTokenAssetData,
+ );
+ }
+ // sort orders by rate
+ // TODO(bmillman): optimization
+ // provide a feeRate to the sorting function to more accurately sort based on the current market for ZRX tokens
+ const sortedTargetOrders = sortingUtils.sortOrdersByFeeAdjustedRate(unsortedTargetOrders);
+ const sortedFeeOrders = sortingUtils.sortFeeOrdersByFeeAdjustedRate(unsortedFeeOrders);
+ // unbundle orders and fillable amounts and compile final result
+ const targetOrdersAndRemainingFillableMakerAssetAmounts = unbundleOrdersWithAmounts(sortedTargetOrders);
+ const feeOrdersAndRemainingFillableMakerAssetAmounts = unbundleOrdersWithAmounts(sortedFeeOrders);
+ return {
+ orders: targetOrdersAndRemainingFillableMakerAssetAmounts.orders,
+ feeOrders: feeOrdersAndRemainingFillableMakerAssetAmounts.orders,
+ remainingFillableMakerAssetAmounts:
+ targetOrdersAndRemainingFillableMakerAssetAmounts.remainingFillableMakerAssetAmounts,
+ remainingFillableFeeAmounts:
+ feeOrdersAndRemainingFillableMakerAssetAmounts.remainingFillableMakerAssetAmounts,
+ };
+ },
+};
+
+/**
+ * Given an array of orders, return a new array with expired and non open orders filtered out.
+ */
+function filterOutExpiredAndNonOpenOrders(
+ orders: SignedOrderWithRemainingFillableMakerAssetAmount[],
+ expiryBufferSeconds: number,
+): SignedOrderWithRemainingFillableMakerAssetAmount[] {
+ const result = _.filter(orders, order => {
+ return orderUtils.isOpenOrder(order) && !orderUtils.willOrderExpire(order, expiryBufferSeconds);
+ });
+ return result;
+}
+
+/**
+ * Given an array of orders and corresponding on-chain infos, return a subset of the orders
+ * that are still fillable orders with their corresponding remainingFillableMakerAssetAmounts.
+ */
+function getValidOrdersWithRemainingFillableMakerAssetAmountsFromOnChain(
+ inputOrders: SignedOrder[],
+ ordersAndTradersInfo: OrderAndTraderInfo[],
+ zrxAssetData: string,
+): SignedOrderWithRemainingFillableMakerAssetAmount[] {
+ // iterate through the input orders and find the ones that are still fillable
+ // for the orders that are still fillable, calculate the remaining fillable maker asset amount
+ const result = _.reduce(
+ inputOrders,
+ (accOrders, order, index) => {
+ // get corresponding on-chain state for the order
+ const { orderInfo, traderInfo } = ordersAndTradersInfo[index];
+ // if the order IS NOT fillable, do not add anything to the accumulations and continue iterating
+ if (orderInfo.orderStatus !== OrderStatus.FILLABLE) {
+ return accOrders;
+ }
+ // if the order IS fillable, add the order and calculate the remaining fillable amount
+ const transferrableAssetAmount = BigNumber.min([traderInfo.makerAllowance, traderInfo.makerBalance]);
+ const transferrableFeeAssetAmount = BigNumber.min([
+ traderInfo.makerZrxAllowance,
+ traderInfo.makerZrxBalance,
+ ]);
+ const remainingTakerAssetAmount = order.takerAssetAmount.minus(orderInfo.orderTakerAssetFilledAmount);
+ const remainingMakerAssetAmount = orderUtils.calculateRemainingMakerAssetAmount(
+ order,
+ remainingTakerAssetAmount,
+ );
+ const remainingFillableCalculator = new RemainingFillableCalculator(
+ order.makerFee,
+ order.makerAssetAmount,
+ order.makerAssetData === zrxAssetData,
+ transferrableAssetAmount,
+ transferrableFeeAssetAmount,
+ remainingMakerAssetAmount,
+ );
+ const remainingFillableAmount = remainingFillableCalculator.computeRemainingFillable();
+ // if the order does not have any remaining fillable makerAsset, do not add anything to the accumulations and continue iterating
+ if (remainingFillableAmount.lte(constants.ZERO_AMOUNT)) {
+ return accOrders;
+ }
+ const orderWithRemainingFillableMakerAssetAmount = {
+ ...order,
+ remainingFillableMakerAssetAmount: remainingFillableAmount,
+ };
+ const newAccOrders = _.concat(accOrders, orderWithRemainingFillableMakerAssetAmount);
+ return newAccOrders;
+ },
+ [] as SignedOrderWithRemainingFillableMakerAssetAmount[],
+ );
+ return result;
+}
+
+/**
+ * Given an array of orders with remaining fillable maker asset amounts. Unbundle into an instance of OrdersAndRemainingFillableMakerAssetAmounts.
+ * If an order is missing a corresponding remainingFillableMakerAssetAmount, assume it is completely fillable.
+ */
+function unbundleOrdersWithAmounts(
+ ordersWithAmounts: SignedOrderWithRemainingFillableMakerAssetAmount[],
+): OrdersAndRemainingFillableMakerAssetAmounts {
+ const result = _.reduce(
+ ordersWithAmounts,
+ (acc, orderWithAmount) => {
+ const { orders, remainingFillableMakerAssetAmounts } = acc;
+ const { remainingFillableMakerAssetAmount, ...order } = orderWithAmount;
+ // if we are still missing a remainingFillableMakerAssetAmount, assume the order is completely fillable
+ const newRemainingAmount = remainingFillableMakerAssetAmount || order.makerAssetAmount;
+ // if remaining amount is less than or equal to zero, do not add it
+ if (newRemainingAmount.lte(constants.ZERO_AMOUNT)) {
+ return acc;
+ }
+ const newAcc = {
+ orders: _.concat(orders, order),
+ remainingFillableMakerAssetAmounts: _.concat(remainingFillableMakerAssetAmounts, newRemainingAmount),
+ };
+ return newAcc;
+ },
+ {
+ orders: [] as SignedOrder[],
+ remainingFillableMakerAssetAmounts: [] as BigNumber[],
+ },
+ );
+ return result;
+}
diff --git a/packages/asset-buyer/src/utils/order_utils.ts b/packages/asset-buyer/src/utils/order_utils.ts
new file mode 100644
index 000000000..62166eb76
--- /dev/null
+++ b/packages/asset-buyer/src/utils/order_utils.ts
@@ -0,0 +1,30 @@
+import { SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+
+import { constants } from '../constants';
+
+export const orderUtils = {
+ isOrderExpired(order: SignedOrder): boolean {
+ return orderUtils.willOrderExpire(order, 0);
+ },
+ willOrderExpire(order: SignedOrder, secondsFromNow: number): boolean {
+ const millisecondsInSecond = 1000;
+ const currentUnixTimestampSec = new BigNumber(Date.now() / millisecondsInSecond).round();
+ return order.expirationTimeSeconds.lessThan(currentUnixTimestampSec.minus(secondsFromNow));
+ },
+ calculateRemainingMakerAssetAmount(order: SignedOrder, remainingTakerAssetAmount: BigNumber): BigNumber {
+ if (remainingTakerAssetAmount.eq(0)) {
+ return constants.ZERO_AMOUNT;
+ }
+ return remainingTakerAssetAmount.times(order.makerAssetAmount).dividedToIntegerBy(order.takerAssetAmount);
+ },
+ calculateRemainingTakerAssetAmount(order: SignedOrder, remainingMakerAssetAmount: BigNumber): BigNumber {
+ if (remainingMakerAssetAmount.eq(0)) {
+ return constants.ZERO_AMOUNT;
+ }
+ return remainingMakerAssetAmount.times(order.takerAssetAmount).dividedToIntegerBy(order.makerAssetAmount);
+ },
+ isOpenOrder(order: SignedOrder): boolean {
+ return order.takerAddress === constants.NULL_ADDRESS;
+ },
+};
diff --git a/packages/forwarder-helper/test/utils/chai_setup.ts b/packages/asset-buyer/test/utils/chai_setup.ts
index 1a8733093..1a8733093 100644
--- a/packages/forwarder-helper/test/utils/chai_setup.ts
+++ b/packages/asset-buyer/test/utils/chai_setup.ts
diff --git a/packages/asset-buyer/tsconfig.json b/packages/asset-buyer/tsconfig.json
new file mode 100644
index 000000000..2ee711adc
--- /dev/null
+++ b/packages/asset-buyer/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "../../tsconfig",
+ "compilerOptions": {
+ "outDir": "lib",
+ "rootDir": "."
+ },
+ "include": ["./src/**/*", "./test/**/*"]
+}
diff --git a/packages/forwarder-helper/tslint.json b/packages/asset-buyer/tslint.json
index ffaefe83a..ffaefe83a 100644
--- a/packages/forwarder-helper/tslint.json
+++ b/packages/asset-buyer/tslint.json
diff --git a/packages/asset-buyer/typedoc-tsconfig.json b/packages/asset-buyer/typedoc-tsconfig.json
new file mode 100644
index 000000000..c9b0af1ae
--- /dev/null
+++ b/packages/asset-buyer/typedoc-tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "../../typedoc-tsconfig",
+ "compilerOptions": {
+ "outDir": "lib"
+ },
+ "include": ["./src/**/*", "./test/**/*"]
+}
diff --git a/packages/base-contract/CHANGELOG.json b/packages/base-contract/CHANGELOG.json
index 6f801694b..b97bc00e0 100644
--- a/packages/base-contract/CHANGELOG.json
+++ b/packages/base-contract/CHANGELOG.json
@@ -1,5 +1,54 @@
[
{
+ "version": "3.0.0",
+ "changes": [
+ {
+ "note": "Change the way we detect BN to work with the newest ethers.js",
+ "pr": 1069
+ },
+ {
+ "note": "Add baseContract._throwIfRevertWithReasonCallResult",
+ "pr": 1069
+ }
+ ]
+ },
+ {
+ "timestamp": 1537907159,
+ "version": "2.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1537875740,
+ "version": "2.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1537541580,
+ "version": "2.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1536142250,
+ "version": "2.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1535377027,
"version": "2.0.1",
"changes": [
diff --git a/packages/base-contract/CHANGELOG.md b/packages/base-contract/CHANGELOG.md
index 530e10ab8..7a3e0f661 100644
--- a/packages/base-contract/CHANGELOG.md
+++ b/packages/base-contract/CHANGELOG.md
@@ -5,6 +5,22 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v2.0.5 - _September 25, 2018_
+
+ * Dependencies updated
+
+## v2.0.4 - _September 25, 2018_
+
+ * Dependencies updated
+
+## v2.0.3 - _September 21, 2018_
+
+ * Dependencies updated
+
+## v2.0.2 - _September 5, 2018_
+
+ * Dependencies updated
+
## v2.0.1 - _August 27, 2018_
* Dependencies updated
diff --git a/packages/base-contract/package.json b/packages/base-contract/package.json
index 33a66c97a..b87092e49 100644
--- a/packages/base-contract/package.json
+++ b/packages/base-contract/package.json