openassets-ruby 0.3.3 → 0.3.4

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: 55f541af3749707d21e550e2fa82882062a203f1
4
- data.tar.gz: 00909d9fb3f0eef92d696b1fd97ed34554c5c805
3
+ metadata.gz: bcc95426e060b6c7e00a0e7e42ddb497ea4621d5
4
+ data.tar.gz: f50086936278851d11ed8136e7ab19a210f87efe
5
5
  SHA512:
6
- metadata.gz: 748937bd4d011a5ee5b62a3527c032a230ad154812526fc0dccf01127dca1213c7bd90fd21a03d4c37c05b254f3a3c1a4760d30237b052a11bb20432d18aa3df
7
- data.tar.gz: 5c97eb9169a61a16b645fcf697d63f09fcefa2fd78c96b64208e6d4d9c81fc5b202f089a1f7b3b3b919224ccace384a9f0b575b2f3454fbfc39ac21e5e6b8293
6
+ metadata.gz: 2ea9d0902779030e3b9a80174bc5646c714f60904298d5a3196556920bd3eecf34ec6c805db40ae68c9f338c7c6a071c2f089b1c89ad34e559f81045183be35a
7
+ data.tar.gz: 94b2f561b2c7601faf9b7388253fa84baf32db56e203306d19d3541ff5a9afad3707cd5ad288b55bfda0aef1f38a782b908b569398d6c2cca14957bc15dc3aa3
data/README.md CHANGED
@@ -215,6 +215,21 @@ Creates a transaction for sending **multiple** asset from the open asset address
215
215
  tx = api.send_assets(from, params)
