Comment on page
Contracts
Returns the Contract Application Binary Interface ( ABI ) of a verified smart contract.
https://api.arbiscan.io/api
?module=contract
&action=getabi
&address=0xff970a61a04b1ca14834a43f5de4533ebddb5cc8
&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\": \"address\",\"name\": \"_logic\",\"type\": \"address\"},{\"internalType\": \"address\",\"name\": \"admin_\",\"type\": \"address\"},{\"internalType\": \"bytes\",\"name\": \"_data\",\"type\": \"bytes\"}],\"stateMutability\": \"payable\",\"type\": \"constructor\"},{\"anonymous\": false,\"inputs\": [{\"indexed\": false,\"internalType\": \"address\",\"name\": \"previousAdmin\",\"type\": \"address\"},{\"indexed\": false,\"internalType\": \"address\",\"name\": \"newAdmin\",\"type\": \"address\"}],\"name\": \"AdminChanged\",\"type\": \"event\"},{\"anonymous\": false,\"inputs\": [{\"indexed\": true,\"internalType\": \"address\",\"name\": \"implementation\",\"type\": \"address\"}],\"name\": \"Upgraded\",\"type\": \"event\"},{\"stateMutability\": \"payable\",\"type\": \"fallback\"},{\"inputs\": [],\"name\": \"admin\",\"outputs\": [{\"internalType\": \"address\",\"name\": \"admin_\",\"type\": \"address\"}],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"address\",\"name\": \"newAdmin\",\"type\": \"address\"}],\"name\": \"changeAdmin\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [],\"name\": \"implementation\",\"outputs\": [{\"internalType\": \"address\",\"name\": \"implementation_\",\"type\": \"address\"}],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"address\",\"name\": \"newImplementation\",\"type\": \"address\"}],\"name\": \"upgradeTo\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"address\",\"name\": \"newImplementation\",\"type\": \"address\"},{\"internalType\": \"bytes\",\"name\": \"data\",\"type\": \"bytes\"}],\"name\": \"upgradeToAndCall\",\"outputs\": [],\"stateMutability\": \"payable\",\"type\": \"function\"},{\"stateMutability\": \"payable\",\"type\": \"receive\"}]"
}
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.arbiscan.io/api?module=contract&action=getabi&address=0xff970a61a04b1ca14834a43f5de4533ebddb5cc8', function (data) {
var contractABI = "";
contractABI = JSON.parse(data.result);
if (contractABI != ''){
var MyContract = web3.eth.contract(contractABI);
var myContractInstance = MyContract.at("0xff970a61a04b1ca14834a43f5de4533ebddb5cc8");
var result = myContractInstance.memberId("0xff970a61a04b1ca14834a43f5de4533ebddb5cc8");
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.arbiscan.io/api
?module=contract
&action=getsourcecode
&address=0xb672bf45a69029fec2273e59417c3e36f32bef4f
&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":"pragma solidity ^0.4.15;\r\n\r\n/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.\r\n/// @author Stefan George - <[email protected]>\r\ncontract MultiSigWallet {\r\n /*\r\n * Events\r\n */\r\n event Confirmation(address indexed sender, uint256 indexed transactionId);\r\n event Revocation(address indexed sender, uint256 indexed transactionId);\r\n event Submission(uint256 indexed transactionId);\r\n event Execution(uint256 indexed transactionId);\r\n event ExecutionFailure(uint256 indexed transactionId);\r\n event Deposit(address indexed sender, uint256 value);\r\n event OwnerAddition(address indexed owner);\r\n event OwnerRemoval(address indexed owner);\r\n event RequirementChange(uint256 required);\r\n\r\n /*\r\n * Constants\r\n */\r\n uint256 public constant MAX_OWNER_COUNT = 50;\r\n\r\n /*\r\n * Storage\r\n */\r\n mapping(uint256 => Transaction) public transactions;\r\n mapping(uint256 => mapping(address => bool)) public confirmations;\r\n mapping(address => bool) public isOwner;\r\n address[] public owners;\r\n uint256 public required;\r\n uint256 public transactionCount;\r\n\r\n struct Transaction {\r\n address destination;\r\n uint256 value;\r\n bytes data;\r\n bool executed;\r\n }\r\n\r\n /*\r\n * Modifiers\r\n */\r\n modifier onlyWallet() {\r\n require(msg.sender == address(this));\r\n _;\r\n }\r\n\r\n modifier ownerDoesNotExist(address owner) {\r\n require(!isOwner[owner]);\r\n _;\r\n }\r\n\r\n modifier ownerExists(address owner) {\r\n require(isOwner[owner]);\r\n _;\r\n }\r\n\r\n modifier transactionExists(uint256 transactionId) {\r\n require(transactions[transactionId].destination != 0);\r\n _;\r\n }\r\n\r\n modifier confirmed(uint256 transactionId, address owner) {\r\n require(confirmations[transactionId][owner]);\r\n _;\r\n }\r\n\r\n modifier notConfirmed(uint256 transactionId, address owner) {\r\n require(!confirmations[transactionId][owner]);\r\n _;\r\n }\r\n\r\n modifier notExecuted(uint256 transactionId) {\r\n require(!transactions[transactionId].executed);\r\n _;\r\n }\r\n\r\n modifier notNull(address _address) {\r\n require(_address != 0);\r\n _;\r\n }\r\n\r\n modifier validRequirement(uint256 ownerCount, uint256 _required) {\r\n require(\r\n ownerCount <= MAX_OWNER_COUNT &&\r\n _required <= ownerCount &&\r\n _required != 0 &&\r\n ownerCount != 0\r\n );\r\n _;\r\n }\r\n\r\n /// @dev Fallback function allows to deposit ether.\r\n function() payable {\r\n if (msg.value > 0) Deposit(msg.sender, msg.value);\r\n }\r\n\r\n /*\r\n * Public functions\r\n */\r\n /// @dev Contract constructor sets initial owners and required number of confirmations.\r\n /// @param _owners List of initial owners.\r\n /// @param _required Number of required confirmations.\r\n function MultiSigWallet(address[] _owners, uint256 _required)\r\n public\r\n validRequirement(_owners.length, _required)\r\n {\r\n for (uint256 i = 0; i < _owners.length; i++) {\r\n require(!isOwner[_owners[i]] && _owners[i] != 0);\r\n isOwner[_owners[i]] = true;\r\n }\r\n owners = _owners;\r\n required = _required;\r\n }\r\n\r\n /// @dev Allows to add a new owner. Transaction has to be sent by wallet.\r\n /// @param owner Address of new owner.\r\n function addOwner(address owner)\r\n public\r\n onlyWallet\r\n ownerDoesNotExist(owner)\r\n notNull(owner)\r\n validRequirement(owners.length + 1, required)\r\n {\r\n isOwner[owner] = true;\r\n owners.push(owner);\r\n OwnerAddition(owner);\r\n }\r\n\r\n /// @dev Allows to remove an owner. Transaction has to be sent by wallet.\r\n /// @param owner Address of owner.\r\n function removeOwner(address owner) public onlyWallet ownerExists(owner) {\r\n isOwner[owner] = false;\r\n for (uint256 i = 0; i < owners.length - 1; i++)\r\n if (owners[i] == owner) {\r\n owners[i] = owners[owners.length - 1];\r\n break;\r\n }\r\n owners.length -= 1;\r\n if (required > owners.length) changeRequirement(owners.length);\r\n OwnerRemoval(owner);\r\n }\r\n\r\n /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\r\n /// @param owner Address of owner to be replaced.\r\n /// @param newOwner Address of new owner.\r\n function replaceOwner(address owner, address newOwner)\r\n public\r\n onlyWallet\r\n ownerExists(owner)\r\n ownerDoesNotExist(newOwner)\r\n {\r\n for (uint256 i = 0; i < owners.length; i++)\r\n if (owners[i] == owner) {\r\n owners[i] = newOwner;\r\n break;\r\n }\r\n isOwner[owner] = false;\r\n isOwner[newOwner] = true;\r\n OwnerRemoval(owner);\r\n OwnerAddition(newOwner);\r\n }\r\n\r\n /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.\r\n /// @param _required Number of required confirmations.\r\n function changeRequirement(uint256 _required)\r\n public\r\n onlyWallet\r\n validRequirement(owners.length, _required)\r\n {\r\n required = _required;\r\n RequirementChange(_required);\r\n }\r\n\r\n /// @dev Allows an owner to submit and confirm a transaction.\r\n /// @param destination Transaction target address.\r\n /// @param value Transaction ether value.\r\n /// @param data Transaction data payload.\r\n /// @return Returns transaction ID.\r\n function submitTransaction(\r\n address destination,\r\n uint256 value,\r\n bytes data\r\n ) public returns (uint256 transactionId) {\r\n transactionId = addTransaction(destination, value, data);\r\n confirmTransaction(transactionId);\r\n }\r\n\r\n /// @dev Allows an owner to confirm a transaction.\r\n /// @param transactionId Transaction ID.\r\n function confirmTransaction(uint256 transactionId)\r\n public\r\n ownerExists(msg.sender)\r\n transactionExists(transactionId)\r\n notConfirmed(transactionId, msg.sender)\r\n {\r\n confirmations[transactionId][msg.sender] = true;\r\n Confirmation(msg.sender, transactionId);\r\n executeTransaction(transactionId);\r\n }\r\n\r\n /// @dev Allows an owner to revoke a confirmation for a transaction.\r\n /// @param transactionId Transaction ID.\r\n function revokeConfirmation(uint256 transactionId)\r\n public\r\n ownerExists(msg.sender)\r\n confirmed(transactionId, msg.sender)\r\n notExecuted(transactionId)\r\n {\r\n confirmations[transactionId][msg.sender] = false;\r\n Revocation(msg.sender, transactionId);\r\n }\r\n\r\n /// @dev Allows anyone to execute a confirmed transaction.\r\n /// @param transactionId Transaction ID.\r\n function executeTransaction(uint256 transactionId)\r\n public\r\n ownerExists(msg.sender)\r\n confirmed(transactionId, msg.sender)\r\n notExecuted(transactionId)\r\n {\r\n if (isConfirmed(transactionId)) {\r\n Transaction storage txn = transactions[transactionId];\r\n txn.executed = true;\r\n if (\r\n external_call(\r\n txn.destination,\r\n txn.value,\r\n txn.data.length,\r\n txn.data\r\n )\r\n ) Execution(transactionId);\r\n else {\r\n ExecutionFailure(transactionId);\r\n txn.executed = false;\r\n }\r\n }\r\n }\r\n\r\n // call has been separated into its own function in order to take advantage\r\n // of the Solidity's code generator to produce a loop that copies tx.data into memory.\r\n function external_call(\r\n address destination,\r\n uint256 value,\r\n uint256 dataLength,\r\n bytes data\r\n ) internal returns (bool) {\r\n bool result;\r\n assembly {\r\n let x := mload(0x40) // \"Allocate\" memory for output (0x40 is where \"free memory\" pointer is stored by convention)\r\n let d := add(data, 32) // First 32 bytes are the padded length of data, so exclude that\r\n result := call(\r\n sub(gas, 34710), // 34710 is the value that solidity is currently emitting\r\n // It includes callGas (700) + callVeryLow (3, to pay for SUB) + callValueTransferGas (9000) +\r\n // callNewAccountGas (25000, in case the destination address does not exist and needs creating)\r\n destination,\r\n value,\r\n d,\r\n dataLength, // Size of the input (in bytes) - this is what fixes the padding problem\r\n x,\r\n 0 // Output is ignored, therefore the output size is zero\r\n )\r\n }\r\n return result;\r\n }\r\n\r\n /// @dev Returns the confirmation status of a transaction.\r\n /// @param transactionId Transaction ID.\r\n /// @return Confirmation status.\r\n function isConfirmed(uint256 transactionId) public constant returns (bool) {\r\n uint256 count = 0;\r\n for (uint256 i = 0; i < owners.length; i++) {\r\n if (confirmations[transactionId][owners[i]]) count += 1;\r\n if (count == required) return true;\r\n }\r\n }\r\n\r\n /*\r\n * Internal functions\r\n */\r\n /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.\r\n /// @param destination Transaction target address.\r\n /// @param value Transaction ether value.\r\n /// @param data Transaction data payload.\r\n /// @return Returns transaction ID.\r\n function addTransaction(\r\n address destination,\r\n uint256 value,\r\n bytes data\r\n ) internal notNull(destination) returns (uint256 transactionId) {\r\n transactionId = transactionCount;\r\n transactions[transactionId] = Transaction({\r\n destination: destination,\r\n value: value,\r\n data: data,\r\n executed: false\r\n });\r\n transactionCount += 1;\r\n Submission(transactionId);\r\n }\r\n\r\n /*\r\n * Web3 call functions\r\n */\r\n /// @dev Returns number of confirmations of a transaction.\r\n /// @param transactionId Transaction ID.\r\n /// @return Number of confirmations.\r\n function getConfirmationCount(uint256 transactionId)\r\n public\r\n constant\r\n returns (uint256 count)\r\n {\r\n for (uint256 i = 0; i < owners.length; i++)\r\n if (confirmations[transactionId][owners[i]]) count += 1;\r\n }\r\n\r\n /// @dev Returns total number of transactions after filers are applied.\r\n /// @param pending Include pending transactions.\r\n /// @param executed Include executed transactions.\r\n /// @return Total number of transactions after filters are applied.\r\n function getTransactionCount(bool pending, bool executed)\r\n public\r\n constant\r\n returns (uint256 count)\r\n {\r\n for (uint256 i = 0; i < transactionCount; i++)\r\n if (\r\n (pending && !transactions[i].executed) ||\r\n (executed && transactions[i].executed)\r\n ) count += 1;\r\n }\r\n\r\n /// @dev Returns list of owners.\r\n /// @return List of owner addresses.\r\n function getOwners() public constant returns (address[]) {\r\n return owners;\r\n }\r\n\r\n /// @dev Returns array with owner addresses, which confirmed transaction.\r\n /// @param transactionId Transaction ID.\r\n /// @return Returns array of owner addresses.\r\n function getConfirmations(uint256 transactionId)\r\n public\r\n constant\r\n returns (address[] _confirmations)\r\n {\r\n address[] memory confirmationsTemp = new address[](owners.length);\r\n uint256 count = 0;\r\n uint256 i;\r\n for (i = 0; i < owners.length; i++)\r\n if (confirmations[transactionId][owners[i]]) {\r\n confirmationsTemp[count] = owners[i];\r\n count += 1;\r\n }\r\n _confirmations = new address[](count);\r\n for (i = 0; i < count; i++) _confirmations[i] = confirmationsTemp[i];\r\n }\r\n\r\n /// @dev Returns list of transaction IDs in defined range.\r\n /// @param from Index start position of transaction array.\r\n /// @param to Index end position of transaction array.\r\n /// @param pending Include pending transactions.\r\n /// @param executed Include executed transactions.\r\n /// @return Returns array of transaction IDs.\r\n function getTransactionIds(\r\n uint256 from,\r\n uint256 to,\r\n bool pending,\r\n bool executed\r\n ) public constant returns (uint256[] _transactionIds) {\r\n uint256[] memory transactionIdsTemp = new uint256[](transactionCount);\r\n uint256 count = 0;\r\n uint256 i;\r\n for (i = 0; i < transactionCount; i++)\r\n if (\r\n (pending && !transactions[i].executed) ||\r\n (executed && transactions[i].executed)\r\n ) {\r\n transactionIdsTemp[count] = i;\r\n count += 1;\r\n }\r\n _transactionIds = new uint256[](to - from);\r\n for (i = from; i < to; i++)\r\n _transactionIds[i - from] = transactionIdsTemp[i];\r\n }\r\n}",
"ABI":"[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"removeOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"revokeConfirmation\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"confirmations\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"addOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"isConfirmed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmationCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"transactions\",\"outputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwners\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"from\",\"type\":\"uint256\"},{\"name\":\"to\",\"type\":\"uint256\"},{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionIds\",\"outputs\":[{\"name\":\"_transactionIds\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmations\",\"outputs\":[{\"name\":\"_confirmations\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"transactionCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_required\",\"type\":\"uint256\"}],\"name\":\"changeRequirement\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"confirmTransaction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"submitTransaction\",\"outputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_OWNER_COUNT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"required\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"replaceOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"executeTransaction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_owners\",\"type\":\"address[]\"},{\"name\":\"_required\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Confirmation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Revocation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Submission\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Execution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"ExecutionFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerAddition\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"RequirementChange\",\"type\":\"event\"}]",
"ContractName":"MultiSigWallet",
"CompilerVersion":"v0.4.26+commit.4563c3fc",
"OptimizationUsed":"0",
"Runs":"200",
"ConstructorArguments":"000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000315efdc2479f0e4645b372d9d722e37a84e523f100000000000000000000000010fabcd7dc6056466d06b6abaf0b2f2f620b2ca2",
"EVMVersion":"Default",
"Library":"",
"LicenseType":"MIT",
"Proxy":"0",
"Implementation":"",
"SwarmSource":"bzzr://e6bff19a0024eb8085d84ca86b94b541bac9200785aaf1f8f1a34c6852f95c62"
}
]
}
Submits a contract source code to Arbiscan for verification.
- 1.
- 2.Only supports HTTP POST due to max transfer size limitations for HTTP GET
- 3.Supports up to 10 different library pairs
- 4.Contracts that use "imports" will need to have the code concatenated into one file as we do not support "imports" in separate files.
- 5.List of supported solc versions, only solc version v0.4.11 and above is supported e.g. v0.4.25+commit.59dbf8f1
- 6.Upon successful submission you will receive a GUID (50 characters) as a receipt
- 7.You may use this GUID to track the status of your submission
- 8.
//Submit Source Code for Verification
$.ajax({
type: "POST", //Only POST supported
url: "//api.arbiscan.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://arbiscan.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-14 where 1=No License .. 14=Business Source License 1.1, see https://arbiscan.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"
}
});
Note: Upon successful submission, a GUID is returned, which can be used to check for submission status.
👇
//Check Source Code Verification Status
$.ajax({
type: "GET",
url: "//api.arbiscan.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 Arbiscan for verification.
- 1.Requires a valid Arbiscan 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.arbiscan.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.arbiscan.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.arbiscan.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