universa 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9d951269ce7957e1ffe99f9d6e05f78464a85d5e6cde57d7a0f8cc6837f3fcb2
4
- data.tar.gz: 16da66789f9d6b05315e9a586937da258b9b4a5101569728f526ed82872b2b3c
3
+ metadata.gz: 3393ecdb08b1b7fe37288be48d86b47a740cf7e923575caa45295c8cdb861247
4
+ data.tar.gz: 76a9a13bdf1a39c8d5e9a0e838a3faf18283d9b357cd3bca18c75f076dbcc65f
5
5
  SHA512:
6
- metadata.gz: f21eaea6435adaa6a85479d828cbe44f95b4a3ce6fc406c5761450b8cd93ee64442d75e32fa0c0c11d79f9d897ce64610c38594de76c8443237a01aa24f4be9e
7
- data.tar.gz: 44045b63034fa9486cba5925bf978fc0a4e95c41f413b9aa822d98b926468c064e4c8312a9914cb92219fcd88550bec1b25124af7d8a9c408442053172a7a1ec
6
+ metadata.gz: 44c450550570eb0e447f7824dae25129cfd59ead09cac86c19b8d3b261d226d7964b88ca3304fc19790ca7512509c5ae3575c0aed09da608133de588d1d1548c
7
+ data.tar.gz: 5b093f28766e602653ad3c9797f4ce6d6a63796c8cd45ab9252b4bd78e145a43aa9510c51370d210d23a97eeab7d4cd14049466f3bc3de0fd933db3b3c1a3467
data/Gemfile CHANGED
@@ -3,4 +3,7 @@ source "https://rubygems.org"
3
3
  git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in universa.gemspec
6
+ #
7
+ # gem 'farcall', :github => 'sergeych/farcall', :branch => 'master'
8
+
6
9
  gemspec
data/bin/umi/bin/umi CHANGED
@@ -344,7 +344,7 @@ declare -r lib_dir="$(realpath "${app_home}/../lib")"
344
344
  declare -a app_mainclass=(com.icodici.farcallscala.Main)
345
345
 
346
346
  declare -r script_conf_file="${app_home}/../conf/application.ini"
