etherscan-lite 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Manifest.txt +3 -0
- data/lib/etherscan-lite/base.rb +55 -26
- data/lib/etherscan-lite/contract.rb +21 -0
- data/lib/etherscan-lite/misc.rb +48 -0
- data/lib/etherscan-lite/proxy.rb +46 -0
- data/lib/etherscan-lite/version.rb +1 -1
- data/lib/etherscan-lite.rb +3 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: edbdb29fdae2d064fbf9d6513b2747ecba5058ef8449d3e430c67be2a2aaa4da
|
4
|
+
data.tar.gz: febad888db3cf78c34e78f46ff09bea7555f2ad0ba030b6146172f5fab03e23d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a545c314b42eb7ed7531e79aac0b3a3d495cb3557fcd4f204421154f7b4a1742064552628045af78ff68573e69a44b4ba1e790461507ce26eed2b25990795f4
|
7
|
+
data.tar.gz: 5e66dd8e43960e491b0b2746a38dfeee2a37d6d1b5dfe5c62e1e1d9dd717f752c3973bbf1da4121ae4c7c58f8c87185f565e4ff45b259c0324c18f71383c4ec8
|
data/Manifest.txt
CHANGED
data/lib/etherscan-lite/base.rb
CHANGED
@@ -2,36 +2,19 @@ module Etherscan
|
|
2
2
|
BASE = 'https://api.etherscan.io/api'
|
3
3
|
|
4
4
|
|
5
|
-
|
6
|
-
|
7
5
|
def self.call( src ) ## get response as (parsed) json (hash table)
|
8
|
-
uri = URI.parse( src )
|
9
|
-
|
10
|
-
http = Net::HTTP.new( uri.host, uri.port )
|
11
|
-
|
12
|
-
puts "[debug] GET #{uri.request_uri} uri=#{uri}"
|
13
6
|
|
14
7
|
headers = {
|
15
8
|
# 'User-Agent' => "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
|
16
9
|
'User-Agent' => "ruby v#{RUBY_VERSION}",
|
17
10
|
}
|
18
11
|
|
12
|
+
response = Webclient.get( src, headers: headers )
|
19
13
|
|
20
|
-
|
21
|
-
|
22
|
-
http.use_ssl = true
|
23
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
24
|
-
end
|
25
|
-
|
26
|
-
response = http.request( request )
|
27
|
-
|
28
|
-
if response.code == '200'
|
29
|
-
puts "#{response.code} #{response.message} - content_type: #{response.content_type}, content_length: #{response.content_length}"
|
14
|
+
if response.status.ok?
|
15
|
+
puts "#{response.status.code} #{response.status.message} - content_type: #{response.content_type}, content_length: #{response.content_length}"
|
30
16
|
|
31
|
-
|
32
|
-
text = text.force_encoding( Encoding::UTF_8 )
|
33
|
-
|
34
|
-
data = JSON.parse( text )
|
17
|
+
data = response.json
|
35
18
|
|
36
19
|
## note: "unwrap" result - and auto-check status/message e.g.
|
37
20
|
## {"status"=>"1",
|
@@ -46,19 +29,65 @@ module Etherscan
|
|
46
29
|
## "result":"Max rate limit reached, please use API Key for higher rate limit"
|
47
30
|
## }
|
48
31
|
|
49
|
-
|
50
|
-
|
51
|
-
|
32
|
+
##
|
33
|
+
# note: add special error handling case for no transaction found!!
|
34
|
+
# ==> [8] query 0x01c59869B44F3Fc5420dbB9166a735CdC020E9Ae...
|
35
|
+
# [debug] GET /api?module=account&action=txlist&address=...
|
36
|
+
# 200 OK - content_type: application/json, content_length: 172
|
37
|
+
# !! ETHERSCAN API ERROR:
|
38
|
+
# 0 No transactions found - []
|
39
|
+
|
40
|
+
if data['status'] == '0' && data['message'] == 'No transactions found' && data['result'].empty?
|
41
|
+
data['result']
|
42
|
+
elsif data['status'] == '1' && data['message'] == 'OK'
|
43
|
+
## puts "#{data['status']} #{data['message']}"
|
44
|
+
data['result']
|
52
45
|
else
|
53
46
|
puts "!! ETHERSCAN API ERROR:"
|
54
47
|
puts "#{data['status']} #{data['message']} - #{data['result']}"
|
55
48
|
exit 1
|
56
49
|
end
|
57
50
|
else
|
58
|
-
puts "!! ERROR:"
|
59
|
-
puts "#{response.code} #{response.message}"
|
51
|
+
puts "!! HTTP ERROR:"
|
52
|
+
puts "#{response.status.code} #{response.status.message}"
|
60
53
|
exit 1
|
61
54
|
end
|
62
55
|
end
|
63
56
|
|
57
|
+
|
58
|
+
def self.proxy_call( src ) ## get response as (parsed) json (hash table)
|
59
|
+
|
60
|
+
headers = {
|
61
|
+
# 'User-Agent' => "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
|
62
|
+
'User-Agent' => "ruby v#{RUBY_VERSION}",
|
63
|
+
}
|
64
|
+
|
65
|
+
response = Webclient.get( src, headers: headers )
|
66
|
+
|
67
|
+
if response.status.ok?
|
68
|
+
puts "#{response.status.code} #{response.status.message} - content_type: #{response.content_type}, content_length: #{response.content_length}"
|
69
|
+
|
70
|
+
### check for {"jsonrpc"=>"2.0",
|
71
|
+
## "id"=>1,
|
72
|
+
## "result"=> ... }
|
73
|
+
data = response.json
|
74
|
+
## pp data
|
75
|
+
|
76
|
+
if data['result']
|
77
|
+
data['result']
|
78
|
+
elsif data['error']
|
79
|
+
puts "!! ETHERSCAN API (PROXY JSON-RPC) ERROR:"
|
80
|
+
puts "#{data['error']}"
|
81
|
+
exit 1
|
82
|
+
else
|
83
|
+
puts "!! ETHERSCAN API (PROXY JSON-RPC) ERROR:"
|
84
|
+
puts " No response on request"
|
85
|
+
exit 1
|
86
|
+
end
|
87
|
+
else
|
88
|
+
puts "!! HTTP ERROR:"
|
89
|
+
puts "#{response.status.code} #{response.status.message}"
|
90
|
+
exit 1
|
91
|
+
end
|
92
|
+
end
|
64
93
|
end # module Etherscan
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Etherscan
|
2
|
+
|
3
|
+
|
4
|
+
###
|
5
|
+
## Get Contract Creator and Creation Tx Hash
|
6
|
+
## Returns a contract's deployer address and transaction hash
|
7
|
+
## it was created, up to 5 at a time.
|
8
|
+
## see https://docs.etherscan.io/api-endpoints/contracts#get-contract-creator-and-creation-tx-hash
|
9
|
+
def self.getcontractcreation_url( contractaddresses: )
|
10
|
+
src = "#{BASE}?module=contract&action=getcontractcreation" +
|
11
|
+
"&contractaddresses=#{contractaddresses.join(',')}" +
|
12
|
+
"&apikey=#{config.key}"
|
13
|
+
src
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.getcontractcreation( **kwargs )
|
17
|
+
call( getcontractcreation_url( **kwargs ) )
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
end # module Etherscan
|
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
module Etherscan
|
3
|
+
|
4
|
+
|
5
|
+
###############
|
6
|
+
# all-in-one helper for getting contract details
|
7
|
+
# note: requires (collects data via) three api calls
|
8
|
+
|
9
|
+
def self.getcontractdetails( contractaddress: )
|
10
|
+
|
11
|
+
delay_in_s = 0.5
|
12
|
+
puts " sleeping #{delay_in_s} sec(s)..."
|
13
|
+
sleep( delay_in_s )
|
14
|
+
data = getcontractcreation( contractaddresses: [contractaddress] )
|
15
|
+
## pp data
|
16
|
+
|
17
|
+
# [{"contractAddress"=>"0x16f5a35647d6f03d5d3da7b35409d65ba03af3b2",
|
18
|
+
# "contractCreator"=>"0xc352b534e8b987e036a93539fd6897f53488e56a",
|
19
|
+
# "txHash"=>"0xc82aa34310c310463eb9fe7835471f7317ac4b5008034a78c93b2a8a237be228"}]
|
20
|
+
|
21
|
+
## reuse hash from repsone - why? why not?
|
22
|
+
details = data[0]
|
23
|
+
|
24
|
+
puts " sleeping #{delay_in_s} sec(s)..."
|
25
|
+
sleep( delay_in_s )
|
26
|
+
data2 = gettransactionbyhash( txhash: details['txHash'] )
|
27
|
+
## puts
|
28
|
+
## pp data2
|
29
|
+
# {"blockHash"=>"0x07f9b4846ee2702da8d18b9eeead15912d977acc8886ab9bf5d760914cb37670",
|
30
|
+
# "blockNumber"=>"0x3f17d2",
|
31
|
+
# "from"=>"0xa97f8ffc8f8e354475880448334e4e99a0e7212f",
|
32
|
+
# "gas"=>"0x2c51d3",
|
33
|
+
# "gasPrice"=>"0x53c53dc33",
|
34
|
+
# "hash"=>"0x79d48c41b99f0ac8f735dbf4d048165542576862df2b05a80be9a4dbe233a623",
|
35
|
+
details['blockNumber'] = data2['blockNumber']
|
36
|
+
|
37
|
+
puts " sleeping #{delay_in_s} sec(s)..."
|
38
|
+
sleep( delay_in_s )
|
39
|
+
data3 = getblockbynumber( blocknumber: data2['blockNumber'] )
|
40
|
+
## puts
|
41
|
+
## pp data3
|
42
|
+
|
43
|
+
details['timestamp'] = data3['timestamp']
|
44
|
+
details
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
end # module Etherscan
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
module Etherscan
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
###
|
7
|
+
## eth_getTransactionByHash
|
8
|
+
## Returns the information about a transaction requested
|
9
|
+
## by transaction hash.
|
10
|
+
## see https://docs.etherscan.io/api-endpoints/geth-parity-proxy#eth_gettransactionbyhash
|
11
|
+
|
12
|
+
def self.gettransactionbyhash_url( txhash: )
|
13
|
+
src = "#{BASE}?module=proxy&action=eth_getTransactionByHash" +
|
14
|
+
"&txhash=#{txhash}" +
|
15
|
+
"&apikey=#{config.key}"
|
16
|
+
src
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.gettransactionbyhash( **kwargs )
|
20
|
+
## note: requires proxy_call!!! - different return / response format in json!!
|
21
|
+
proxy_call( gettransactionbyhash_url( **kwargs ) )
|
22
|
+
end
|
23
|
+
|
24
|
+
#####
|
25
|
+
## eth_getBlockByNumber
|
26
|
+
## Returns information about a block by block number.
|
27
|
+
## see https://docs.etherscan.io/api-endpoints/geth-parity-proxy#eth_getblockbynumber
|
28
|
+
##
|
29
|
+
## the boolean value to show full transaction objects.
|
30
|
+
## when true, returns full transaction objects and their information,
|
31
|
+
## when false only returns a list of transactions.
|
32
|
+
def self.getblockbynumber_url( blocknumber:, transactions: false )
|
33
|
+
src = "#{BASE}?module=proxy&action=eth_getBlockByNumber" +
|
34
|
+
"&tag=#{blocknumber}" + ## note - must be a hexstring !!! e.g. 0x10d4f
|
35
|
+
"&boolean=#{transactions}" + ## " note:must be true or false
|
36
|
+
"&apikey=#{config.key}"
|
37
|
+
src
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.getblockbynumber( **kwargs )
|
41
|
+
## note: requires proxy_call!!! - different return / response format in json!!
|
42
|
+
proxy_call( getblockbynumber_url( **kwargs ) )
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
end # module Etherscan
|
data/lib/etherscan-lite.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: etherscan-lite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-12-
|
11
|
+
date: 2022-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cocos
|
@@ -75,6 +75,9 @@ files:
|
|
75
75
|
- lib/etherscan-lite.rb
|
76
76
|
- lib/etherscan-lite/account.rb
|
77
77
|
- lib/etherscan-lite/base.rb
|
78
|
+
- lib/etherscan-lite/contract.rb
|
79
|
+
- lib/etherscan-lite/misc.rb
|
80
|
+
- lib/etherscan-lite/proxy.rb
|
78
81
|
- lib/etherscan-lite/version.rb
|
79
82
|
homepage: https://github.com/rubycocos/blockchain
|
80
83
|
licenses:
|