Class: Etherscan::Api

Inherits:
Object
  • Object
show all
Defined in:
lib/etherscan/api.rb

Instance Method Summary collapse

Constructor Details

#initialize(url, api_key = nil) ⇒ Api

Returns a new instance of Api.



3
4
5
6
# File 'lib/etherscan/api.rb', line 3

def initialize(url, api_key = nil)
  @url = url
  @api_key = api_key
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args) ⇒ Object



34
35
36
37
# File 'lib/etherscan/api.rb', line 34

def method_missing(method, *args)
  module_name, action = method.to_s.split('_')
  request(module_name, action, args[0] || {})
end

Instance Method Details

#account_balance(address:, tag: 'latest') ⇒ Object

Accounts



42
43
44
# File 'lib/etherscan/api.rb', line 42

def (address:, tag: 'latest')
  request('account', 'balance', address: address, tag: tag)
end

#account_balancemulti(addresses:, tag: 'latest') ⇒ Object



46
47
48
49
50
51
52
53
54
# File 'lib/etherscan/api.rb', line 46

def (addresses:, tag: 'latest')
  if addresses.is_a? Array
    request('account', 'balancemulti', address: addresses.join(','), tag: tag)
  elsif addresses.is_a? String
    request('account', 'balancemulti', address: addresses, tag: tag)
  else
    raise 'addresses must be an array or a string'
  end
end

#account_tokenbalance(contractaddress:, address:, tag: 'latest') ⇒ Object



176
177
178
# File 'lib/etherscan/api.rb', line 176

def (contractaddress:, address:, tag: 'latest')
  request('account', 'tokenbalance', contractaddress: contractaddress, address: address, tag: tag)
end

#account_tokennfttx(address:, contractaddress:, startblock: 0, endblock: 999_999_999, sort: 'asc', page: 1, offset: 1000) ⇒ Object



88
89
90
91
92
93
94
95
# File 'lib/etherscan/api.rb', line 88

def (address:, contractaddress:,
                       startblock: 0, endblock: 999_999_999, sort: 'asc', page: 1, offset: 1000)
  params = {
    address: address, contractaddress: contractaddress,
    startblock: startblock, endblock: endblock, sort: sort, page: page, offset: offset
  }
  request('account', 'tokennfttx', params)
end

#account_tokentx(address:, contractaddress:, startblock: 0, endblock: 999_999_999, sort: 'asc', page: 1, offset: 1000) ⇒ Object



79
80
81
82
83
84
85
86
# File 'lib/etherscan/api.rb', line 79

def (address:, contractaddress:,
                    startblock: 0, endblock: 999_999_999, sort: 'asc', page: 1, offset: 1000)
  params = {
    address: address, contractaddress: contractaddress,
    startblock: startblock, endblock: endblock, sort: sort, page: page, offset: offset
  }
  request('account', 'tokentx', params)
end

#account_txlist(address:, startblock: 0, endblock: 999_999_999, sort: 'asc', page: 1, offset: 1000) ⇒ Object



56
57
58
59
60
61
62
63
# File 'lib/etherscan/api.rb', line 56

def (address:, startblock: 0, endblock: 999_999_999, sort: 'asc', page: 1, offset: 1000)
  request('account', 'txlist', address: address,
                               startblock: startblock,
                               endblock: endblock,
                               sort: sort,
                               page: page,
                               offset: offset)
end

#account_txlistinternal(address: nil, startblock: 0, endblock: 999_999_999, sort: 'asc', page: 1, offset: 1000) ⇒ Object



65
66
67
68
69
70
71
72
# File 'lib/etherscan/api.rb', line 65

def (address: nil,
                           startblock: 0, endblock: 999_999_999, sort: 'asc', page: 1, offset: 1000)
  params = {
    address: address,
    startblock: startblock, endblock: endblock, sort: sort, page: page, offset: offset
  }
  request('account', 'txlistinternal', params)
end

#account_txlistinternal_by_txhash(txhash:) ⇒ Object



74
75
76
77
# File 'lib/etherscan/api.rb', line 74

def (txhash:)
  # https://docs.etherscan.io/api-endpoints/accounts#get-internal-transactions-by-transaction-hash
  request('account', 'txlistinternal', txhash: txhash)
end

#block_getblockcount(blockno:) ⇒ Object



136
137
138
# File 'lib/etherscan/api.rb', line 136

def block_getblockcount(blockno:)
  request('block', 'getblockcount', blockno: blockno)
end

#block_getblocknobytime(timestamp:, closest: 'before') ⇒ Object



140
141
142
# File 'lib/etherscan/api.rb', line 140

def block_getblocknobytime(timestamp:, closest: 'before')
  request('block', 'getblocknobytime', timestamp: timestamp, closest: closest)
end

#block_getblockreward(blockno:) ⇒ Object

Blocks



132
133
134
# File 'lib/etherscan/api.rb', line 132

