peatio-bitgo 2.6.0 → 2.6.5

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
  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