openassets-ruby 0.4.6 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b9d348974ed51f85bc9e72c5eb5a38bd0a184238
4
- data.tar.gz: a693b29a1e8d88cb25b6babd4cabcfd42640502d
3
+ metadata.gz: 373d3c6333cae6c3f7b59ab0c5b655016d97a246
4
+ data.tar.gz: f2893fc9d18904df4ea8120d6d9cf88a955021e9
5
5
  SHA512:
6
- metadata.gz: 742fe44913fa3c9fe836ee659719236bc024cd6b655a5fcae74affdb22f0f07cf2ec7c7d4f72e47119e88030368b4069f8333f799f963348795411dbf0a0c72b
7
- data.tar.gz: 1d0f68e09c1c0f61c78d130d211949f52822cc0617f20314e55515910cc3625f80c92917a8697d44b846c7cb8fe4f43033741f2f39042a80b00c363bcf49a26c
6
+ metadata.gz: 1eded75af7ea679718ce74292b4cd2c4a74fa0e84788ec760061d587d2d729d00fe43ca0dfd046991cf56c225384d3ecb5010ba4a53540dd9e6f612fe81bf952
7
+ data.tar.gz: 24180dbf44cdadd4ccf2daf36bdce9e3fcf9abcab72654a677dbaa58e6cf02af1335a0f4b4c6f9273c7dca4827d1409961ca4aab2bb333742291c2af3465be95
data/README.md CHANGED
@@ -40,7 +40,7 @@ The configuration options are as follows:
40
40
  |**provider**|The RPC server. Specify possible now only "bitcoind".|bitcoind|
41
41
  |**cache**|The path to the database file. If you want to use in-memory database, specify ':memory:'.|cache.db|
42
42
  |**dust_limit**|The amount of Bitcoin, which is set to the each output of the Open Assets Protocol(issue or transfer).|600 (satoshi)|
43
- |**default_fees**|The transaction fee. (used by issue_asset and send_asset, send_bitcoin )|10000 (satoshi)|
43
+ |**default_fees**|The default transaction fee in satoshi. If you want to use auto fee settings, specify ':auto'. (used by issue_asset and send_asset, send_bitcoin )|10000 (satoshi)|
44
44
  |**min_confirmation**|The minimum number of confirmations the transaction containing an output that used to get UTXO.|1|
45
45
  |**max_confirmation**|The maximum number of confirmations the transaction containing an output that used to get UTXO.|9999999|
46
46
  |**rpc**|The access information to the RPC server of Bitcoin Core.|N/A|
@@ -364,7 +364,20 @@ module OpenAssets
364
364
  end
365
365
 
366
366
  def create_tx_builder
367
- OpenAssets::Transaction::TransactionBuilder.new(@config[:dust_limit])
367
+ if @config[:default_fees] == :auto
368
+ # Estimate a transaction fee rate (satoshis/KB) if fee is specified by :auto
369
+ efr = coin_to_satoshi(provider.estimatefee(1).to_s).to_i
370
+ if efr < 0
371
+ # Negative efr means "estimatefee" of bitcoin-api returns false
372
+ # In this case, use default minimum fees rate (10_000 satoshis/KB)
373
+ efr = 10_000
374
+ end
375
+ OpenAssets::Transaction::TransactionBuilder.new(@config[:dust_limit], efr)
376
+ else
377
+ # If fee is specified by a fixed value (or the default value)
378
+ OpenAssets::Transaction::TransactionBuilder.new(@config[:dust_limit])
379
+ end
380
+
368
381
  end
369
382
 
370
383
  def load_tx(txid)
@@ -73,7 +73,9 @@ module OpenAssets
73
73
 
74
74
  # Convert Asset Definition to json format.
75
75
  def to_json
76
- to_hash.to_json
76
+ h = to_hash
77
+ h.delete('proof_of_authenticity')
78
+ h.to_json
77
79
  end
78
80
 
79
81
  def to_hash
@@ -7,8 +7,12 @@ module OpenAssets
7
7
  # The minimum allowed output value.
8
8
  attr_accessor :amount
9
9
 
10
- def initialize(amount = 600)
10
+ # The estimated transaction fee rate (satoshis/KB).
11
+ attr_accessor :efr
12
+
13
+ def initialize(amount = 600, efr = 10000)
11
14
  @amount = amount
15
+ @efr = efr
12
16
  end
13
17
 
14
18
  # Creates a transaction for issuing an asset.
@@ -17,6 +21,12 @@ module OpenAssets
17
21
  # @param [Integer] fees The fees to include in the transaction.
18
22
  # @return[Bitcoin:Protocol:Tx] An unsigned transaction for issuing asset.
19
23
  def issue_asset(issue_spec, metadata, fees)
24
+
25
+ if fees == :auto
26
+ # Calculate fees (assume that one vin and four vouts are wrote)
27
+ fees = calc_fee(1, 4)
28
+ end
29
+
20
30
  inputs, total_amount =
21
31
  TransactionBuilder.collect_uncolored_outputs(issue_spec.unspent_outputs, 2 * @amount + fees)