def block_getblockreward(blockno:)
  request('block', 'getblockreward', blockno: blockno)
end

#contract_getabi(address:) ⇒ Object

Contracts



100
101
102
# File 'lib/etherscan/api.rb', line 100

def contract_getabi(address:)
  request('contract', 'getabi', address: address)
end

#contract_getcontractcreation(contractaddresses:) ⇒ Object



108
109
110
111
112
113
114
115
116
# File 'lib/etherscan/api.rb', line 108

def contract_getcontractcreation(contractaddresses:)
  if contractaddresses.is_a? Array
    request('contract', 'getcontractcreation', contractaddresses: contractaddresses.join(','))
  elsif contractaddresses.is_a? String
    request('contract', 'getcontractcreation', contractaddresses: contractaddresses)
  else
    raise 'contractaddresses must be an array or a string'
  end
end

#contract_getsourcecode(address:) ⇒ Object



104
105
106
# File 'lib/etherscan/api.rb', line 104

def contract_getsourcecode(address:)
  request('contract', 'getsourcecode', address: address)
end

#logs_getLogs(from_block: 0, to_block: 'latest', address: nil, topic0: nil, topic1: nil, topic2: nil, topic3: nil, topic0_1_opr: nil, topic1_2_opr: nil, topic2_3_opr: nil, topic0_2_opr: nil, topic0_3_opr: nil, topic1_3_opr: nil) ⇒ Object

Logs

fromBlock, toBlock, address topic0, topic1, topic2, topic3 (32 Bytes per topic) topic0_1_opr (and|or between topic0 & topic1), topic1_2_opr (and|or between topic1 & topic2), topic2_3_opr (and|or between topic2 & topic3), topic0_2_opr (and|or between topic0 & topic2), topic0_3_opr (and|or between topic0 & topic3), topic1_3_opr (and|or between topic1 & topic3)



155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/etherscan/api.rb', line 155

def logs_getLogs(from_block: 0, to_block: 'latest', address: nil,
                 topic0: nil, topic1: nil, topic2: nil, topic3: nil,
                 topic0_1_opr: nil, topic1_2_opr: nil, topic2_3_opr: nil,
                 topic0_2_opr: nil, topic0_3_opr: nil, topic1_3_opr: nil)
  params = {
    fromBlock: from_block, toBlock: to_block, address: address,
    topic0: topic0, topic1: topic1, topic2: topic2, topic3: topic3,
    topic0_1_opr: topic0_1_opr, topic1_2_opr: topic1_2_opr, topic2_3_opr: topic2_3_opr,
    topic0_2_opr: topic0_2_opr, topic0_3_opr: topic0_3_opr, topic1_3_opr: topic1_3_opr
  }

  request('logs', 'getLogs', params)
end

#request(module_name, action, params = {}) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/etherscan/api.rb', line 8

def request(module_name, action, params = {})
  params = params.reject { |_k, v| v.nil? } # filter out nil values
  params_query = params.keys.map { |key| "#{key}=#{params[key]}" }.join('&').strip
  params_query = if params_query.empty?
                   ''
                 else
                   "&#{params_query}"
                 end

  api_key_query = @api_key.nil? ? '' : "&apikey=#{@api_key}"

  uri = URI "#{@url}?module=#{module_name}&action=#{action}#{params_query}#{api_key_query}"
  Etherscan.logger.debug "Req: #{uri}"
  resp = Net::HTTP.get(uri)
  Etherscan.logger.debug "Rsp: #{resp}"
  resp = JSON.parse(resp)

  raise resp['result'] if resp['status'] == '0'

  resp['result']
end

#respond_to_missing?(*_args) ⇒ Boolean

Returns:

  • (Boolean)


30
31
32
# File 'lib/etherscan/api.rb', line 30

def respond_to_missing?(*_args)
  true
end

#stats_ethpriceObject



187
188
189
# File 'lib/etherscan/api.rb', line 187

def stats_ethprice
  request('stats', 'ethprice')
end

#stats_ethsupplyObject

Stats



183
184
185
# File 'lib/etherscan/api.rb', line 183

def stats_ethsupply
  request('stats', 'ethsupply')
end

#stats_tokensupply(contractaddress:) ⇒ Object

Tokens



172
173
174
# File 'lib/etherscan/api.rb', line 172

def stats_tokensupply(contractaddress:)
  request('stats', 'tokensupply', contractaddress: contractaddress)
end

#transaction_getstatus(txhash:) ⇒ Object

Transactions



121
122
123
# File 'lib/etherscan/api.rb', line 121

def transaction_getstatus(txhash:)
  request('transaction', 'getstatus', txhash: txhash)
end

#transaction_gettxreceiptstatus(txhash:) ⇒ Object



125
126
127
# File 'lib/etherscan/api.rb', line 125

def transaction_gettxreceiptstatus(txhash:)
  request('transaction', 'gettxreceiptstatus', txhash: txhash)
end