Research
Security News
Malicious npm Package Targets Solana Developers and Hijacks Funds
A malicious npm package targets Solana developers, rerouting funds in 2% of transactions to a hardcoded address.
abi-to-sol
Advanced tools
Input an ABI JSON and get a Solidity interface
compatible with whatever
pragma solidity <version-range>
you need.
abi-to-sol evaluates your input ABI and finds all the external functions, events, structs, and user-defined value types in order to produce a source file that's suitable for copying and pasting into your project. Import your external contract's interface and interact with it, almost as if you had copied the whole other project's sourcecode into a "vendor" directory (but without the potential Solidity version mismatch!)
It doesn't matter what version of Solidity generated the ABI in the first place
(or if the contract wasn't even written in Solidity), abi-to-sol will give
you *.sol
output that's compatible with your existing project! (Some rare
caveats may apply, see below.)
Skip the terminal and just use the hosted Web UI.
Install globally via:
$ npm install -g abi-to-sol
Installing locally should work fine as well, but you may have to jump through
hoops to get the abi-to-sol
script available on your PATH.
Pipe ABI JSON to stdin, get Solidity on stdout.
abi-to-sol [--solidity-version=<solidityVersion>] [--license=<license>] [--validate] [<name>]
abi-to-sol -h | --help
abi-to-sol --version
Options:
<name>
Name of generated interface. Default: MyInterface
--validate
Validate JSON before starting
-V --solidity-version
Version of Solidity (for pragma). Default: >=0.7.0 <0.9.0
-L --license
SPDX license identifier. default: UNLICENSED
-h --help Show this screen.
--version Show version.
Run the following command:
$ echo '[{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"label","type":"bytes32"},{"name":"owner","type":"address"}],"name":"setSubnodeOwner","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"ttl","type":"uint64"}],"name":"setTTL","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"ttl","outputs":[{"name":"","type":"uint64"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"owner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":true,"name":"label","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"resolver","type":"address"}],"name":"NewResolver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"ttl","type":"uint64"}],"name":"NewTTL","type":"event"}]' \
| npx abi-to-sol ENS
Get this output:
// SPDX-License-Identifier: UNLICENSED
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol. SEE BELOW FOR SOURCE. !!
pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;
interface ENS {
function resolver(bytes32 node) external view returns (address);
function owner(bytes32 node) external view returns (address);
function setSubnodeOwner(
bytes32 node,
bytes32 label,
address owner
) external;
function setTTL(bytes32 node, uint64 ttl) external;
function ttl(bytes32 node) external view returns (uint64);
function setResolver(bytes32 node, address resolver) external;
function setOwner(bytes32 node, address owner) external;
event Transfer(bytes32 indexed node, address owner);
event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);
event NewResolver(bytes32 indexed node, address resolver);
event NewTTL(bytes32 indexed node, uint64 ttl);
}
// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/* ... */
This tool works best with ABIs from contracts written in Solidity, thanks to
the useful internalType
hints that Solidity provides. This is non-standard,
so abi-to-sol still works without those. You should be able to use this tool
to import someone else's Vyper contract interface into your Solidity project.
User-defined value types are supported, but if these UDVTs require special constructors, abi-to-sol won't give you any implementations. Take extra care to make sure you know how to interact with an external contract that has UDVTs as part of its interface.
You might run into problems if you need this tool to output interfaces that
are compatible with sufficiently old versions of Solidity (<0.5.0
), due to
certain missing features (structs/arrays couldn't be external function
parameters back then).
... but probably you should definitely just don't use solc that old.
Similarly, there might be problems if you need this tool to output interfaces
that are compatible with a particularly large range of solc versions (e.g.
^0.6.0 || ^0.7.0
). This is because the data location changed across versions
(from address[] calldata
to address[] memory
, e.g.), and there's no single
syntax that abi-to-sol can output that would satisfy everything. (This only
matters for input ABIs where it's relevant, so you may still be alright.)
This project does not output Vyper code... but you don't need a project like
this one for Vyper because Vyper already lets you import *.abi.json
files
directly! Maybe this isn't a caveat.
Feel free to donate to gnidan.eth ❤️
FAQs
Compile ABI JSON to Solidity interface
The npm package abi-to-sol receives a total of 2,387 weekly downloads. As such, abi-to-sol popularity was classified as popular.
We found that abi-to-sol demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
A malicious npm package targets Solana developers, rerouting funds in 2% of transactions to a hardcoded address.
Security News
Research
Socket researchers have discovered malicious npm packages targeting crypto developers, stealing credentials and wallet data using spyware delivered through typosquats of popular cryptographic libraries.
Security News
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.