blockcypher-ruby 0.2.0 → 0.2.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.
Files changed (25) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +31 -2
  3. data/lib/blockcypher/api.rb +112 -51
  4. data/lib/blockcypher-ruby.rb +1 -0
  5. data/spec/blockcypher/api_spec.rb +110 -43
  6. data/spec/config.yml +2 -0
  7. data/spec/config.yml.sample +2 -0
  8. data/spec/fixtures/vcr_cassettes/BlockCypher_Api/Asset_API/Asset_Transfer/should_transfer_asset.yml +1349 -0
  9. data/spec/fixtures/vcr_cassettes/BlockCypher_Api/Asset_API/Generate_Asset_Address/should_include_private_public_oap_address_original_address_hashes.yml +51 -0
  10. data/spec/fixtures/vcr_cassettes/BlockCypher_Api/Asset_API/Issue_Asset/should_issue_asset.yml +156 -0
  11. data/spec/fixtures/vcr_cassettes/BlockCypher_Api/_address_final_balance/should_get_the_balance_of_an_address.yml +102 -0
  12. data/spec/fixtures/vcr_cassettes/BlockCypher_Api/_address_generate/should_generate_new_addresses.yml +97 -0
  13. data/spec/fixtures/vcr_cassettes/BlockCypher_Api/_create_forwarding_address/allows_creating_a_payment_forward_with_a_callback.yml +100 -0
  14. data/spec/fixtures/vcr_cassettes/BlockCypher_Api/_create_forwarding_address/allows_creating_a_payment_forward_with_a_callback_and_confirmation_notifications_enabled.yml +101 -0
  15. data/spec/fixtures/vcr_cassettes/BlockCypher_Api/_create_forwarding_address/allows_creating_a_payment_forward_with_options.yml +102 -0
  16. data/spec/fixtures/vcr_cassettes/BlockCypher_Api/_create_forwarding_address/creates_a_payment_forward.yml +99 -0
  17. data/spec/fixtures/vcr_cassettes/BlockCypher_Api/_create_forwarding_address/is_possible_to_use_the_alias_create_payments_forwarding.yml +99 -0
  18. data/spec/fixtures/vcr_cassettes/BlockCypher_Api/_delete_forwarding_address/deletes_all_previously_created_forwarding_addresses.yml +269 -0
  19. data/spec/fixtures/vcr_cassettes/BlockCypher_Api/_faucet/should_fund_a_bcy_test_address_with_the_faucet.yml +96 -0
  20. data/spec/fixtures/vcr_cassettes/BlockCypher_Api/_list_forwarding_addresses/lists_all_forwading_addresses_created_for_a_given_token.yml +119 -0
  21. data/spec/fixtures/vcr_cassettes/BlockCypher_Api/_transaction_new/should_call_the_txs/new_api.yml +187 -0
  22. data/spec/fixtures/vcr_cassettes/BlockCypher_Api/_transaction_sign_and_send/should_call_txs/send_api.yml +187 -0
  23. data/spec/spec_helper.rb +15 -0
  24. data/spec/support/vcr.rb +10 -0
  25. metadata +80 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7745506061c201b5a82f943b2dadec2759f82a88
4
- data.tar.gz: fb35dcbc2e31dbf1c3433f41d442413b9cb79a62
2
+ SHA256:
3
+ metadata.gz: d57bd644ca20b09669708df8ad9ee6bfde407b3ad96ea35a1b92d1fe3e6bb4a7
4
+ data.tar.gz: 74ea376dd072dddb1f795f625df8d7be4dcbe3163ef933adab48db7a99724d37
5
5
  SHA512:
