* abi-gen-wrappers: fix half-baked folder rename
* .circleci: give cache more descriptive name
* abi-gen: rename type field. tsName->langLocalName
* contract-artifacts: add devdoc to ERC20Token.json
Artifact changes crafted manually: re-generated artifacts from within
@0x/contracts-erc20, and then copied them into @0x/contract-artifacts,
but only committed the changes that added devdoc.
Modified @0x/contracts-erc20/compiler.json to include devdoc in the
hopes that next time contract-artifacts are re-generated en masse, the
devdoc output will just come along for the ride.
Compiling ERC20 TypeScript wrappers after adding devdoc to the artifacts
revealed some inconsistencies in the types. ethereum-types'
DevdocOutput REQUIRED many fields which are not always present,
depending the devdoc contents itself. Relaxing the requirement had some
ramifications.
* abi-gen: Python!
Lots more to come, but so far generating typed methods with some
parameter validation and with reasonable docstrings; enough to make
ERC20 work.
* existing erc20 python wrapper: re-order methods
In order to minimize the diff in the upcoming commit of the
auto-generated version.
* existing erc20 python wrapper: rename method
Rename method _erc20 to _get_contract_instance.
* existing erc20 python wrapper: rename vars
Rename method parameters to match names used in contract methods.
* existing erc20 python wrapper: correction
Contract method `allowance` previously was returning a transaction hash,
but it's a const method, so changed it to return the int that the
underlying method returns.
* contract_wrappers.py: pull in generated code
Custom setup.py command to pull in code previously generated into
../../packages/abi-gen-wrappers/src/generated-wrappers/py.
Changes to existing wrapper code reflect differences between the old,
manually-written wrapper and the new, auto-generated wrapper.
Reconfigured Circle CI to give Python build access to the output of the
TypeScript build, in order to import the generated wrappers from there.
* abi-gen: sanitize docstrings for pycodestyle lint
* abi-gen-templates.py: expose ABI from template
Use ABI given by template, not gotten by name from
zero_ex.contract_artifacts.
Also, expose ABI as a static method.
* py wrappers: contract addr to ctor, not methods
In all Python wrappers (old, manual ones; and new, generated ones), have
client pass the contract address to the wrapper's constructor, rather
than to the individual method calls.
* py wrappers: remove unused param `account_address`
* py wrappers: document use of `private_key`
* Rename file erc20_wrapper.py to erc20_token.py
To match the name of the underlying contract.
* Update CHANGELOG.json's
* git rm erc20_token.py
No need to keep it checked in. Doing so would require manual overhead
of keeping the generated copy in sync with the generation code, which
may get overlooked and cause confusion for others. Authoritative source
will be the published package on PyPI.
* abi-gen-templates: tweak CHANGELOG wording
Co-Authored-By: Fabio B <kandinsky454@protonmail.ch>
* Include transaction parameters in const calls too
* Doc contract_address param to gen'd wrapper ctor
* make myself a CODEOWNER of abi-gen*
* rename ids: langLocalName -> languageSpecificName
* Move Python generation to its own packages/ folder
* Stop duplicating contract artifacts in Python pkg!
Thanks to the way we're now using the `./setup.py pre_install`
convention, there's no longer a need to check the artifacts in to the
Python package.
* move py templates BACK to abi-gen-templates
I got a little overzealous in the previous commit that moved ALL the
python stuff into the new packages/python-contract-wrappers folder.
* Update known-good test output: prettify
* add getABIEncodedTransationData to gen'd code
It was added into the template in the following commit, but the
corresponding checked-in generated code was not updated accordingly.
f51c4f9617
* Fix missed instance of languageSpecificName change
* abi-gen: refine pipeline for testing gen'd code
- generate wrappers for test fixture contracts (dummy, etc) not in `yarn
build` but in `yarn test`
- rename folder test/generated-test/generated-wrappers to
test/generated-test/known-good, and stop writing test output to there,
instead writing it to a new test/generated-test/output folder.
- sol-compile test fixture contracts in every test run
- run unit tests separately from tests of generated and built TypeScript
wrappers. The existing `yarn run_mocha` will run unit tests, and
there's a new `yarn run_contract_wrapper_tests`.
* abi-gen: test Python gen [known test failures]
Also generate TypeScript wrapper test code into a TypeScript folder
(alongside the newly created Python folder).
Known-good code manually corrected (from generated code) to reflect
known problems that still need to be addressed. Namely:
- base contract and tx params should be imported from canonical
package, not relative path. relative path is working for wrapping
OUR contracts, but would not be usable in a more general
context.
- return type missing for some generated methods.
These outstanding problems are currently causing this test to fail.
* fix failing abi-gen test: missing return types
* fix failing abi-gen test: qualify imports
* in py wrapper, simplify base class initialization
per
https://github.com/0xProject/0x-monorepo/pull/1878#discussion_r299248641
* move 3rd party typings to typescript-typings
* make package python-contract-wrappers private
* make Xianny CODEOWNER of base-contract & templates
* abi-gen: clarify --help for --backend
* remove superfluous CHANGELOG entry
ABI Gen
This package allows you to generate TypeScript contract wrappers from ABI files. It's heavily inspired by Geth abigen but takes a different approach. You can write your custom handlebars templates which will allow you to seamlessly integrate the generated code into your existing codebase with existing conventions.
Here are the templates used to generate the contract wrappers used by 0x.js.e
Installation
yarn add -g @0x/abi-gen
Usage
abi-gen
Options:
--help Show help [boolean]
--version Show version number [boolean]
--abis Glob pattern to search for ABI JSON files
[string] [required]
--output, -o, --out Folder where to put the output files [string] [required]
--partials Glob pattern for the partial template files [string]
--template Path for the main template file that will be used to
generate each contract [string] [required]
--backend The backing Ethereum library your app uses. Either 'web3'
or 'ethers'. Ethers auto-converts small ints to numbers
whereas Web3 doesn't.
[string] [choices: "web3", "ethers"] [default: "web3"]
--network-id ID of the network where contract ABIs are nested in
artifacts [number] [default: 50]
You're required to pass a glob template where your abi files are located. TL;DR - here is the example from 0x.js.
--abis 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken|TokenRegistry).json
We could've just used --abis 'src/artifacts/*.json but we wanted to exclude some of the abi files.
The abi file should be either a Truffle contract artifact (a JSON object with an abi key) or a JSON abi array.
You need to also specify the location of your main template used for every contract --template as well as the partial templates --partials that can later be used from the main one.
How to write custom templates?
The best way to get started is to copy 0x.js templates and start adjusting them for your needs.
We use handlebars template engine under the hood.
You need to have a master template called contract.mustache. it will be used to generate each contract wrapper. Although - you don't need and probably shouldn't write all your logic in a single template file. You can write partial templates and as long as they are within a partials folder - they will be registered and available.
Which data/context do I get in my templates?
For now you don't get much on top of methods abi, some useful helpers and a contract name because it was enough for our use-case, but if you need something else - create a PR. See the type definition of what we pass to the render method.
Output files
Output files will be generated within an output folder with names converted to camel case and taken from abi file names. If you already have some files in that folder they will be overwritten.
Contributing
We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our contribution guidelines before getting started.
Install dependencies
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
yarn config set workspaces-experimental true
Then install dependencies
yarn install
Build
To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
PKG=@0x/abi-gen yarn build
Or continuously rebuild on change:
PKG=@0x/abi-gen yarn watch
Clean
yarn clean
Lint
yarn lint