etherlite 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/Gemfile +4 -0
- data/Guardfile +10 -0
- data/LICENSE.txt +21 -0
- data/README.md +41 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/etherlite.gemspec +31 -0
- data/lib/etherlite.rb +66 -0
- data/lib/etherlite/abi.rb +22 -0
- data/lib/etherlite/account.rb +67 -0
- data/lib/etherlite/address.rb +21 -0
- data/lib/etherlite/api/address.rb +21 -0
- data/lib/etherlite/api/node.rb +36 -0
- data/lib/etherlite/client.rb +11 -0
- data/lib/etherlite/commands/abi/load_contract.rb +66 -0
- data/lib/etherlite/commands/abi/load_function.rb +28 -0
- data/lib/etherlite/commands/abi/load_type.rb +55 -0
- data/lib/etherlite/commands/base.rb +0 -0
- data/lib/etherlite/commands/contract/event_base/decode_log_inputs.rb +21 -0
- data/lib/etherlite/commands/contract/function/encode_arguments.rb +32 -0
- data/lib/etherlite/commands/utils/validate_address.rb +25 -0
- data/lib/etherlite/configuration.rb +33 -0
- data/lib/etherlite/connection.rb +39 -0
- data/lib/etherlite/contract/base.rb +58 -0
- data/lib/etherlite/contract/event_base.rb +36 -0
- data/lib/etherlite/contract/event_input.rb +19 -0
- data/lib/etherlite/contract/function.rb +43 -0
- data/lib/etherlite/railtie.rb +29 -0
- data/lib/etherlite/railties/configuration_extensions.rb +9 -0
- data/lib/etherlite/railties/utils.rb +13 -0
- data/lib/etherlite/types/address.rb +20 -0
- data/lib/etherlite/types/array_base.rb +36 -0
- data/lib/etherlite/types/array_dynamic.rb +13 -0
- data/lib/etherlite/types/array_fixed.rb +23 -0
- data/lib/etherlite/types/base.rb +27 -0
- data/lib/etherlite/types/bool.rb +26 -0
- data/lib/etherlite/types/byte_string.rb +17 -0
- data/lib/etherlite/types/bytes.rb +19 -0
- data/lib/etherlite/types/fixed.rb +38 -0
- data/lib/etherlite/types/integer.rb +38 -0
- data/lib/etherlite/types/string.rb +10 -0
- data/lib/etherlite/utils.rb +63 -0
- data/lib/etherlite/version.rb +3 -0
- data/lib/generators/etherlite/init_generator.rb +10 -0
- data/lib/generators/etherlite/templates/etherlite.yml +11 -0
- metadata +206 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
require "etherlite/railties/configuration_extensions"
|
2
|
+
require "etherlite/railties/utils"
|
3
|
+
|
4
|
+
# Add rails specifig related configuration parameters
|
5
|
+
class Etherlite::Configuration
|
6
|
+
include Etherlite::Railties::ConfigurationExtensions
|
7
|
+
end
|
8
|
+
|
9
|
+
module Etherlite
|
10
|
+
class Railtie < Rails::Railtie
|
11
|
+
initializer "etherlite.configure" do
|
12
|
+
if File.exists? "#{Rails.application.paths['config'].existent.first}/etherlite.yml"
|
13
|
+
Etherlite.configure Rails.application.config_for(:etherlite)
|
14
|
+
end
|
15
|
+
|
16
|
+
Etherlite.config.logger = Rails.logger
|
17
|
+
end
|
18
|
+
|
19
|
+
initializer "etherlite.load_available_contracts", after: "etherlite.configure" do
|
20
|
+
Etherlite::Railties::Utils.load_contracts(Rails.root.join(Etherlite.config.contracts_path))
|
21
|
+
end
|
22
|
+
|
23
|
+
rake_tasks do
|
24
|
+
# Nothing for now
|
25
|
+
end
|
26
|
+
|
27
|
+
# IDEA: use config.to_prepare to reload contracts on every request.
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Etherlite::Railties
|
2
|
+
module Utils
|
3
|
+
def self.load_contracts(_path, prefix: 'Contract')
|
4
|
+
Dir.glob(_path.join('**/*.json')).map do |fullpath|
|
5
|
+
path = Pathname.new fullpath
|
6
|
+
path = path.relative_path_from _path
|
7
|
+
path = path.dirname.join(path.basename(path.extname)).to_s
|
8
|
+
|
9
|
+
Object.const_set(path.camelize + prefix, Etherlite::Abi.load_contract_at(fullpath))
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Etherlite::Types
|
2
|
+
class Address < Base
|
3
|
+
def signature
|
4
|
+
"address" # not sure about this
|
5
|
+
end
|
6
|
+
|
7
|
+
def size
|
8
|
+
32
|
9
|
+
end
|
10
|
+
|
11
|
+
def encode(_value)
|
12
|
+
_value = Etherlite::Utils.normalize_address_param _value
|
13
|
+
_value.to_raw_hex.rjust(64, '0')
|
14
|
+
end
|
15
|
+
|
16
|
+
def decode(_connection, _value)
|
17
|
+
Etherlite::Address.new _connection, _value[24..-1].downcase
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Etherlite::Types
|
2
|
+
class ArrayBase < Base
|
3
|
+
attr_reader :subtype
|
4
|
+
|
5
|
+
def initialize(_subtype)
|
6
|
+
raise ArgumentError, 'An array can not contain a dynamic type' if _subtype.dynamic?
|
7
|
+
@subtype = _subtype
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def encode_values(_values)
|
13
|
+
if @subtype.dynamic?
|
14
|
+
encode_dynamic _values
|
15
|
+
else
|
16
|
+
_values.map { |i| @subtype.encode(i) }.join
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def encode_dynamic(_values)
|
21
|
+
offset = 32 * @size # initial header offset
|
22
|
+
header = []
|
23
|
+
tail = []
|
24
|
+
|
25
|
+
_values.each do |item|
|
26
|
+
encoded_item = @subtype.encode(item)
|
27
|
+
|
28
|
+
header << Etherlite::Utils.uint_to_hex(offset)
|
29
|
+
tail << encoded_item
|
30
|
+
offset += encoded_item.length / 2 # hex string, 2 characters per byte
|
31
|
+
end
|
32
|
+
|
33
|
+
header.join + tail.join
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Etherlite::Types
|
2
|
+
class ArrayDynamic < ArrayBase
|
3
|
+
def signature
|
4
|
+
"#{subtype.signature}[]"
|
5
|
+
end
|
6
|
+
|
7
|
+
def encode(_value)
|
8
|
+
raise ArgumentError, "expected an array for #{signature}" unless _value.is_a? Array
|
9
|
+
|
10
|
+
Etherlite::Utils.uint_to_hex(_value.size) + encode_values(_value)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Etherlite::Types
|
2
|
+
class ArrayFixed < ArrayBase
|
3
|
+
def initialize(_subtype, _size)
|
4
|
+
super _subtype
|
5
|
+
@size = _size
|
6
|
+
end
|
7
|
+
|
8
|
+
def signature
|
9
|
+
"#{subtype.signature}[#{@size}]"
|
10
|
+
end
|
11
|
+
|
12
|
+
def size
|
13
|
+
subtype.size * @size
|
14
|
+
end
|
15
|
+
|
16
|
+
def encode(_value)
|
17
|
+
raise ArgumentError, "expected an array for #{signature}" unless _value.is_a? Array
|
18
|
+
raise ArgumentError, "expected array of size #{@size}" unless _value.size == @size
|
19
|
+
|
20
|
+
encode_values _value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Etherlite::Types
|
2
|
+
class Base
|
3
|
+
def signature
|
4
|
+
raise NotImplementedError, 'signature must be implemented by base type'
|
5
|
+
end
|
6
|
+
|
7
|
+
def size
|
8
|
+
nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def fixed?
|
12
|
+
!size.nil?
|
13
|
+
end
|
14
|
+
|
15
|
+
def dynamic?
|
16
|
+
size.nil?
|
17
|
+
end
|
18
|
+
|
19
|
+
def encode(_value)
|
20
|
+
raise NotImplementedError, 'encode must be implemented by base type'
|
21
|
+
end
|
22
|
+
|
23
|
+
def decode(_connection, _value)
|
24
|
+
'0x' + _value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Etherlite::Types
|
2
|
+
class Bool < Base
|
3
|
+
TRUE = '0000000000000000000000000000000000000000000000000000000000000001'.freeze # 32 bytes
|
4
|
+
FALSE = '0000000000000000000000000000000000000000000000000000000000000000'.freeze
|
5
|
+
|
6
|
+
def signature
|
7
|
+
"bool"
|
8
|
+
end
|
9
|
+
|
10
|
+
def size
|
11
|
+
32
|
12
|
+
end
|
13
|
+
|
14
|
+
def encode(_value)
|
15
|
+
unless _value.is_a?(TrueClass) || _value.is_a?(FalseClass)
|
16
|
+
raise ArgumentError, "value must be a boolean for #{signature}"
|
17
|
+
end
|
18
|
+
|
19
|
+
_value ? TRUE : FALSE
|
20
|
+
end
|
21
|
+
|
22
|
+
def decode(_connection, _value)
|
23
|
+
_value.hex > 0
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Etherlite::Types
|
2
|
+
class ByteString < Base
|
3
|
+
def signature
|
4
|
+
"bytes"
|
5
|
+
end
|
6
|
+
|
7
|
+
def encode(_value)
|
8
|
+
raise ArgumentError, "invalid argument type for 'bytes'" unless _value.is_a? ::String
|
9
|
+
|
10
|
+
bytes_as_hex = _value.unpack('H*').first
|
11
|
+
bytes = bytes_as_hex.length / 2
|
12
|
+
padded_size = (bytes.to_f / 32).ceil * 32
|
13
|
+
|
14
|
+
Etherlite::Utils.uint_to_hex(bytes) + bytes_as_hex.ljust(padded_size * 2, '0')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Etherlite::Types
|
2
|
+
class Bytes < Base
|
3
|
+
def initialize(_size)
|
4
|
+
raise ArgumentError, "invalid byte size #{_size}" unless 0 < _size && _size <= 32
|
5
|
+
@size = _size
|
6
|
+
end
|
7
|
+
|
8
|
+
def signature
|
9
|
+
"bytes#{@size}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def size
|
13
|
+
32
|
14
|
+
end
|
15
|
+
|
16
|
+
def encode(_value)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Etherlite::Types
|
2
|
+
class Fixed < Base
|
3
|
+
def initialize(_signed, _size_m, _size_n)
|
4
|
+
unless 0 < (_size_m + _size_n) && (_size_m + _size_n) <= 256 &&
|
5
|
+
_size_m % 8 == 0 && _size_n % 8 == 0
|
6
|
+
raise ArgumentError, "invalid fixed size #{_size_m}x#{_size_n}"
|
7
|
+
end
|
8
|
+
|
9
|
+
@signed = _signed
|
10
|
+
@size_m = _size_m
|
11
|
+
@size_n = _size_n
|
12
|
+
end
|
13
|
+
|
14
|
+
def size
|
15
|
+
32
|
16
|
+
end
|
17
|
+
|
18
|
+
def signature
|
19
|
+
"#{@signed ? 'fixed' : 'ufixed'}#{@size_m}x#{@size_n}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def encode(_value)
|
23
|
+
raise ArgumentError, "expected a number for #{signature}" unless _value.is_a? Numeric
|
24
|
+
raise ArgumentError, "expected a positive number for #{signature}" if !@signed && _value < 0
|
25
|
+
|
26
|
+
norm_value = (_value * (2**@size_n)).floor
|
27
|
+
raise ArgumentError, "value out of bounds #{_value}" if norm_value.abs > maximum
|
28
|
+
|
29
|
+
@signed ? Etherlite::Utils.int_to_hex(norm_value) : Etherlite::Utils.uint_to_hex(norm_value)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def maximum
|
35
|
+
2**(@signed ? (@size_m + @size_n) - 1 : (@size_m + @size_n))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Etherlite::Types
|
2
|
+
class Integer < Base
|
3
|
+
def initialize(_signed, _size)
|
4
|
+
unless 0 < _size && _size <= 256 && _size % 8 == 0
|
5
|
+
raise ArgumentError, "invalid integer size #{_size}"
|
6
|
+
end
|
7
|
+
|
8
|
+
@signed = _signed
|
9
|
+
@size = _size
|
10
|
+
end
|
11
|
+
|
12
|
+
def signature
|
13
|
+
"#{@signed ? 'int' : 'uint'}#{@size}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def size
|
17
|
+
32
|
18
|
+
end
|
19
|
+
|
20
|
+
def encode(_value)
|
21
|
+
raise ArgumentError, "expected a number for #{signature}" unless _value.is_a? ::Integer
|
22
|
+
raise ArgumentError, "expected a positive number for #{signature}" if !@signed && _value < 0
|
23
|
+
raise ArgumentError, "value out of bounds #{_value}" if _value.abs > maximum
|
24
|
+
|
25
|
+
@signed ? Etherlite::Utils.int_to_hex(_value) : Etherlite::Utils.uint_to_hex(_value)
|
26
|
+
end
|
27
|
+
|
28
|
+
def decode(_connection, _value)
|
29
|
+
@signed ? Etherlite::Utils.hex_to_int(_value) : Etherlite::Utils.hex_to_uint(_value)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def maximum
|
35
|
+
2**(@signed ? @size - 1 : @size)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require "etherlite/commands/utils/validate_address"
|
2
|
+
|
3
|
+
module Etherlite
|
4
|
+
module Utils
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def sha3(_data)
|
8
|
+
Digest::SHA3.hexdigest(_data, 256)
|
9
|
+
end
|
10
|
+
|
11
|
+
def uint_to_hex(_value, bytes: 32)
|
12
|
+
_value.to_s(16).rjust(bytes * 2, '0')
|
13
|
+
end
|
14
|
+
|
15
|
+
def int_to_hex(_value, bytes: 32)
|
16
|
+
if _value < 0
|
17
|
+
# 2's complement for negative values
|
18
|
+
(_value & ((1 << bytes * 8) - 1)).to_s(16)
|
19
|
+
else
|
20
|
+
uint_to_hex(_value, bytes: bytes)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def hex_to_uint(_hex_value)
|
25
|
+
_hex_value.hex
|
26
|
+
end
|
27
|
+
|
28
|
+
def hex_to_int(_hex_value)
|
29
|
+
# TODO.
|
30
|
+
end
|
31
|
+
|
32
|
+
def valid_address?(_address)
|
33
|
+
ValidateAddress.for(address: _address)
|
34
|
+
end
|
35
|
+
|
36
|
+
def normalize_address(_value)
|
37
|
+
_value.gsub(/^0x/, '').downcase
|
38
|
+
end
|
39
|
+
|
40
|
+
def normalize_address_param(_value)
|
41
|
+
if _value.respond_to? :address
|
42
|
+
_value.address
|
43
|
+
else
|
44
|
+
_value = _value.to_s
|
45
|
+
raise ArgumentError, 'invalid address' unless valid_address? _value
|
46
|
+
normalize_address _value
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def encode_address_param(_value)
|
51
|
+
'0x' + normalize_address_param(_value)
|
52
|
+
end
|
53
|
+
|
54
|
+
def encode_block_param(_value)
|
55
|
+
return _value.to_s if ['pending', 'earliest', 'latest'].include?(_value.to_s)
|
56
|
+
'0x' + _value.to_s(16)
|
57
|
+
end
|
58
|
+
|
59
|
+
def encode_quantity_param(_value)
|
60
|
+
'0x' + _value.to_s(16)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Etherlite
|
2
|
+
class InitGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path("../templates", __FILE__)
|
4
|
+
|
5
|
+
desc "Initializes the app to work with etherlite"
|
6
|
+
def create_index
|
7
|
+
template("etherlite.yml", "config/etherlite.yml")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
metadata
ADDED
@@ -0,0 +1,206 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: etherlite
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ignacio Baixas
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-06-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: digest-sha3
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: power-types
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.12'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.12'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '10.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '10.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: guard
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '2.14'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '2.14'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: guard-rspec
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '4.7'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '4.7'
|
125
|
+
description: ''
|
126
|
+
email:
|
127
|
+
- ignacio@surbtc.com
|
128
|
+
executables: []
|
129
|
+
extensions: []
|
130
|
+
extra_rdoc_files: []
|
131
|
+
files:
|
132
|
+
- ".gitignore"
|
133
|
+
- ".rspec"
|
134
|
+
- ".travis.yml"
|
135
|
+
- CODE_OF_CONDUCT.md
|
136
|
+
- Gemfile
|
137
|
+
- Guardfile
|
138
|
+
- LICENSE.txt
|
139
|
+
- README.md
|
140
|
+
- Rakefile
|
141
|
+
- bin/console
|
142
|
+
- bin/setup
|
143
|
+
- etherlite.gemspec
|
144
|
+
- lib/etherlite.rb
|
145
|
+
- lib/etherlite/abi.rb
|
146
|
+
- lib/etherlite/account.rb
|
147
|
+
- lib/etherlite/address.rb
|
148
|
+
- lib/etherlite/api/address.rb
|
149
|
+
- lib/etherlite/api/node.rb
|
150
|
+
- lib/etherlite/client.rb
|
151
|
+
- lib/etherlite/commands/abi/load_contract.rb
|
152
|
+
- lib/etherlite/commands/abi/load_function.rb
|
153
|
+
- lib/etherlite/commands/abi/load_type.rb
|
154
|
+
- lib/etherlite/commands/base.rb
|
155
|
+
- lib/etherlite/commands/contract/event_base/decode_log_inputs.rb
|
156
|
+
- lib/etherlite/commands/contract/function/encode_arguments.rb
|
157
|
+
- lib/etherlite/commands/utils/validate_address.rb
|
158
|
+
- lib/etherlite/configuration.rb
|
159
|
+
- lib/etherlite/connection.rb
|
160
|
+
- lib/etherlite/contract/base.rb
|
161
|
+
- lib/etherlite/contract/event_base.rb
|
162
|
+
- lib/etherlite/contract/event_input.rb
|
163
|
+
- lib/etherlite/contract/function.rb
|
164
|
+
- lib/etherlite/railtie.rb
|
165
|
+
- lib/etherlite/railties/configuration_extensions.rb
|
166
|
+
- lib/etherlite/railties/utils.rb
|
167
|
+
- lib/etherlite/types/address.rb
|
168
|
+
- lib/etherlite/types/array_base.rb
|
169
|
+
- lib/etherlite/types/array_dynamic.rb
|
170
|
+
- lib/etherlite/types/array_fixed.rb
|
171
|
+
- lib/etherlite/types/base.rb
|
172
|
+
- lib/etherlite/types/bool.rb
|
173
|
+
- lib/etherlite/types/byte_string.rb
|
174
|
+
- lib/etherlite/types/bytes.rb
|
175
|
+
- lib/etherlite/types/fixed.rb
|
176
|
+
- lib/etherlite/types/integer.rb
|
177
|
+
- lib/etherlite/types/string.rb
|
178
|
+
- lib/etherlite/utils.rb
|
179
|
+
- lib/etherlite/version.rb
|
180
|
+
- lib/generators/etherlite/init_generator.rb
|
181
|
+
- lib/generators/etherlite/templates/etherlite.yml
|
182
|
+
homepage: https://github.com/SurBTC/etherlite
|
183
|
+
licenses:
|
184
|
+
- MIT
|
185
|
+
metadata: {}
|
186
|
+
post_install_message:
|
187
|
+
rdoc_options: []
|
188
|
+
require_paths:
|
189
|
+
- lib
|
190
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
196
|
+
requirements:
|
197
|
+
- - ">="
|
198
|
+
- !ruby/object:Gem::Version
|
199
|
+
version: '0'
|
200
|
+
requirements: []
|
201
|
+
rubyforge_project:
|
202
|
+
rubygems_version: 2.6.4
|
203
|
+
signing_key:
|
204
|
+
specification_version: 4
|
205
|
+
summary: Ethereum integration for ruby on rails
|
206
|
+
test_files: []
|