bitpay-sdk 2.3.3 → 2.4.0

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: f17aaeed06964a9e0cb8aaa38e8e291b5135e0e2
4
- data.tar.gz: c84ffdc47caf825006420824e3f63b61a22bc27a
3
+ metadata.gz: 934b96a7f24134990a0cfed00c6e3b50502c3823
4
+ data.tar.gz: 68a05391e925b79b565f7cc2400ce7a101bc5ebf
5
5
  SHA512:
6
- metadata.gz: 66d9265331b654fa308f0ae24782fe62d9a0b113e5a470341400d329edd0e3a4b71c36964f02a9c5e0c6a793a702e8444c98357728c0efa84c6f65ae9c000117
7
- data.tar.gz: 86f177707cbc8f8c2f71d4a4b031153935ce62e3fef1be0077f26de57dd77b9076f4d1a579a60e6266e537f8e571bdd030defb89dff6a5917b0639dae61ce927
6
+ metadata.gz: b9c62e5a6a700b1c73c928f27c5cff0436ddb33bffd2292e18248046b89ce9c54b65918b151a3f9a32559e42c239da02c20fc326d350f1369cedad6748cc9089
7
+ data.tar.gz: 56ab8bfb2b86bd9e15a5f7165a0e58b98eb92ac987868e9789d6167a19f15645f99157680fe17c313dcf692f21dcd94779507881710198f3738e05a298222698
data/.gitignore CHANGED
@@ -7,4 +7,5 @@ pkg
7
7
  .ruby-gemset
8
8
  *.swo
9
9
  *.swp
10
- bitpaykey.pem
10
+ bitpaykey.pem
11
+ constants.txt
data/GUIDE.md CHANGED
@@ -154,6 +154,13 @@ client.get_all_refunds_for_invoice(id: 'PvVhgBfA7wKPWhuVC24rJo')
154
154
  # To get a specific refund for a specific invoice
155
155
  client.get_refund(id: 'JB49z2MsDH7FunczeyDS8j', request_id: '4evCrXq4EDXk4oqDXdWQhX')
156
156
  ```
157
+ ### Cancel Refund Requests
158
+
159
+ Requires a `merchant` token.
160
+
161
+ ```ruby
162
+ client.cancel_refund(id: 'JB49z2MsDH7FunczeyDS8j', request_id: '4evCrXq4EDXk4oqDXdWQhX')
163
+ ```
157
164
 
158
165
  ### Make a HTTP request directly against the REST API
159
166
 
@@ -187,10 +194,10 @@ API Documentation is available on the [BitPay site](https://bitpay.com/api).
187
194
 
188
195
  In order to run the tests, you must have phantomjs installed and on your PATH.
189
196
 
190
- The tests require that environment variables be set for the bitpay server, user name, and password. First run:
197
+ The tests require that environment variables be set for the bitpay server, user name, password, an invoice id for refunds and a valid testnet bitcoin address for refunds. First run:
191
198
 
192
199
  ```bash
193
- $ source ./spec/set_constants.sh https://test.bitpay.com <yourusername> <yourpassword>
200
+ $ source ./spec/set_constants.sh https://test.bitpay.com <yourusername> <yourpassword> <a-confirmed-invoice-id> <a-valid-testnet-address>
194
201
  $ bundle install
195
202
  $ bundle exec rake
