* .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
77 lines
2.3 KiB
Python
77 lines
2.3 KiB
Python
"""Tests for ERC20Token wrapper."""
|
|
|
|
from decimal import Decimal
|
|
|
|
import pytest
|
|
|
|
from zero_ex.contract_addresses import network_to_addresses, NetworkId
|
|
from zero_ex.contract_wrappers import TxParams
|
|
from zero_ex.contract_wrappers.erc20_token import ERC20Token
|
|
|
|
|
|
MAX_ALLOWANCE = int("{:.0f}".format(Decimal(2) ** 256 - 1))
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def erc20_wrapper(ganache_provider):
|
|
"""Get an instance of ERC20Token wrapper class for testing."""
|
|
return ERC20Token(
|
|
ganache_provider, network_to_addresses(NetworkId.GANACHE).ether_token
|
|
)
|
|
|
|
|
|
def test_erc20_wrapper__balance_of(
|
|
accounts,
|
|
erc20_wrapper, # pylint: disable=redefined-outer-name
|
|
weth_instance, # pylint: disable=redefined-outer-name
|
|
):
|
|
"""Test getting baance of an account for an ERC20 token."""
|
|
acc1_original_weth_balance = erc20_wrapper.balance_of.call(accounts[0])
|
|
acc2_original_weth_balance = erc20_wrapper.balance_of.call(accounts[1])
|
|
|
|
expected_difference = 1 * 10 ** 18
|
|
|
|
weth_instance.functions.deposit().transact(
|
|
{"from": accounts[0], "value": expected_difference}
|
|
)
|
|
weth_instance.functions.deposit().transact(
|
|
{"from": accounts[1], "value": expected_difference}
|
|
)
|
|
acc1_weth_balance = erc20_wrapper.balance_of.call(accounts[0])
|
|
acc2_weth_balance = erc20_wrapper.balance_of.call(accounts[1])
|
|
|
|
assert (
|
|
acc1_weth_balance - acc1_original_weth_balance == expected_difference
|
|
)
|
|
assert (
|
|
acc2_weth_balance - acc2_original_weth_balance == expected_difference
|
|
)
|
|
|
|
|
|
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
|