* .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
134 lines
4.1 KiB
Handlebars
134 lines
4.1 KiB
Handlebars
"""Generated wrapper for {{contractName}} Solidity contract."""
|
|
|
|
# pylint: disable=too-many-arguments
|
|
|
|
import json
|
|
from typing import ( # pylint: disable=unused-import
|
|
Any,
|
|
List,
|
|
Optional,
|
|
Tuple,
|
|
Union,
|
|
)
|
|
|
|
from eth_utils import to_checksum_address
|
|
from mypy_extensions import TypedDict # pylint: disable=unused-import
|
|
from hexbytes import HexBytes
|
|
from web3 import Web3
|
|
from web3.contract import ContractFunction
|
|
from web3.datastructures import AttributeDict
|
|
from web3.providers.base import BaseProvider
|
|
|
|
from zero_ex.contract_wrappers.bases import ContractMethod, Validator
|
|
from zero_ex.contract_wrappers.tx_params import TxParams
|
|
|
|
|
|
# Try to import a custom validator class definition; if there isn't one,
|
|
# declare one that we can instantiate for the default argument to the
|
|
# constructor for {{contractName}} below.
|
|
try:
|
|
# both mypy and pylint complain about what we're doing here, but this
|
|
# works just fine, so their messages have been disabled here.
|
|
from . import ( # type: ignore # pylint: disable=import-self
|
|
{{contractName}}Validator,
|
|
)
|
|
except ImportError:
|
|
|
|
class {{contractName}}Validator( # type: ignore
|
|
Validator
|
|
):
|
|
"""No-op input validator."""
|
|
|
|
|
|
try:
|
|
from .middleware import MIDDLEWARE # type: ignore
|
|
except ImportError:
|
|
pass
|
|
|
|
|
|
{{tupleDefinitions ABIString}}
|
|
|
|
{{#each methods}}
|
|
{{> method_class contractName=../contractName}}
|
|
{{/each}}
|
|
|
|
# pylint: disable=too-many-public-methods,too-many-instance-attributes
|
|
class {{contractName}}:
|
|
"""Wrapper class for {{contractName}} Solidity contract.{{docBytesIfNecessary ABIString}}"""
|
|
{{#each methods}}
|
|
{{toPythonIdentifier this.languageSpecificName}}: {{toPythonClassname this.languageSpecificName}}Method
|
|
"""Constructor-initialized instance of
|
|
:class:`{{toPythonClassname this.languageSpecificName}}Method`.
|
|
"""
|
|
|
|
{{/each}}
|
|
|
|
def __init__(
|
|
self,
|
|
web3_or_provider: Union[Web3, BaseProvider],
|
|
contract_address: str,
|
|
validator: {{contractName}}Validator = None,
|
|
):
|
|
"""Get an instance of wrapper for smart contract.
|
|
|
|
:param web3_or_provider: Either an instance of `web3.Web3`:code: or
|
|
`web3.providers.base.BaseProvider`:code:
|
|
:param contract_address: where the contract has been deployed
|
|
:param validator: for validation of method inputs.
|
|
"""
|
|
# pylint: disable=too-many-statements
|
|
|
|
self.contract_address = contract_address
|
|
|
|
if not validator:
|
|
validator = {{contractName}}Validator(web3_or_provider, contract_address)
|
|
|
|
web3 = None
|
|
if isinstance(web3_or_provider, BaseProvider):
|
|
web3 = Web3(web3_or_provider)
|
|
elif isinstance(web3_or_provider, Web3):
|
|
web3 = web3_or_provider
|
|
else:
|
|
raise TypeError(
|
|
"Expected parameter 'web3_or_provider' to be an instance of either"
|
|
+ " Web3 or BaseProvider"
|
|
)
|
|
|
|
# if any middleware was imported, inject it
|
|
try:
|
|
MIDDLEWARE
|
|
except NameError:
|
|
pass
|
|
else:
|
|
try:
|
|
for middleware in MIDDLEWARE:
|
|
web3.middleware_onion.inject(
|
|
middleware['function'], layer=middleware['layer'],
|
|
)
|
|
except ValueError as value_error:
|
|
if value_error.args == ("You can't add the same un-named instance twice",):
|
|
pass
|
|
|
|
self._web3_eth = web3.eth
|
|
|
|
{{#if methods}}
|
|
functions = self._web3_eth.contract(address=to_checksum_address(contract_address), abi={{contractName}}.abi()).functions
|
|
|
|
{{#each methods}}
|
|
self.{{toPythonIdentifier this.languageSpecificName}} = {{toPythonClassname this.languageSpecificName}}Method(web3_or_provider, contract_address, functions.{{this.name}}, validator)
|
|
|
|
{{/each}}
|
|
{{/if}}
|
|
{{#each events}}
|
|
{{> event contractName=../contractName}}
|
|
{{/each}}
|
|
|
|
@staticmethod
|
|
def abi():
|
|
"""Return the ABI to the underlying contract."""
|
|
return json.loads(
|
|
'{{{ABIString}}}' # noqa: E501 (line-too-long)
|
|
)
|
|
|
|
# pylint: disable=too-many-lines
|