347
- declare -r app_classpath="$lib_dir/com.icodici.umi-0.8.12.jar:$lib_dir/org.scala-lang.scala-library-2.12.7.jar:$lib_dir/com.icodici.universa_core-3.8.7.jar:$lib_dir/org.yaml.snakeyaml-1.18.jar:$lib_dir/net.sf.jopt-simple.jopt-simple-4.9.jar:$lib_dir/org.postgresql.postgresql-42.1.4.jar:$lib_dir/org.xerial.sqlite-jdbc-3.8.9.1.jar:$lib_dir/com.icodici.nanohttpd-2.1.0.jar:$lib_dir/com.icodici.common_tools-3.8.7.jar:$lib_dir/com.eclipsesource.minimal-json.minimal-json-0.9.4.jar:$lib_dir/net.java.dev.jna.jna-4.5.1.jar:$lib_dir/org.checkerframework.checker-qual-2.3.2.jar:$lib_dir/com.icodici.crypto-3.8.7.jar:$lib_dir/com.madgag.spongycastle.core-1.58.0.0.jar:$lib_dir/com.squareup.jnagmp.jnagmp-2.0.0.jar:$lib_dir/com.typesafe.play.play-json_2.12-2.6.10.jar:$lib_dir/com.typesafe.play.play-functional_2.12-2.6.10.jar:$lib_dir/org.scala-lang.scala-reflect-2.12.7.jar:$lib_dir/org.typelevel.macro-compat_2.12-1.1.1.jar:$lib_dir/joda-time.joda-time-2.9.9.jar:$lib_dir/com.fasterxml.jackson.core.jackson-core-2.8.11.jar:$lib_dir/com.fasterxml.jackson.core.jackson-annotations-2.8.11.jar:$lib_dir/com.fasterxml.jackson.datatype.jackson-datatype-jdk8-2.8.11.jar:$lib_dir/com.fasterxml.jackson.core.jackson-databind-2.8.11.1.jar:$lib_dir/com.fasterxml.jackson.datatype.jackson-datatype-jsr310-2.8.11.jar:$lib_dir/org.scala-sbt.ipcsocket.ipcsocket-1.0.0.jar:$lib_dir/net.java.dev.jna.jna-platform-4.5.0.jar"
347
+ declare -r app_classpath="$lib_dir/com.icodici.umi-0.8.17.jar:$lib_dir/org.scala-lang.scala-library-2.12.7.jar:$lib_dir/com.icodici.universa_core-3.8.7.jar:$lib_dir/org.yaml.snakeyaml-1.18.jar:$lib_dir/net.sf.jopt-simple.jopt-simple-4.9.jar:$lib_dir/org.postgresql.postgresql-42.1.4.jar:$lib_dir/org.xerial.sqlite-jdbc-3.8.9.1.jar:$lib_dir/com.icodici.nanohttpd-2.1.0.jar:$lib_dir/com.icodici.common_tools-3.8.7.jar:$lib_dir/com.eclipsesource.minimal-json.minimal-json-0.9.4.jar:$lib_dir/net.java.dev.jna.jna-4.5.1.jar:$lib_dir/org.checkerframework.checker-qual-2.3.2.jar:$lib_dir/com.icodici.crypto-3.8.7.jar:$lib_dir/com.madgag.spongycastle.core-1.58.0.0.jar:$lib_dir/com.squareup.jnagmp.jnagmp-2.0.0.jar:$lib_dir/com.typesafe.play.play-json_2.12-2.6.10.jar:$lib_dir/com.typesafe.play.play-functional_2.12-2.6.10.jar:$lib_dir/org.scala-lang.scala-reflect-2.12.7.jar:$lib_dir/org.typelevel.macro-compat_2.12-1.1.1.jar:$lib_dir/joda-time.joda-time-2.9.9.jar:$lib_dir/com.fasterxml.jackson.core.jackson-core-2.8.11.jar:$lib_dir/com.fasterxml.jackson.core.jackson-annotations-2.8.11.jar:$lib_dir/com.fasterxml.jackson.datatype.jackson-datatype-jdk8-2.8.11.jar:$lib_dir/com.fasterxml.jackson.core.jackson-databind-2.8.11.1.jar:$lib_dir/com.fasterxml.jackson.datatype.jackson-datatype-jsr310-2.8.11.jar:$lib_dir/org.scala-sbt.ipcsocket.ipcsocket-1.0.0.jar:$lib_dir/net.java.dev.jna.jna-platform-4.5.0.jar"
348
348
 
349
349
  # java_cmd is overrode in process_args when -java-home is used
350
350
  declare java_cmd=$(get_java_cmd)
data/bin/umi/bin/umi.bat CHANGED
@@ -80,7 +80,7 @@ rem "-J" is stripped, "-D" is left as is, and everything is appended to JAVA_OPT
80
80
  set _JAVA_PARAMS=
81
81
  set _APP_ARGS=
82
82
 
