openassets-ruby 0.1.4 → 0.1.5

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: 0ebe922dafaddce5468b643e800caeebfac700c5
4
- data.tar.gz: 238a308ab6eea7f04ed160d70468831ab5a2d6e2
3
+ metadata.gz: d3804b292002c1e288151b5f5e9b17e271e9a223
4
+ data.tar.gz: 7ca178d7e5556ddbc997f09cf05a9dcdb87f7112
5
5
  SHA512:
6
- metadata.gz: 73085f2221a5753ca9d4463cf712a71efe175e2b77705723faac92fe89a64a6478af497814206e1b5d0aa7c56a936d58675093a4e9e7e194d815d80967057004
7
- data.tar.gz: cd26cfd741e51acc8d4be4ba6631bbbad19956d52285550ba855630f7fd3b118aa7940531d4bb9d5cc1d3d6fbbc2e53de335aa2025d93abb443ab0e70cd83066
6
+ metadata.gz: 066a91d9c71bc20a8241279ff9f8319c0220d42cc7748847f9bbefabad54e2304f64b7974fc23a27588a05f6075303120c84e7781d35ea80dfba6a5e88b8c537
7
+ data.tar.gz: 568042474c3efa701a00672b695dec08dbea170eeda6108a63653a32e61fc40ebd052a548a8eef53ee439fc19599dd3c95dcece6e8436a0ea4b2b1d1545cea06
data/README.md CHANGED
@@ -69,6 +69,21 @@ Creates a transaction for sending an asset from the open asset address to anothe
69
69
  api.send_asset(from, 'AWo3R89p5REmoSyMWB8AeUmud8456bRxZL', 100, to, 10000, 'broadcast')
