I am building a web UI for testing smart contracts and currently I have to supply the ABI for a contract I test. Is there a way to extract the ABI from a deployed contract (preferably programmatically)?
8 Answers
If the source code has been published to Etherscan, then they have an API to retrieve it. From https://etherscan.io/apis#contracts:
Get Contract ABI for Verified Contract Source Codes
-
Unfortunately this wont work as I need it for smart contracts running on a private network (Ganache)– AndreyJan 30, 2018 at 15:06
-
That's correct. In general, there's no way to get the ABI for a contract unless it's been explicitly stored somewhere. Jan 30, 2018 at 16:57
Go to EtherScan > enter the contract address > click on the Contract in the tab section heading > Scroll down to find the Contract ABI > click on the Copy icon to copy it
Yes, there are tools that try to recover ABI from bytecode.
For example porosity and mythril.
It is not always possible to recover ABI because bytecode does not contain function signatures but only last 4 bytes of function signature hash.
-
If you look at potosity or mythril, you need an ABI to Disassemble or Decompilation. There's no way to get an ABI from a deployed contract.– hefgiMay 16, 2018 at 13:44
Since you are developing the UI, I supposed you have developed the contract as well. In that case, if you are using Truffle, after deploying the contract you can find the ABI for each contract you deployed in the autogenerated build/contracts folder in your project, for example /build/contracts/Migrations.json.
If you are deploying by command line, you can read from the file where is previously builded, in the case of hardhat there is a example:
const fs = require("fs")
const path = require("path")
const getTheAbi = () => {
try {
const dir = path.resolve(
__dirname,
"./artifacts/contracts/HelloWorld.sol/HelloWorld.json"
)
const file = fs.readFileSync(dir, "utf8")
const json = JSON.parse(file)
const abi = json.abi
console.log(`abi`, abi)
return abi
} catch (e) {
console.log(`e`, e)
}
}
When using React, you can check the ABI of deployed contracts by accessing the artifacts folder that is created after deployment:
artifacts -> contracts -> smartcontract.sol -> smartcontract.json
-
If you are using Brownie for local python deployment, after you use command
brownie compile
, you can find the JSON ABI of your smart contract in this folder:build -> contracts -> ContractABC.json
Oct 20, 2022 at 19:22