* .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
70 lines
3.3 KiB
Handlebars
70 lines
3.3 KiB
Handlebars
|
|
class {{toPythonClassname this.languageSpecificName}}Method(ContractMethod):
|
|
"""Various interfaces to the {{this.name}} method."""
|
|
|
|
def __init__(self, web3_or_provider: Union[Web3, BaseProvider], contract_address: str, contract_function: ContractFunction, validator: Validator=None):
|
|
"""Persist instance data."""
|
|
super().__init__(web3_or_provider, contract_address, validator)
|
|
self.underlying_method = contract_function
|
|
|
|
{{#if inputs}}
|
|
def validate_and_normalize_inputs(self, {{> typed_params inputs=inputs}}):
|
|
"""Validate the inputs to the {{this.name}} method."""
|
|
{{#each this.inputs}}
|
|
self.validator.assert_valid(
|
|
method_name='{{../name}}',
|
|
parameter_name='{{name}}',
|
|
argument_value={{toPythonIdentifier name}},
|
|
)
|
|
{{#if (equal type 'address')}}
|
|
{{toPythonIdentifier this.name}} = self.validate_and_checksum_address({{toPythonIdentifier this.name}})
|
|
{{else if (equal type 'uint256')}}
|
|
# safeguard against fractional inputs
|
|
{{toPythonIdentifier this.name}} = int({{toPythonIdentifier this.name}})
|
|
{{/if}}
|
|
{{/each}}
|
|
return ({{> params }})
|
|
|
|
{{/if}}
|
|
def call(self, {{#if inputs}}{{> typed_params inputs=inputs}}, {{/if}}tx_params: Optional[TxParams] = None) -> {{> return_type outputs=outputs type='call'~}}:
|
|
"""Execute underlying contract method via eth_call.
|
|
{{sanitizeDevdocDetails this.name this.devdoc.details 8}}{{~#if this.devdoc.params~}}{{#each this.devdoc.params}}
|
|
{{makeParameterDocstringRole @key this 8}}{{/each}}{{/if}}
|
|
:param tx_params: transaction parameters
|
|
{{#if this.constant~}}
|
|
{{#if this.devdoc.return}}
|
|
{{makeReturnDocstringRole this.devdoc.return 8}}{{/if}}
|
|
{{else}}
|
|
:returns: the return value of the underlying method.
|
|
{{/if}}
|
|
"""
|
|
{{#if inputs}}
|
|
({{> params }}) = self.validate_and_normalize_inputs({{> params}})
|
|
{{/if}}
|
|
tx_params = super().normalize_tx_params(tx_params)
|
|
return self.underlying_method({{> params}}).call(tx_params.as_dict())
|
|
|
|
def send_transaction(self, {{#if inputs}}{{> typed_params inputs=inputs}}, {{/if}}tx_params: Optional[TxParams] = None) -> Union[HexBytes, bytes]:
|
|
"""Execute underlying contract method via eth_sendTransaction.
|
|
{{sanitizeDevdocDetails this.name this.devdoc.details 8}}{{~#if this.devdoc.params~}}{{#each this.devdoc.params}}
|
|
{{makeParameterDocstringRole @key this 8}}{{/each}}{{/if}}
|
|
:param tx_params: transaction parameters
|
|
{{#if this.constant~}}
|
|
{{#if this.devdoc.return}}
|
|
{{makeReturnDocstringRole this.devdoc.return 8}}{{/if}}
|
|
{{/if}}
|
|
"""
|
|
{{#if inputs}}
|
|
({{> params }}) = self.validate_and_normalize_inputs({{> params}})
|
|
{{/if}}
|
|
tx_params = super().normalize_tx_params(tx_params)
|
|
return self.underlying_method({{> params}}).transact(tx_params.as_dict())
|
|
|
|
def estimate_gas(self, {{#if inputs}}{{> typed_params inputs=inputs}}, {{/if}}tx_params: Optional[TxParams] = None) -> int:
|
|
"""Estimate gas consumption of method call."""
|
|
{{#if inputs}}
|
|
({{> params }}) = self.validate_and_normalize_inputs({{> params}})
|
|
{{/if}}
|
|
tx_params = super().normalize_tx_params(tx_params)
|
|
return self.underlying_method({{> params}}).estimateGas(tx_params.as_dict())
|