peatio-bitgo 2.6.0 → 2.6.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
  SHA256:
3
- metadata.gz: 274572ccfc7d17e3150b4271d2872fda747aff0684a50e21c8bb74382e0c437f
4
- data.tar.gz: f90adec7c757956565af265400011033a73902348ee1a1d98393ea51e83e2ab1
3
+ metadata.gz: af28c5fe41488709946c6b6605b89cc57685edc7dcdf27031eb452b81dbf3bb1
4
+ data.tar.gz: 566d20452432523045c9e16eedf0b02db1e724ac52dcbe8cace1348bc067c38b
5
5
  SHA512:
6
- metadata.gz: 58ec57b436b4e5d43d71d3b6db335e36cb4e0c49fac46a9495c2bfdfc1bcf3909577ba1367641bc3a3357adb2779bb515270d285662fdfa9ed0cef62526c49b7
7
- data.tar.gz: 8fc3e3d276680e91140264bc3ab9d32648632598484dd23ddebdb36d4b79612eb14a585d902ac12585a8b92831e4db4712b3d6444e6ef0ed12c932fab98ae71a
6
+ metadata.gz: f2fafca0f648009a3fa035e311a90e180cee285e2b88fd7c71c8ac0916b105369bcea5f43d61fb7ec4510550828cc9f5d1c9534c70ced3549723b8e049abc95f
7
+ data.tar.gz: bb06a8d50dae6bb682669d416fd8a5469654e531dd8f91e5f841a3a669ca67c399056bb846676ec62279ab9870d64758c585b5d22b30cd6a8399749b2ea8d111
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- peatio-bitgo (2.6.0)
4
+ peatio-bitgo (2.6.5)
5
5
  activesupport (~> 5.2.3)
6
6
  better-faraday (~> 1.0.5)
7
7
  faraday (~> 0.17)
@@ -12,35 +12,35 @@ PATH
12
12
  GEM
13
13
  remote: https://rubygems.org/
14
14
  specs:
15
- activemodel (5.2.4.2)
16
- activesupport (= 5.2.4.2)
17
- activesupport (5.2.4.2)
15
+ activemodel (5.2.4.5)
16
+ activesupport (= 5.2.4.5)
17
+ activesupport (5.2.4.5)
18
18
  concurrent-ruby (~> 1.0, >= 1.0.2)
19
19
  i18n (>= 0.7, < 2)
20
20
  minitest (~> 5.1)
21
21
  tzinfo (~> 1.1)
22
22
  addressable (2.7.0)
23
23
  public_suffix (>= 2.0.2, < 5.0)
24
- amq-protocol (2.3.1)
24
+ amq-protocol (2.3.2)
25
25
  amqp (1.8.0)
26
26
  amq-protocol (>= 2.2.0)
27
27
  eventmachine
28
28
  better-faraday (1.0.8)
29
29
  activesupport (>= 4.0, < 6.0)
30
30
  faraday (~> 0.12)
31
- bunny (2.15.0)
31
+ bunny (2.17.0)
32
32
  amq-protocol (~> 2.3, >= 2.3.1)
33
- byebug (11.1.1)
34
- clamp (1.3.1)
35
- coderay (1.1.2)
36
- concurrent-ruby (1.1.6)
37
- connection_pool (2.2.2)
33
+ byebug (11.1.3)
34
+ clamp (1.3.2)
35
+ coderay (1.1.3)
36
+ concurrent-ruby (1.1.8)
37
+ connection_pool (2.2.3)
38
38
  cookiejar (0.3.3)
39
39
  crack (0.4.3)
40
40
  safe_yaml (~> 1.0.0)
41
41
  daemons (1.3.1)
42
- diff-lcs (1.3)
43
- em-http-request (1.1.5)
42
+ diff-lcs (1.4.4)
43
+ em-http-request (1.1.7)
44
44
  addressable (>= 2.3.4)
45
45
  cookiejar (!= 0.3.1)
46
46
  em-socksify (>= 0.3)
@@ -50,40 +50,40 @@ GEM
50
50
  eventmachine (>= 1.0.0.beta.4)
51
51
  em-synchrony (1.0.6)
52
52
  eventmachine (>= 1.0.0.beta.1)
53
- em-websocket (0.5.1)
53
+ em-websocket (0.5.2)
54
54
  eventmachine (>= 0.12.9)
55
55
  http_parser.rb (~> 0.6.0)
56
56
  eventmachine (1.2.7)
57
- faraday (0.17.3)
57
+ faraday (0.17.4)
58
58
  multipart-post (>= 1.2, < 3)
59
59
  faraday_middleware (0.13.1)
60
60
  faraday (>= 0.7.4, < 1.0)