83
- set "APP_CLASSPATH=%APP_LIB_DIR%\com.icodici.umi-0.8.12.jar;%APP_LIB_DIR%\org.scala-lang.scala-library-2.12.7.jar;%APP_LIB_DIR%\com.icodici.universa_core-3.8.7.jar;%APP_LIB_DIR%\org.yaml.snakeyaml-1.18.jar;%APP_LIB_DIR%\net.sf.jopt-simple.jopt-simple-4.9.jar;%APP_LIB_DIR%\org.postgresql.postgresql-42.1.4.jar;%APP_LIB_DIR%\org.xerial.sqlite-jdbc-3.8.9.1.jar;%APP_LIB_DIR%\com.icodici.nanohttpd-2.1.0.jar;%APP_LIB_DIR%\com.icodici.common_tools-3.8.7.jar;%APP_LIB_DIR%\com.eclipsesource.minimal-json.minimal-json-0.9.4.jar;%APP_LIB_DIR%\net.java.dev.jna.jna-4.5.1.jar;%APP_LIB_DIR%\org.checkerframework.checker-qual-2.3.2.jar;%APP_LIB_DIR%\com.icodici.crypto-3.8.7.jar;%APP_LIB_DIR%\com.madgag.spongycastle.core-1.58.0.0.jar;%APP_LIB_DIR%\com.squareup.jnagmp.jnagmp-2.0.0.jar;%APP_LIB_DIR%\com.typesafe.play.play-json_2.12-2.6.10.jar;%APP_LIB_DIR%\com.typesafe.play.play-functional_2.12-2.6.10.jar;%APP_LIB_DIR%\org.scala-lang.scala-reflect-2.12.7.jar;%APP_LIB_DIR%\org.typelevel.macro-compat_2.12-1.1.1.jar;%APP_LIB_DIR%\joda-time.joda-time-2.9.9.jar;%APP_LIB_DIR%\com.fasterxml.jackson.core.jackson-core-2.8.11.jar;%APP_LIB_DIR%\com.fasterxml.jackson.core.jackson-annotations-2.8.11.jar;%APP_LIB_DIR%\com.fasterxml.jackson.datatype.jackson-datatype-jdk8-2.8.11.jar;%APP_LIB_DIR%\com.fasterxml.jackson.core.jackson-databind-2.8.11.1.jar;%APP_LIB_DIR%\com.fasterxml.jackson.datatype.jackson-datatype-jsr310-2.8.11.jar;%APP_LIB_DIR%\org.scala-sbt.ipcsocket.ipcsocket-1.0.0.jar;%APP_LIB_DIR%\net.java.dev.jna.jna-platform-4.5.0.jar"
83
+ set "APP_CLASSPATH=%APP_LIB_DIR%\com.icodici.umi-0.8.17.jar;%APP_LIB_DIR%\org.scala-lang.scala-library-2.12.7.jar;%APP_LIB_DIR%\com.icodici.universa_core-3.8.7.jar;%APP_LIB_DIR%\org.yaml.snakeyaml-1.18.jar;%APP_LIB_DIR%\net.sf.jopt-simple.jopt-simple-4.9.jar;%APP_LIB_DIR%\org.postgresql.postgresql-42.1.4.jar;%APP_LIB_DIR%\org.xerial.sqlite-jdbc-3.8.9.1.jar;%APP_LIB_DIR%\com.icodici.nanohttpd-2.1.0.jar;%APP_LIB_DIR%\com.icodici.common_tools-3.8.7.jar;%APP_LIB_DIR%\com.eclipsesource.minimal-json.minimal-json-0.9.4.jar;%APP_LIB_DIR%\net.java.dev.jna.jna-4.5.1.jar;%APP_LIB_DIR%\org.checkerframework.checker-qual-2.3.2.jar;%APP_LIB_DIR%\com.icodici.crypto-3.8.7.jar;%APP_LIB_DIR%\com.madgag.spongycastle.core-1.58.0.0.jar;%APP_LIB_DIR%\com.squareup.jnagmp.jnagmp-2.0.0.jar;%APP_LIB_DIR%\com.typesafe.play.play-json_2.12-2.6.10.jar;%APP_LIB_DIR%\com.typesafe.play.play-functional_2.12-2.6.10.jar;%APP_LIB_DIR%\org.scala-lang.scala-reflect-2.12.7.jar;%APP_LIB_DIR%\org.typelevel.macro-compat_2.12-1.1.1.jar;%APP_LIB_DIR%\joda-time.joda-time-2.9.9.jar;%APP_LIB_DIR%\com.fasterxml.jackson.core.jackson-core-2.8.11.jar;%APP_LIB_DIR%\com.fasterxml.jackson.core.jackson-annotations-2.8.11.jar;%APP_LIB_DIR%\com.fasterxml.jackson.datatype.jackson-datatype-jdk8-2.8.11.jar;%APP_LIB_DIR%\com.fasterxml.jackson.core.jackson-databind-2.8.11.1.jar;%APP_LIB_DIR%\com.fasterxml.jackson.datatype.jackson-datatype-jsr310-2.8.11.jar;%APP_LIB_DIR%\org.scala-sbt.ipcsocket.ipcsocket-1.0.0.jar;%APP_LIB_DIR%\net.java.dev.jna.jna-platform-4.5.0.jar"
84
84
  set "APP_MAIN_CLASS=com.icodici.farcallscala.Main"
85
85
  set "SCRIPT_CONF_FILE=%APP_HOME%\conf\application.ini"
86
86
 
