def test_exchange_wrapper__fill_order(
    accounts,
    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, zrx_asset_data)
    order_hash = generate_order_hash_hex(order=order,
                                         exchange_address=exchange_address,
                                         chain_id=1337)
    order_signature = sign_hash(ganache_provider, maker, order_hash)

    web3 = Web3(ganache_provider)
    web3.eth.setGasPriceStrategy(  # pylint: disable=no-member
        rpc_gas_price_strategy)

    fill_results = exchange_wrapper.fill_order.call(
        order=order,
        taker_asset_fill_amount=order["takerAssetAmount"],
        signature=order_signature,
        tx_params=TxParams(
            from_=taker,
            value=web3.eth.generateGasPrice()  # pylint: disable=no-member
            * 150000,
        ),
    )
    assert fill_results["makerAssetFilledAmount"] == 1
    assert fill_results["takerAssetFilledAmount"] == 1
    assert fill_results["makerFeePaid"] == 0
    assert fill_results["takerFeePaid"] == 0
    assert (fill_results["protocolFeePaid"] == web3.eth.generateGasPrice() *
            150000  # pylint: disable=no-member
            )

    tx_hash = exchange_wrapper.fill_order.send_transaction(
        order=order,
        taker_asset_fill_amount=order["takerAssetAmount"],
        signature=order_signature,
        tx_params=TxParams(
            from_=taker,
            value=web3.eth.generateGasPrice()  # pylint: disable=no-member
            * 150000,
        ),
    )
    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)
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)
def test_erc20_wrapper__approve(
        accounts,
        erc20_proxy_address,
        erc20_wrapper,  # pylint: disable=redefined-outer-name
):
    """Test approving one account to spend balance from another account."""
    erc20_wrapper.approve.send_transaction(
        erc20_proxy_address,
        MAX_ALLOWANCE,
        tx_params=TxParams(from_=accounts[0]),
    )
    erc20_wrapper.approve.send_transaction(
        erc20_proxy_address,
        MAX_ALLOWANCE,
        tx_params=TxParams(from_=accounts[1]),
    )

    acc_1_weth_allowance = erc20_wrapper.allowance.call(
        accounts[0], erc20_proxy_address)
    acc_2_weth_allowance = erc20_wrapper.allowance.call(
        accounts[1], erc20_proxy_address)

    assert acc_1_weth_allowance == MAX_ALLOWANCE
    assert acc_2_weth_allowance == MAX_ALLOWANCE
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,
                                chain_id=1337) for order in orders
    ]
    order_signatures = [
        sign_hash(ganache_provider, maker, order_hash)
        for order_hash in order_hashes
    ]
    taker_amounts = [order["takerAssetAmount"] for order in orders]

    web3 = Web3(ganache_provider)
    web3.eth.setGasPriceStrategy(  # pylint: disable=no-member
        rpc_gas_price_strategy)

    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,
            value=2 * web3.eth.generateGasPrice()  # pylint: disable=no-member
            * 150000,
        ),
    )
    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])
def test_exchange_wrapper__fill_order__without_from_tx_param(
    accounts,
    exchange_wrapper,  # pylint: disable=redefined-outer-name
    ganache_provider,
    weth_asset_data,
    zrx_asset_data,
):
    """Test filling an order."""
    maker = accounts[1]
    exchange_address = exchange_wrapper.contract_address
    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,
                                         chain_id=1337)
    order_signature = sign_hash(ganache_provider, maker, order_hash)

    web3 = Web3(ganache_provider)
    web3.eth.setGasPriceStrategy(  # pylint: disable=no-member
        rpc_gas_price_strategy)

    exchange_wrapper._web3_eth.defaultAccount = (  # pylint: disable=protected-access
        None)
    exchange_wrapper._web3_eth.accounts.clear()  # pylint: disable=protected-access

    built_tx = exchange_wrapper.fill_order.build_transaction(
        order=order,
        taker_asset_fill_amount=order["takerAssetAmount"],
        signature=order_signature,
        tx_params=TxParams(
            value=web3.eth.generateGasPrice()  # pylint: disable=no-member
            * 150000, ),
    )
    assert (
        built_tx["data"][:824] ==
        "powerchain9b44d5560000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000003a00000000000000000000000006ecbe1db9ef729cbe972c83fb886247691fb6beb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005af3107a40000000000000000000000000000000000000000000000000"
    )
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])