infura_ruby 1.1.0 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -2
- data/lib/infura_ruby.rb +2 -2
- data/lib/infura_ruby/client.rb +44 -7
- data/lib/infura_ruby/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2cab21eb980c99eb83827f434ed6f742e858e37a
|
4
|
+
data.tar.gz: 2b5fe568f354d5009e3fafe26cf75d812575902e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 553ba0800d07eb6e324de103c5ed8ab72104eea4f3c190486b4f9e49c88eb2101ba02e79fc0a6ae8781d5abb53cf35b6f0fda0d56f807240f6fcd968764634e1
|
7
|
+
data.tar.gz: 8b00a4adc2230efe369783de5077f4f031649620d997de79322e11f5b21f792fc28d9cd6ebd0207f9eb6537d62f50674af1a1568541a2c52803b561b81d318c6
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# InfuraRuby
|
2
2
|
|
3
|
-
Ruby gem to wrap the [INFURA](https://github.com/ethereum/wiki/wiki/JSON-RPC
|
3
|
+
Ruby gem to wrap the [INFURA](https://github.com/ethereum/wiki/wiki/JSON-RPC) API which gives HTTP API access to ethereum and IPFS nodes. The API uses the same format as the [JSON RPC spec](https://github.com/ethereum/wiki/wiki/JSON-RPC) for normal ethereum nodes.
|
4
4
|
|
5
|
-
For now, I only need the `getBalance` call
|
5
|
+
For now, I only need the `getBalance` call and so that is all I have built. Feel free to add the rest of the functionality or I may get to it over time...
|
6
6
|
|
7
7
|
## Usage
|
8
8
|
|
@@ -19,4 +19,13 @@ infura = InfuraRuby.client(api_key: key)
|
|
19
19
|
|
20
20
|
# get the balance (in wei) of an address
|
21
21
|
infura.get_balance('0x81F631b8615EaB75d38DaC4d4bce4A5b63e10310') #=> 591686024850016
|
22
|
+
|
23
|
+
# This can be qualified with 4 different tags to get the balance at the tag's time.
|
24
|
+
# 'latest' - latest balance (default) with at least 1 confirmation
|
25
|
+
# 'pending' - balance including pending transactions
|
26
|
+
# 'earliest' - balance at the time of the genesis block or earliest known block
|
27
|
+
# '0x123' - balance at the time of chain height `0x123` (hex string)
|
28
|
+
|
29
|
+
# balance including unconfirmed transactions
|
30
|
+
infura.get_balance('0x81F631b8615EaB75d38DaC4d4bce4A5b63e10310', tag: 'pending')
|
22
31
|
```
|
data/lib/infura_ruby.rb
CHANGED
data/lib/infura_ruby/client.rb
CHANGED
@@ -3,6 +3,11 @@ require 'json'
|
|
3
3
|
|
4
4
|
module InfuraRuby
|
5
5
|
class Client
|
6
|
+
class InfuraCallError < StandardError; end
|
7
|
+
class InvalidEthereumAddressError < StandardError; end
|
8
|
+
|
9
|
+
ETHEREUM_ADDRESS_REGEX = /^0x[0-9a-fA-F]{40}$/
|
10
|
+
|
6
11
|
# Infura URLs for each network.
|
7
12
|
NETWORK_URLS = {
|
8
13
|
main: 'https://mainnet.infura.io',
|
@@ -14,6 +19,13 @@ module InfuraRuby
|
|
14
19
|
'eth_getBalance'
|
15
20
|
].freeze
|
16
21
|
|
22
|
+
BLOCK_PARAMETERS = [
|
23
|
+
/^0x[0-9a-fA-F]{1,}$/, # an integer block number (hex string)
|
24
|
+
/^earliest$/, # for the earliest/genesis block
|
25
|
+
/^latest$/, # for the latest mined block
|
26
|
+
/^pending$/ # for the pending state/transactions
|
27
|
+
].freeze
|
28
|
+
|
17
29
|
def initialize(api_key:, network: :main)
|
18
30
|
validate_api_key(api_key)
|
19
31
|
validate_network(network)
|
@@ -22,16 +34,27 @@ module InfuraRuby
|
|
22
34
|
@network = network
|
23
35
|
end
|
24
36
|
|
37
|
+
# TODO: move calls out of client - worth doing when we have > 1.
|
25
38
|
# Returns balance of address in wei as integer.
|
26
|
-
def get_balance(address)
|
39
|
+
def get_balance(address, tag: 'latest')
|
40
|
+
validate_address(address)
|
41
|
+
validate_block_tag(tag)
|
42
|
+
|
27
43
|
resp = conn.post do |req|
|
28
44
|
req.headers['Content-Type'] = 'application/json'
|
29
|
-
req.body = json_rpc(method: 'eth_getBalance', params: [address,
|
45
|
+
req.body = json_rpc(method: 'eth_getBalance', params: [address, tag]).to_json
|
30
46
|
end
|
31
|
-
|
32
47
|
resp_body = JSON.parse(resp.body)
|
33
|
-
|
34
|
-
|
48
|
+
|
49
|
+
if resp_body['error']
|
50
|
+
raise InfuraCallError.new(
|
51
|
+
"Error (#{resp_body['error']['code']}): Infura API call "\
|
52
|
+
"eth_getBalance gave message: '#{resp_body['error']['message']}'"
|
53
|
+
)
|
54
|
+
else
|
55
|
+
wei_amount_hex_string = resp_body['result']
|
56
|
+
wei_amount_hex_string.to_i(16)
|
57
|
+
end
|
35
58
|
end
|
36
59
|
|
37
60
|
private
|
@@ -39,7 +62,7 @@ module InfuraRuby
|
|
39
62
|
# TODO: this JSON RPC object should be a whole object / gem.
|
40
63
|
def json_rpc(method:, params:)
|
41
64
|
validate_json_rpc_method(method)
|
42
|
-
|
65
|
+
|
43
66
|
{
|
44
67
|
"jsonrpc" => "2.0",
|
45
68
|
"method" => method,
|
@@ -48,8 +71,22 @@ module InfuraRuby
|
|
48
71
|
}
|
49
72
|
end
|
50
73
|
|
74
|
+
def validate_block_tag(tag)
|
75
|
+
if BLOCK_PARAMETERS.none? { |regex| regex =~ tag.to_s }
|
76
|
+
raise NotImplementedError.new("Block parameter tag '#{tag}' does not exist.")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def validate_address(address)
|
81
|
+
if ETHEREUM_ADDRESS_REGEX !~ address
|
82
|
+
raise InvalidEthereumAddressError.new("'#{address}' is not a valid ethereum address.")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
51
86
|
def validate_json_rpc_method(method)
|
52
|
-
|
87
|
+
if !JSON_RPC_METHODS.include?(method)
|
88
|
+
raise NotImplementedError.new("JSON RPC method '#{method}' does not exist.")
|
89
|
+
end
|
53
90
|
end
|
54
91
|
|
55
92
|
def conn
|
data/lib/infura_ruby/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: infura_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julian Borrey
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01
|
11
|
+
date: 2017-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -100,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
100
100
|
version: '0'
|
101
101
|
requirements: []
|
102
102
|
rubyforge_project:
|
103
|
-
rubygems_version: 2.
|
103
|
+
rubygems_version: 2.5.1
|
104
104
|
signing_key:
|
105
105
|
specification_version: 4
|
106
106
|
summary: Library for the INFURA API.
|