@@ -0,0 +1,94 @@
1
+ module Universa
2
+
3
+ # Adapter for Universa Binder class which behaves like a ruby hash.
4
+ class Binder < RemoteAdapter
5
+ remote_class "net.sergeych.tools.Binder"
6
+
7
+ # Set object for a key
8
+ #
9
+ # @param [Object] key key.to_s will be used (so use Symbols or Strings freely)
10
+ # @param [Object] value
11
+ def []=(key, value)
12
+ __getobj__.set(key.to_s, value)
13
+ end
14
+
15
+ # Get object by key.
16
+ # @param [Object] key key.to_s will be used (so use Symbols or Strings freely)
17
+ # @return [Object] or nil
18
+ def [](key)
19
+ __getobj__.get(key.to_s)
20
+ end
21
+
22
+ # Create hew Binder from any hash. Keys will be converted to strings.
23
+ def self.of hash
24
+ invoke_static "of", hash.transform_keys(&:to_s)
25
+ end
26
+
27
+ # Retrieve binder keys
28
+ def keys
29
+ __getobj__.keySet()
30
+ end
31
+
32
+ # # Internal use only. Allow processing remote commands as local calls
33
+ def respond_to_missing?(method_name, include_private = false)
34
+ l = method_name[-1]
35
+ LOCAL_METHODS.include?(method_name) || l == '!' || l == '?'
36
+ end
37
+
38
+ # Internal use only. Call remote method as needed. This is where all the magick comes from: it call
39
+ # remote get/set method
40
+ def method_missing(method_name, *args, &block)
41
+ if respond_to_missing?(method_name, true)
42
+ super
43
+ else
44
+ if method_name[-1] == '_'
45
+ __getobj__.set(method_name[0..-1], args[0])
46
+ args[0]
47
+ else
48
+ __getobj__.get(method_name)
49
+ end
50
+ end
51
+ end
52
+
53
+ LOCAL_METHODS = Set.new(%i[to_hash to_ary [] []= keys values each each_key each_with_index size map to_s])
54
+
55
+ def to_s
56
+ to_h.to_s
57
+ end
58
+
59
+ # Converts binder to the array of [key, value] pairs, like with regular ruby hashes
60
+ def to_a
61
+ map {|x| x}
62
+ end
63
+
64
+ # Enumerates all binder entries with a required block
65
+ # @yield [key,value] pairs
66
+ def each &block
67
+ keys.each {|k| block.call [k, __getobj__.get(k)]}
68
+ end
69
+
70
+ # @return an array of values returned by the block
71
+ # @yiekd [key,value] pairs.
72
+ def map &block
73
+ keys.map {|k| block.call [k, __getobj__.get(k)]}
74
+ end
75
+
76
+ # @return [Array(Array(String,Object))] array of [key,value] pairs.
77
+ def to_a
78
+ map {|x| x}
79
+ end
80
+
81
+ # converts to a regular ruby hash
82
+ def to_h
83
+ to_a.to_h
84
+ end
85
+ end
86
+
87
+ end
88
+
89
+ class Hash
90
+ def to_binder
91
+ Binder.of self
92
+ end
93
+ end
94
+
@@ -10,6 +10,9 @@ module Universa
10
10
  # and also implement newtor-wide procedures.
11
11
  class Client
12
12
  using Universa::Parallel
13
+ include Universa
14
+
15
+ attr :connection_key
13
16
 
14
17
  # Create client
15
18
  # @param [PrivateKey] private_key to connect with. Generates new one if omitted.
@@ -46,18 +49,20 @@ module Universa
46
49
  # @return [ContractState] of some final node check It does not aggregates (yet)
47
50
  def get_state obj
48
51
  result = Concurrent::IVar.new
49
- negative_votes = Concurrent::AtomicFixnum.new(@nodes.size * 20 / 100)
52
+ negative_votes = Concurrent::AtomicFixnum.new(@nodes.size * 11 / 100)
50
53
  positive_votes = Concurrent::AtomicFixnum.new(@nodes.size * 30 / 100)
