Migrate Python libraries to v3 (#2284)
* .gitignore migrations/0x_ganache_snapshot * .gitignore new-ish Python contract wrappers These should have been added back when we started generating these wrappers. * rm superfluous contract artifact in Python package All of the contract artifacts were removed from the Python package recently, because now they're copied from the monorepo/packages area as an automated build step. Somehow this one artifact slipped through the cracks. * Eliminate circular dependency This was preventing the Exchange wrapper from ever importing its validator! * Improve output of monorepo-level parallel script - Capture stderr (and have it included in stdout) so that it doesn't leak onto the console for commands that didn't actually fail. - Include all error output in the Exception object (eliminate print statement). * Silence new versions of linters Newer versions care about this stuff. Old versions didn't, and we don't either. * Support Rich Reverts via Web3.py middleware * Fix bug in generated wrappers' bytes handling `bytes.fromhex(bytes.decode('utf-8')` is just plain wrong. It would work for some cases, but is not working when trying to fill orders with the latest Exchange contract. * Migrate to Exchange v3 * Fix typo in DevUtils documentation * Include new contracts in docs * Re-enable Python checks in CI * Accept strings for bytes * Fix CircleCI build artifacts for gen'd python I swear the previous way was working before, but it wasn't working now, so this fixes it. * Accept a provider OR a Web3 object In various places. This allows the caller to install middleware (which in web3.py is installed on a Web3 object, not on a provider) before executing any RPC calls, which is important for the case where one wants to produce signatures locally before submitting to a remote node. * wrapper base: don't assume there are accounts * Eliminate some inline linter directives * make CHANGELOGs be REVERSE chronological * Update CHANGELOG entries and bump version numbers * @0x/contract-addresses: Put addr's in JSON, not TS This allows easier consumption by other languages. (Specifically, it eliminates the overhead of keeping the Python addresses package in sync with the TypeScript one.) * sra_client.py: incl. docker in `./setup.py clean` * sra_client.py: Migrate to protocol v3 Removed script that existed only to exclude runs of sra_client builds (parallel_without_sra_client). Now `parallel` is used by CI, re-including sra_client in CI checks. * abi-gen/templates/Py: clarify if/else logic In response to https://github.com/0xProject/0x-monorepo/pull/2284#discussion_r342200906 * sra_client.py: Update CHANGELOG and bump version * contract_addresses/setup.py: rm unnecessary rm * json_schemas.py: corrections to dev dependencies * In tests against deployment, also run doctests * contract_wrappers example: rm xtra Order attribute Thanks to @steveklebanoff for catching this. https://github.com/0xProject/0x-monorepo/pull/2284#pullrequestreview-312065368
This commit is contained in:
@@ -5,20 +5,24 @@ import random
|
||||
import pytest
|
||||
from eth_utils import remove_0x_prefix
|
||||
|
||||
from zero_ex.contract_addresses import NETWORK_TO_ADDRESSES, NetworkId
|
||||
from zero_ex.contract_addresses import network_to_addresses, NetworkId
|
||||
from zero_ex.contract_wrappers import TxParams
|
||||
from zero_ex.contract_wrappers.exchange import Exchange
|
||||
from zero_ex.contract_wrappers.exchange.types import Order
|
||||
from zero_ex.json_schemas import assert_valid
|
||||
from zero_ex.order_utils import generate_order_hash_hex, sign_hash_to_bytes
|
||||
from zero_ex.order_utils import (
|
||||
asset_data_utils,
|
||||
generate_order_hash_hex,
|
||||
sign_hash,
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture(scope="module")
|
||||
def exchange_wrapper(ganache_provider):
|
||||
"""Get an Exchange wrapper instance."""
|
||||
return Exchange(
|
||||
provider=ganache_provider,
|
||||
contract_address=NETWORK_TO_ADDRESSES[NetworkId.GANACHE].exchange,
|
||||
web3_or_provider=ganache_provider,
|
||||
contract_address=network_to_addresses(NetworkId.GANACHE).exchange,
|
||||
)
|
||||
|
||||
|
||||
@@ -43,6 +47,8 @@ def create_test_order(
|
||||
salt=random.randint(1, 1000000000),
|
||||
makerAssetData=maker_asset_data,
|
||||
takerAssetData=taker_asset_data,
|
||||
makerFeeAssetData=asset_data_utils.encode_erc20("0x" + "00" * 20),
|
||||
takerFeeAssetData=asset_data_utils.encode_erc20("0x" + "00" * 20),
|
||||
)
|
||||
return order
|
||||
|
||||
@@ -67,16 +73,29 @@ def test_exchange_wrapper__fill_order(
|
||||
exchange_wrapper, # pylint: disable=redefined-outer-name
|
||||
ganache_provider,
|
||||
weth_asset_data,
|
||||
zrx_asset_data,
|
||||
):
|
||||
"""Test filling an order."""
|
||||
taker = accounts[0]
|
||||
maker = accounts[1]
|
||||
exchange_address = exchange_wrapper.contract_address
|
||||
order = create_test_order(maker, 1, weth_asset_data, 1, weth_asset_data)
|
||||
order = create_test_order(maker, 1, weth_asset_data, 1, zrx_asset_data)
|
||||
order_hash = generate_order_hash_hex(
|
||||
order=order, exchange_address=exchange_address
|
||||
order=order, exchange_address=exchange_address, chain_id=1337
|
||||
)
|
||||
order_signature = sign_hash_to_bytes(ganache_provider, maker, order_hash)
|
||||
order_signature = sign_hash(ganache_provider, maker, order_hash)
|
||||
|
||||
fill_results = exchange_wrapper.fill_order.call(
|
||||
order=order,
|
||||
taker_asset_fill_amount=order["takerAssetAmount"],
|
||||
signature=order_signature,
|
||||
tx_params=TxParams(from_=taker),
|
||||
)
|
||||
assert fill_results[0] == 1
|
||||
assert fill_results[1] == 1
|
||||
assert fill_results[2] == 0
|
||||
assert fill_results[3] == 0
|
||||
assert fill_results[4] == 0
|
||||
|
||||
tx_hash = exchange_wrapper.fill_order.send_transaction(
|
||||
order=order,
|
||||
@@ -107,11 +126,13 @@ def test_exchange_wrapper__batch_fill_orders(
|
||||
orders.append(order_1)
|
||||
orders.append(order_2)
|
||||
order_hashes = [
|
||||
generate_order_hash_hex(order=order, exchange_address=exchange_address)
|
||||
generate_order_hash_hex(
|
||||
order=order, exchange_address=exchange_address, chain_id=1337
|
||||
)
|
||||
for order in orders
|
||||
]
|
||||
order_signatures = [
|
||||
sign_hash_to_bytes(ganache_provider, maker, order_hash)
|
||||
sign_hash(ganache_provider, maker, order_hash)
|
||||
for order_hash in order_hashes
|
||||
]
|
||||
taker_amounts = [order["takerAssetAmount"] for order in orders]
|
||||
@@ -128,3 +149,20 @@ def test_exchange_wrapper__batch_fill_orders(
|
||||
assert_fill_log(
|
||||
fill_events[index].args, maker, taker, order, order_hashes[index]
|
||||
)
|
||||
|
||||
|
||||
def test_two_instantiations_with_web3_objects(web3_instance):
|
||||
"""Test that instantiating two Exchange objects doesn't raise.
|
||||
|
||||
When instantiating an Exchange object with a web3 client (rather than a
|
||||
provider) there was a bug encountered where web3.py was giving an error
|
||||
when trying to install the rich-revert-handling middleware on the web3
|
||||
client, an error saying "can't install this same middleware instance
|
||||
again." Test that that bug isn't occurring.
|
||||
"""
|
||||
exchange = Exchange( # pylint: disable=unused-variable
|
||||
web3_instance, network_to_addresses(NetworkId.GANACHE).exchange
|
||||
)
|
||||
exchange2 = Exchange( # pylint: disable=unused-variable
|
||||
web3_instance, network_to_addresses(NetworkId.GANACHE).exchange
|
||||
)
|
||||
|
Reference in New Issue
Block a user