mixin_bot 0.3.9 → 0.3.10

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: d714edf6aef84c707774d04abf1b8016041d09160f82864966e2b09bf6845870
4
- data.tar.gz: 7816eaf72dd92c841ed78e9bc315a562feb12b34d50f7c87c35a3c34d7fe1176
3
+ metadata.gz: cd8f989ccf2f759f7a9498fbacb7ce8b2f1652c254b08d9c021de11ff2814ecc
4
+ data.tar.gz: e3da8ada69570970fd7277058f0f55b5b05696dde767be56190eef4a7bab8a21
5
5
  SHA512:
6
- metadata.gz: 846f28a71824b964b68664538e2960f991dabf3ebbcf3f162cacc2ef4fd88713351d2949f639108d125cfd65dc33aebb9f6c4bfdc07d2fcf07f72d01a96c10b2
7
- data.tar.gz: fc2939f80ba895921d45d5d29866d50696dab737b19f5234d1223d6f3cd5867879606ec3978ee502ae7532275cbd6172a6a780771c3d68965fa82f5e2ae446f7
6
+ metadata.gz: c8fc866de489a28d5566ae5711a42c6635ab62a11c8789b744728d7eac2e428af451114d80f8383d2ddb1d9997e92a84ca9bffe24f9eee3e3f1feadcf768b002
7
+ data.tar.gz: 7aeea158f3c1f142b82e9ffbc26647aa30d8c8dfe0712eede9417cc7875786d95cef4cdbe617f6f5f6e6f90092a1fb9934a64fe9cfbdef89261b008b180262d4
data/lib/mixin_bot.rb CHANGED
@@ -11,6 +11,7 @@ require 'msgpack'
11
11
  require 'open3'
12
12
  require 'openssl'
13
13
  require 'rbnacl'
14
+ require 'sha3'
14
15
 
15
16
  require_relative './mixin_bot/api'
16
17
  require_relative './mixin_bot/cli'
@@ -28,26 +28,28 @@ module MixinBot
28
28
  # "signed_tx":""
29
29
  # }
30
30
  # ]}
31
- def multisigs(limit: 100, offset: nil, access_token: nil)
32
- path = format('/multisigs?limit=%<limit>s&offset=%<offset>s', limit: limit, offset: offset)
31
+ def outputs(**kwargs)
32
+ limit = kwargs[:limit] || 100
33
+ offset = kwargs[:offset]
34
+ state = kwargs[:state]
35
+ members = kwargs[:members]
36
+ threshold = kwargs[:threshold]
37
+ access_token = kwargs[:access_token]
38
+ members = SHA3::Digest::SHA256.hexdigest(members&.sort&.join)
39
+
40
+ path = format(
41
+ '/multisigs/outputs?limit=%<limit>s&offset=%<offset>s&state=%<state>s&members=%<members>s&threshold=%<threshold>s',
42
+ limit: limit,
43
+ offset: offset,
44
+ state: state,
45
+ members: members,
46
+ threshold: threshold
47
+ )
33
48
  access_token ||= access_token('GET', path, '')
34
49
  authorization = format('Bearer %<access_token>s', access_token: access_token)
35
50
  client.get(path, headers: { 'Authorization': authorization })
36
51
  end
37
-
38
- def all_multisigs(utxos: [], offset: nil, access_token: nil)
39
- res = multisigs(limit: 100, offset: offset, access_token: access_token)
40
-
41
- return [] if res['data'].nil?
42
-
43
- utxos += res['data']
44
-
45
- if res['data'].length < 100
46
- utxos
47
- else
48
- all_multisigs(utxos: utxos, offset: utxos[-1]['created_at'], access_token: access_token)
49
- end
50
- end
52
+ alias multisigs outputs
51
53
 
52
54
  def create_output(receivers:, index:, access_token: nil)
53
55
  path = '/outputs'
@@ -64,7 +66,7 @@ module MixinBot
64
66
  # create a request for multi sign
65
67
  # for now, raw(RAW-TRANSACTION-HEX) can only be generated by Mixin SDK of Golang or Javascript
66
68
  def create_sign_multisig_request(raw, access_token: nil)