22
32
  tx = Bitcoin::Protocol::Tx.new
@@ -50,7 +60,12 @@ module OpenAssets
50
60
  asset_transfer_spec.unspent_outputs, nil, oa_address_to_address(btc_change_script), 0)
51
61
  transfer([[asset_id, asset_transfer_spec]], [btc_transfer_spec], fees)
52
62
  end
53
-
63
+
64
+ # Creates a transaction for sending assets to many.
65
+ # @param[Array[OpenAssets::Transaction::TransferParameters]] asset_transfer_spec The parameters of the asset being transferred.
66
+ # @param[String] btc_change_script The script where to send bitcoin change, if any.
67
+ # @param[Integer] fees The fees to include in the transaction.
68
+ # @return[Bitcoin::Protocol:Tx] The resulting unsigned transaction.
54
69
  def transfer_assets(transfer_specs, btc_change_script, fees)
55
70
  btc_transfer_spec = OpenAssets::Transaction::TransferParameters.new(
56
71
  transfer_specs[0][1].unspent_outputs, nil, oa_address_to_address(btc_change_script), 0)
@@ -72,12 +87,18 @@ module OpenAssets
72
87
  def transfer_btcs(btc_transfer_specs, fees)
73
88
  transfer([], btc_transfer_specs, fees)
74
89
  end
75
-
76
-
90
+
77
91
  # Create a transaction for burn asset
78
92
  def burn_asset(unspents, asset_id, fee)
93
+
79
94
  tx = Bitcoin::Protocol::Tx.new
80
95
  targets = unspents.select{|o|o.output.asset_id == asset_id}
96
+
97
+ if fee == :auto
98
+ # Calculate fees and otsuri (assume that one vout exists)
99
+ fee = calc_fee(targets.size, 1)
100
+ end
101
+
81
102
  raise TransactionBuildError.new('There is no asset.') if targets.length == 0
82
103
  total_amount = targets.inject(0){|sum, o|o.output.value + sum}
83
104
  otsuri = total_amount - fee
@@ -207,18 +228,32 @@ module OpenAssets
207
228
  # Calculate total amount of bitcoins to send
208
229
  btc_transfer_total_amount = btc_transfer_specs.inject(0) {|sum, b| sum + b.amount}
209
230
 
210
- if btc_excess < btc_transfer_total_amount + fees
231
+ if fees == :auto
232
+ fixed_fees = 0
233
+ else
234
+ fixed_fees = fees
235
+ end
236
+
237
+ if btc_excess < btc_transfer_total_amount + fixed_fees
211
238
  # When there does not exist enough bitcoins to send in the inputs
212
239
  # assign new address (utxo) to the inputs (does not include output coins)
213
240
  # CREATING INPUT (if needed)
214
241
  uncolored_outputs, uncolored_amount =
215
- TransactionBuilder.collect_uncolored_outputs(utxo, btc_transfer_total_amount + fees - btc_excess)
242
+ TransactionBuilder.collect_uncolored_outputs(utxo, btc_transfer_total_amount + fixed_fees - btc_excess)
216
243
  utxo = utxo - uncolored_outputs
217
244
  inputs << uncolored_outputs
218
245
  btc_excess += uncolored_amount
219
246
  end
220
247
 
248
+ if fees == :auto
249
+ # Calculate fees and otsuri (the numbers of vins and vouts are known)
250
+ # +1 in the second term means "otsuri" vout,
251
+ # and outputs size means the number of vout witn asset_id
252
+ fees = calc_fee(inputs.size, outputs.size + btc_transfer_specs.size + 1)
253
+ end
254
+
221
255
  otsuri = btc_excess - btc_transfer_total_amount - fees
256
+
222
257
  if otsuri > 0 && otsuri < @amount
223
258
  # When there exists otsuri, but it is smaller than @amount (default is 600 satoshis)
224
259
  # assign new address (utxo) to the input (does not include @amount - otsuri)
@@ -261,9 +296,22 @@ module OpenAssets
261
296
  }
262
297
 
263
298
  outputs.each{|o|tx.add_out(o)}
264
-
299
+
265
300
  tx
266
301
  end
302
+
303
+ # Calculate a transaction fee
304
+ # @param [Integer] inputs_num: The number of vin fields.
305
+ # @param [Integer] outputs_num: The number of vout fields.
306
+ # @return [Integer] A transaction fee.
307
+ def calc_fee(inputs_num, outputs_num)
308
+ # See http://bitcoinfees.com/
309
+ tx_size = 148 * inputs_num + 34 * outputs_num + 10
310
+ # See Bitcoin::tx.calculate_minimum_fee
311
+ fee = (1 + tx_size / 1_000) * @efr
312
+
313
+ fee
314
+ end
267
315
 
268
316
  end
269
317
 
@@ -1,3 +1,3 @@
1
1
  module OpenAssets
2
- VERSION = '0.4.6'
2
+ VERSION = '0.4.7'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openassets-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.6
4
+ version: 0.4.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - azuchi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-02 00:00:00.000000000 Z
11
+ date: 2016-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bitcoin-ruby