mixin_bot 0.3.9 → 0.3.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mixin_bot.rb +1 -0
- data/lib/mixin_bot/api/multisig.rb +38 -70
- data/lib/mixin_bot/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd8f989ccf2f759f7a9498fbacb7ce8b2f1652c254b08d9c021de11ff2814ecc
|
4
|
+
data.tar.gz: e3da8ada69570970fd7277058f0f55b5b05696dde767be56190eef4a7bab8a21
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8fc866de489a28d5566ae5711a42c6635ab62a11c8789b744728d7eac2e428af451114d80f8383d2ddb1d9997e92a84ca9bffe24f9eee3e3f1feadcf768b002
|
7
|
+
data.tar.gz: 7aeea158f3c1f142b82e9ffbc26647aa30d8c8dfe0712eede9417cc7875786d95cef4cdbe617f6f5f6e6f90092a1fb9934a64fe9cfbdef89261b008b180262d4
|
data/lib/mixin_bot.rb
CHANGED
@@ -28,26 +28,28 @@ module MixinBot
|
|
28
28
|
# "signed_tx":""
|
29
29
|
# }
|
30
30
|
# ]}
|
31
|
-
def
|
32
|
-
|
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
|
-
|
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
|
-
|
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 ||=
|
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:
|
252
|
+
asset: SHA3::Digest::SHA256.hexdigest(asset_id),
|
285
253
|
inputs: inputs,
|
286
254
|
outputs: outputs,
|
287
255
|
extra: extra
|
data/lib/mixin_bot/version.rb
CHANGED
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.
|
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-
|
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
|