61
- faye (1.2.5)
61
+ faye (1.4.0)
62
62
  cookiejar (>= 0.3.0)
63
- em-http-request (>= 0.3.0)
63
+ em-http-request (>= 1.1.6)
64
64
  eventmachine (>= 0.12.0)
65
- faye-websocket (>= 0.9.1)
65
+ faye-websocket (>= 0.11.0)
66
66
  multi_json (>= 1.0.0)
67
67
  rack (>= 1.0.0)
68
68
  websocket-driver (>= 0.5.1)
69
- faye-websocket (0.10.9)
69
+ faye-websocket (0.11.0)
70
70
  eventmachine (>= 0.12.0)
71
71
  websocket-driver (>= 0.5.1)
72
72
  hashdiff (1.0.1)
73
73
  http_parser.rb (0.6.0)
74
- i18n (1.8.2)
74
+ i18n (1.8.9)
75
75
  concurrent-ruby (~> 1.0)
76
- jwt (2.2.1)
76
+ jwt (2.2.2)
77
77
  memoist (0.16.2)
78
78
  method_source (1.0.0)
79
- minitest (5.14.0)
79
+ minitest (5.14.4)
80
80
  mocha (1.11.2)
81
- multi_json (1.14.1)
81
+ multi_json (1.15.0)
82
82
  multipart-post (2.1.1)
83
83
  mysql2 (0.5.3)
84
84
  net-http-persistent (3.0.1)
85
85
  connection_pool (~> 2.2)
86
- peatio (2.4.4)
86
+ peatio (2.6.3)
87
87
  activemodel (> 5.2, <= 6.0.0)
88
88
  amqp
89
89
  bunny
@@ -97,44 +97,44 @@ GEM
97
97
  mysql2
98
98
  prometheus-client
99
99
  thin
100
- prometheus-client (2.0.0)
101
- pry (0.13.0)
100
+ prometheus-client (2.1.0)
101
+ pry (0.13.1)
102
102
  coderay (~> 1.1)
103
103
  method_source (~> 1.0)
104
104
  pry-byebug (3.9.0)
105
105
  byebug (~> 11.0)
106
106
  pry (~> 0.13.0)
107
- public_suffix (4.0.4)
108
- rack (2.2.2)
107
+ public_suffix (4.0.5)
108
+ rack (2.2.3)
109
109
  rake (13.0.1)
110
110
  rspec (3.9.0)
111
111
  rspec-core (~> 3.9.0)
112
112
  rspec-expectations (~> 3.9.0)
113
113
  rspec-mocks (~> 3.9.0)
114
- rspec-core (3.9.1)
115
- rspec-support (~> 3.9.1)
116
- rspec-expectations (3.9.1)
114
+ rspec-core (3.9.2)
115
+ rspec-support (~> 3.9.3)
116
+ rspec-expectations (3.9.2)
117
117
  diff-lcs (>= 1.2.0, < 2.0)
118
118
  rspec-support (~> 3.9.0)
119
119
  rspec-mocks (3.9.1)
120
120
  diff-lcs (>= 1.2.0, < 2.0)
121
121
  rspec-support (~> 3.9.0)
122
- rspec-support (3.9.2)
122
+ rspec-support (3.9.3)
123
123
  safe_yaml (1.0.5)
124
- thin (1.7.2)
124
+ thin (1.8.0)
125
125
  daemons (~> 1.0, >= 1.0.9)
126
126
  eventmachine (~> 1.0, >= 1.0.4)
127
127
  rack (>= 1, < 3)
128
128
  thread_safe (0.3.6)
129
- tzinfo (1.2.7)
129
+ tzinfo (1.2.9)
130
130
  thread_safe (~> 0.1)
131
131
  webmock (3.8.3)
132
132
  addressable (>= 2.3.6)
133
133
  crack (>= 0.3.2)
134
134
  hashdiff (>= 0.4.0, < 2.0.0)
135
- websocket-driver (0.7.1)
135
+ websocket-driver (0.7.3)
136
136
  websocket-extensions (>= 0.1.0)
137
- websocket-extensions (0.1.4)
137
+ websocket-extensions (0.1.5)
138
138
 
139
139
  PLATFORMS
140
140
  ruby
@@ -22,7 +22,7 @@ module Peatio
22
22
  args = [@endpoint.to_s + path]
23
23
 
24
24
  if data
25
- if %i[ post put patch ].include?(verb)
25
+ if %i[post put patch].include?(verb)
26
26
  args << data.compact.to_json
27
27
  args << { 'Content-Type' => 'application/json' }
28
28
  else
@@ -9,7 +9,7 @@ module Peatio
9
9
  unless Gem::Requirement.new(BLOCKCHAIN_VERSION_REQUIREMENT)