51
- random_connections(@nodes.size * 2 / 3).par.each {|conn|
52
- if result.incomplete?
53
- if (state = conn.get_state(obj)).approved?
54
- result.try_set(state) if positive_votes.decrement < 0
55
- else
56
- result.try_set(state) if negative_votes.decrement < 0
54
+ retry_with_timeout(20, 3) {
55
+ random_connections(@nodes.size).par.each {|conn|
56
+ if result.incomplete?
57
+ if (state = conn.get_state(obj)).approved?
58
+ result.try_set(state) if positive_votes.decrement < 0
59
+ else
60
+ result.try_set(state) if negative_votes.decrement < 0
61
+ end
57
62
  end
58
- end
63
+ }
64
+ result.value
59
65
  }
60
- result.value
61
66
  end
62
67
 
63
68
  # @return [Array(Connection)] array of count randomly selected connections
@@ -144,6 +149,8 @@ module Universa
144
149
  # Access to the single node using universa client protocol.
145
150
  #
146
151
  class Connection
152
+ include Universa
153
+
147
154
  # create connection for a given clietn. Don't call it direcly, use
148
155
  # {Client.random_connection} or {Client.random_connections} instead. The client implements
149
156
  # lazy initialization so time-consuming actual connection will be postponed until
@@ -168,12 +175,14 @@ module Universa
168
175
  # @param [Contract] contract, muts be sealed ({Contract#seal})
169
176
  # @return [ContractState] of the result. Could contain errors.
170
177
  def register_single contract
171
- result = ContractState.new(execute "approve", packedItem: contract.packed)
172
- while result.is_pending
173
- sleep(0.1)
174
- result = get_state contract
175
- end
176
- result
178
+ retry_with_timeout(15, 3) {
179
+ result = ContractState.new(execute "approve", packedItem: contract.packed)
180
+ while result.is_pending
181
+ sleep(0.1)
182
+ result = get_state contract
183
+ end
184
+ result
185
+ }
177
186
  end
178
187
 
179
188
  # Get contract or hashId state from this single node
@@ -19,29 +19,6 @@ module Universa
19
19
  remote_class "com.icodici.universa.contract.roles.Role"
20
20
  end
21
21
 
22
- # Adapter for Universa Binder class. Provides some ruby-style helpers
23
- class Binder < RemoteAdapter
24
- remote_class "net.sergeych.tools.Binder"
25
-
26
- # Set object for a key
27
- #
28
- # @param [Object] key key.to_s will be used (so use Symbols or Strings freely)
29
- # @param [Object] value
30
- def []=(key, value)
31
- set(key.to_s, value)
32
- end
33
-
34
- # Get object by key.
35
- # @param [Object] key key.to_s will be used (so use Symbols or Strings freely)
36
- # @return [Object] or nil
37
- def [](key)
38
- get(key.to_s)
39
- end
40
-
41
- def self.of hash
42
- invoke_static "of", hash.transform_keys(&:to_s)
43
- end
44
- end
45
22
 
46
23
  # Adapter for Universa +HashId+ class, helps to avoid confusion when using different
47
24
  # representations of the ID.
@@ -147,6 +124,10 @@ module Universa
147
124
  get_owner
148
125
  end
149
126
 
127
+ def owner= key
128
+ set_owner_key key
129
+ end
130
+
150
131
  # Shortcut for is_ok
151
132
  def ok?
152
133
  is_ok
@@ -172,13 +153,33 @@ module Universa
172
153
  end
173
154
 
174
155
  def state
175
- @state ||= get_state_data
156
+ @state ||= getStateData()
176
157
  end
177
158
 
159
+ # Get +transactional.data+ section creating it if need
160
+ # @return [Binder] instance
161
+ def transactional
162
+ @transactional ||= getTransactionalData()
163
+ end
164
+
165
+ # def transactional?
166
+ # !!getTransactional()
167
+ # end
168
+
169
+ # Helper for many token-like contracts containing state.data.amount
170
+ # @return [BigDecimal] amount or nil
178
171
  def amount
179
172
  v = state[:amount] and BigDecimal(v.to_s)
180
173
  end
181
174
 
175
+ # Write helper for many token-like contracts containing state.data.amount. Saves value
176
+ # in state.data.anomount and properly encodes it so it will be preserved on packing.
177
+ #
178
+ # @param [Object] value, should be some representation of a number (also string)
179
+ def amount= (value)
180
+ state[:amount] = value.to_s.force_encoding('utf-8')
181
+ end
182
+
182
183
  # Get packed transaction containing the serialized signed contract and all its counterparts.
183
184
  # Be sure to cal {#seal} somewhere before.
184
185
  #
@@ -195,10 +196,29 @@ module Universa
195
196
  }
