etht 0.1.3 → 0.1.4
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/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:
         |