A simple CLI for querying contract information from block-explorers.
npm install -g @owodunni/ethscan
By default Ethscan querries Etherscans api, this is rate limited to 1Hz. To change Blockexplorer or use an API key the following environment variables can be set:
ETHSCAN_KEY='Your api key'
ETHSCAN_URL='https://rinkeby.etherscan.io/api'
These can also be set by the cli. There are predefined block-explorers for Polygon, Ethereum, Fantom, BSC.
ethscan -h
Usage:
ethscan (abi | code) <address> [options]
ethscan -h | --help | --version
Options:
-o, --output=<file> Write to output file.
-k, --api=<key> API key
-u, --url=<url> Block-explorer url
-c, --chain=<name> Use predefined chain block-explorer
-h --help Show this screen.
-v, --version Show version.
-d, --debug Print debug logs.
Output contract ABI:
ethscan abi 0xD33526068D116cE69F19A9ee46F0bd304F21A51f -chain ethereum
[
{
"inputs": [
{
"internalType": "contract RocketStorageInterface",
"name": "_rocketStorageAddress",
"type": "address"
},
{
"internalType": "contract IERC20",
"name": "_rocketTokenRPLFixedSupplyAddress",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
...
]
Save contract code:
ethscan code 0xD33526068D116cE69F19A9ee46F0bd304F21A51f -o ~/code
~/code tree .
.
├── contracts
│ ├── contract
│ │ ├── RocketBase.sol
│ │ └── token
│ │ └── RocketTokenRPL.sol
│ └── interface
│ ├── dao
│ │ └── protocol
│ │ └── settings
│ │ └── RocketDAOProtocolSettingsInflationInterface.sol
│ ├── RocketStorageInterface.sol
│ ├── RocketVaultInterface.sol
│ └── token
│ └── RocketTokenRPLInterface.sol
└── @openzeppelin
└── contracts
├── math
│ └── SafeMath.sol
├── token
│ └── ERC20
│ ├── ERC20Burnable.sol
│ ├── ERC20.sol
│ └── IERC20.sol
└── utils
└── Context.sol
14 directories, 11 files
Output contract code:
ethscan code 0xD33526068D116cE69F19A9ee46F0bd304F21A51f
[
...
{
content: '/**\n' +
' * .\n' +
' * / \\\n' +
" * |.'.|\n" +
" * |'.'|\n" +
" * ,'| |`.\n" +
" * |,-'-|-'-.|\n" +
' * __|_| | _ _ _____ _\n' +
' * | ___ \\| | | | | | ___ \\ | |\n' +
' * | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |\n' +
' * | // _ \\ / __| |/ / _ \\ __| | __/ _ \\ / _ \\| |\n' +
' * | |\\ \\ (_) | (__| < __/ |_ | | | (_) | (_) | |\n' +
' * \\_| \\_\\___/ \\___|_|\\_\\___|\\__| \\_| \\___/ \\___/|_|\n' +
' * +---------------------------------------------------+\n' +
' * | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |\n' +
' * +---------------------------------------------------+\n' +
...
'interface RocketTokenRPLInterface is IERC20 {\n' +
' function getInflationCalcTime() external view returns(uint256);\n' +
' function getInflationIntervalTime() external view returns(uint256);\n' +
...
'}\n',
path: '/contracts/interface/token/RocketTokenRPLInterface.sol'
}
]
For local development linking the package is useful. This enables us to use a development version of ethscan
instead of fetching from npm.
npm link
Contributions are welcome! Leave an issue or send an email.
Don't forget to format the code:
npm run fix