feat(abigen,abigen-plugin): force-load all generated contract wrapper classes on first access #44
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description
Generated contract wrappers self-register any custom errors that it contains in the companion object initializer, which is initialized on first class access. This creates an issue where only errors from contracts referenced in the code are automatically registered, and thus available to be decoded project-wide when any contract call fails.
This PR also contains optimization of
ethers-abigen
tests: all generated contract wrappers are now compiled by a single kotlin compile task, speeding up the tests. The wrappers are also now placed underbuild
directory so the files can be inspected for errors.Solution
This PR introduces a "hack" to force-load all generated contract wrappers within a module, generated by the same gradle abigen task, when first generated contract class is referenced in code.
Abigen gradle task collects all generated wrapper canonical names, which are then referenced inside the generated "loader" object. This loader object contains a dummy function which is called in all generated wrappers' companion object initializers.