196
197
  end
197
198
 
198
- # def create_revocation *keys
199
- # Service.umi.invoke_static 'ContractService', 'createRevocation', *keyss
200
- # sel
201
- # end
199
+ # Call it after check to get summaru of errors found.
200
+ #
201
+ # @return [String] possibly empty ''
202
+ def errors_string
203
+ getErrors.map {|e| "(#{e.object || ''}): #{e.error}"}.join(', ').strip
204
+ end
205
+
206
+ def can_perform_role name, *keys
207
+ getRole(name.to_s).isAllowedForKeys(Set.new keys.map {|x|
208
+ x.is_a?(PrivateKey) ? x.public_key : x
209
+ })
210
+ end
211
+
212
+ # Create a contract that revokes this one if register with the Universa network. BE CAREFUL!
213
+ # REVOCATION IS IRREVERSIBLE! period.
214
+ #
215
+ # @param [PrivateKey] keys enough to allow this contract revocation
216
+ # @return [Contract] revocation contract. Register it with the Universa network to perform revocation.
217
+ def create_revocation(*keys)
218
+ revoke = Service.umi.invoke_static 'ContractsService', 'createRevocation', *keys
219
+ revoke.seal
220
+ revoke
221
+ end
202
222
 
203
223
  end
204
224
 
data/lib/universa/umi.rb CHANGED
@@ -239,8 +239,15 @@ module Universa
239
239
  x._as_umi_arg(self)
240
240
  else
241
241
  case x
242
+ when Set
243
+ # Make a Java Set
244
+ r = call("instantiate","Set", x.to_a.map{|i| i._as_umi_arg(self)})
245
+ # Ref will garbage collect it
246
+ Ref.new(self, r)
247
+ # but we need a ref struct only:
248
+ r
242
249
  when Time
243
- { __type: 'unixtime', seconds: x.to_i}
250
+ {__type: 'unixtime', seconds: x.to_i}
244
251
  when String
245
252
  x.encoding == Encoding::BINARY ? {__type: 'binary', base64: Base64.encode64(x)} : x
246
253
  else
@@ -1,4 +1,4 @@
1
1
  module Universa
2
2
  # Current gem version
3
- VERSION = "0.1.8"
3
+ VERSION = "0.1.9"
4
4
  end
data/lib/universa.rb CHANGED
@@ -5,6 +5,7 @@ require "universa/tools"
5
5
  require "universa/umi"
6
6
  require "universa/service"
7
7
  require "universa/keys"
8
+ require "universa/binder"
8
9
  require "universa/contract"
9
10
  require "universa/client"
10
11
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: universa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - sergeych
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-27 00:00:00.000000000 Z
11
+ date: 2018-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: farcall
@@ -137,7 +137,7 @@ files:
137
137
  - bin/umi/lib/com.icodici.common_tools-3.8.7.jar
138
138
  - bin/umi/lib/com.icodici.crypto-3.8.7.jar
139
139
  - bin/umi/lib/com.icodici.nanohttpd-2.1.0.jar
140
- - bin/umi/lib/com.icodici.umi-0.8.12.jar
140
+ - bin/umi/lib/com.icodici.umi-0.8.17.jar
141
141
  - bin/umi/lib/com.icodici.universa_core-3.8.7.jar
142
142
  - bin/umi/lib/com.madgag.spongycastle.core-1.58.0.0.jar
143
143
  - bin/umi/lib/com.squareup.jnagmp.jnagmp-2.0.0.jar
@@ -153,6 +153,7 @@ files:
153
153
  - bin/umi/lib/org.yaml.snakeyaml-1.18.jar
154
154
  - exe/universa
155
155
  - lib/universa.rb
156
+ - lib/universa/binder.rb
156
157
  - lib/universa/client.rb
157
158
  - lib/universa/contract.rb
158
159
  - lib/universa/errors.rb