67
- path = '/multisigs'
69
+ path = '/multisigs/requests'
68
70
  payload = {
69
71
  action: 'sign',
70
72
  raw: raw
@@ -77,7 +79,7 @@ module MixinBot
77
79
  # transfer from the multisig address
78
80
  # create a request for unlock a multi-sign
79
81
  def create_unlock_multisig_request(raw, access_token: nil)
80
- path = '/multisigs'
82
+ path = '/multisigs/requests'
81
83
  payload = {
82
84
  action: 'unlock',
83
85
  raw: raw
@@ -88,7 +90,7 @@ module MixinBot
88
90
  end
89
91
 
90
92
  def sign_multisig_request(request_id, pin)
91
- path = format('/multisigs/%<request_id>s/sign', request_id: request_id)
93
+ path = format('/multisigs/requests/%<request_id>s/sign', request_id: request_id)
92
94
  payload = {
93
95
  pin: encrypt_pin(pin)
94
96
  }
@@ -98,7 +100,7 @@ module MixinBot
98
100
  end
99
101
 
100
102
  def unlock_multisig_request(request_id, pin)
101
- path = format('/multisigs/%<request_id>s/unlock', request_id: request_id)
103
+ path = format('/multisigs/requests/%<request_id>s/unlock', request_id: request_id)
102
104
  payload = {
103
105
  pin: encrypt_pin(pin)
104
106
  }
@@ -108,7 +110,7 @@ module MixinBot
108
110
  end
109
111
 
110
112
  def cancel_multisig_request(request_id, pin)
111
- path = format('/multisigs/%<request_id>s/cancel', request_id: request_id)
113
+ path = format('/multisigs/requests/%<request_id>s/cancel', request_id: request_id)
112
114
  payload = {
113
115
  pin: encrypt_pin(pin)
114
116
  }
@@ -165,76 +167,42 @@ module MixinBot
165
167
  "fffe#{s}"
166
168
  end
167
169
 
168
- # filter utxo by members, asset_id and threshold
169
- def filter_utxos(**kwargs)
170
- utxos = all_multisigs(access_token: kwargs[:access_token])
171
-
172
- unless kwargs[:members].nil?
173
- utxos = utxos.filter(
174
- &lambda { |utxo|
175
- utxo['members'].sort == kwargs[:members].sort
176
- }
177
- )
178
- end
179
-
180
- unless kwargs[:asset_id].nil?
181
- utxos = utxos.filter(
182
- &lambda { |utxo|
183
- utxo['asset_id'] == kwargs[:asset_id]
184
- }
185
- )
186
- end
187
-
188
- unless kwargs[:threshold].nil?
189
- utxos = utxos.filter(
190
- &lambda { |utxo|
191
- utxo['threshold'] == kwargs[:threshold]
192
- }
193
- )
194
- end
195
-
196
- unless kwargs[:state].nil?
197
- utxos = utxos.filter(
198
- &lambda { |utxo|
199
- utxo['state'] == kwargs[:state]
200
- }
201
- )
202
- end
203
-
204
- utxos
205
- end
206
-
207
170
  # kwargs:
208
171
  # {
209
172
  # senders: [ uuid ],
210
173
  # receivers: [ uuid ],
211
174
  # threshold: integer,
212
175
  # asset_id: uuid,
213
- # asset_mixin_id: string,
214
176
  # amount: string / float,
215
177
  # memo: string,
216
178
  # }
217
- def build_raw_transaction(kwargs)
179
+ RAW_TRANSACTION_ARGUMENTS = %i[senders receivers amount threshold asset_id].freeze
180
+ def build_raw_transaction(**kwargs)
181
+ raise ArgumentError, "#{RAW_TRANSACTION_ARGUMENTS.join(', ')} are needed for build raw transaction" unless RAW_TRANSACTION_ARGUMENTS.all? { |param| kwargs.keys.include? param }
182
+
218
183
  senders = kwargs[:senders]
219
184
  receivers = kwargs[:receivers]
220
- asset_id = kwargs[:asset_id]
221
- asset_mixin_id = kwargs[:asset_mixin_id]
222
185
  amount = kwargs[:amount]
223
- memo = kwargs[:memo]
224
186
  threshold = kwargs[:threshold]
225
- access_token = kwargs[:access_token]
187
+ asset_id = kwargs[:asset_id]
226
188
  utxos = kwargs[:utxos]
189
+ memo = kwargs[:memo]
190
+ access_token = kwargs[:access_token]
227
191
 
228
192
  raise 'access_token required!' if access_token.nil? && !senders.include?(client_id)
229
193
 
230
- # default to use all unspent utxo
231
- utxos ||= filter_utxos(
194
+ # default to use all(first 100) unspent utxo
195
+ utxos ||= multisigs(
232
196
  members: senders,
233
- asset_id: asset_id,
234
197
  threshold: threshold,
235
198
  state: 'unspent',
236
199
  access_token: access_token
200
+ ).filter(
201
+ &lambda { |utxo|
202
+ utxo['asset_id'] == kwargs[:asset_id]
203
+ }
237
204
  )
205
+
238
206
  amount = amount.to_f.round(8)
239
207
  input_amount = utxos.map(
240
208
  &lambda { |utxo|
@@ -281,7 +249,7 @@ module MixinBot
281
249
  extra = Digest.hexencode memo.to_s.slice(0, 140)
282
250
  tx = {
283
251
  version: 1,
284
- asset: asset_mixin_id,
252
+ asset: SHA3::Digest::SHA256.hexdigest(asset_id),
285
253
  inputs: inputs,
286
254
  outputs: outputs,
287
255
  extra: extra
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MixinBot
4
- VERSION = '0.3.9'
4
+ VERSION = '0.3.10'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mixin_bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.9
4
+ version: 0.3.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - an-lee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-22 00:00:00.000000000 Z
11
+ date: 2021-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: awesome_print
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '7.1'
125
+ - !ruby/object:Gem::Dependency
126
+ name: sha3
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: thor
127
141
  requirement: !ruby/object:Gem::Requirement