iota-ruby 1.1.5 → 1.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +2 -2
- data/lib/iota.rb +4 -2
- data/lib/iota/api/api.rb +24 -18
- data/lib/iota/api/commands.rb +8 -1
- data/lib/iota/api/transport.rb +43 -0
- data/lib/iota/api/wrappers.rb +1 -20
- data/lib/iota/models/account.rb +18 -6
- data/lib/iota/multisig/multisig.rb +1 -1
- data/lib/iota/utils/broker.rb +3 -1
- data/lib/iota/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 001faa9697735af3ccb7dc1b9e853808a09d9ebc
|
4
|
+
data.tar.gz: 46f4cb83b7559dad8265ec8b3b4e080467c180db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9057f008b0a7647b49ff7d9a3bd11e5c719f42f39922d4ae819ce214377fd2ff1d3b7f06e63115a6b01b5723966d3f1f4e4e250cd929e5a351d078228593df1
|
7
|
+
data.tar.gz: a6209e6d04d1295017d4e738cd8770e0e18036cdf45be69ffc6155227655685fa815f6b4dd60bee1ff1418d881da17f738a35eda07ca58493df2b8c9ae9dc7d1
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
## [1.1.6] - 2018-07-22
|
2
|
+
### Added
|
3
|
+
- `wasAddressSpentFrom` API
|
4
|
+
- Inbuilt batching for following apis: `getTrytes`, `getBalances`, `wereAddressesSpentFrom`, `getInclusionStates` & `findTransactions`
|
5
|
+
- adding changelog file to keep track of future changes
|
6
|
+
|
7
|
+
### Changed
|
8
|
+
- Only returning balance array as reponse for `getBalances` api call (Major)
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ This is the **unofficial** Ruby gem for the IOTA Core. It implements both the [o
|
|
9
9
|
Add this line to your application's Gemfile:
|
10
10
|
|
11
11
|
```ruby
|
12
|
-
gem 'iota-ruby'
|
12
|
+
gem 'iota-ruby'
|
13
13
|
```
|
14
14
|
|
15
15
|
And then execute:
|
@@ -87,4 +87,4 @@ else
|
|
87
87
|
end
|
88
88
|
```
|
89
89
|
|
90
|
-
If you'd like to support development, please consider donating to my IOTA address: **
|
90
|
+
If you'd like to support development, please consider donating to my IOTA address: **SGBYR9DXPBPGTFLILQWAYIMINZ9MQAFKGDBHQSXGLKNIHCQZEDYPVNRMDVWFPXQTAIVKWCVWXVXZVZ9R9HIKTZWUAC**
|
data/lib/iota.rb
CHANGED
@@ -8,6 +8,7 @@ require "iota/utils/broker"
|
|
8
8
|
|
9
9
|
require "iota/api/commands"
|
10
10
|
require "iota/api/wrappers"
|
11
|
+
require "iota/api/transport"
|
11
12
|
require "iota/api/api"
|
12
13
|
|
13
14
|
require "iota/crypto/curl"
|
@@ -31,7 +32,7 @@ require "iota/models/account"
|
|
31
32
|
|
32
33
|
module IOTA
|
33
34
|
class Client
|
34
|
-
attr_reader :version, :host, :port, :provider, :sandbox, :token, :broker, :api, :utils, :validator, :multisig
|
35
|
+
attr_reader :version, :host, :port, :provider, :sandbox, :token, :broker, :api, :utils, :validator, :multisig, :batch_size
|
35
36
|
|
36
37
|
def initialize(settings = {})
|
37
38
|
setSettings(settings)
|
@@ -56,6 +57,7 @@ module IOTA
|
|
56
57
|
@sandbox = settings[:sandbox] || false
|
57
58
|
@token = settings[:token] || false
|
58
59
|
@timeout = settings[:timeout] || 120
|
60
|
+
@batch_size = settings[:batch_size] || 500
|
59
61
|
|
60
62
|
if @sandbox
|
61
63
|
@sandbox = @provider.gsub(/\/$/, '')
|
@@ -63,7 +65,7 @@ module IOTA
|
|
63
65
|
end
|
64
66
|
|
65
67
|
@broker = IOTA::Utils::Broker.new(@provider, @token, @timeout)
|
66
|
-
@api = IOTA::API::Api.new(@broker, @sandbox)
|
68
|
+
@api = IOTA::API::Api.new(@broker, @sandbox, @batch_size)
|
67
69
|
end
|
68
70
|
|
69
71
|
def symbolize_keys(hash)
|
data/lib/iota/api/api.rb
CHANGED
@@ -2,17 +2,15 @@ module IOTA
|
|
2
2
|
module API
|
3
3
|
class Api
|
4
4
|
include Wrappers
|
5
|
+
include Transport
|
5
6
|
|
6
|
-
def initialize(broker, sandbox)
|
7
|
+
def initialize(broker, sandbox, batch_size = 500)
|
7
8
|
@broker = broker
|
8
9
|
@sandbox = sandbox
|
9
10
|
@commands = Commands.new
|
10
11
|
@utils = IOTA::Utils::Utils.new
|
11
12
|
@validator = @utils.validator
|
12
|
-
|
13
|
-
|
14
|
-
def sendCommand(command, &callback)
|
15
|
-
@broker.send(command, &callback)
|
13
|
+
@batch_size = batch_size
|
16
14
|
end
|
17
15
|
|
18
16
|
def findTransactions(searchValues, &callback)
|
@@ -23,7 +21,8 @@ module IOTA
|
|
23
21
|
searchKeys = searchValues.keys
|
24
22
|
validKeys = ['bundles', 'addresses', 'tags', 'approvees']
|
25
23
|
|
26
|
-
error = false
|
24
|
+
error = false
|
25
|
+
entry_count = 0
|
27
26
|
|
28
27
|
searchKeys.each do |key|
|
29
28
|
if !validKeys.include?(key.to_s)
|
@@ -32,6 +31,7 @@ module IOTA
|
|
32
31
|
end
|
33
32
|
|
34
33
|
hashes = searchValues[key]
|
34
|
+
entry_count += hashes.count
|
35
35
|
|
36
36
|
if key.to_s == 'addresses'
|
37
37
|
searchValues[key] = hashes.map do |address|
|
@@ -66,18 +66,21 @@ module IOTA
|
|
66
66
|
if error
|
67
67
|
return sendData(false, error, &callback)
|
68
68
|
else
|
69
|
-
|
69
|
+
if entry_count <= @batch_size || searchKeys.count > 1
|
70
|
+
return sendCommand(@commands.findTransactions(searchValues), &callback)
|
71
|
+
else
|
72
|
+
return sendBatchedCommand(@commands.findTransactions(searchValues), &callback)
|
73
|
+
end
|
70
74
|
end
|
71
75
|
end
|
72
76
|
|
73
77
|
def getBalances(addresses, threshold, &callback)
|
74
|
-
# Check if correct transaction hashes
|
75
78
|
if !@validator.isArrayOfHashes(addresses)
|
76
79
|
return sendData(false, "Invalid Trytes provided", &callback)
|
77
80
|
end
|
78
81
|
|
79
82
|
command = @commands.getBalances(addresses.map{|address| @utils.noChecksum(address)}, threshold)
|
80
|
-
|
83
|
+
sendBatchedCommand(command, &callback)
|
81
84
|
end
|
82
85
|
|
83
86
|
def getTrytes(hashes, &callback)
|
@@ -85,21 +88,15 @@ module IOTA
|
|
85
88
|
return sendData(false, "Invalid Trytes provided", &callback)
|
86
89
|
end
|
87
90
|
|
88
|
-
|
91
|
+
sendBatchedCommand(@commands.getTrytes(hashes), &callback)
|
89
92
|
end
|
90
93
|
|
91
94
|
def getInclusionStates(transactions, tips, &callback)
|
92
|
-
|
93
|
-
if !@validator.isArrayOfHashes(transactions)
|
94
|
-
return sendData(false, "Invalid Trytes provided", &callback)
|
95
|
-
end
|
96
|
-
|
97
|
-
# Check if correct tips
|
98
|
-
if !@validator.isArrayOfHashes(tips)
|
95
|
+
if !@validator.isArrayOfHashes(transactions) || !@validator.isArrayOfHashes(tips)
|
99
96
|
return sendData(false, "Invalid Trytes provided", &callback)
|
100
97
|
end
|
101
98
|
|
102
|
-
|
99
|
+
sendBatchedCommand(@commands.getInclusionStates(transactions, tips), &callback)
|
103
100
|
end
|
104
101
|
|
105
102
|
def getNodeInfo(&callback)
|
@@ -193,6 +190,15 @@ module IOTA
|
|
193
190
|
sendCommand(@commands.checkConsistency(tails), &callback)
|
194
191
|
end
|
195
192
|
|
193
|
+
def wereAddressesSpentFrom(addresses, &callback)
|
194
|
+
if !@validator.isArrayOfHashes(addresses)
|
195
|
+
return sendData(false, "Invalid Trytes provided", &callback)
|
196
|
+
end
|
197
|
+
|
198
|
+
command = @commands.wereAddressesSpentFrom(addresses.map{|address| @utils.noChecksum(address)})
|
199
|
+
sendBatchedCommand(command, &callback)
|
200
|
+
end
|
201
|
+
|
196
202
|
private
|
197
203
|
def sendData(status, data, &callback)
|
198
204
|
callback ? callback.call(status, data) : [status, data]
|
data/lib/iota/api/commands.rb
CHANGED
@@ -6,7 +6,7 @@ module IOTA
|
|
6
6
|
command: 'findTransactions'
|
7
7
|
}
|
8
8
|
|
9
|
-
searchValues.each { |k, v| command[k] = v }
|
9
|
+
searchValues.each { |k, v| command[k.to_sym] = v }
|
10
10
|
|
11
11
|
command
|
12
12
|
end
|
@@ -101,6 +101,13 @@ module IOTA
|
|
101
101
|
tails: tails
|
102
102
|
}
|
103
103
|
end
|
104
|
+
|
105
|
+
def wereAddressesSpentFrom(addresses)
|
106
|
+
{
|
107
|
+
command: 'wereAddressesSpentFrom',
|
108
|
+
addresses: addresses
|
109
|
+
}
|
110
|
+
end
|
104
111
|
end
|
105
112
|
end
|
106
113
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module IOTA
|
2
|
+
module API
|
3
|
+
module Transport
|
4
|
+
def sendCommand(command, &callback)
|
5
|
+
@broker.send(command, &callback)
|
6
|
+
end
|
7
|
+
|
8
|
+
def sendBatchedCommand(command, &callback)
|
9
|
+
# Key and value both should be symbols
|
10
|
+
mapping = {
|
11
|
+
getTrytes: [ :hashes ],
|
12
|
+
getBalances: [ :addresses ],
|
13
|
+
wereAddressesSpentFrom: [ :addresses ],
|
14
|
+
getInclusionStates: [ :transactions ],
|
15
|
+
findTransactions: [ :bundles, :addresses, :tags, :approvees ]
|
16
|
+
}
|
17
|
+
|
18
|
+
command_name = command[:command].to_sym
|
19
|
+
if mapping[command_name]
|
20
|
+
results = []
|
21
|
+
|
22
|
+
keys_to_batch = mapping[command_name]
|
23
|
+
keys_to_batch.each do |key|
|
24
|
+
if command[key]
|
25
|
+
command[key].each_slice(@batch_size) do |group|
|
26
|
+
batchedCommand = command.clone.merge({ key => group })
|
27
|
+
sendCommand(batchedCommand) do |status, response|
|
28
|
+
if !status
|
29
|
+
return sendData(false, response, &callback)
|
30
|
+
end
|
31
|
+
results += response
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
return sendData(true, results, &callback)
|
37
|
+
else
|
38
|
+
return sendCommand(command, &callback)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/iota/api/wrappers.rb
CHANGED
@@ -10,7 +10,7 @@ module IOTA
|
|
10
10
|
ret_status = false
|
11
11
|
ret_data = nil
|
12
12
|
# get the trytes of the transaction hashes
|
13
|
-
|
13
|
+
getTrytes(hashes) do |status, trytes|
|
14
14
|
ret_status = status
|
15
15
|
if status
|
16
16
|
transactionObjects = []
|
@@ -425,25 +425,6 @@ module IOTA
|
|
425
425
|
end
|
426
426
|
end
|
427
427
|
end
|
428
|
-
|
429
|
-
def getTrytesInBatches(hashes, batchSize = 500, &callback)
|
430
|
-
if !@validator.isArrayOfHashes(hashes)
|
431
|
-
return sendData(false, "Invalid Trytes provided", &callback)
|
432
|
-
end
|
433
|
-
|
434
|
-
data = []
|
435
|
-
|
436
|
-
hashes.each_slice(batchSize) do |group|
|
437
|
-
getTrytes(group) do |status, trytes|
|
438
|
-
if !status
|
439
|
-
return sendData(false, trytes, &callback)
|
440
|
-
end
|
441
|
-
data += trytes
|
442
|
-
end
|
443
|
-
end
|
444
|
-
|
445
|
-
sendData(true, data, &callback)
|
446
|
-
end
|
447
428
|
end
|
448
429
|
end
|
449
430
|
end
|
data/lib/iota/models/account.rb
CHANGED
@@ -58,7 +58,7 @@ module IOTA
|
|
58
58
|
raise StandardError, balancesData
|
59
59
|
end
|
60
60
|
|
61
|
-
balancesData
|
61
|
+
balancesData.each_with_index do |balance, index|
|
62
62
|
balance = balance.to_i
|
63
63
|
@balance += balance
|
64
64
|
|
@@ -208,7 +208,7 @@ module IOTA
|
|
208
208
|
confirmedInputs = []
|
209
209
|
totalBalance = 0
|
210
210
|
|
211
|
-
balances
|
211
|
+
balances.each_with_index do |balance, i|
|
212
212
|
# If input has balance, add it to confirmedInputs
|
213
213
|
balance = balance.to_i
|
214
214
|
|
@@ -318,9 +318,22 @@ module IOTA
|
|
318
318
|
loop do
|
319
319
|
newAddress = @seed.getAddress(index, security, checksum)
|
320
320
|
|
321
|
-
@api.
|
321
|
+
@api.wereAddressesSpentFrom([newAddress]) do |status, spent_states|
|
322
322
|
if !status
|
323
|
-
raise StandardError,
|
323
|
+
raise StandardError, spent_states
|
324
|
+
end
|
325
|
+
|
326
|
+
spent = spent_states[0]
|
327
|
+
|
328
|
+
# Check transactions if not spent
|
329
|
+
if !spent
|
330
|
+
@api.findTransactions(addresses: [newAddress]) do |status, trx_hashes|
|
331
|
+
if !status
|
332
|
+
raise StandardError, trx_hashes
|
333
|
+
end
|
334
|
+
|
335
|
+
spent = trx_hashes.length > 0
|
336
|
+
end
|
324
337
|
end
|
325
338
|
|
326
339
|
if return_all
|
@@ -328,8 +341,7 @@ module IOTA
|
|
328
341
|
end
|
329
342
|
|
330
343
|
index += 1
|
331
|
-
|
332
|
-
return (return_all ? allAddresses : newAddress) if trx_hashes.length == 0
|
344
|
+
return (return_all ? allAddresses : newAddress) if !spent
|
333
345
|
end
|
334
346
|
end
|
335
347
|
end
|
@@ -125,7 +125,7 @@ module IOTA
|
|
125
125
|
if !st1
|
126
126
|
raise StandardError, "Error fetching balances: #{balances}"
|
127
127
|
else
|
128
|
-
return createBundle(balances[
|
128
|
+
return createBundle(balances[0].to_i, totalValue, bundle, input, remainderAddress, tag, signatureFragments)
|
129
129
|
end
|
130
130
|
end
|
131
131
|
end
|
data/lib/iota/utils/broker.rb
CHANGED
@@ -98,7 +98,9 @@ module IOTA
|
|
98
98
|
'getTrytes' => 'trytes',
|
99
99
|
'getInclusionStates' => 'states',
|
100
100
|
'attachToTangle' => 'trytes',
|
101
|
-
'checkConsistency' => 'state'
|
101
|
+
'checkConsistency' => 'state',
|
102
|
+
'getBalances' => 'balances',
|
103
|
+
'wereAddressesSpentFrom'=> 'states'
|
102
104
|
}
|
103
105
|
|
104
106
|
# If correct result and we want to prepare the result
|
data/lib/iota/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iota-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vivek Marakana
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-07-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -92,6 +92,7 @@ files:
|
|
92
92
|
- ".editorconfig"
|
93
93
|
- ".gitignore"
|
94
94
|
- ".travis.yml"
|
95
|
+
- CHANGELOG.md
|
95
96
|
- Gemfile
|
96
97
|
- LICENSE
|
97
98
|
- README.md
|
@@ -104,6 +105,7 @@ files:
|
|
104
105
|
- lib/iota.rb
|
105
106
|
- lib/iota/api/api.rb
|
106
107
|
- lib/iota/api/commands.rb
|
108
|
+
- lib/iota/api/transport.rb
|
107
109
|
- lib/iota/api/wrappers.rb
|
108
110
|
- lib/iota/crypto/bundle.rb
|
109
111
|
- lib/iota/crypto/converter.rb
|