etht 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -5
- data/etht.gemspec +2 -1
- data/exe/etht +4 -1
- data/lib/etht.rb +9 -2
- data/lib/etht/bigquery.rb +10 -12
- data/lib/etht/etherscan.rb +177 -0
- data/lib/etht/version.rb +1 -1
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ca8ae2c29d35644a3d72e1ed819048020838736539e71023d5b81a0808875a5
|
4
|
+
data.tar.gz: c40d028004ed756b4805eed8e89a71e0a7efc35de52bee891ebe7c00bc358abd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 005a56ce7e56e95fa9bcff843e9077a129f3492e5aa149a78d7f184307a88bc68e058004159fddeabd04c5b41eacec5eae405445a8d091b41dcdf9e5dd81f761
|
7
|
+
data.tar.gz: 5707e919d084a23f8115b3516db8a3979555decb1b682245fba6249f31a46166ee8047687eeb3390eec0a9c59f8f8c4aa7e75d4ed09acff2d2f4a9b936b1bae0
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
etht (0.1.
|
5
|
-
|
4
|
+
etht (0.1.4)
|
5
|
+
faraday
|
6
6
|
google-cloud-bigquery
|
7
|
+
json
|
7
8
|
thor
|
8
9
|
yard
|
9
10
|
|
@@ -15,9 +16,6 @@ GEM
|
|
15
16
|
concurrent-ruby (1.1.7)
|
16
17
|
declarative (0.0.20)
|
17
18
|
declarative-option (0.1.0)
|
18
|
-
etherscan_api (0.4.0)
|
19
|
-
faraday
|
20
|
-
json (~> 2.1)
|
21
19
|
faraday (1.0.1)
|
22
20
|
multipart-post (>= 1.2, < 3)
|
23
21
|
google-api-client (0.43.0)
|
data/etht.gemspec
CHANGED
@@ -30,8 +30,9 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.add_development_dependency 'bundler'
|
31
31
|
spec.add_development_dependency 'rake'
|
32
32
|
|
33
|
-
spec.add_dependency '
|
33
|
+
spec.add_dependency 'faraday'
|
34
34
|
spec.add_dependency 'google-cloud-bigquery'
|
35
|
+
spec.add_dependency 'json'
|
35
36
|
spec.add_dependency 'thor'
|
36
37
|
spec.add_dependency 'yard'
|
37
38
|
end
|
data/exe/etht
CHANGED
data/lib/etht.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'thor'
|
4
4
|
require 'etht/bigquery'
|
5
|
+
require 'etht/etherscan'
|
5
6
|
require 'etht/version'
|
6
7
|
|
7
8
|
# @author Hernani Rodrigues Vaz
|
@@ -9,6 +10,12 @@ module Etht
|
|
9
10
|
ID = `whoami`.chomp
|
10
11
|
|
11
12
|
class Error < StandardError; end
|
13
|
+
# class Exception < StandardError
|
14
|
+
class Exception < StandardError
|
15
|
+
def initialize(message)
|
16
|
+
super(message)
|
17
|
+
end
|
18
|
+
end
|
12
19
|
|
13
20
|
# CLI para carregar etherscan comuns no bigquery
|
14
21
|
class CLI < Thor
|
@@ -17,13 +24,13 @@ module Etht
|
|
17
24
|
option :m, type: :boolean, default: false, desc: 'apaga linhas existencia multipla'
|
18
25
|
# processa etherscan
|
19
26
|
def work
|
20
|
-
Bigquery.new({ e: options[:e], m: options[:m], i: true }).
|
27
|
+
Bigquery.new({ e: options[:e], m: options[:m], i: true }).processa_eth
|
21
28
|
end
|
22
29
|
|
23
30
|
desc 'show', 'mostra dados do etherscan'
|
24
31
|
# show etherscan
|
25
32
|
def show
|
26
|
-
Bigquery.new.
|
33
|
+
Bigquery.new.processa_eth
|
27
34
|
end
|
28
35
|
|
29
36
|
default_task :show
|
data/lib/etht/bigquery.rb
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'etherscan'
|
4
3
|
require 'google/cloud/bigquery'
|
5
4
|
|
6
|
-
#
|
7
|
-
Etherscan.configure do |config|
|
8
|
-
config.key = 'QA14GAMNM3AJIX8IEGA8MHEHBHJDTDSBPX'
|
9
|
-
end
|
10
|
-
|
5
|
+
# @author Hernani Rodrigues Vaz
|
11
6
|
module Etht
|
12
7
|
DF = '%Y-%m-%d'
|
13
8
|
DI = '%Y-%m-%d %H:%M:%S'
|
@@ -16,10 +11,8 @@ module Etht
|
|
16
11
|
class Bigquery
|
17
12
|
# @return [Google::Cloud::Bigquery] API bigquery
|
18
13
|
attr_reader :apibq
|
19
|
-
# @return [
|
20
|
-
attr_reader :
|
21
|
-
# @return [Hash<Symbol, Boolean>] opcoes trabalho com linhas
|
22
|
-
attr_reader :linha
|
14
|
+
# @return [Etherscan::Api] API etherscan
|
15
|
+
attr_reader :apies
|
23
16
|
|
24
17
|
# @return [Array] row folha calculo em processamento
|
25
18
|
attr_reader :row
|
@@ -34,14 +27,19 @@ module Etht
|
|
34
27
|
# @option ops [Boolean] :m (false) apaga linhas existencia multipla?
|
35
28
|
# @option ops [Boolean] :i (false) insere linha nova?
|
36
29
|
# @return [Bigquery] acesso folhas calculo bloks.io & correspondente bigquery dataset
|
37
|
-
def initialize(
|
30
|
+
def initialize(ops = { e: false, m: false, i: false })
|
38
31
|
# usa env GOOGLE_APPLICATION_CREDENTIALS para obter credentials
|
39
32
|
# @see https://cloud.google.com/bigquery/docs/authentication/getting-started
|
40
33
|
@apibq = Google::Cloud::Bigquery.new
|
41
|
-
@
|
34
|
+
@apies = Etht::Accounts.new
|
42
35
|
@linha = ops
|
43
36
|
end
|
44
37
|
|
38
|
+
def processa_eth
|
39
|
+
contract_address = '0xfc325129a11fab241287e42a9f04a74f14077b77'
|
40
|
+
p apies.normal_transactions(contract_address)
|
41
|
+
end
|
42
|
+
|
45
43
|
# cria job bigquery & verifica execucao
|
46
44
|
#
|
47
45
|
# @param [String] sql a executar
|
@@ -0,0 +1,177 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'faraday'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
# @author Hernani Rodrigues Vaz
|
7
|
+
module Etht
|
8
|
+
# class Config
|
9
|
+
class Config
|
10
|
+
attr_accessor :key, :secret, :url, :raise_exceptions
|
11
|
+
attr_writer :logger
|
12
|
+
|
13
|
+
def logger
|
14
|
+
@logger ||= Logger.new(STDERR)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# class Api
|
19
|
+
class Api
|
20
|
+
attr_reader :connection
|
21
|
+
|
22
|
+
def initialize(params = {})
|
23
|
+
@connection = Etht::Client.new(params)
|
24
|
+
end
|
25
|
+
|
26
|
+
def get(params)
|
27
|
+
response = connection.get(params)
|
28
|
+
response['result']
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# class Client
|
33
|
+
class Client
|
34
|
+
URL = 'https://api.etherscan.io/'
|
35
|
+
HEADERS = { 'Content-Type' => 'application/json', 'Accept' => 'application/json' }.freeze
|
36
|
+
|
37
|
+
attr_reader :key, :url, :user_agent, :headers, :raise_exceptions
|
38
|
+
attr_writer :adapter, :conn
|
39
|
+
|
40
|
+
def initialize(params = {})
|
41
|
+
@key = params.fetch(:key, Etht.config.key)
|
42
|
+
@url = params.fetch(:url, Etht.config.url || URL)
|
43
|
+
@adapter = params.fetch(:adapter, adapter)
|
44
|
+
@conn = params.fetch(:conn, conn)
|
45
|
+
@user_agent = params.fetch(:user_agent, "etherscan/#{Etht::VERSION};ruby")
|
46
|
+
@headers = HEADERS.merge('User-Agent' => @user_agent)
|
47
|
+
@raise_exceptions = params.fetch(:raise_exceptions, Etht.config.raise_exceptions || true)
|
48
|
+
yield self if block_given?
|
49
|
+
end
|
50
|
+
|
51
|
+
def get(params = {})
|
52
|
+
endpoint = 'api'
|
53
|
+
merged_params = params.merge({ apikey: key })
|
54
|
+
response = conn.get(endpoint) do |req|
|
55
|
+
req.headers = headers
|
56
|
+
req.params = merged_params
|
57
|
+
end
|
58
|
+
raise Etht::Exception, response if raise_exceptions? && response.status != 200
|
59
|
+
|
60
|
+
JSON(response.body)
|
61
|
+
end
|
62
|
+
|
63
|
+
def conn
|
64
|
+
@conn ||= Faraday.new(url: @url) do |conn|
|
65
|
+
conn.request :url_encoded
|
66
|
+
conn.adapter adapter
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def adapter
|
71
|
+
@adapter ||= Faraday.default_adapter
|
72
|
+
end
|
73
|
+
|
74
|
+
def raise_exceptions?
|
75
|
+
@raise_exceptions
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# class Accounts < Etht::Api
|
80
|
+
class Accounts < Api
|
81
|
+
def address_balance(address)
|
82
|
+
params = {
|
83
|
+
module: 'account', action: 'balance',
|
84
|
+
address: address, tag: 'latest'
|
85
|
+
}
|
86
|
+
get(params)
|
87
|
+
end
|
88
|
+
|
89
|
+
def multi_address_balance(addresses)
|
90
|
+
raise Etht::Exception, 'up to 20 accounts in a single batch' if addresses.size > 20
|
91
|
+
|
92
|
+
params = {
|
93
|
+
module: 'account', action: 'balancemulti',
|
94
|
+
address: addresses.join(','), tag: 'latest'
|
95
|
+
}
|
96
|
+
get(params)
|
97
|
+
end
|
98
|
+
|
99
|
+
# Get a list of 'Normal' Transactions By Address
|
100
|
+
# if page is not defined Returns up to 10000 last transactions
|
101
|
+
# Available args: start_block, end_block, sort, page, offset
|
102
|
+
# @param sort 'asc' -> ascending order, 'des' -> descending order
|
103
|
+
# @param start_block starting blockNo to retrieve results
|
104
|
+
# @param end_block ending blockNo to retrieve results
|
105
|
+
# @param page Paginated result <page number>
|
106
|
+
# @param offset max records to return
|
107
|
+
def normal_transactions(address, args = {})
|
108
|
+
action = 'txlist'
|
109
|
+
transcations(action, address, nil, args)
|
110
|
+
end
|
111
|
+
|
112
|
+
# Get a list of 'Internal' Transactions By Address
|
113
|
+
# Available args: start_block, end_block, sort, page, offset
|
114
|
+
def internal_transactions(address, args = {})
|
115
|
+
action = 'txlistinternal'
|
116
|
+
transcations(action, address, nil, args)
|
117
|
+
end
|
118
|
+
|
119
|
+
# Get a list of "ERC20 - Token Transfer Events"
|
120
|
+
# @param contract_address Token address (set nil to get a list of all ERC20 transactions)
|
121
|
+
# @param address Address for ERC20 transactions (optional)
|
122
|
+
# Available args: start_block, end_block, sort, page, offset
|
123
|
+
def token_transactions(contract_address, address = nil, args = {})
|
124
|
+
raise Etht::Exception, 'contract or address must be defined' if (contract_address || address).nil?
|
125
|
+
|
126
|
+
action = 'tokentx'
|
127
|
+
transcations(action, address, contract_address, args)
|
128
|
+
end
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
def transcations(action, address, contract_address, args)
|
133
|
+
params = {
|
134
|
+
module: 'account', action: action,
|
135
|
+
address: address, contractaddress: contract_address,
|
136
|
+
startblock: args[:start_block], endblock: args[:end_block],
|
137
|
+
page: args[:page], offset: args[:offset], sort: args[:sort]
|
138
|
+
}.reject { |_, v| v.nil? }
|
139
|
+
get(params)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
# class Tokens < Etht::Api
|
144
|
+
class Tokens < Api
|
145
|
+
def total_supply(contract_address)
|
146
|
+
params = {
|
147
|
+
module: 'stats', action: 'tokensupply',
|
148
|
+
contractaddress: contract_address
|
149
|
+
}
|
150
|
+
get(params)
|
151
|
+
end
|
152
|
+
|
153
|
+
def balance(address, contract_address)
|
154
|
+
params = {
|
155
|
+
module: 'account', action: 'tokenbalance',
|
156
|
+
address: address, contractaddress: contract_address
|
157
|
+
}
|
158
|
+
get(params)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def self.configure
|
163
|
+
yield config
|
164
|
+
end
|
165
|
+
|
166
|
+
def self.config
|
167
|
+
@config ||= Config.new
|
168
|
+
end
|
169
|
+
|
170
|
+
def self.logger
|
171
|
+
config.logger
|
172
|
+
end
|
173
|
+
|
174
|
+
configure do |config|
|
175
|
+
config.key = ENV['ETHERSCAN_API_KEY']
|
176
|
+
end
|
177
|
+
end
|
data/lib/etht/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: etht
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hernâni Rodrigues Vaz
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: faraday
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: json
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: thor
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -116,6 +130,7 @@ files:
|
|
116
130
|
- exe/etht
|
117
131
|
- lib/etht.rb
|
118
132
|
- lib/etht/bigquery.rb
|
133
|
+
- lib/etht/etherscan.rb
|
119
134
|
- lib/etht/version.rb
|
120
135
|
homepage: https://github.com/hernanirvaz/etht
|
121
136
|
licenses:
|