70
70
  ```
71
71
 
72
+ * **send_bitcoin**
73
+ Creates a transaction for sending bitcoins from an address to another.
74
+ ```ruby
75
+ # send bitcoin
76
+ # api.send_bitcoin(<from btc address>, <amount (satoshi)>, <to btc address>, <fees (The fess in satoshis for the transaction. use 10000 satoshi if specified nil)>, <mode=('broadcast', 'signed', 'unsigned')>, <output_qty default value is 1.>)
77
+
78
+ # example
79
+ from = '14M4kbAtn71P1nnNYuhBDFTNYxa19t1XP6'
80
+ to = '1MFW7BTwiNbAkmVz4SzAMQXboKYKGSzkq2'
81
+ api.send_bitcoin(from, 60000, to)
82
+ ```
83
+
84
+ If specified output_qty, the send output is divided by the number of output_qty.
85
+ Ex, amount = 60000 and output_qty = 2, send TxOut is two (each value is 30000, 30000) and change TxOut one.
86
+
72
87
  ## License
73
88
 
74
89
  The MIT License (MIT)
@@ -118,6 +118,7 @@ module OpenAssets
118
118
  # @param[String] mode 'broadcast' (default) for signing and broadcasting the transaction,
119
119
  # 'signed' for signing the transaction without broadcasting,
120
120
  # 'unsigned' for getting the raw unsigned transaction without broadcasting"""='broadcast'
121
+ # @return[Bitcoin::Protocol:Tx] The resulting transaction.
121
122
  def send_asset(from, asset_id, amount, to, fees = nil, mode = 'broadcast')
122
123
  builder = OpenAssets::Transaction::TransactionBuilder.new(@config[:dust_limit])
123
124
  colored_outputs = get_unspent_outputs([oa_address_to_address(from)])
@@ -127,6 +128,26 @@ module OpenAssets
127
128
  tx
128
129
  end
129
130
 
131
+ # Creates a transaction for sending bitcoins from an address to another.
132
+ # @param[String] from The address to send the bitcoins from.
133
+ # @param[Integer] amount The amount of satoshis to send.
134
+ # @param[String] to The address to send the bitcoins to.
135
+ # @param[Integer] fees The fess in satoshis for the transaction.
136
+ # @param[String] mode 'broadcast' (default) for signing and broadcasting the transaction,
137
+ # 'signed' for signing the transaction without broadcasting,
138
+ # 'unsigned' for getting the raw unsigned transaction without broadcasting"""='broadcast'
139
+ # @param [Integer] output_qty The number of divides the issue output. Default value is 1.
140
+ # Ex. amount = 125 and output_qty = 2, asset quantity = [62, 63] and issue TxOut is two.
141
+ # @return[Bitcoin::Protocol:Tx] The resulting transaction.
142
+ def send_bitcoin(from, amount, to, fees = nil, mode = 'broadcast', output_qty = 1)
143
+ validate_address([from, to])
144
+ builder = OpenAssets::Transaction::TransactionBuilder.new(@config[:dust_limit])
145
+ colored_outputs = get_unspent_outputs([from])
146
+ send_param = OpenAssets::Transaction::TransferParameters.new(colored_outputs, to, from, amount)
147
+ tx = builder.transfer_btc(send_param, fees.nil? ? @config[:default_fees]: fees, output_qty)
148
+ process_transaction(tx, mode)
149
+ end
150
+
130
151
  # Get unspent outputs.
131
152
  # @param [Array] addresses The array of Bitcoin address.
132
153
  # @return [Array[OpenAssets::Transaction::SpendableOutput]] The array of unspent outputs.
@@ -28,6 +28,7 @@ module OpenAssets
28
28
  payload = [OAP_MARKER, VERSION]
29
29
  payload << Bitcoin::Protocol.pack_var_int(@asset_quantities.length).unpack("H*")
30
30
  @asset_quantities.map{|q|payload << encode_leb128(q)}
31
+ @metadata ||= ''
31
32
  payload << Bitcoin::Protocol.pack_var_int(@metadata.length).unpack("H*")
32
33
  tmp = []
33
34
  @metadata.bytes{|b| tmp << b.to_s(16)}
@@ -50,56 +50,17 @@ module OpenAssets
50
50
  # @param[Integer] fees The fees to include in the transaction.
51
51
  # @return[Bitcoin::Protocol:Tx] The resulting unsigned transaction.
52
52
  def transfer_assets(asset_id, transfer_spec, btc_change_script, fees)
53
- btc_transfer_spec = OpenAssets::Transaction::TransferParameters.new(transfer_spec.unspent_outputs, nil, btc_change_script, 0)
54
- outputs = []
55
- asset_quantities = []
56
- inputs, total_amount = TransactionBuilder.collect_colored_outputs(transfer_spec.unspent_outputs, asset_id, transfer_spec.amount)
57
-
58
- # add asset transfer outpu
59
- outputs << create_colored_output(oa_address_to_address(transfer_spec.to_script))
60
- asset_quantities << transfer_spec.amount
61
-
62
- # add the rest of the asset to the origin address
63
- if total_amount > transfer_spec.amount
64
- outputs << create_colored_output(oa_address_to_address(transfer_spec.change_script))
65
- asset_quantities << (total_amount - transfer_spec.amount)
66
- end
67
-
68
- btc_excess = inputs.inject(0) { |sum, i| sum + i.output.value } - outputs.inject(0){|sum, o| sum + o.value}
69
- if btc_excess < btc_transfer_spec.amount + fees
70
- uncolored_outputs, uncolored_amount =
71
- TransactionBuilder.collect_uncolored_outputs(btc_transfer_spec.unspent_outputs, btc_transfer_spec.amount + fees - btc_excess)
72
- inputs << uncolored_outputs
73
- btc_excess += uncolored_amount
74
- end
75
-
76
- change = btc_excess - btc_transfer_spec.amount - fees
77
- if change > 0
78
- outputs << create_uncolored_output(oa_address_to_address(btc_transfer_spec.change_script), change)
79
- end
80
-
81
- if btc_transfer_spec.amount > 0
82
- outputs << create_uncolored_output(oa_address_to_address(btc_transfer_spec.to_script), btc_transfer_spec.amount)
83
- end
84
-
85
- # add marker output to outputs first.
86
- unless asset_quantities.empty?
87
- outputs.unshift(create_marker_output(asset_quantities))
88
- end
89
-
90
- tx = Bitcoin::Protocol::Tx.new
91
- inputs.flatten.each{|i|
92
- script_sig = i.output.script.to_binary
93
- tx_in = Bitcoin::Protocol::TxIn.from_hex_hash(i.out_point.hash, i.out_point.index)
94
- tx_in.script_sig = script_sig
95
- tx.add_in(tx_in)
96
- }
97
- outputs.each{|o|tx.add_out(o)}
98
- tx
53
+ btc_transfer_spec = OpenAssets::Transaction::TransferParameters.new(
54
+ transfer_spec.unspent_outputs, nil, oa_address_to_address(btc_change_script), 0)
55
+ transfer([[asset_id, transfer_spec]], btc_transfer_spec, fees)
99
56
  end
100
57
 
101
- def transfer_btc
102
-
58
+ # Creates a transaction for sending bitcoins.
59
+ # @param[OpenAssets::Transaction::TransferParameters] btc_transfer_spec The parameters of the bitcoins being transferred.
60
+ # @param[Integer] fees The fees to include in the transaction.
61
+ # @return[Bitcoin::Protocol:Tx] The resulting unsigned transaction.
62
+ def transfer_btc(btc_transfer_spec, fees, output_qty = 1)
63
+ transfer([], btc_transfer_spec, fees, output_qty)
103
64
  end
104
65
 
105
66
  # collect uncolored outputs in unspent outputs(contains colored output).
@@ -166,6 +127,66 @@ module OpenAssets
166
127
  Bitcoin::Protocol::TxOut.new(value, Bitcoin::Script.new(Bitcoin::Script.to_hash160_script(hash160)).to_payload)
167
128
  end
168
129
 
130
+ def transfer(asset_transfer_specs, btc_transfer_spec, fees, btc_output_qty = 1)
131
+ inputs = []
132
+ outputs = []
133
+ asset_quantities = []
134
+ asset_transfer_specs.each{|asset_id, transfer_spec|
135
+ colored_outputs, total_amount = TransactionBuilder.collect_colored_outputs(transfer_spec.unspent_outputs, asset_id, transfer_spec.amount)
136
+ inputs = inputs + colored_outputs
137
+
138
+ # add asset transfer output
139
+ outputs << create_colored_output(oa_address_to_address(transfer_spec.to_script))
140
+ asset_quantities << transfer_spec.amount
141
+
142
+ # add the rest of the asset to the origin address
143
+ if total_amount > transfer_spec.amount
144
+ outputs << create_colored_output(oa_address_to_address(transfer_spec.change_script))
145
+ asset_quantities << (total_amount - transfer_spec.amount)
146
+ end
147
+ }
148
+
149
+ # btc_excess = inputs(colored) total satoshi - outputs(transfer) total satoshi
150
+ btc_excess = inputs.inject(0) { |sum, i| sum + i.output.value } - outputs.inject(0){|sum, o| sum + o.value}
151
+ if btc_excess < btc_transfer_spec.amount + fees
152
+ uncolored_outputs, uncolored_amount =
153
+ TransactionBuilder.collect_uncolored_outputs(btc_transfer_spec.unspent_outputs, btc_transfer_spec.amount + fees - btc_excess)
154
+ inputs << uncolored_outputs
155
+ btc_excess += uncolored_amount
156
+ end
157
+
158
+ otsuri = btc_excess - btc_transfer_spec.amount - fees
159
+ if otsuri > 0
160
+ outputs << create_uncolored_output(btc_transfer_spec.change_script, otsuri)
161
+ end
162
+
163
+ if btc_transfer_spec.amount > 0
164
+ btc_output_qty.times {|index|
165
+ if index == btc_output_qty - 1
166
+ amount = btc_transfer_spec.amount / btc_output_qty + btc_transfer_spec.amount % btc_output_qty
167
+ else
168
+ amount = btc_transfer_spec.amount / btc_output_qty
169
+ end
170
+ outputs << create_uncolored_output(btc_transfer_spec.to_script, amount)
171
+ }
172
+ end
173
+
174
+ # add marker output to outputs first.
175
+ unless asset_quantities.empty?
176
+ outputs.unshift(create_marker_output(asset_quantities))
177
+ end
178
+
179
+ tx = Bitcoin::Protocol::Tx.new
180
+ inputs.flatten.each{|i|
181
+ script_sig = i.output.script.to_binary
182
+ tx_in = Bitcoin::Protocol::TxIn.from_hex_hash(i.out_point.hash, i.out_point.index)
183
+ tx_in.script_sig = script_sig
184
+ tx.add_in(tx_in)
185
+ }
186
+ outputs.each{|o|tx.add_out(o)}
187
+ tx
188
+ end
189
+
169
190
  end
170
191
 
171
192
  end
@@ -1,3 +1,3 @@
1
1
  module OpenAssets
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
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.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - azuchi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-08-21 00:00:00.000000000 Z
11
+ date: 2015-08-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bitcoin-ruby