* Install Py packages in dep. order, not in parallel Install Python packages in dependency order, not in parallel. * sra_client.py: Add `./setup.py clean` * Fix python package dependency ordering... ...and include a script to produce the proper ordering. * sra_client.py: reformat whitespace in doctest * contract_wrappers.py: don't auto-import wrappers This was discovered while minimizing CircleCI steps to dianose a problem with running the Launch Kit Backend in CircleCI. These classes should be imported via the zero_ex.contract_wrappers.exchange and zero_ex.contract_wrappers.erc20_token modules, respectively. We permitted importing them from just zero_ex.contract_wrappers back when they were the only wrappers we had, but now that we have so many different contracts being wrapped, this is just another list to keep manually updated (which, obviously is error prone, since it slipped through the cracks already), so it's better to just not support this type of import. * abi-gen/Py: doc contract method attributes Without this, generated documentation was not including the class members that represent the contract methods, rendering the usage unclear. * sra_client.py: disable tests in CI * abi-gen/Py: strip repeated spaces from devdoc * contract_wrappers.py: gen docs for all wrappers... ...except for the dummy tokens. * sra_client.py/test: change launch kit docker image Previously these teses were using 0xorg/launch-kit-ci, but that was a one-off thing created just for CI, back before there was a regularly maintained docker image of Launch Kit. Changed to use 0xorg/launch-kit-backend since it's regularly maintained/updated. Because the -backend image is using a different Linux distribution (Alpine), the commands used to wait for ganache startup also had to change. The tag used, 74bcc39, is provisional due to the pending Issue at https://github.com/0xProject/0x-launch-kit-backend/issues/73 . When that issue is resolved, the tag suffix on the imag name should be removed. * Migrate from Web3.py 4.x to 5.x * sra_client.py: checksum address in doctest Due to problem with launch-kit-backend, documented at https://github.com/0xProject/0x-launch-kit-backend/issues/73 , we need to checksum the makerAddress, in the order retrieved from the relayer, before filling it, otherwise Web3.py gives this error: InvalidAddress('Web3.py only accepts checksum addresses. The software that gave you this non-checksum address should be considered unsafe, please file it as a bug on their platform. Try using an ENS name instead. Or, if you must accept lower safety, use Web3.toChecksumAddress(lower_case_address).', '0x5409ed021d9299bf6814279a6a1411a7e866a631') * Update CHANGELOGs * sra_client.py: make CHANGELOG be REVESE chrono. Formerly CHANGELOG was in chronological order. Now it's in reverse chronological order. * abi-gen/Py: fix missing space in sanitized devdoc
131 lines
4.5 KiB
Python
131 lines
4.5 KiB
Python
"""Test 0x Exchnage wrapper."""
|
|
|
|
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_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
|
|
|
|
|
|
@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,
|
|
)
|
|
|
|
|
|
def create_test_order(
|
|
maker_address,
|
|
maker_asset_amount,
|
|
maker_asset_data,
|
|
taker_asset_amount,
|
|
taker_asset_data,
|
|
):
|
|
"""Create a test order."""
|
|
order = Order(
|
|
makerAddress=maker_address,
|
|
takerAddress="0x0000000000000000000000000000000000000000",
|
|
feeRecipientAddress="0x0000000000000000000000000000000000000000",
|
|
senderAddress="0x0000000000000000000000000000000000000000",
|
|
makerAssetAmount=maker_asset_amount,
|
|
takerAssetAmount=taker_asset_amount,
|
|
makerFee=0,
|
|
takerFee=0,
|
|
expirationTimeSeconds=100000000000000,
|
|
salt=random.randint(1, 1000000000),
|
|
makerAssetData=maker_asset_data,
|
|
takerAssetData=taker_asset_data,
|
|
)
|
|
return order
|
|
|
|
|
|
def assert_fill_log(fill_log, maker, taker, order, order_hash):
|
|
"""assert that the fill log matches the order details"""
|
|
assert fill_log.makerAddress == maker
|
|
assert fill_log.takerAddress == taker
|
|
assert fill_log.feeRecipientAddress == order["feeRecipientAddress"]
|
|
assert fill_log.senderAddress == taker
|
|
assert fill_log.orderHash == bytes.fromhex(remove_0x_prefix(order_hash))
|
|
assert fill_log.makerAssetFilledAmount == order["makerAssetAmount"]
|
|
assert fill_log.takerAssetFilledAmount == order["takerAssetAmount"]
|
|
assert fill_log.makerFeePaid == order["makerFee"]
|
|
assert fill_log.takerFeePaid == order["takerFee"]
|
|
assert fill_log.makerAssetData == order["makerAssetData"]
|
|
assert fill_log.takerAssetData == order["takerAssetData"]
|
|
|
|
|
|
def test_exchange_wrapper__fill_order(
|
|
accounts,
|
|
exchange_wrapper, # pylint: disable=redefined-outer-name
|
|
ganache_provider,
|
|
weth_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_hash = generate_order_hash_hex(
|
|
order=order, exchange_address=exchange_address
|
|
)
|
|
order_signature = sign_hash_to_bytes(ganache_provider, maker, order_hash)
|
|
|
|
tx_hash = exchange_wrapper.fill_order.send_transaction(
|
|
order=order,
|
|
taker_asset_fill_amount=order["takerAssetAmount"],
|
|
signature=order_signature,
|
|
tx_params=TxParams(from_=taker),
|
|
)
|
|
assert_valid(tx_hash.hex(), "/hexSchema")
|
|
|
|
fill_event = exchange_wrapper.get_fill_event(tx_hash)
|
|
assert_fill_log(fill_event[0].args, maker, taker, order, order_hash)
|
|
|
|
|
|
# pylint: disable=too-many-locals
|
|
def test_exchange_wrapper__batch_fill_orders(
|
|
accounts,
|
|
exchange_wrapper, # pylint: disable=redefined-outer-name
|
|
ganache_provider,
|
|
weth_asset_data,
|
|
):
|
|
"""Test filling a batch of orders."""
|
|
taker = accounts[0]
|
|
maker = accounts[1]
|
|
exchange_address = exchange_wrapper.contract_address
|
|
orders = []
|
|
order_1 = create_test_order(maker, 1, weth_asset_data, 1, weth_asset_data)
|
|
order_2 = create_test_order(maker, 1, weth_asset_data, 1, weth_asset_data)
|
|
orders.append(order_1)
|
|
orders.append(order_2)
|
|
order_hashes = [
|
|
generate_order_hash_hex(order=order, exchange_address=exchange_address)
|
|
for order in orders
|
|
]
|
|
order_signatures = [
|
|
sign_hash_to_bytes(ganache_provider, maker, order_hash)
|
|
for order_hash in order_hashes
|
|
]
|
|
taker_amounts = [order["takerAssetAmount"] for order in orders]
|
|
tx_hash = exchange_wrapper.batch_fill_orders.send_transaction(
|
|
orders=orders,
|
|
taker_asset_fill_amounts=taker_amounts,
|
|
signatures=order_signatures,
|
|
tx_params=TxParams(from_=taker),
|
|
)
|
|
assert_valid(tx_hash.hex(), "/hexSchema")
|
|
|
|
fill_events = exchange_wrapper.get_fill_event(tx_hash)
|
|
for index, order in enumerate(orders):
|
|
assert_fill_log(
|
|
fill_events[index].args, maker, taker, order, order_hashes[index]
|
|
)
|