10
10
  .satisfied_by?(Gem::Version.new(Peatio::Blockchain::VERSION))
11
11
  [
12
- "Bitgo blockchain version requiremnt was not suttisfied by Peatio::Blockchain.",
12
+ "Bitgo blockchain version requirement was not satisfied by Peatio::Blockchain.",
13
13
  "Bitgo blockchain requires #{BLOCKCHAIN_VERSION_REQUIREMENT}.",
14
14
  "Peatio::Blockchain version is #{Peatio::Blockchain::VERSION}"
15
15
  ].join('\n').tap { |s| Kernel.abort s }
@@ -18,7 +18,7 @@ module Peatio
18
18
  unless Gem::Requirement.new(WALLET_VERSION_REQUIREMENT)
19
19
  .satisfied_by?(Gem::Version.new(Peatio::Wallet::VERSION))
20
20
  [
21
- "Bitgo wallet version requiremnt was not suttisfied by Peatio::Wallet.",
21
+ "Bitgo wallet version requirement was not satisfied by Peatio::Wallet.",
22
22
  "Bitgo wallet requires #{WALLET_VERSION_REQUIREMENT}.",
23
23
  "Peatio::Wallet version is #{Peatio::Wallet::VERSION}"
24
24
  ].join('\n').tap { |s| Kernel.abort s }
@@ -1,5 +1,5 @@
1
1
  module Peatio
2
2
  module Bitgo
3
- VERSION = "2.6.0".freeze
3
+ VERSION = "2.6.5".freeze
4
4
  end
5
5
  end
@@ -1,9 +1,14 @@
1
1
  module Peatio
2
2
  module Bitgo
3
3
  class Wallet < Peatio::Wallet::Abstract
4
+ TIME_DIFFERENCE_IN_MINUTES = 10
5
+ XLM_MEMO_TYPES = { 'memoId': 'id', 'memoText': 'text', 'memoHash': 'hash', 'memoReturn': 'return' }
4
6
 
5
- def initialize(settings = {})
6
- @settings = settings
7
+ DEFAULT_FEATURES = { skip_deposit_collection: false }.freeze
8
+
9
+ def initialize(custom_features = {})
10
+ @features = DEFAULT_FEATURES.merge(custom_features).slice(*SUPPORTED_FEATURES)
11
+ @settings = {}
7
12
  end
8
13
 
9
14
  def configure(settings = {})
@@ -24,10 +29,14 @@ module Peatio
24
29
  def create_address!(options = {})
25
30
  currency = erc20_currency_id
26
31
  options.deep_symbolize_keys!
27
- if options.dig(:pa_details,:address_id).present?
32
+
33
+ if options.dig(:pa_details, :address_id).present? &&
34
+ options.dig(:pa_details, :updated_at).present? &&
35
+ time_difference_in_minutes(options.dig(:pa_details, :updated_at)) >= TIME_DIFFERENCE_IN_MINUTES
36
+
28
37
  response = client.rest_api(:get, "#{currency}/wallet/#{wallet_id}/address/#{options.dig(:pa_details, :address_id)}")
29
38
  { address: response['address'], secret: bitgo_wallet_passphrase }
30
- else
39
+ elsif options.dig(:pa_details, :address_id).blank?
31
40
  response = client.rest_api(:post, "#{currency}/wallet/#{wallet_id}/address")
32
41
  { address: response['address'], secret: bitgo_wallet_passphrase, details: { address_id: response['id'] }}
33
42
  end
@@ -52,7 +61,7 @@ module Peatio
52
61
  end
53
62
 
