* CI: use a docker image that includes Python So that tests of abi-gen generating Python can exercise the code being generated. * CI fix: disable old yarn permission denied hack Motivated by CI failure of previous commit. * CI fix: more resources for test-contracts-ganache Motivated by CI failure of previous commit. * CI fix: remove hack of permissions for python libs Fix for previous CI run's failure of test-python. Apparently we don't need this in the docker container we've switched to. * abi-gen/Py: minimum viable test of gen'd code Ensure the code is parseable by running it through black. * abi-gen/Py: expand Python linter usage Make abi-gen filter its output through black, if its available in the runtime environment. Accordingly, stop having contract_wrappers.py's setup.py pre_install run black on copied-over files. Adds Pylint to the list of linters run against test-cli/output. * abi-gen: re-enable Solidity linter It was broken, running seemingly cleanly but not actually reading any files, because it was targetting the wrong folder. * abi-gen/test-cli/fixtures/sol: fix linter errors * abi-gen/test-cli: disable pylint blackisted-name * abi-gen/Py: rm unused var in contracts w/o methods Remove unused variable from generated wrapper for contracts without any methods.
101 lines
3.1 KiB
Handlebars
101 lines
3.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."""
|
|
|
|
|
|
{{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,
|
|
provider: BaseProvider,
|
|
contract_address: str,
|
|
validator: {{contractName}}Validator = None,
|
|
):
|
|
"""Get an instance of wrapper for smart contract.
|
|
|
|
:param provider: instance of :class:`web3.providers.base.BaseProvider`
|
|
:param contract_address: where the contract has been deployed
|
|
:param validator: for validation of method inputs.
|
|
"""
|
|
self.contract_address = contract_address
|
|
|
|
if not validator:
|
|
validator = {{contractName}}Validator(provider, contract_address)
|
|
|
|
self._web3_eth = Web3( # type: ignore # pylint: disable=no-member
|
|
provider
|
|
).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(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
|