Contracts
Returns the Contract Application Binary Interface ( ABI ) of a verified smart contract.
https://api-ropsten.etherscan.io/api
?module=contract
&action=getabi
&address=0x41c61A4A5298093b0de024962f048cC790b23F89
&apikey=YourApiKeyToken
Request
Response
Query Parameters
Parameter | Description |
---|---|
address | the contract address that has a verified source code |
Sample Response
{
"status":"1",
"message":"OK",
"result":"[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_size\",\"type\":\"uint32\"}],\"name\":\"isBlockSizeSupported\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"upgradeParameters\",\"type\":\"bytes\"}],\"name\":\"upgrade\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_proof\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes32\",\"name\":\"_commitment\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"_chunks\",\"type\":\"uint32\"}],\"name\":\"verifyBlockProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]"
}
A simple sample for retrieving the contractABI using Web3.js and Jquery to interact with a contract.
var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider());
var version = web3.version.api;
$.getJSON('https://api-ropsten.etherscan.io/api?module=contract&action=getabi&address=0x2e150637263745DAC19e0BB90B4348154bCd811f', function (data) {
var contractABI = "";
contractABI = JSON.parse(data.result);
if (contractABI != ''){
var MyContract = web3.eth.contract(contractABI);
var myContractInstance = MyContract.at("0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359");
var result = myContractInstance.memberId("0xfe8ad7dd2f564a877cc23feea6c0a9cc2e783715");
console.log("result1 : " + result);
var result = myContractInstance.members(1);
console.log("result2 : " + result);
} else {
console.log("Error" );
}
});
Returns the Solidity source code of a verified smart contract.
Tip : You can also download a CSV list of verified contracts addresses of which the code publishers have provided a corresponding Open Source license for redistribution.
📩
https://api-ropsten.etherscan.io/api
?module=contract
&action=getsourcecode
&address=0xF34FE09b190A05E7ED8d5911EEd19a2504e3Fcd4
&apikey=YourApiKeyToken
Request
Response
Query Parameters
Parameter | Description |
---|---|
address | the contract address that has a verified source code |
Sample Response
{
"status":"1",
"message":"OK",
"result":[
{
"SourceCode":"// SPDX-License-Identifier: UNLICENSED\r\npragma solidity ^0.8.0;\r\n\r\n//ERC20 Token Standard Interface\r\ninterface ERC20Interface {\r\n // function totalSupply() public view returns (uint256);\r\n\r\n // function balanceOf(address tokenOwner) public view returns (uint256 balance);\r\n\r\n // function allowance(address tokenOwner, address spender) public view returns (uint256 remaining);\r\n\r\n function transfer(address to, uint256 tokens)\r\n external\r\n returns (bool success);\r\n\r\n function approve(address spender, uint256 tokens)\r\n external\r\n returns (bool success);\r\n\r\n function transferFrom(\r\n address from,\r\n address to,\r\n uint256 tokens\r\n ) external returns (bool success);\r\n\r\n //Transfer event - useful for consumers - part of erc20\r\n event Transfer(address indexed _from, address indexed _to, uint256 _value);\r\n\r\n //Approval event - useful for consumers-part of erc20\r\n event Approval(\r\n address indexed _owner,\r\n address indexed _spender,\r\n uint256 _value\r\n );\r\n}\r\n\r\n//ERC20 Token\r\ncontract DappToken is ERC20Interface {\r\n string public name; //token_name\r\n string public symbol; //token_symbol\r\n uint256 public TotalSupply; //read the total no. of tokens with default getter\r\n\r\n mapping(address => uint256) public BalanceOf; //read token balance of specific address\r\n mapping(address => mapping(address => uint256)) public Allowance;\r\n\r\n //constructor func.\r\n constructor(uint256 _initialSupply) {\r\n name = \"NK Token\"; //token_name\r\n symbol = \"NKT\"; //token_symbol\r\n BalanceOf[msg.sender] = _initialSupply; //ref. above mapping\r\n TotalSupply = _initialSupply; //set total no. of tokens\r\n }\r\n\r\n \r\n function transfer(address _to, uint256 _value)\r\n public\r\n override\r\n returns (bool success)\r\n {\r\n //exception if account doesn't have enough tokens\r\n require(BalanceOf[msg.sender] >= _value);\r\n\r\n //Transfer balance\r\n BalanceOf[msg.sender] -= _value; //deduct the value from msg.sender\r\n BalanceOf[_to] += _value; //increase the value of the receiver\r\n\r\n //Transfer event\r\n emit Transfer(msg.sender, _to, _value);\r\n\r\n //returns a boolean\r\n return true;\r\n }\r\n\r\n function approve(address _spender, uint256 _value)\r\n public\r\n override\r\n returns (bool success)\r\n {\r\n //update the allowance\r\n Allowance[msg.sender][_spender] = _value;\r\n\r\n //approve event\r\n emit Approval(msg.sender, _spender, _value);\r\n\r\n //returns a boolean\r\n return true;\r\n }\r\n\r\n\r\n\r\n function transferFrom(\r\n address _from,\r\n address _to,\r\n uint256 _value\r\n ) public override returns (bool success) {\r\n //_from has enough tokens i.e _value is always <= balanceOf[_from]\r\n require(_value <= BalanceOf[_from]);\r\n\r\n //require allowance is big enough to send tokens\r\n require(_value <= Allowance[_from][msg.sender]);\r\n\r\n //update the allowance\r\n Allowance[_from][msg.sender] -= _value;\r\n\r\n //change balance\r\n BalanceOf[_from] -= _value;\r\n BalanceOf[_to] += _value;\r\n\r\n //transfer event\r\n emit Transfer(_from, _to, _value);\r\n\r\n //returns a boolean\r\n return true;\r\n }\r\n}",
"ABI":"[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_initialSupply\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"Allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"BalanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
"ContractName":"DappToken",
"CompilerVersion":"v0.8.0+commit.c7dfd78e",
"OptimizationUsed":"0",
"Runs":"200",
"ConstructorArguments":"00000000000000000000000000000000000000000000000000000000000f4240",
"EVMVersion":"Default",
"Library":"",
"LicenseType":"Unlicense",
"Proxy":"0",
"Implementation":"",
"SwarmSource":"ipfs://7fc7a87f54872cd88e1a65665b778063d4d04308cf3e42d6b1c01703a7c0ffd7"
}
]
}
Submits a contract source code to Etherscan for verification.
- 1.
- 2.Current daily limit of 100 submissions per day per user (subject to change)
- 3.Only supports HTTP POST due to max transfer size limitations for HTTP GET
- 4.Supports up to 10 different library pairs
- 5.Contracts that use "imports" will need to have the code concatenated into one file as we do not support "imports" in separate files.
- 6.List of supported solc versions, only solc version v0.4.11 and above is supported e.g. v0.4.25+commit.59dbf8f1
- 7.Upon successful submission you will receive a GUID (50 characters) as a receipt
- 8.You may use this GUID to track the status of your submission
- 9.
Note: Upon successful submission, a GUID is returned, which can be used to check for submission status.
👇
//Submit Source Code for Verification
$.ajax({
type: "POST", //Only POST supported
url: "//api-ropsten.etherscan.io/api", //Set to the correct API url for Other Networks
data: {
apikey: $('#apikey').val(), //A valid API-Key is required
module: 'contract', //Do not change
action: 'verifysourcecode', //Do not change
contractaddress: $('#contractaddress').val(), //Contract Address starts with 0x...
sourceCode: $('#sourceCode').val(), //Contract Source Code (Flattened if necessary)
codeformat: $('#codeformat').val(), //solidity-single-file (default) or solidity-standard-json-input (for std-input-json-format support
contractname: $('#contractname').val(), //ContractName (if codeformat=solidity-standard-json-input, then enter contractname as ex: erc20.sol:erc20)
compilerversion: $('#compilerversion').val(), // see https://ropsten.etherscan.io/solcversions for list of support versions
optimizationUsed: $('#optimizationUsed').val(), //0 = No Optimization, 1 = Optimization used (applicable when codeformat=solidity-single-file)
runs: 200, //set to 200 as default unless otherwise (applicable when codeformat=solidity-single-file)
constructorArguements: $('#constructorArguements').val(), //if applicable
evmversion: $('#evmVersion').val(), //leave blank for compiler default, homestead, tangerineWhistle, spuriousDragon, byzantium, constantinople, petersburg, istanbul (applicable when codeformat=solidity-single-file)
licenseType: $('#licenseType').val(), //Valid codes 1-12 where 1=No License .. 12=Apache 2.0, see https://ropsten.etherscan.io/contract-license-types
libraryname1: $('#libraryname1').val(), //if applicable, a matching pair with libraryaddress1 required
libraryaddress1: $('#libraryaddress1').val(), //if applicable, a matching pair with libraryname1 required
libraryname2: $('#libraryname2').val(), //if applicable, matching pair required
libraryaddress2: $('#libraryaddress2').val(), //if applicable, matching pair required
libraryname3: $('#libraryname3').val(), //if applicable, matching pair required
libraryaddress3: $('#libraryaddress3').val(), //if applicable, matching pair required
libraryname4: $('#libraryname4').val(), //if applicable, matching pair required
libraryaddress4: $('#libraryaddress4').val(), //if applicable, matching pair required
libraryname5: $('#libraryname5').val(), //if applicable, matching pair required
libraryaddress5: $('#libraryaddress5').val(), //if applicable, matching pair required
libraryname6: $('#libraryname6').val(), //if applicable, matching pair required
libraryaddress6: $('#libraryaddress6').val(), //if applicable, matching pair required
libraryname7: $('#libraryname7').val(), //if applicable, matching pair required
libraryaddress7: $('#libraryaddress7').val(), //if applicable, matching pair required
libraryname8: $('#libraryname8').val(), //if applicable, matching pair required
libraryaddress8: $('#libraryaddress8').val(), //if applicable, matching pair required
libraryname9: $('#libraryname9').val(), //if applicable, matching pair required
libraryaddress9: $('#libraryaddress9').val(), //if applicable, matching pair required
libraryname10: $('#libraryname10').val(), //if applicable, matching pair required
libraryaddress10: $('#libraryaddress10').val() //if applicable, matching pair required
},
success: function (result) {
console.log(result);
if (result.status == "1") {
//1 = submission success, use the guid returned (result.result) to check the status of your submission.
// Average time of processing is 30-60 seconds
document.getElementById("postresult").innerHTML = result.status + ";" + result.message + ";" + result.result;
// result.result is the GUID receipt for the submission, you can use this guid for checking the verification status
} else {
//0 = error
document.getElementById("postresult").innerHTML = result.status + ";" + result.message + ";" + result.result;
}
console.log("status : " + result.status);
console.log("result : " + result.result);
},
error: function (result) {
console.log("error!");
document.getElementById("postresult").innerHTML = "Unexpected Error"
}
});
//Check Source Code Verification Status
$.ajax({
type: "GET",
url: "//api-ropsten.etherscan.io/api",
data: {
apikey: $('#apikey').val(),
guid: 'ezq878u486pzijkvvmerl6a9mzwhv6sefgvqi5tkwceejc7tvn', //Replace with your Source Code GUID receipt above
module: "contract",
action: "checkverifystatus"
},
success: function (result) {
console.log("status : " + result.status); //0=Error, 1=Pass
console.log("message : " + result.message); //OK, NOTOK
console.log("result : " + result.result); //result explanation
$('#guidstatus').html(">> " + result.result);
},
error: function (result) {
alert('error');
}
});
Submits a proxy contract source code to Etherscan for verification.
- 1.Requires a valid Etherscan API key, it will be rejected otherwise
- 2.Current daily limit of 100 submissions per day per user (subject to change)
- 3.Only supports HTTP post
- 4.Upon successful submission you will receive a GUID (50 characters) as a receipt
- 5.You may use this GUID to track the status of your submission
- 6.Verified proxy contracts will display the "Read/Write as Proxy" of the implementation contract under the contract address's contract tab
Request
Response
// example with only the mandatory contract address parameter
curl -d "address=0xcbdcd3815b5f975e1a2c944a9b2cd1c985a1cb7f" "https://api-ropsten.etherscan.io/api?module=contract&action=verifyproxycontract&apikey=YourApiKeyToken"
// example using the expectedimplementation optional parameter
// the expectedimplementation enforces a check to ensure the returned implementation contract address == address picked up by the verifier
curl -d "address=0xbc46363a7669f6e12353fa95bb067aead3675c29&expectedimplementation=0xe45a5176bc0f2c1198e2451c4e4501d4ed9b65a6" "https://api-ropsten.etherscan.io/api?module=contract&action=verifyproxycontract&apikey=YourApiKeyToken"
// OK
{"status":"1","message":"OK","result":"gwgrrnfy56zf6vc1fljuejwg6pelnc5yns6fg6y2i6zfpgzquz"}
// NOTOK
{"status":"0","message":"NOTOK","result":"Invalid API Key"}
Request
Response
curl "https://api-ropsten.etherscan.io/api?module=contract&action=checkproxyverification&guid=gwgrrnfy56zf6vc1fljuejwg6pelnc5yns6fg6y2i6zfpgzquz&apikey=YourApiKeyToken"
// OK
{"status":"1","message":"OK","result":"The proxy's (0xbc46363a7669f6e12353fa95bb067aead3675c29) implementation contract is found at 0xe45a5176bc0f2c1198e2451c4e4501d4ed9b65a6 and is successfully updated."}
// NOTOK
{"status":"0","message":"NOTOK","result":"A corresponding implementation contract was unfortunately not detected for the proxy address."}
Last modified 1yr ago