openassets-ruby 0.4.6 → 0.4.7

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
  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