6
- metadata.gz: 1ce6d7b7f4d59c3080e77d952e0bf5ff59c1674d9d3f833c749f6d20058f0dbe0e2080fbee7864e8a75a77f17d0fd1a8e1ea5747576a47fc4127216e6edc1da2
7
- data.tar.gz: a3a07c71551edd6f81a4f94ad3017fb540b7cb14eefd2e182a33330ce530a92b2cec39b1346dce0b9fc2b53bc5b79ab6fdc1f9480a9d71cb83c7c5b4de12c714
6
+ metadata.gz: f58122d38a6b058b77e27a71ff6f31e2b36eba7207d2f53aa5ca843c82968f3bae2c7ff85bdf63ce28a3dbbdfe5443db8ebfb7926fe6c5774f149185db2391c5
7
+ data.tar.gz: 8b4c1951d6a66682a45c870c1961296fb4cabdea7e92b9633e4cc764fd152534b3e3019e4942ad53812e2097a37ff06adda382e20a47d72890298229fdac2d08
data/README.md CHANGED
@@ -6,7 +6,31 @@ Simple Ruby client for the [BlockCypher](http://www.blockcypher.com) API.
6
6
 
7
7
  Simply using rubygems:
8
8
 
9
- gem install blockcypher-ruby
9
+ gem install blockcypher-ruby
10
+
11
+ ### For Rails apps
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ ```ruby
16
+ gem 'blockcypher-ruby', '~> 0.2.7'
17
+ ```
18
+
19
+ And then execute:
20
+
21
+ ```bash
22
+ $ bundle install
23
+ ```
24
+
25
+ Or install it yourself as:
26
+
27
+ ```bash
28
+ $ git clone https://github.com/blockcypher/ruby-client.git
29
+ $ cd ruby-client
30
+ $ bundle
31
+ $ gem build blockcypher-ruby.gemspec
32
+ $ gem install blockcypher-ruby-0.2.7.gem
33
+ ```
10
34
 
11
35
  ## Initializing a client
12
36
 
@@ -18,7 +42,12 @@ If you want to use BTC on the main net, which is normally what you want to do, i
18
42
 
19
43
  For more information check the API docs at:
20
44
 
21
- http://dev.blockcypher.com
45
+ https://www.blockcypher.com/dev/bitcoin
46
+
47
+ ## Development
48
+
49
+ - Copy `spec/config.yml.sample` to `spec/config.yml` and put your test API token
50
+ - `rspec spec`
22
51
 
23
52
  ## Contributors
24
53
 
@@ -1,19 +1,20 @@
1
- module BlockCypher
1
+ # frozen_string_literal: true
2
2
 
3
+ module BlockCypher
3
4
  V1 = 'v1'
4
5
 
5
6
  BTC = 'btc'
6
7
  LTC = 'ltc'
7
8
  DOGE = 'doge'
8
- BCY= 'bcy'
9
+ BCY = 'bcy'
10
+ ETH = 'eth'
9
11
 
10
12
  MAIN_NET = 'main'
11
13
  TEST_NET = 'test'
12
14
  TEST_NET_3 = 'test3'
13
15
 
14
16
  class Api
15
-
16
- class Error < RuntimeError ; end
17
+ class Error < RuntimeError; end
17
18
 
18
19
  attr_reader :api_token
19
20
 
@@ -32,8 +33,8 @@ module BlockCypher
32
33
  api_http_get('/txs')
33
34
  end
34
35
 
35
- def blockchain_transaction(transaction_hash)
36
- api_http_get('/txs/' + transaction_hash)
36
+ def blockchain_transaction(transaction_hash, **params)
37
+ api_http_get('/txs/' + transaction_hash, query: params)
37
38
  end
38
39
 
39
40
  def blockchain_block(block_index, params)
@@ -56,9 +57,9 @@ module BlockCypher
56
57
  ##################
57
58
  # Transaction API
58
59
  ##################
59
-
60
+
60
61
  def decode_hex(hex)
61
- payload = { 'tx' => hex}
62
+ payload = { 'tx' => hex }
62
63
  api_http_post('/txs/decode', json_payload: payload)
63
64
  end
64
65
 
@@ -68,10 +69,7 @@ module BlockCypher
68
69
  end
69
70
 
70
71
  def send_money(from_address, to_address, satoshi_amount, private_key)
71
-
72
- unless to_address.kind_of? Array
73
- to_address = [to_address]
74
- end
72
+ to_address = [to_address] unless to_address.is_a? Array
75
73
 
76
74
  tx_new = transaction_new([from_address], to_address, satoshi_amount)
77
75
 
@@ -114,13 +112,13 @@ module BlockCypher
114
112
  signatures = []
115
113
 
116
114
  tosign.each do |to_sign_hex|
117
- to_sign_binary = [to_sign_hex].pack("H*")
115
+ to_sign_binary = [to_sign_hex].pack('H*')
118
116
  sig_binary = key.sign(to_sign_binary)
119
- sig_hex = sig_binary.unpack("H*").first
117
+ sig_hex = sig_binary.unpack1('H*')
120
118
  signatures << sig_hex
121
119
  end
122
120
 
123
- return signatures
121
+ signatures
124
122
  end
125
123
 
126
124
  def transaction_new_custom(payload)
@@ -140,8 +138,8 @@ module BlockCypher
140
138
 
141
139
  ##################
142
140
  # Microtx API
143
- ##################
144
-
141
+ ##################
142
+
145
143
  # This method sends private key to server
146
144
  def microtx_from_priv(private_key, to_address, value_satoshis)
147
145
  payload = {
@@ -174,33 +172,58 @@ module BlockCypher
174
172
  end
175
173
 
176
174
  def address_generate_multi(pubkeys, script_type)
177
- payload = { 'pubkeys' => pubkeys, 'script_type' => script_type}
175
+ payload = { 'pubkeys' => pubkeys, 'script_type' => script_type }
178
176
  api_http_post('/addrs', json_payload: payload)
179
177
  end
180
178
 
181
- def address_details(address, unspent_only: false)
182
- api_http_get('/addrs/' + address, query: { unspentOnly: unspent_only } )
179
+ def address_details(address, unspent_only: false, limit: 50,
180
+ before: nil, after: nil, confirmations: nil,
181
+ omit_wallet_addresses: false, include_confidence: false)
182
+ query = {
183
+ unspentOnly: unspent_only,
184
+ limit: limit,
185
+ omitWalletAddresses: omit_wallet_addresses,
186
+ includeConfidence: include_confidence
187
+ }
188
+ query[:before] = before if before
189
+ query[:after] = after if after
190
+
191
+ api_http_get('/addrs/' + address, query: query)
183
192
  end
184
193
 
185
- def address_balance(address)
186
- api_http_get('/addrs/' + address + '/balance')
194
+ def address_balance(address, omit_wallet_addresses: false)
195
+ query = { omitWalletAddresses: omit_wallet_addresses }
196
+ api_http_get('/addrs/' + address + '/balance', query: query)
187
197
  end
188
198
 
189
- def address_final_balance(address)
190
- details = address_balance(address)
199
+ def address_final_balance(address, omit_wallet_addresses: false)
200
+ details = address_balance(address,
201
+ omit_wallet_addresses: omit_wallet_addresses)
191
202
  details['final_balance']
192
203
  end
193
204
 
194
- def address_full_txs(address, limit: 10)
195
- api_http_get("/addrs/#{address}/full", query: { limit: limit })
205
+ def address_full_txs(address, limit: 10, before: nil, after: nil,
206
+ include_hex: false, omit_wallet_addresses: false,
207
+ include_confidence: false, txlimit: 20)
208
+ query = {
209
+ limit: limit,
210
+ includeHex: include_hex,
211
+ omitWalletAddresses: omit_wallet_addresses,
212
+ includeConfidence: include_confidence,
213
+ txlimit: txlimit
214
+ }
215
+ query[:before] = before if before
216
+ query[:after] = after if after
217
+
218
+ api_http_get("/addrs/#{address}/full", query: query)
196
219
  end
197
220
 
198
221
  ##################
199
222
  # Wallet API
200
223
  ##################
201
-
224
+
202
225
  def wallet_create(name, addresses)
203
- payload = { 'name' => name, 'addresses' => Array(addresses)}
226
+ payload = { 'name' => name, 'addresses' => Array(addresses) }
204
227
  api_http_post('/wallets', json_payload: payload)
205
228
  end
206
229
 
@@ -208,9 +231,11 @@ module BlockCypher
208
231
  api_http_get('/wallets/' + name)
209
232
  end
210
233
 
211
- def wallet_add_addr(name, addresses)
212
- payload = { 'addresses' => Array(addresses)}
213
- api_http_post('/wallets/' + name + '/addresses', json_payload: payload)
234
+ def wallet_add_addr(name, addresses, omit_wallet_addresses: false)
235
+ payload = { 'addresses' => Array(addresses) }
236
+ query = { omitWalletAddresses: omit_wallet_addresses }
237
+ api_http_post('/wallets/' + name + '/addresses',
238
+ json_payload: payload, query: query)
214
239
  end
215
240
 
216
241
  def wallet_get_addr(name)
@@ -218,8 +243,8 @@ module BlockCypher
218
243
  end
219
244
 
220
245
  def wallet_delete_addr(name, addresses)
221
- addrjoin = addresses.join(";")
222
- api_http_delete('/wallets/' + name + '/addresses', query: { address: addrjoin})
246
+ addrjoin = addresses.join(';')
247
+ api_http_delete('/wallets/' + name + '/addresses', query: { address: addrjoin })
223
248
  end
224
249
 
225
250
  def wallet_gen_addr(name)
@@ -234,15 +259,12 @@ module BlockCypher
234
259
  # Events API
235
260
  ##################
236
261
 
237
- def event_webhook_subscribe(url, event, confirmations: nil, hash:nil, address:nil, script:nil)
262
+ def event_webhook_subscribe(url, event, options = {})
238
263
  payload = {
239
264
  url: url,
240
- event: event,
241
- }
242
- payload[:address] = address if address
243
- payload[:hash] = hash if hash
244
- payload[:script] = script if script
245
- payload[:confirmations] = confirmations if confirmations
265
+ event: event
266
+ }.merge(options)
267
+
246
268
  api_http_post('/hooks', json_payload: payload)
247
269
  end
248
270
 
@@ -262,23 +284,61 @@ module BlockCypher
262
284
  # Payments and Forwarding API
263
285
  ##################
264
286
 
265
- def create_forwarding_address(destination, callback_url: nil, enable_confirmations: false)
287
+ def create_forwarding_address(
288
+ destination,
289
+ callback_url: nil,
290
+ enable_confirmations: false,
291
+ mining_fees_satoshis: nil
292
+ )
266
293
  payload = {
267
294
  destination: destination,
268
295
  callback_url: callback_url,
269
- enable_confirmations: enable_confirmations
296
+ enable_confirmations: enable_confirmations,
297
+ mining_fees_satoshis: mining_fees_satoshis
270
298
  }
271
299
  api_http_post('/payments', json_payload: payload)
272
300
  end
273
301
 
274
- alias :create_payments_forwarding :create_forwarding_address
302
+ alias create_payments_forwarding create_forwarding_address
275
303
 
276
304
  def list_forwarding_addresses
277
- api_http_get("/payments")
305
+ api_http_get('/payments')
278
306
  end
279
307
 
280
308
  def delete_forwarding_address(id)
281
- api_http_delete("/payments/" + id)
309
+ api_http_delete('/payments/' + id)
310
+ end
311
+
312
+ #############
313
+ # Asset API #
314
+ #############
315
+
316
+ def generate_asset_address
317
+ api_http_post('/oap/addrs')
318
+ end
319
+
320
+ def issue_asset(from_private, to_address, amount)
321
+ api_http_post('/oap/issue', json_payload: {
322
+ from_private: from_private,
323
+ to_address: to_address,
324
+ amount: amount
325
+ })
326
+ end
327
+
328
+ def transfer_asset(asset_id, from_private, to_address, amount)
329
+ api_http_post("/oap/#{asset_id}/transfer", json_payload: {
330
+ from_private: from_private,
331
+ to_address: to_address,
332
+ amount: amount
333
+ })
334
+ end
335
+
336
+ def asset_txs(asset_id)
337
+ api_http_get("/oap/#{asset_id}/txs")
338
+ end
339
+
340
+ def asset_address(asset_id, oap_address)
341
+ api_http_get("/oap/#{asset_id}/addrs/#{oap_address}")
282
342
  end
283
343
 
284
344
  private
@@ -287,7 +347,7 @@ module BlockCypher
287
347
  uri = endpoint_uri(api_path, query)
288
348
 
289
349
  # Build the connection
290
- http = Net::HTTP.new(uri.host, uri.port)
350
+ http = Net::HTTP.new(uri.host, uri.port)
291
351
  http.use_ssl = true
292
352
 
293
353
  # Build the Request
@@ -307,19 +367,20 @@ module BlockCypher
307
367
  end
308
368
 
309
369
  response = http.request(request)
370
+ response_code = response.code.to_i
310
371
 
311
372
  # Detect errors/return 204 empty body
312
- if response.code == '400'
313
- raise Error.new(uri.to_s + ' Response:' + response.body)
314
- elsif response.code == '204'
373
+ if response_code >= 400
374
+ raise Error, uri.to_s + ' Response:' + response.body
375
+ elsif response_code == 204
315
376
  return nil
316
377
  end
317
378
 
318
379
  # Process the response
319
380
  begin
320
381
  json_response = JSON.parse(response.body)
321
- return json_response
322
- rescue => e
382
+ json_response
383
+ rescue StandardError => e
323
384
  raise "Unable to parse JSON response #{e.inspect}, #{response.body}"
324
385
  end
325
386
  end
@@ -0,0 +1 @@
1
+ require 'blockcypher'
@@ -1,88 +1,110 @@
1
- require 'blockcypher'
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
2
4
 
3
5
  module BlockCypher
6
+ describe Api, vcr: { record: :once } do
7
+ let(:api) do
8
+ BlockCypher::Api.new({
9
+ api_token: CONFIG[:api_token],
10
+ currency: BlockCypher::BCY,
11
+ network: BlockCypher::TEST_NET,
12
+ version: BlockCypher::V1
13
+ })
14
+ end
15
+
16
+ let(:addr1) { api.address_generate }
17
+ let(:addr2) { api.address_generate }
18
+ context '#address_generate' do
19
+ it 'should generate new addresses' do
20
+ expect(addr1['address']).to be_a(String)
21
+ expect(addr2['address']).to be_a(String)
22
+ end
23
+ end
4
24
 
5
- describe Api do
6
- let(:api) { BlockCypher::Api.new(currency: BlockCypher::BTC, network: BlockCypher::TEST_NET_3, version: BlockCypher::V1) }
25
+ let(:address_1) { addr1['address'].to_s }
26
+ let(:address_1_private_key) { addr1['private'].to_s }
7
27
 
8
- let(:address_1) { 'miB9s4fcYCEBxPQm8vw6UrsYc2iSiEW3Yn' }
9
- let(:address_1_private_key) { 'f2a73451a726e81aec76a2bfd5a4393a89822b30cc4cddb2b4317efb2266ad47' }
28
+ let(:address_2) { addr2['address'].to_s }
29
+ let(:address_2_private_key) { addr2['private'].to_s }
10
30
 
11
- let(:address_2) { 'mnTBb2Fd13pKwNjFQz9LVoy2bqmDugLM5m' }
12
- let(:address_2_private_key) { '76a32c1e5b6f9e174719e7c1b555d6a55674fdc2fd99cfeee96a5de632775645' }
31
+ context '#faucet' do
32
+ it 'should fund a bcy test address with the faucet' do
33
+ res = api.faucet(address_1, 100_000)
34
+ expect(res['tx_ref']).to be_a(String)
35
+ end
36
+ end
13
37
 
14
38
  context '#transaction_new' do
15
-
16
39
  it 'should call the txs/new api' do
17
40
  input_addresses = [address_1]
18
41
  output_addresses = [address_2]
19
- satoshi_value = 20000
42
+ satoshi_value = 20_000
20
43
  res = api.transaction_new(input_addresses, output_addresses, satoshi_value)
21
- expect(res["tx"]["hash"]).to be_a(String)
22
- expect(res["tx"]["hash"].length).to be(64)
44
+ expect(res['tx']['hash']).to be_a(String)
45
+ expect(res['tx']['hash'].length).to be(64)
23
46
  end
24
47
  end
25
48
 
26
49
  context '#transaction_sign_and_send' do
27
-
28
50
  it 'should call txs/send api' do
29
-
30
- input_addresses = [address_2]
31
- output_addresses = [address_1]
32
- satoshi_value = 10000
51
+ input_addresses = [address_1]
52
+ output_addresses = [address_2]
53
+ satoshi_value = 10_000
33
54
 
34
55
  new_tx = api.transaction_new(input_addresses, output_addresses, satoshi_value)
35
- res = api.transaction_sign_and_send(new_tx, address_2_private_key)
36
- expect(res["tx"]["hash"]).to be_a(String)
37
- expect(res["tx"]["hash"].length).to be(64)
56
+ res = api.transaction_sign_and_send(new_tx, address_1_private_key)
57
+ expect(res['tx']['hash']).to be_a(String)
58
+ expect(res['tx']['hash'].length).to be(64)
38
59
  end
39
-
40
60
  end
41
61
 
42
62
  context '#address_final_balance' do
43
-
44
63
  it 'should get the balance of an address' do
45
64
  balance = api.address_final_balance(address_1)
46
65
  expect(balance).to be_kind_of Integer
47
66
  expect(balance).to be > 0
48
67
  end
49
-
50
68
  end
51
69
 
52
70
  context '#create_forwarding_address' do
53
-
54
71
  it 'creates a payment forward' do
55
- forward_details = api.create_forwarding_address(address_1, "foo")
56
- expect(forward_details["input_address"]).to be_a(String)
57
- expect(forward_details["input_address"].length).to be(34) # Ok this isn't strictly true but..
58
- end
59
-
60
- it 'allows creating a payment forward with a callback' do
61
- forward_details = api.create_forwarding_address(address_1, "foo", callback_url: "http://test.com/foo")
62
- expect(forward_details["callback_url"]).to eql("http://test.com/foo")
63
- expect(forward_details["enable_confirmations"]).to be nil
72
+ forward_details = api.create_forwarding_address(address_1)
73
+ expect(forward_details['input_address']).to be_a(String)
74
+ expect(forward_details['input_address'].length).to be(34) # Ok this isn't strictly true but..
64
75
  end
65
76
 
66
- it 'allows creating a payment forward with a callback and confirmation notifications enabled' do
67
- forward_details = api.create_forwarding_address(address_1, "foo", callback_url: "http://test.com/foo", enable_confirmations: true)
68
- expect(forward_details["callback_url"]).to eql("http://test.com/foo")
69
- expect(forward_details["enable_confirmations"]).to be true
77
+ it 'allows creating a payment forward with options' do
78
+ forward_details = api.create_forwarding_address(address_1, {
79
+ callback_url: 'http://test.com/foo',
80
+ enable_confirmations: true,
81
+ mining_fees_satoshis: 20_000
82
+ })
83
+ expect(forward_details['callback_url']).to eql('http://test.com/foo')
84
+ expect(forward_details['enable_confirmations']).to be true
85
+ expect(forward_details['mining_fees_satoshis']).to be 20_000
70
86
  end
71
87
 
72
88
  it 'is possible to use the alias create_payments_forwarding' do
73
- forward_details = api.create_payments_forwarding(address_1, "foo")
74
- expect(forward_details["input_address"]).to be_a(String)
89
+ forward_details = api.create_payments_forwarding(address_1)
90
+ expect(forward_details['input_address']).to be_a(String)
75
91
  end
76
-
77
92
  end
78
93
 
79
94
  context '#list_forwarding_addresses' do
80
-
81
95
  it 'lists all forwading addresses created for a given token' do
82
- forwarding_addresses = api.list_forwarding_addresses("foo")
83
- expect(forwarding_addresses.first["destination"]).to eql(address_1)
96
+ forwarding_addresses = api.list_forwarding_addresses
97
+ expect(forwarding_addresses.first['destination']).to eql(address_1)
84
98
  end
99
+ end
85
100
 
101
+ context '#delete_forwarding_address' do
102
+ it 'deletes all previously created forwarding addresses' do
103
+ forwarding_addresses = api.list_forwarding_addresses
104
+ forwarding_addresses.each { |x| api.delete_forwarding_address(x['id']) }
105
+ forwarding_addresses = api.list_forwarding_addresses
106
+ expect(forwarding_addresses.any? == false)
107
+ end
86
108
  end
87
109
 
88
110
  describe '#endpoint_uri' do
@@ -98,6 +120,51 @@ module BlockCypher
98
120
  end
99
121
  end
100
122
 
101
- end
123
+ describe 'Asset API' do
124
+ describe 'Generate Asset Address' do
125
+ it 'should include private, public, oap_address, original_address hashes' do
126
+ res = api.generate_asset_address
127
+ expect(res).to include('private', 'public', 'oap_address', 'original_address')
128
+ end
129
+ end
130
+
131
+ describe 'Issue Asset' do
132
+ it 'should issue asset' do
133
+ asset_address = api.generate_asset_address
134
+ api.faucet(asset_address['original_address'], 1_000_000)
135
+ res = api.issue_asset(asset_address['private'], asset_address['oap_address'], 1000)
136
+
137
+ expect(res).to include(
138
+ 'ver',
139
+ 'assetid',
140
+ 'oap_meta',
141
+ 'hash',
142
+ 'received',
143
+ 'double_spend',
144
+ 'inputs',
145
+ 'outputs'
146
+ )
147
+ end
148
+ end
102
149
 
150
+ describe 'Asset Transfer' do
151
+ it 'should transfer asset' do
152
+ asset_address = api.generate_asset_address
153
+ asset_address_to = api.generate_asset_address
154
+ api.faucet(asset_address['original_address'], 100_000_000)
155
+ asset = api.issue_asset(asset_address['private'], asset_address['oap_address'], 1000)
156
+
157
+ puts 'waiting asset to been issued'
158
+ begin
159
+ printf('|')
160
+ check_address = api.asset_address(asset['assetid'], asset_address['oap_address'])
161
+ sleep(1)
162
+ end while check_address['n_tx'] == 0
163
+
164
+ res = api.transfer_asset(asset['assetid'], asset_address['private'], asset_address_to['oap_address'], 100)
165
+ expect(res).to include('assetid')
166
+ end
167
+ end
168
+ end
169
+ end
103
170
  end
data/spec/config.yml ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ api_token: aa5ced01083e7f6f0b3dc11e618379a9
@@ -0,0 +1,2 @@
1
+ ---
2
+ api_token: testtoken-changeme