196
203
  ```
@@ -1,6 +1,6 @@
1
1
  Capybara.javascript_driver = :poltergeist
2
2
  Capybara.default_driver = :poltergeist
3
- Capybara.default_wait_time = 5
3
+ Capybara.default_wait_time = 10
4
4
  Capybara.register_driver :poltergeist do |app|
5
5
  Capybara::Poltergeist::Driver.new(app, timeout: 60, js_errors: false, phantomjs_options: ['--ignore-ssl-errors=yes', '--ssl-protocol=TLSv1', '--web-security=false'])
6
6
  end
@@ -10,6 +10,10 @@ TEST_USER = ENV['RCTESTUSER']
10
10
  TEST_PASS = ENV['RCTESTPASSWORD']
11
11
  DASHBOARD_URL = "#{ROOT_ADDRESS}/dashboard/merchant/home"
12
12
 
13
+ # Specify a bitpay txid which has 6+ confirmations. Default belongs to 'bitpayrubyclient@gmail.com' test account
14
+ REFUND_TRANSACTION = ENV['REFUND_TRANSACTION']
15
+ REFUND_ADDRESS = ENV['REFUND_ADDRESS']
16
+
13
17
  unless
14
18
  ROOT_ADDRESS &&
15
19
  TEST_USER &&
@@ -6,10 +6,10 @@ Feature: pairing with bitpay
6
6
  Scenario: the client has a correct pairing code
7
7
  Given the user pairs with BitPay with a valid pairing code
8
8
  Then the user is paired with BitPay
9
-
9
+
10
10
  Scenario: the client initiates pairing
11
- Given the user requests a client-side pairing
12
- Then they will receive a claim code
11
+ Given the user performs a client-side pairing
12
+ Then the user has a merchant token
13
13
 
14
14
  Scenario Outline: the client has a bad pairing code
15
15
  Given the user fails to pair with a semantically <valid> code <code>
@@ -0,0 +1,20 @@
1
+ @refunds
2
+ Feature: issuing a refund
3
+ The merchant wants to issue a refund
4
+ So that they can serve their customers
5
+
6
+ Scenario: creating a refund
7
+ Given the user creates a refund
8
+ Then they will receive a refund id
9
+
10
+ Scenario: retrieving a refund
11
+ Given the user requests a specific refund
12
+ Then they will receive the refund
13
+
14
+ Scenario: retrieving all refunds
15
+ Given the user requests all refunds for an invoice
16
+ Then they will receive an array of refunds
17
+
18
+ Scenario: canceling a refund
19
+ Given a properly formatted cancellation request
20
+ Then the refund will be cancelled
@@ -2,6 +2,10 @@ Feature: retrieving an invoice
2
2
  The user may want to retrieve invoices
3
3
  So that they can view them
4
4
 
5
- Scenario: The request is correct
5
+ Scenario: Correct public request
6
6
  Given that a user knows an invoice id
7
- Then they can retrieve that invoice
7
+ Then they can retrieve the public version of that invoice
8
+
9
+ Scenario: Correct merchant request
10
+ Given that a user knows an invoice id
11
+ Then they can retrieve the merchant-scoped version of that invoice
@@ -1,6 +1,6 @@
1
1
  When(/^the user (?:tries to |)creates? an invoice (?:for|without) "(.*?)" (?:or |and |)"(.*?)"$/) do |price, currency|
2
2
  begin
3
- @response = @client.create_invoice(price: price, currency: currency)
3
+ @response = @client.create_invoice(price: price, currency: currency, facade: 'merchant')
4
4
  rescue => error
5
5
  @error = error
6
6
  end
@@ -15,12 +15,17 @@ Given(/^there is an invalid token$/) do
15
15
  end
16
16
 
17
17
  Given(/^that a user knows an invoice id$/) do
18
- client = new_client_from_stored_values
19
- @id = (client.create_invoice(price: 3, currency: "USD" ))['id']
18
+ @client = new_client_from_stored_values
19
+ @id = (@client.create_invoice(price: 3, currency: "USD", facade: 'merchant' ))['id']
20
20
  end
21
21
 
22
- Then(/^they can retrieve that invoice$/) do
23
- invoice = BitPay::SDK::Client.new(api_uri: ROOT_ADDRESS, insecure: true).get_public_invoice(id: @id)
22
+ Then(/^they can retrieve the public version of that invoice$/) do
23
+ invoice = @client.get_public_invoice(id: @id)
24
+ raise "That's the wrong invoice" unless invoice['id'] == @id
25
+ end
26
+
27
+ Then(/^they can retrieve the merchant\-scoped version of that invoice$/) do
28
+ invoice = @client.get_invoice(id: @id)
24
29
  raise "That's the wrong invoice" unless invoice['id'] == @id
25
30
  end
26
31
 
@@ -31,7 +31,6 @@ Given(/^the user is paired with BitPay$/) do
31
31
  raise "Client is not paired" unless @client.verify_tokens
32
32
  end
33
33
 
34
-
35
34
  Given(/^the user has a bad pairing_code "(.*?)"$/) do |arg1|
36
35
  # This is a no-op, pairing codes are transient and never actually saved
37
36
  end
@@ -53,13 +52,16 @@ Then(/^they will receive an? (.*?) matching "(.*?)"$/) do |error_class, error_me
53
52
  raise "Error: #{@error.class}, message: #{@error.message}" unless Object.const_get(error_class) == @error.class && @error.message.include?(error_message)
54
53
  end
55
54
 
56
- Given(/^the user requests a client\-side pairing$/) do
55
+ Given(/^the user performs a client\-side pairing$/) do
57
56
  sleep 1
58
57
  pem = BitPay::KeyUtils.generate_pem
59
- client = BitPay::SDK::Client.new(api_uri: ROOT_ADDRESS, pem: pem, insecure: true)
60
- @response = client.pair_client({})
58
+ @client = BitPay::SDK::Client.new(api_uri: ROOT_ADDRESS, pem: pem, insecure: true)
59
+ response = @client.pair_client({facade: 'merchant'})
60
+ @token = response.first["token"]
61
+ approve_token_on_server(response.first["pairingCode"])
61
62
  end
62
63
 
63
- Then(/^they will receive a claim code$/) do
64
- expect(@response.first["pairingCode"] ).not_to be_empty
64
+ Then(/^the user has a merchant token$/) do
65
+ tokens = {'merchant' => @token}
66
+ raise "Merchant token not authorized" unless @client.verify_tokens(tokens: tokens)
65
67
  end
@@ -0,0 +1,37 @@
1
+ Given(/^the user creates a refund$/) do
2
+ client = new_client_from_stored_values
3
+ @response = client.refund_invoice(id: REFUND_TRANSACTION, params: {amount: 1, currency: 'USD', bitcoinAddress: REFUND_ADDRESS})
4
+ end
5
+
6
+ Then(/^they will receive a refund id$/) do
7
+ @refund_id = @response["id"]
8
+ expect(@refund_id).not_to be_empty
9
+ end
10
+
11
+ Given(/^the user requests a specific refund$/) do
12
+ client = new_client_from_stored_values
13
+ @response = client.get_refund(invoice_id: REFUND_TRANSACTION, request_id: @refund_id)
14
+ end
15
+
16
+ Then(/^they will receive the refund$/) do
17
+ expect(@response.first["status"]).not_to be_empty
18
+ end
19
+
20
+ Given(/^the user requests all refunds for an invoice$/) do
21
+ client = new_client_from_stored_values
22
+ @response = client.get_all_refunds_for_invoice(id: REFUND_TRANSACTION)
23
+ end
24
+
25
+ Then(/^they will receive an array of refunds$/) do
26
+ expect(@response).to be_instance_of Array
27
+ end
28
+
29
+ Given(/^a properly formatted cancellation request$/) do
30
+ client = new_client_from_stored_values
31
+ @refund_id = client.get_all_refunds_for_invoice(id: REFUND_TRANSACTION).first["id"]
32
+ @response = client.cancel_refund(invoice_id: REFUND_TRANSACTION, request_id: @refund_id)
33
+ end
34
+
35
+ Then(/^the refund will be cancelled$/) do
36
+ expect(@response).to eq("Success")
37
+ end
@@ -29,6 +29,17 @@ def get_claim_code_from_server
29
29
  Capybara::find(".token-claimcode", match: :first).text
30
30
  end
31
31
 
32
+ def approve_token_on_server(pairing_code)
33
+ Capybara::visit ROOT_ADDRESS
34
+ log_in unless logged_in
35
+ Capybara::visit DASHBOARD_URL
36
+ raise "Bad Login" unless Capybara.current_session.current_url == DASHBOARD_URL
37
+ Capybara::visit "#{ROOT_ADDRESS}/api-tokens"
38
+ Capybara::fill_in 'pairingCode', :with => pairing_code
39
+ Capybara::click_button "Find"
40
+ Capybara::click_button "Approve"
41
+ end
42
+
32
43
  def log_in
33
44
  Capybara::visit "#{ROOT_ADDRESS}/dashboard/login/"
34
45
  Capybara::fill_in 'email', :with => TEST_USER
@@ -53,11 +64,15 @@ def new_client_from_stored_values
53
64
  unless client.verify_tokens then
54
65
  raise "Locally stored tokens are invalid, please remove #{BitPay::TOKEN_FILE_PATH}" end
55
66
  else
56
- claim_code = get_claim_code_from_server
57
67
  pem = BitPay::KeyUtils.generate_pem
58
68
  client = BitPay::SDK::Client.new(api_uri: ROOT_ADDRESS, pem: pem, insecure: true)
59
69
  sleep 1 # rate limit compliance
60
- token = client.pair_pos_client(claim_code)
70
+ response = client.pair_client({facade: 'merchant'})
71
+ pairing_code = response.first["pairingCode"]
72
+ token = response #.first["token"]
73
+ approve_token_on_server(pairing_code)
74
+
75
+
61
76
  FileUtils.mkdir_p(BitPay::BITPAY_CREDENTIALS_DIR)
62
77
  File.write(BitPay::PRIVATE_KEY_PATH, pem)
63
78
  File.write(BitPay::TOKEN_FILE_PATH, JSON.generate(token))
@@ -47,8 +47,7 @@ module BitPay
47
47
  # => Pass {pairingCode: 'WfD01d2'} to claim a server-initiated pairing code
48
48
  #
49
49
  def pair_client(params={})
50
- tokens = post(path: 'tokens', params: params)
51
- return tokens["data"]
50
+ post(path: 'tokens', params: params)
52
51
  end
53
52
 
54
53
  ## Compatibility method for pos pairing
@@ -70,17 +69,80 @@ module BitPay
70
69
  raise BitPay::ArgumentError, "Illegal Argument: Currency is invalid." unless /^[[:upper:]]{3}$/.match(currency)
71
70
  params.merge!({price: price, currency: currency})
72
71
  token = get_token(facade)
73
- invoice = post(path: "invoices", token: token, params: params)
74
- invoice["data"]
72
+ post(path: "invoices", token: token, params: params)
73
+ end
74
+
75
+ ## Gets the privileged merchant-version of the invoice
76
+ # Requires merchant facade token
77
+ #
78
+ def get_invoice(id:)
79
+ token = get_token('merchant')
80
+ get(path: "invoices/#{id}", token: token)
75
81
  end
76
82
 
77
83
  ## Gets the public version of the invoice
78
84
  #
79
85
  def get_public_invoice(id:)
80
- invoice = get(path: "invoices/#{id}", public: true)
81
- invoice["data"]
86
+ get(path: "invoices/#{id}", public: true)
82
87
  end
83
88
 
89
+
90
+ ## Refund paid BitPay invoice
91
+ #
92
+ # If invoice["data"]["flags"]["refundable"] == true the a refund address was
93
+ # provided with the payment and the refund_address parameter is an optional override
94
+ #
95
+ # Amount and Currency are required fields for fully paid invoices but optional
96
+ # for under or overpaid invoices which will otherwise be completely refunded
97
+ #
98
+ # Requires merchant facade token
99
+ #
100
+ # @example
101
+ # client.refund_invoice(id: 'JB49z2MsDH7FunczeyDS8j', params: {amount: 10, currency: 'USD', bitcoinAddress: '1Jtcygf8W3cEmtGgepggtjCxtmFFjrZwRV'})
102
+ #
103
+ def refund_invoice(id:, params:{})
104
+ invoice = get_invoice(id: id)
105
+ post(path: "invoices/#{id}/refunds", token: invoice["token"], params: params)
106
+ end
107
+
108
+ ## Get All Refunds for Invoice
109
+ # Returns an array of all refund requests for a specific invoice,
110
+ #
111
+ # Requires merchant facade token
112
+ #
113
+ # @example:
114
+ # client.get_all_refunds_for_invoice(id: 'JB49z2MsDH7FunczeyDS8j')
115
+ #
116
+ def get_all_refunds_for_invoice(id:)
117
+ urlpath = "invoices/#{id}/refunds"
118
+ invoice = get_invoice(id: id)
119
+ get(path: urlpath, token: invoice["token"])
120
+ end
121
+
122
+ ## Get Refund
123
+ # Requires merchant facade token
124
+ #
125
+ # @example:
126
+ # client.get_refund(id: 'JB49z2MsDH7FunczeyDS8j', request_id: '4evCrXq4EDXk4oqDXdWQhX')
127
+ #
128
+ def get_refund(invoice_id:, request_id:)
129
+ urlpath = "invoices/#{invoice_id}/refunds/#{request_id}"
130
+ invoice = get_invoice(id: invoice_id)
131
+ get(path: urlpath, token: invoice["token"])
132
+ end
133
+
134
+ ## Cancel Refund
135
+ # Requires merchant facade token
136
+ #
137
+ # @example:
138
+ # client.cancel_refund(id: 'JB49z2MsDH7FunczeyDS8j', request_id: '4evCrXq4EDXk4oqDXdWQhX')
139
+ #
140
+ def cancel_refund(invoice_id:, request_id:)
141
+ urlpath = "invoices/#{invoice_id}/refunds/#{request_id}"
142
+ refund = get_refund(invoice_id: invoice_id, request_id: request_id)
143
+ delete(path: urlpath, token: refund["token"])
144
+ end
145
+
84
146
  ## Checks that the passed tokens are valid by
85
147
  # comparing them to those that are authorized by the server
86
148
  #
@@ -8,7 +8,7 @@ module BitPay
8
8
  token ||= get_token(facade)
9
9
  case verb.upcase
10
10
  when "GET"
11
- return get(path: path, token:token)
11
+ return get(path: path, token: token)
12
12
  when "POST"
13
13
  return post(path: path, token: token, params: params)
14
14
  else
@@ -41,6 +41,15 @@ module BitPay
41
41
  process_request(request)
42
42
  end
43
43
 
44
+ def delete(path:, token: nil)
45
+ urlpath = '/' + path
46
+ urlpath = urlpath + '?token=' + token if token
47
+ request = Net::HTTP::Delete.new urlpath
48
+ request['X-Signature'] = KeyUtils.sign(@uri.to_s + urlpath, @priv_key)
49
+ request['X-Identity'] = @pub_key
50
+ process_request(request)
51
+ end
52
+
44
53
  private
45
54
 
46
55
  ## Processes HTTP Request and returns parsed response
@@ -58,7 +67,7 @@ module BitPay
58
67
  end
59
68
 
60
69
  if response.kind_of? Net::HTTPSuccess
61
- return JSON.parse(response.body)
70
+ return JSON.parse(response.body)["data"]
62
71
  elsif JSON.parse(response.body)["error"]
63
72
  raise(BitPayError, "#{response.code}: #{JSON.parse(response.body)['error']}")
64
73
  else
@@ -71,7 +80,7 @@ module BitPay
71
80
  # updates @tokens
72
81
  #
73
82
  def refresh_tokens
74
- response = get(path: 'tokens')["data"]
83
+ response = get(path: 'tokens')
75
84
  token_array = response || {}
76
85
  tokens = {}
77
86
  token_array.each do |t|
@@ -3,5 +3,5 @@
3
3
  # or https://github.com/bitpay/php-bitpay-client/blob/master/LICENSE
4
4
 
5
5
  module BitPay
6
- VERSION = '2.3.3'
6
+ VERSION = '2.4.0'
7
7
  end
@@ -19,6 +19,12 @@ describe BitPay::SDK::Client do
19
19
  .to_return(:status => 200, :body => tokens.to_json, :headers => {})
20
20
  stub_request(:get, "#{BitPay::TEST_API_URI}/invoices/TEST_INVOICE_ID?token=MERCHANT_TOKEN").
21
21
  to_return(:body => get_fixture('invoices_{id}-GET.json'))
22
+ stub_request(:get, "#{BitPay::TEST_API_URI}/invoices/TEST_INVOICE_ID/refunds?token=MERCHANT_INVOICE_TOKEN").
23
+ to_return(:body => get_fixture('invoices_{id}_refunds-GET.json'))
24
+ stub_request(:get, "#{BitPay::TEST_API_URI}/invoices/TEST_INVOICE_ID/refunds/TEST_REQUEST_ID?token=MERCHANT_INVOICE_TOKEN").
25
+ to_return(:body => get_fixture('invoices_{id}_refunds-GET.json'))
26
+ stub_request(:post, "#{BitPay::TEST_API_URI}/invoices/TEST_INVOICE_ID/refunds").
27
+ to_return(:body => get_fixture('invoices_{id}_refunds-POST.json'))
22
28
  end
23
29
 
24
30
  describe "#initialize" do
@@ -109,6 +115,51 @@ describe BitPay::SDK::Client do
109
115
  end
110
116
  end
111
117
 
118
+ describe '#refund_invoice' do
119
+ subject { bitpay_client }
120
+ before { stub_const('ENV', {'BITPAY_PEM' => PEM}) }
121
+ it { is_expected.to respond_to(:refund_invoice) }
122
+
123
+ it 'should get the token for the invoice' do
124
+ bitpay_client.refund_invoice(id: 'TEST_INVOICE_ID')
125
+ expect(WebMock).to have_requested :get, "#{BitPay::TEST_API_URI}/invoices/TEST_INVOICE_ID?token=MERCHANT_TOKEN"
126
+ end
127
+
128
+ it 'should generate a POST to the invoices/refund endpoint' do
129
+ bitpay_client.refund_invoice(id: 'TEST_INVOICE_ID')
130
+ expect(WebMock).to have_requested :post, "#{BitPay::TEST_API_URI}/invoices/TEST_INVOICE_ID/refunds"
131
+ end
132
+ end
133
+
134
+ describe '#get_all_refunds_for_invoice' do
135
+ subject { bitpay_client }
136
+ before {stub_const('ENV', {'BITPAY_PEM' => PEM})}
137
+ it { is_expected.to respond_to(:get_all_refunds_for_invoice) }
138
+
139
+ it 'should get the token for the invoice' do
140
+ bitpay_client.get_all_refunds_for_invoice(id: 'TEST_INVOICE_ID')
141
+ expect(WebMock).to have_requested :get, "#{BitPay::TEST_API_URI}/invoices/TEST_INVOICE_ID?token=MERCHANT_TOKEN"
142
+ end
143
+ it 'should GET all refunds' do
144
+ bitpay_client.get_all_refunds_for_invoice(id: 'TEST_INVOICE_ID')
145
+ expect(WebMock).to have_requested :get, "#{BitPay::TEST_API_URI}/invoices/TEST_INVOICE_ID/refunds?token=MERCHANT_INVOICE_TOKEN"
146
+ end
147
+ end
148
+
149
+ describe '#get_refund' do
150
+ subject { bitpay_client }
151
+ before {stub_const('ENV', {'BITPAY_PEM' => PEM})}
152
+ it { is_expected.to respond_to(:get_refund) }
153
+ it 'should get the token for the invoice' do
154
+ bitpay_client.get_refund(invoice_id: 'TEST_INVOICE_ID', request_id: 'TEST_REQUEST_ID')
155
+ expect(WebMock).to have_requested :get, "#{BitPay::TEST_API_URI}/invoices/TEST_INVOICE_ID?token=MERCHANT_TOKEN"
156
+ end
157
+ it 'should GET a single refund' do
158
+ bitpay_client.get_refund(invoice_id: 'TEST_INVOICE_ID', request_id: 'TEST_REQUEST_ID')
159
+ expect(WebMock).to have_requested :get, "#{BitPay::TEST_API_URI}/invoices/TEST_INVOICE_ID/refunds/TEST_REQUEST_ID?token=MERCHANT_INVOICE_TOKEN"
160
+ end
161
+ end
162
+
112
163
  describe "#verify_tokens" do
113
164
  subject { bitpay_client }
114
165
  before {stub_const('ENV', {'BITPAY_PEM' => PEM})}
@@ -1,9 +1,11 @@
1
1
  {
2
2
  "facade": "merchant/supportRequest",
3
- "data": {
4
- "id": "TEST_REQUEST_ID",
5
- "requestDate": "2015-01-27T00:36:12.360Z",
6
- "status": "pending",
7
- "token": "REFUND_REQUEST_TOKEN"
8
- }
3
+ "data": [
4
+ {
5
+ "id": "TEST_REQUEST_ID",
6
+ "requestDate": "2015-01-27T00:36:12.360Z",
7
+ "status": "pending",
8
+ "token": "REFUND_REQUEST_TOKEN"
9
+ }
10
+ ]
9
11
  }
@@ -6,5 +6,7 @@ export RCTESTUSER=$2
6
6
  echo $RCTESTUSER
7
7
  export RCTESTPASSWORD=$3
8
8
  echo $RCTESTPASSWORD
9
- export PRIV_KEY=$4
10
- echo $PRIV_KEY
9
+ export REFUND_TRANSACTION=$4
10
+ echo $REFUND_TRANSACTION
11
+ export REFUND_ADDRESS=$5
12
+ echo $REFUND_ADDRESS
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitpay-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.3
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bitpay, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-13 00:00:00.000000000 Z
11
+ date: 2015-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -215,7 +215,6 @@ extra_rdoc_files: []
215
215
  files:
216
216
  - ".gitignore"
217
217
  - ".travis.yml"
218
- - CHANGELOG.md
219
218
  - GUIDE.md
220
219
  - Gemfile
221
220
  - LICENSE.md
@@ -226,9 +225,11 @@ files:
226
225
  - config/constants.rb
227
226
  - features/creating_invoices.feature
228
227
  - features/pairing.feature
228
+ - features/refunds.feature
229
229
  - features/retrieving_invoices.feature
230
230
  - features/step_definitions/invoice_steps.rb
231
231
  - features/step_definitions/keygen_steps.rb
232
+ - features/step_definitions/refund_steps.rb
232
233
  - features/step_definitions/step_helpers.rb
233
234
  - lib/bitpay/cacert.pem
234
235
  - lib/bitpay/client.rb
@@ -1,11 +0,0 @@
1
- # Change Log
2
- All notable changes to this project will be documented in this file.
3
- This project adheres to [Semantic Versioning](http://semver.org/).
4
-
5
- ## [2.3.3] - 2015-03-12
6
- ### Changed
7
- - Pull refund functionality from 2.3 spec
8
- - Bump gem version
9
-
10
- ### Fixed
11
- - Fix Bug: GitHub issue #40 - error on return from endpoints that do not have a "data" field