216
216
  ```
217
217
 
218
+ * **burn_asset**
219
+ Creates a transaction for burn asset.
220
+ This API is to burn the asset by spending the all UTXO of specified asset as Bitcoin.
221
+ ```ruby
222
+ # burn_asset
223
+ # api.burn_asset(<from open asset address>, <asset ID>,, <fees (The fess in satoshis for the transaction. use 10000 satoshi if specified nil)>, <mode=('broadcast', 'signed', 'unsigned')>, <output_qty default value is 1.>)
224
+
225
+ # example
226
+ oa_address = 'bX2vhttomKj2fdd7SJV2nv8U4zDjusE5Y4B'
227
+ asset_id = 'oGu4VXx2TU97d9LmPP8PMCkHckkcPqC5RY'
228
+ tx = api.burn_asset(oa_address, asset_id, 10000)
229
+ ```
230
+
231
+ **Note:** Burned asset will not be able to again get.
232
+
218
233
  ## Command line interface
219
234
 
220
235
  Openassets-ruby comes with a `openassets` command line interface that allows easy interaction with OpenAssets.
@@ -93,10 +93,9 @@ module OpenAssets
93
93
  # @return[Bitcoin::Protocol::Tx] The Bitcoin::Protocol::Tx object.
94
94
  def issue_asset(from, amount, metadata = nil, to = nil, fees = nil, mode = 'broadcast', output_qty = 1)
95
95
  to = from if to.nil?
96
- builder = OpenAssets::Transaction::TransactionBuilder.new(@config[:dust_limit])
97
96
  colored_outputs = get_unspent_outputs([oa_address_to_address(from)])
98
97
  issue_param = OpenAssets::Transaction::TransferParameters.new(colored_outputs, to, from, amount, output_qty)
99
- tx = builder.issue_asset(issue_param, metadata, fees.nil? ? @config[:default_fees]: fees)
98
+ tx = create_tx_builder.issue_asset(issue_param, metadata, fees.nil? ? @config[:default_fees]: fees)
100
99
  tx = process_transaction(tx, mode)
101
100
  tx
102
101
  end
@@ -112,10 +111,9 @@ module OpenAssets
112
111
  # 'unsigned' for getting the raw unsigned transaction without broadcasting"""='broadcast'
113
112
  # @return[Bitcoin::Protocol:Tx] The resulting transaction.
114
113
  def send_asset(from, asset_id, amount, to, fees = nil, mode = 'broadcast', output_qty = 1)
115
- builder = OpenAssets::Transaction::TransactionBuilder.new(@config[:dust_limit])
116
114
  colored_outputs = get_unspent_outputs([oa_address_to_address(from)])
117
115
  asset_transfer_spec = OpenAssets::Transaction::TransferParameters.new(colored_outputs, to, from, amount, output_qty)
118
- tx = builder.transfer_asset(asset_id, asset_transfer_spec, from, fees.nil? ? @config[:default_fees]: fees)
116
+ tx = create_tx_builder.transfer_asset(asset_id, asset_transfer_spec, from, fees.nil? ? @config[:default_fees]: fees)
119
117
  tx = process_transaction(tx, mode)
120
118
  tx
121
119
  end
@@ -129,12 +127,11 @@ module OpenAssets
129
127
  # 'unsigned' for getting the raw unsigned transaction without broadcasting"""='broadcast'
130
128
  # @return[Bitcoin::Protocol:Tx] The resulting transaction.
131
129
  def send_assets(from, send_asset_params, fees = nil, mode = 'broadcast')
132
- builder = OpenAssets::Transaction::TransactionBuilder.new(@config[:dust_limit])
133
130
  colored_outputs = get_unspent_outputs([oa_address_to_address(from)])
134
131
  transfer_specs = send_asset_params.map{|param|
135
132
  [param.asset_id, OpenAssets::Transaction::TransferParameters.new(colored_outputs, param.to, from, param.amount)]
136
133
  }
137
- tx = builder.transfer_assets(transfer_specs, from, fees.nil? ? @config[:default_fees]: fees)
134
+ tx = create_tx_builder.transfer_assets(transfer_specs, from, fees.nil? ? @config[:default_fees]: fees)
138
135
  tx = process_transaction(tx, mode)
139
136
  tx
140
137
  end
@@ -152,10 +149,22 @@ module OpenAssets
152
149
  # @return[Bitcoin::Protocol:Tx] The resulting transaction.
153
150
  def send_bitcoin(from, amount, to, fees = nil, mode = 'broadcast', output_qty = 1)
154
151
  validate_address([from, to])
155
- builder = OpenAssets::Transaction::TransactionBuilder.new(@config[:dust_limit])
156
152
  colored_outputs = get_unspent_outputs([from])
157
153
  btc_transfer_spec = OpenAssets::Transaction::TransferParameters.new(colored_outputs, to, from, amount, output_qty)
158
- tx = builder.transfer_btc(btc_transfer_spec, fees.nil? ? @config[:default_fees]: fees)
154
+ tx = create_tx_builder.transfer_btc(btc_transfer_spec, fees.nil? ? @config[:default_fees]: fees)
155
+ process_transaction(tx, mode)
156
+ end
157
+
158
+ # Creates a transaction for burn asset.
159
+ # @param[String] oa_address The open asset address to burn asset.
160
+ # @param[String] asset_id The asset ID identifying the asset to burn.
161
+ # @param[Integer] fees The fess in satoshis for the transaction.
162
+ # @param[String] mode 'broadcast' (default) for signing and broadcasting the transaction,
163
+ # 'signed' for signing the transaction without broadcasting,
164
+ # 'unsigned' for getting the raw unsigned transaction without broadcasting"""='broadcast'
165
+ def burn_asset(oa_address, asset_id, fees = nil, mode = 'broadcast')
166
+ unspents = get_unspent_outputs([oa_address_to_address(oa_address)])
167
+ tx = create_tx_builder.burn_asset(unspents, asset_id, fees.nil? ? @config[:default_fees]: fees)
159
168
  process_transaction(tx, mode)
160
169
  end
161
170
 
@@ -309,6 +318,10 @@ module OpenAssets
309
318
  end
310
319
  end
311
320
 
321
+ def create_tx_builder
322
+ OpenAssets::Transaction::TransactionBuilder.new(@config[:dust_limit])
323
+ end
324
+
312
325
  end
313
326
 
314
327
  end
@@ -54,7 +54,6 @@ module OpenAssets
54
54
 
55
55
  # convert to hash object.
56
56
  def to_hash
57
- address = script_to_address(@script)
58
57
  {
59
58
  'address' => address,
60
59
  'oa_address' => address.nil? ? nil : address_to_oa_address(address),
@@ -63,14 +62,14 @@ module OpenAssets
63
62
  'asset_id' => @asset_id,
64
63
  'asset_quantity' => @asset_quantity.to_s,
65
64
  'asset_amount' => asset_amount.to_s,
66
- 'account' => account,
65
+ 'account' => @account,
67
66
  'asset_definition_url' => @asset_definition_url,
68
67
  'proof_of_authenticity' => proof_of_authenticity
69
68
  }
70
69
  end
71
70
 
72
- def account
73
- @account.nil? ? nil : @account.encode('ISO-8859-1').force_encoding('UTF-8')
71
+ def address
72
+ script_to_address(@script)
74
73
  end
75
74
 
76
75
  private
@@ -106,7 +106,7 @@ module OpenAssets
106
106
  :id => 'jsonrpc'
107
107
  }
108
108
  RestClient.post(server_url, data.to_json, content_type: :json) do |respdata, request, result|
109
- response = JSON.parse(respdata)
109
+ response = JSON.parse(respdata.gsub(/\\u([\da-fA-F]{4})/) { [$1].pack('H*').unpack('n*').pack('U*').encode('ISO-8859-1').force_encoding('UTF-8') })
110
110
  raise ApiError, response['error'] if response['error']
111
111
  response['result']
112
112
  end
@@ -65,6 +65,29 @@ module OpenAssets
65
65
  transfer([], btc_transfer_spec, fees)
66
66
  end
67
67
 
68
+ # Create a transaction for burn asset
69
+ def burn_asset(unspents, asset_id, fee)
70
+ tx = Bitcoin::Protocol::Tx.new
71
+ targets = unspents.select{|o|o.output.asset_id == asset_id}
72
+ raise TransactionBuildError.new('There is no asset.') if targets.length == 0
73
+ total_amount = targets.inject(0){|sum, o|o.output.value + sum}
74
+ otsuri = total_amount - fee
75
+ if otsuri < @amount
76
+ uncolored_outputs, uncolored_amount =
77
+ TransactionBuilder.collect_uncolored_outputs(unspents, @amount - otsuri)
78
+ targets = targets + uncolored_outputs
79
+ otsuri += uncolored_amount
80
+ end
81
+ targets.each{|o|
82
+ script_sig = o.output.script.to_binary
83
+ tx_in = Bitcoin::Protocol::TxIn.from_hex_hash(o.out_point.hash, o.out_point.index)
84
+ tx_in.script_sig = script_sig
85
+ tx.add_in(tx_in)
86
+ }
87
+ tx.add_out(create_uncolored_output(targets[0].output.address, otsuri))
88
+ tx
89
+ end
90
+
68
91
  # collect uncolored outputs in unspent outputs(contains colored output).
69
92
  # @param [Array[OpenAssets::Transaction::SpendableOutput]] unspent_outputs The Array of available outputs.
70
93
  # @param [Integer] amount The amount to collect.
@@ -99,6 +99,16 @@ module OpenAssets
99
99
  }
100
100
  end
101
101
 
102
+ # validate asset ID
103
+ def valid_asset_id?(asset_id)
104
+ return false if asset_id.nil? || asset_id.length != 34
105
+ decoded = decode_base58(asset_id)
106
+ return false if decoded[0,2].to_i(16) != oa_version_byte
107
+ p2pkh_script_hash = decoded[2..-9]
108
+ address = hash160_to_address(p2pkh_script_hash)
109
+ valid_address?(address)
110
+ end
111
+
102
112
  # generate Asset ID from open asset address.
103
113
  def oa_address_to_asset_id(oa_address)
104
114
  address_to_asset_id(oa_address_to_address(oa_address))
@@ -1,3 +1,3 @@
1
1
  module OpenAssets
2
- VERSION = '0.3.3'
2
+ VERSION = '0.3.4'
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.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - azuchi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-02-02 00:00:00.000000000 Z
11
+ date: 2016-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bitcoin-ruby