54
63
  txid = client.rest_api(:post, "#{currency_id}/wallet/#{wallet_id}/sendcoins", {
55
- address: transaction.to_address.to_s,
64
+ address: normalize_address(transaction.to_address.to_s),
56
65
  amount: amount.to_s,
57
66
  walletPassphrase: bitgo_wallet_passphrase,
58
67
  memo: xlm_memo(transaction.to_address.to_s)
@@ -111,14 +120,15 @@ module Peatio
111
120
  end
112
121
 
113
122
  def trigger_webhook_event(event)
114
- currency_id = @wallet.fetch(:testnet).present? ? 't' + @currency.fetch(:id) : @currency.fetch(:id)
115
- return unless currency_id == event['coin'] && @wallet.fetch(:wallet_id) == event['wallet']
123
+ currency = @wallet.fetch(:testnet).present? ? 't' + @currency.fetch(:id) : @currency.fetch(:id)
124
+ return unless currency == event['coin'] && @wallet.fetch(:wallet_id) == event['wallet']
116
125
 
117
126
  if event['type'] == 'transfer'
118
127
  transactions = fetch_transfer!(event['transfer'])
119
128
  return { transfers: transactions }
120
- elsif event['address_confirmation']
121
- # TODO Add Address confirmation
129
+ elsif event['type'] == 'address_confirmation'
130
+ address_id = fetch_address_id(event['address'])
131
+ return { address_id: address_id, currency_id: currency_id }
122
132
  end
123
133
  end
124
134
 
@@ -127,8 +137,15 @@ module Peatio
127
137
  address_confirmation_webhook(url)
128
138
  end
129
139
 
140
+ def fetch_address_id(address)
141
+ currency = erc20_currency_id
142
+ client.rest_api(:get, "#{currency}/wallet/#{wallet_id}/address/#{address}")
143
+ .fetch('id')
144
+ rescue Bitgo::Client::Error => e
145
+ raise Peatio::Wallet::ClientError, e
146
+ end
147
+
130
148
  def fetch_transfer!(id)
131
- # TODO: Add Rspecs for this one
132
149
  response = client.rest_api(:get, "#{currency_id}/wallet/#{wallet_id}/transfer/#{id}")
133
150
  parse_entries(response['entries']).map do |entry|
134
151
  to_address = if response.dig('coinSpecific', 'memo').present?
@@ -140,14 +157,18 @@ module Peatio
140
157
  end
141
158
  state = define_transaction_state(response['state'])
142
159
 
160
+ if response['outputs'].present?
161
+ output = response['outputs'].find { |out| out['address'] == to_address }
162
+ txout = output['index'] if output.present?
163
+ end
164
+
143
165
  transaction = Peatio::Transaction.new(
144
166
  currency_id: @currency.fetch(:id),
145
167
  amount: convert_from_base_unit(entry['valueString']),
146
168
  hash: normalize_txid(response['txid']),
147
169
  to_address: to_address,
148
170
  block_number: response['height'],
149
- # TODO: Add sendmany support
150
- txout: 0,
171
+ txout: txout.to_i,
151
172
  status: state
152
173
  )
153
174
 
@@ -169,7 +190,7 @@ module Peatio
169
190
 
170
191
  def address_confirmation_webhook(url)
171
192
  client.rest_api(:post, "#{currency_id}/wallet/#{wallet_id}/webhooks", {
172
- type: 'address_confirmation_webhook',
193
+ type: 'address_confirmation',
173
194
  allToken: true,
174
195
  url: url,
175
196
  label: "webhook for #{url}",
@@ -207,19 +228,25 @@ module Peatio
207
228
  end
208
229
 
209
230
  def xlm_memo(address)
210
- if @currency.fetch(:id) == 'xlm'
211
- {
212
- type: "id",
213
- value: "#{memo_id_from(address)}"
214
- }
215
- end
231
+ build_xlm_memo(address) if @currency.fetch(:id) == 'xlm'
216
232
  end
217
233
 
218
- def memo_id_from(address)
219
- memo_id = address.partition('memoId=').last
220
- memo_id = 0 if memo_id.empty?
234
+ def build_xlm_memo(address)
235
+ case address.split('?').last.split('=').first
236
+ when 'memoId'
237
+ memo_value_from(address, 'memoId')
238
+ when 'memoText'
239
+ memo_value_from(address, 'memoText')
240
+ when 'memoHash'
241
+ memo_value_from(address, 'memoHash')
242
+ when 'memoReturn'
243
+ memo_value_from(address, 'memoReturn')
244
+ end
245
+ end
221
246
 
222
- memo_id
247
+ def memo_value_from(address, type)
248
+ memo_value = address.partition(type + '=').last
249
+ return { type: XLM_MEMO_TYPES[type.to_sym], value: memo_value } if memo_value.present?
223
250
  end
224
251
 
225
252
  def currency_id
@@ -234,6 +261,14 @@ module Peatio
234
261
  @wallet.fetch(:wallet_id)
235
262
  end
236
263
 
264
+ def normalize_address(address)
265
+ if @currency.fetch(:id) == 'xlm'
266
+ address.split('?').first
267
+ else
268
+ address
269
+ end
270
+ end
271
+
237
272
  def normalize_txid(txid)
238
273
  txid.downcase
239
274
  end
@@ -252,9 +287,13 @@ module Peatio
252
287
  x.to_i
253
288
  end
254
289
 
290
+ def time_difference_in_minutes(updated_at)
291
+ (Time.now - updated_at)/60
292
+ end
293
+
255
294
  def define_transaction_state(state)
256
295
  case state
257
- when 'unconfrimed'
296
+ when 'unconfirmed'
258
297
  'pending'
259
298
  when 'confirmed'
260
299
  'success'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: peatio-bitgo
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.0
4
+ version: 2.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nadia Ch., Maksym N.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-15 00:00:00.000000000 Z
11
+ date: 2021-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport