EtherscanClient
简介
Etherscan API 客户端是 Rest API 的 Swift 版本。
示例
要运行示例项目,请克隆仓库,然后首先从 Example 目录中运行 pod install
安装
EtherscanClient 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod 'EtherscanClient'
作者
如有任何问题,请随时通过电子邮件向我发送 [email protected]
许可证
EtherscanClientffmpeg可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。
初始化
Etherscan Client必须使用API密钥和一个账户地址进行初始化。
let client = EtherscanClient(apiKey: "XXXXXXXXXXXXXXXXXX", accountAddress: "0x9dd134d14d1e65f84b706d6f205cd5b1cd03a46b")
账户
以下调用是Etherscan的账户模块的一部分。
获取以太币余额
一次最多处理20个账户。不使用任何参数将调用默认的accountAddress
获取余额。addresses
:一个可选的地址数组,默认为nil
。
client.getBalance() { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
let addresses = ["0xddbd2b932c763ba5b1b7ae3b362eac3e8d40121a",
"0x63a9975ba31b0b9626b34300f7f627147df1f526",
"0x198ef1ec325a96cc354c7266a038be8b5c558f67"]
client.getBalance(addresses: addresses) { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
获取“正常”交易的列表
address
:可选的交易地址。默认为初始账户地址startBlock
:可选的起始区块编号endBlock
:可选的结束区块编号page
:可选的页码。与偏移量一起使用。如果设置为空,则查询将返回最多10000次交易。offset
:可选的偏移量。每页的交易数量
/// Gets a list of normal transactions from the default account
client.getTransaction() { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
/// Gets a list of normal transactions from an address
client.getTransaction(address: "0x9dd134d14d1e65f84b706d6f205cd5b1cd03a46b") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
/// Get a filtered list of normal Transactions based on start and end block
client.getTransaction(startBlock: "0", endBlock: "99999999") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
/// Get a paginated list of normal Transactions
client.getTransaction(page: "1", offset: "10") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
获取“内部”交易的列表
address
:交易地址。默认为初始账户地址txHash
:使用地址查询的替代方案。查询 txHash 时地址必须设置为 nullstartBlock
:可选的起始区块编号endBlock
:可选的结束区块编号page
:可选的页码。与偏移量一起使用。如果设置为空,则查询将返回最多10000次交易。offset
:可选的偏移量。每页的交易数量
/// Gets a list of internal transactions from the default account
client.getInternalTransaction() { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
/// Get a list of internal transactions by transaction hash
client.getInternalTransaction(txhash: "0x40eb908387324f2b575b4879cd9d7188f69c8fc9d87c901b9e2daaea4b442170") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
按地址获取“ERC20 - Token Transfer Events”列表
address
:转账事件地址。默认为初始账户地址startBlock
:可选的起始区块编号endBlock
:可选的结束区块编号page
:可选的页码。与偏移量一起使用。如果设置为空,则查询将返回最多10000次交易。offset
:可选的偏移量。每页的交易数量contractAddress
:ERC20合同的合约地址
/// Get a list of all ERC20 token transfers from the default account
client.getErc20Transfers() { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
/// Get a list of ERC20 transfers from a specific ERC20 token
client.getErc20Transfers(contractAddress: "0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
按地址获取挖掘的区块列表
address
:区块地址。默认为初始账户地址blockType
:可以是.blocks
或.uncles
。默认为.blocks
page
:可选的页码。与偏移量一起使用。如果设置为空,则查询将返回最多10000次交易。offset
:每页的交易数量
client.getBlocksMined() { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
/// Getting uncle blocks mined
client.getBlocksMined(blockType: .uncles) { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
合约
以下调用是 Etherscan 的 合约模块的一部分
获取已验证合约源代码的合约 ABI
address
:合约地址
client.getContractABI(address: "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
获取已验证合约源代码的合约源代码
address
:合约地址
client.getSourceCode(address: "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
交易
以下调用是Etherscan的交易模块的一部分
检查合约执行状态(如果在合约执行期间出现错误)
txHash
:交易哈希
client.checkContractExecutionStatus(txHash: "0x15f8e5ea1079d9a0bb04a4c58ae5fe7654b5b2b4463375ff7ffb490aa0032f3a") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
检查交易回执状态(仅适用于比(Byzantium)分叉后的交易)
txHash
:交易哈希
client.checkContractExecutionStatus(txHash: "0x15f8e5ea1079d9a0bb04a4c58ae5fe7654b5b2b4463375ff7ffb490aa0032f3a") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
区块
以下调用是Etherscan的区块模块的一部分
通过区块号获取区块和叔父奖励
blockno
:区块号
client.getBlockReward(blockno: "2165403") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
通过块号获取预估区块倒计时时间
blockno
:区块号
client.getBlockCountDown(blockno: "16100000") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
根据时间戳获取区块编号
timestamp
: 秒级的Unix时间戳closest
:.before
或.after
client.getBlockNo(timestamp: "1578638524", closest: .before) { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
事件日志
以下调用是Etherscan的事件模块的一部分
获取事件日志
事件日志API旨在提供对原生的eth_getLogs的替代方案。出于性能和安全的考虑,仅返回前1000个结果。请缩小过滤参数
fromBlock
: 块号,整数或 'latest'toBlock
: 块号,整数或 'latest'address
: 事件地址topicx
:.topic0
,. topic1
,. topic2
,或.topic3
topicxbytes
: topicx字节(32字节)topicOperator
: 仅在包含topic y时使用。可以是.and
或.or
topicy
: 使用.topic1
,.topic2
或.topic3
topicybytes
: topicy字节(32字节)
client.getEventLog(fromBlock: "379224", toBlock: "latest", address: "0x33990122638b9132ca29c723bdf037f1a891a70c", topicx: .topic0, topicxbytes: "0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
client.getEventLog(fromBlock: "379224", toBlock: "latest", address: "0x33990122638b9132ca29c723bdf037f1a891a70c", topicx: .topic0, topicxbytes: "0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545", topicOperator: .and, topicy: .topic1, topicybytes: "0x72657075746174696f6e00000000000000000000000000000000000000000000") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
代币
以下调用是Etherscan的代币模块的一部分
通过合约地址获取ERC20-Token TotalSupply
contractAddress
: ERC20代币地址
client.getErc20TotalSupply(contractAddress: "0x57d90b64a1a57749b0f932f1a3395792e12e7055") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
根据 TokenContractAddress 获取 ERC20 代币账户余额
contractAddress
: ERC20 代币的地址 address
: 账户地址
client.getErc20AccountBalance(contractAddress: "0x57d90b64a1a57749b0f932f1a3395792e12e7055", address: "0xe04f27eb70e025b78871a2ad7eabe85e61212761") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
燃气跟踪器
获取确认时间估算
gasPrice
: 以 wei 为单位的 gas 价格
client.getGasEstimationTime(gasPrice: "2000000000") { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
获取 gas oracle
client.getGasOracle { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
统计信息
以下调用是 Etherscan 的 统计模块的一部分
获取以太币总供应量
client.getTotalEthSupply { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
获取以太币上次价格(在 BTC 和 USD 中)
client.getEthLastPrice { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
获取以太坊节点大小
startDate
: 开始日期必须为 'yyyy-MM-dd' 格式endDate
: 结束日期必须为 'yyyy-MM-dd' 格式clientType
: 必须是 .geth 或 .parityisArchived
: 如果同步模式为归档或默认的标志值(可选)
client.getEthNodeSize(startDate: "2019-02-01", endDate: "2019-02-28", clientType: .geth) { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
client.getEthNodeSize(startDate: "2019-02-01", endDate: "2019-02-28", clientType: .geth, isArchived: true) { result in
switch result {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
}
待办事项
代理模块
当前,来自代理模块返回的数据全部为十六进制编码。
经过验证的合约地址和名称列表
Etherscan 发布了一个 csv 列表https://etherscan.io/exportData?type=open-source-contract-codes