查询已验证合约的合约 ABI 和源代码#
查询已验证合约的合约 ABI、源代码等基本信息,或查询已验证代理合约的实现合约地址信息。
请求路径#
GET
https://web3.okx.com/api/v5/xlayer/contract/verify-contract-info请求参数#
| 参数名 | 类型 | 是否必须 | 描述 |
|---|---|---|---|
| chainShortName | String | 是 | 公链缩写符号,例如 XLAYER |
| contractAddress | String | 是 | 合约地址 |
响应参数#
| 参数名 | 类型 | 描述 |
|---|---|---|
| sourceCode | String | 合约源代码 |
| contractName | String | 合约名称 |
| compilerVersion | String | 使用的编译器版本 |
| compilerType | String | 编译器类型 |
| optimization | String | 编译合约时是否使用了优化,0无优化,1有优化 |
| optimizationRuns | String | 执行优化运行代码的次数 |
| contractAbi | String | 合约ABI |
| evmVersion | String | 编译合约的EVM版本 |
| licenseType | String | 开源许可证类型 |
| libraryInfo | Array | 合约中引用的库的信息 |
| > libraryName | String | 库名称 |
| > libraryAddress | String | 库地址,如0xCfE28868F6E0A24b7333D22D8943279e76aC2cdc |
| proxy | String | 是否为代理合约,0表示不是代理合约,1表示是代理合约 |
| implementation | String | 代理合约的实现合约的地址 |
| swarmSource | String | 合约源代码的Swarm的哈希值 |
请求示例#
shell
curl --location --request GET 'https://web3.okx.com/api/v5/xlayer/contract/verify-contract-info?chainShortName=xlayer&contractAddress=0xcF80631b469A54dcba8c8ee1aF84505f496ed248' \
--header 'OK-ACCESS-KEY: 37c541a1-****-****-****-10fe7a038418' \
--header 'OK-ACCESS-SIGN: leaV********3uw=' \
--header 'OK-ACCESS-PASSPHRASE: 1****6' \
--header 'OK-ACCESS-TIMESTAMP: 2023-10-18T12:21:41.274Z'
响应示例#
json
{
"code": "0",
"msg": "",
"data": [
{
"sourceCode": "// proxy.sol - execute actions atomically through the proxy's identity\r\n\r\n// Copyright (C) 2017 DappHub, LLC\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\r\n\r\npragma solidity ^0.4.23;\r\n\r\ncontract DSAuthority {\r\n function canCall(\r\n address src, address dst, bytes4 sig\r\n ) public view returns (bool);\r\n}\r\n\r\ncontract DSAuthEvents {\r\n event LogSetAuthority (address indexed authority);\r\n event LogSetOwner (address indexed owner);\r\n}\r\n\r\ncontract DSAuth is DSAuthEvents {\r\n DSAuthority public authority;\r\n address public owner;\r\n\r\n constructor() public {\r\n owner = msg.sender;\r\n emit LogSetOwner(msg.sender);\r\n }\r\n\r\n function setOwner(address owner_)\r\n public\r\n auth\r\n {\r\n owner = owner_;\r\n emit LogSetOwner(owner);\r\n }\r\n\r\n function setAuthority(DSAuthority authority_)\r\n public\r\n auth\r\n {\r\n authority = authority_;\r\n emit LogSetAuthority(authority);\r\n }\r\n\r\n modifier auth {\r\n require(isAuthorized(msg.sender, msg.sig));\r\n _;\r\n }\r\n\r\n function isAuthorized(address src, bytes4 sig) internal view returns (bool) {\r\n if (src == address(this)) {\r\n return true;\r\n } else if (src == owner) {\r\n return true;\r\n } else if (authority == DSAuthority(0)) {\r\n return false;\r\n } else {\r\n return authority.canCall(src, this, sig);\r\n }\r\n }\r\n}\r\n\r\ncontract DSNote {\r\n event LogNote(\r\n bytes4 indexed sig,\r\n address indexed guy,\r\n bytes32 indexed foo,\r\n bytes32 indexed bar,\r\n uint wad,\r\n bytes fax\r\n ) anonymous;\r\n\r\n modifier note {\r\n bytes32 foo;\r\n bytes32 bar;\r\n\r\n assembly {\r\n foo := calldataload(4)\r\n bar := calldataload(36)\r\n }\r\n\r\n emit LogNote(msg.sig, msg.sender, foo, bar, msg.value, msg.data);\r\n\r\n _;\r\n }\r\n}\r\n\r\n// DSProxy\r\n// Allows code execution using a persistant identity This can be very\r\n// useful to execute a sequence of atomic actions. Since the owner of\r\n// the proxy can be changed, this allows for dynamic ownership models\r\n// i.e. a multisig\r\ncontract DSProxy is DSAuth, DSNote {\r\n DSProxyCache public cache; // global cache for contracts\r\n\r\n constructor(address _cacheAddr) public {\r\n require(setCache(_cacheAddr));\r\n }\r\n\r\n function() public payable {\r\n }\r\n\r\n // use the proxy to execute calldata _data on contract _code\r\n function execute(bytes _code, bytes _data)\r\n public\r\n payable\r\n returns (address target, bytes32 response)\r\n {\r\n target = cache.read(_code);\r\n if (target == 0x0) {\r\n // deploy contract & store its address in cache\r\n target = cache.write(_code);\r\n }\r\n\r\n response = execute(target, _data);\r\n }\r\n\r\n function execute(address _target, bytes _data)\r\n public\r\n auth\r\n note\r\n payable\r\n returns (bytes32 response)\r\n {\r\n require(_target != 0x0);\r\n\r\n // call contract in current context\r\n assembly {\r\n let succeeded := delegatecall(sub(gas, 5000), _target, add(_data, 0x20), mload(_data), 0, 32)\r\n response := mload(0) // load delegatecall output\r\n switch iszero(succeeded)\r\n case 1 {\r\n // throw if delegatecall failed\r\n revert(0, 0)\r\n }\r\n }\r\n }\r\n\r\n //set new cache\r\n function setCache(address _cacheAddr)\r\n public\r\n auth\r\n note\r\n returns (bool)\r\n {\r\n require(_cacheAddr != 0x0); // invalid cache address\r\n cache = DSProxyCache(_cacheAddr); // overwrite cache\r\n return true;\r\n }\r\n}\r\n\r\n// DSProxyFactory\r\n// This factory deploys new proxy instances through build()\r\n// Deployed proxy addresses are logged\r\ncontract DSProxyFactory {\r\n event Created(address indexed sender, address indexed owner, address proxy, address cache);\r\n mapping(address=>bool) public isProxy;\r\n DSProxyCache public cache = new DSProxyCache();\r\n\r\n // deploys a new proxy instance\r\n // sets owner of proxy to caller\r\n function build() public returns (DSProxy proxy) {\r\n proxy = build(msg.sender);\r\n }\r\n\r\n // deploys a new proxy instance\r\n // sets custom owner of proxy\r\n function build(address owner) public returns (DSProxy proxy) {\r\n proxy = new DSProxy(cache);\r\n emit Created(msg.sender, owner, address(proxy), address(cache));\r\n proxy.setOwner(owner);\r\n isProxy[proxy] = true;\r\n }\r\n}\r\n\r\n// DSProxyCache\r\n// This global cache stores addresses of contracts previously deployed\r\n// by a proxy. This saves gas from repeat deployment of the same\r\n// contracts and eliminates blockchain bloat.\r\n\r\n// By default, all proxies deployed from the same factory store\r\n// contracts in the same cache. The cache a proxy instance uses can be\r\n// changed. The cache uses the sha3 hash of a contract's bytecode to\r\n// lookup the address\r\ncontract DSProxyCache {\r\n mapping(bytes32 => address) cache;\r\n\r\n function read(bytes _code) public view returns (address) {\r\n bytes32 hash = keccak256(_code);\r\n return cache[hash];\r\n }\r\n\r\n function write(bytes _code) public returns (address target) {\r\n assembly {\r\n target := create(0, add(_code, 0x20), mload(_code))\r\n switch iszero(extcodesize(target))\r\n case 1 {\r\n // throw if contract failed to deploy\r\n revert(0, 0)\r\n }\r\n }\r\n bytes32 hash = keccak256(_code);\r\n cache[hash] = target;\r\n }\r\n}",
"contractName": "DSProxy",
"compilerVersion": "v0.4.23+commit.124ca40d",
"compilerType": "solc",
"optimization": "1",
"optimizationRuns": "200",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner_\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[{\"name\":\"response\",\"type\":\"bytes32\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_code\",\"type\":\"bytes\"},{\"indexed\":false,\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[{\"name\":\"target\",\"type\":\"address\"},{\"name\":\"response\",\"type\":\"bytes32\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"cache\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"indexed\":false,\"name\":\"authority_\",\"type\":\"address\"}],\"name\":\"setAuthority\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_cacheAddr\",\"type\":\"address\"}],\"name\":\"setCache\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"authority\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_cacheAddr\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"constant\":false,\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"constant\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sig\",\"type\":\"bytes4\"},{\"indexed\":true,\"name\":\"guy\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"foo\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"bar\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"wad\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"fax\",\"type\":\"bytes\"}],\"name\":\"LogNote\",\"payable\":false,\"type\":\"event\"},{\"constant\":false,\"inputs\":[{\"indexed\":true,\"name\":\"authority\",\"type\":\"address\"}],\"name\":\"LogSetAuthority\",\"payable\":false,\"type\":\"event\"},{\"constant\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"LogSetOwner\",\"payable\":false,\"type\":\"event\"}]",
"evmVersion": "Default",
"licenseType": "No License (None)",
"libraryInfo": "",
"proxy": "0",
"implementation": "",
"swarmSource": "bzzr://e498874c9ba9e75028e0c84f1b1d83b2dad5de910c59b837b32e5a190794c5e1"
}
]
}
