etherscanio 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 75235b7097173271620ff5b1c5934c3b0925e984
4
+ data.tar.gz: e3931309dbcb07e4cbf8bb11cf1f183f3c65e9ce
5
+ SHA512:
6
+ metadata.gz: 8dae5cd73b1dca8178eeb9b908310a08cd8283a3a89c1bf147f05c55b21f647f96d13bfadaeb8b157e39989869bd95746953f811aa3261264b1ddc84e7128966
7
+ data.tar.gz: b8fd18b33f4049886995373bbf2c8f9cde3bac51d6d5c3c5b0e6afbafab912b97123a48c1d0c678d12a0b56a5f4f8efb130014372d9f60276c6abd5d33e4dbf7
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+
11
+ # rspec failure tracking
12
+ .rspec_status
@@ -0,0 +1,90 @@
1
+ Metrics/BlockLength:
2
+ Enabled: false
3
+
4
+ # Disable global vars
5
+ Style/SpecialGlobalVars:
6
+ Enabled: false
7
+
8
+ # Disable class length restriction
9
+ Metrics/ClassLength:
10
+ Enabled: false
11
+
12
+ # Disable module length restriction
13
+ Metrics/ModuleLength:
14
+ Enabled: false
15
+
16
+ # Disable method length restriction
17
+ Metrics/MethodLength:
18
+ Enabled: false
19
+
20
+ # Disable checking of ABC metrics (assignment, branch, condition)
21
+ Metrics/AbcSize:
22
+ Enabled: false
23
+
24
+ # Disable method perceived complexity (how it is hard to read a method)
25
+ Metrics/PerceivedComplexity:
26
+ Enabled: false
27
+
28
+ # Disable cyclomatic complexity which is a number of paths through a method
29
+ Metrics/CyclomaticComplexity:
30
+ Enabled: false
31
+
32
+ # Block nesting is 5
33
+ Metrics/BlockNesting:
34
+ Max: 5
35
+
36
+ # Set max line length to 120
37
+ Metrics/LineLength:
38
+ Max: 120
39
+
40
+ # Set max line length to 120
41
+ Metrics/ParameterLists:
42
+ Max: 6
43
+
44
+ Style/Documentation:
45
+ Enabled: false
46
+
47
+ # Trailing comma helps not to forget to put it
48
+ # if you want to add new value below
49
+ Style/TrailingCommaInLiteral:
50
+ Enabled: false
51
+
52
+ # It is totally ok to use block chain by my preference
53
+ # It promotes functional programming style
54
+ Style/MultilineBlockChain:
55
+ Enabled: false
56
+
57
+ # Empty lines are enabled to simplify vim paragraph selection
58
+ Style/EmptyLinesAroundBlockBody:
59
+ Enabled: false
60
+
61
+ Style/EmptyLinesAroundClassBody:
62
+ Enabled: false
63
+
64
+ Style/EmptyLinesAroundMethodBody:
65
+ Enabled: false
66
+
67
+ # Disable multiline method indentation, not comfortable with it
68
+ Style/MultilineMethodCallIndentation:
69
+ Enabled: false
70
+
71
+ # extend self uses ruby inheritance instead of copying methods
72
+ Style/ModuleFunction:
73
+ Enabled: false
74
+
75
+ Style/Lambda:
76
+ Enabled: false
77
+
78
+ AllCops:
79
+ DisplayCopNames: true
80
+ Exclude:
81
+ - db/**/*
82
+ - bin/**
83
+ - config/**/**
84
+ - spec/dummy/bin/**
85
+ - spec/dummy/db/**
86
+ - Guardfile
87
+
88
+ Rails:
89
+ Enabled: false
90
+ Exclude:
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.1
5
+ before_install: gem install bundler -v 1.14.5
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+
2
+ source 'https://rubygems.org'
3
+
4
+ # Specify your gem's dependencies in testgem.gemspec
5
+ gemspec
@@ -0,0 +1,51 @@
1
+
2
+
3
+ guard :rspec, cmd: "bundle exec rspec" do
4
+ require "guard/rspec/dsl"
5
+ dsl = Guard::RSpec::Dsl.new(self)
6
+
7
+ # Feel free to open issues for suggestions and improvements
8
+
9
+ # RSpec files
10
+ rspec = dsl.rspec
11
+ watch(rspec.spec_helper) { rspec.spec_dir }
12
+ watch(rspec.spec_support) { rspec.spec_dir }
13
+ watch(rspec.spec_files)
14
+
15
+ # Ruby files
16
+ ruby = dsl.ruby
17
+ dsl.watch_spec_files_for(ruby.lib_files)
18
+
19
+ # Rails files
20
+ rails = dsl.rails(view_extensions: %w(erb haml slim))
21
+ dsl.watch_spec_files_for(rails.app_files)
22
+ dsl.watch_spec_files_for(rails.views)
23
+
24
+ watch(rails.controllers) do |m|
25
+ [
26
+ rspec.spec.call("routing/#{m[1]}_routing"),
27
+ rspec.spec.call("controllers/#{m[1]}_controller"),
28
+ rspec.spec.call("acceptance/#{m[1]}")
29
+ ]
30
+ end
31
+
32
+ # Rails config changes
33
+ watch(rails.spec_helper) { rspec.spec_dir }
34
+ watch(rails.routes) { "#{rspec.spec_dir}/routing" }
35
+ watch(rails.app_controller) { "#{rspec.spec_dir}/controllers" }
36
+
37
+ # Capybara features specs
38
+ watch(rails.view_dirs) { |m| rspec.spec.call("features/#{m[1]}") }
39
+ watch(rails.layouts) { |m| rspec.spec.call("features/#{m[1]}") }
40
+
41
+ # Turnip features and steps
42
+ watch(%r{^spec/acceptance/(.+)\.feature$})
43
+ watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) do |m|
44
+ Dir[File.join("**/#{m[1]}.feature")][0] || "spec/acceptance"
45
+ end
46
+ end
47
+
48
+ guard :rubocop do
49
+ watch(%r{.+\.rb$})
50
+ watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
51
+ end
@@ -0,0 +1,5 @@
1
+ # etherscanio-rb
2
+
3
+ Access to the API of etherscan.io and the ethereum blockchain
4
+
5
+ [![Build Status](https://travis-ci.org/sebs/etherscanio-rb.svg?branch=master)](https://travis-ci.org/sebs/etherscanio-rb)
@@ -0,0 +1,7 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task test: :spec
7
+ task default: :spec
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'etherscanio'
7
+ spec.version = '0.0.1'
8
+ spec.authors = ['Sebastian Schürmann']
9
+ spec.email = ['sebs@2xs.org']
10
+ spec.description = '3rd party uinding to the ethereumblockchain API at etherscan.io'
11
+ spec.summary = ''
12
+ spec.homepage = 'https://github.com/sebs/etherscanio-rb'
13
+ spec.license = 'MIT'
14
+
15
+ spec.files = `git ls-files`.split($/)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ['lib']
19
+
20
+ spec.add_dependency 'rest-client'
21
+ spec.add_development_dependency 'bundler'
22
+ spec.add_development_dependency 'rake'
23
+ spec.add_development_dependency 'rspec'
24
+ spec.add_development_dependency 'guard'
25
+ spec.add_development_dependency 'guard-rspec'
26
+ spec.add_development_dependency 'rubocop'
27
+ spec.add_development_dependency 'guard-rubocop'
28
+ spec.add_development_dependency 'webmock'
29
+
30
+ end
@@ -0,0 +1,70 @@
1
+ module Etherscanio
2
+ class Api
3
+ def initialize(_key)
4
+ nil
5
+ end
6
+
7
+ def account_txlist(address, startblock, endblock, sort = 'desc', page = nil, offset = nil)
8
+ call = Etherscanio::Call.new('account', 'txlist')
9
+ call.address = address
10
+ call.startblock = startblock
11
+ call.endblock = endblock
12
+ call.page = page
13
+ call.offset = offset
14
+ call.sort = sort
15
+ call.fetch
16
+ end
17
+
18
+ def account_txlistinternal(address, startblock, endblock, sort = 'desc', page = nil, offset = nil)
19
+ call = Etherscanio::Call.new('account', 'txlistinternal')
20
+ call.address = address
21
+ call.startblock = startblock
22
+ call.endblock = endblock
23
+ call.page = page
24
+ call.offset = offset
25
+ call.sort = sort
26
+ call.fetch
27
+ end
28
+
29
+ def account_balance(address, tag)
30
+ call = Etherscanio::Call.new('account', 'balance')
31
+ call.address = address
32
+ call.tag = tag
33
+ call.fetch
34
+ end
35
+
36
+ def getminedblocks(address, blocktype, page = nil, offset = nil)
37
+ call = Etherscanio::Call.new('account', 'getminedblocks')
38
+ call.page = page
39
+ call.offset = offset
40
+ call.address = address
41
+ call.blocktype = blocktype
42
+ call.fetch
43
+ end
44
+
45
+ def account_balancemulti(address, tag)
46
+ call = Etherscanio::Call.new('account', 'balancemulti')
47
+ call.address = address
48
+ call.tag = tag
49
+ call.fetch
50
+ end
51
+
52
+ def contract_getabi(address)
53
+ call = Etherscanio::Call.new('contract', 'getabi')
54
+ call.address = address
55
+ call.fetch
56
+ end
57
+
58
+ def transaction_getstatus(txhash)
59
+ call = Etherscanio::Call.new('transaction', 'getstatus')
60
+ call.txhash = txhash
61
+ call.fetch
62
+ end
63
+
64
+ def block_getblockreward(blockno)
65
+ call = Etherscanio::Call.new('block', 'getblockreward')
66
+ call.blockno = blockno
67
+ call.fetch
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,56 @@
1
+ require 'rest-client'
2
+ module Etherscanio
3
+ class Call
4
+ attr_accessor :mod,
5
+ :action,
6
+ :api_key,
7
+ :address,
8
+ :tag,
9
+ :startblock,
10
+ :endblock,
11
+ :sort,
12
+ :page,
13
+ :offset,
14
+ :sort,
15
+ :blocktype,
16
+ :txhash,
17
+ :blockno
18
+ def initialize(mod, action)
19
+ @base = 'http://api.etherscan.io/api?'
20
+ @mod = mod
21
+ @action = action
22
+ @api_key = false
23
+ end
24
+
25
+ def fetch
26
+ res = RestClient.get(to_s, {}).body
27
+ parsed = JSON.parse(res)
28
+ JSON.generate(parsed)
29
+ end
30
+
31
+ def to_s
32
+ uri = 'module=' + mod + '&action=' + action
33
+ uri += '&apikey=' + api_key if api_key
34
+ uri += address_fragment
35
+ uri += '&startblock=' + startblock.to_s if startblock
36
+ uri += '&endblock=' + endblock.to_s if endblock
37
+ uri += '&blocktype=' + blocktype if blocktype
38
+ uri += '&txhash=' + txhash if txhash
39
+ uri += '&blockno=' + blockno.to_s if blockno
40
+ uri += '&offset=' + offset.to_s if offset
41
+ uri += '&sort=' + sort if sort
42
+ uri += '&page=' + page.to_s if page
43
+ uri += '&tag=' + tag if tag
44
+ @base + uri
45
+ end
46
+
47
+ private
48
+
49
+ def address_fragment
50
+ res = ''
51
+ res += '&address=' + address if address && !address.is_a?(Array)
52
+ res += '&address=' + address.join(',') if address && address.is_a?(Array)
53
+ res
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Etherscanio::Api do
4
+ describe 'account_balance' do
5
+ subject { Etherscanio::Api.new(apikey).account_balance(address, tag) }
6
+
7
+ context 'one address' do
8
+ subject { Etherscanio::Api.new(apikey).account_balance(address, tag) }
9
+ let(:apikey) { 'YourApiKeyToken' }
10
+ let(:address) { '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae' }
11
+ let(:tag) { 'latest' }
12
+ it { is_expected.to be_a(Object) }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe Etherscanio::Api do
4
+ describe 'account_balancemulti' do
5
+
6
+ context 'multiple address' do
7
+ subject { Etherscanio::Api.new(apikey).account_balancemulti(address, tag) }
8
+ let(:apikey) { 'YourApiKeyToken' }
9
+ let(:address) do
10
+ %w(
11
+ 0xddbd2b932c763ba5b1b7ae3b362eac3e8d40121a
12
+ 0x63a9975ba31b0b9626b34300f7f627147df1f526
13
+ 0x198ef1ec325a96cc354c7266a038be8b5c558f67
14
+ )
15
+ end
16
+ let(:tag) { 'latest' }
17
+ it { is_expected.to be_a(Object) }
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe Etherscanio::Api do
4
+ describe 'account_balance' do
5
+ subject { Etherscanio::Api.new(apikey).getminedblocks(address, blocktype) }
6
+
7
+ context 'no paging' do
8
+ let(:apikey) { 'YourApiKeyToken' }
9
+ let(:address) { '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae' }
10
+ let(:blocktype) { 'block' }
11
+ it { is_expected.to be_a(Object) }
12
+ end
13
+
14
+ context 'paging' do
15
+ subject { Etherscanio::Api.new(apikey).getminedblocks(address, blocktype, page, offset) }
16
+ let(:apikey) { 'YourApiKeyToken' }
17
+ let(:address) { '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae' }
18
+ let(:page) { 1 }
19
+ let(:offset) { 10 }
20
+ let(:blocktype) { 'block' }
21
+ it { is_expected.to be_a(Object) }
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe Etherscanio::Api do
4
+ describe 'account_txlistinternal' do
5
+ subject { Etherscanio::Api.new(apikey).account_txlistinternal(address, startblock, endblock, sort) }
6
+
7
+ context 'no paging' do
8
+ let(:apikey) { 'YourApiKeyToken' }
9
+ let(:address) { '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae' }
10
+ let(:startblock) { 0 }
11
+ let(:endblock) { 99_999_999 }
12
+ let(:sort) { 'desc' }
13
+ it { is_expected.to be_a(Object) }
14
+ end
15
+
16
+ context 'paging' do
17
+ subject { Etherscanio::Api.new(apikey).account_txlistinternal(address, startblock, endblock, sort, page, offset) }
18
+ let(:apikey) { 'YourApiKeyToken' }
19
+ let(:address) { '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae' }
20
+ let(:startblock) { 0 }
21
+ let(:endblock) { 99_999_999 }
22
+ let(:sort) { 'desc' }
23
+ let(:page) { 1 }
24
+ let(:offset) { 10 }
25
+ it { is_expected.to be_a(Object) }
26
+ end
27
+ end
28
+ end