mixin_bot 0.12.0 → 1.0.0
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/api/address.rb +21 -0
- data/lib/mixin_bot/api/app.rb +5 -11
- data/lib/mixin_bot/api/asset.rb +9 -16
- data/lib/mixin_bot/api/attachment.rb +27 -22
- data/lib/mixin_bot/api/auth.rb +31 -53
- data/lib/mixin_bot/api/blaze.rb +4 -3
- data/lib/mixin_bot/api/collectible.rb +60 -58
- data/lib/mixin_bot/api/conversation.rb +29 -49
- data/lib/mixin_bot/api/encrypted_message.rb +17 -17
- data/lib/mixin_bot/api/legacy_multisig.rb +87 -0
- data/lib/mixin_bot/api/legacy_output.rb +50 -0
- data/lib/mixin_bot/api/legacy_payment.rb +31 -0
- data/lib/mixin_bot/api/legacy_snapshot.rb +39 -0
- data/lib/mixin_bot/api/legacy_transaction.rb +173 -0
- data/lib/mixin_bot/api/legacy_transfer.rb +42 -0
- data/lib/mixin_bot/api/me.rb +13 -17
- data/lib/mixin_bot/api/message.rb +13 -10
- data/lib/mixin_bot/api/multisig.rb +16 -221
- data/lib/mixin_bot/api/output.rb +46 -0
- data/lib/mixin_bot/api/payment.rb +9 -20
- data/lib/mixin_bot/api/pin.rb +57 -65
- data/lib/mixin_bot/api/rpc.rb +9 -11
- data/lib/mixin_bot/api/snapshot.rb +15 -29
- data/lib/mixin_bot/api/tip.rb +43 -0
- data/lib/mixin_bot/api/transaction.rb +184 -60
- data/lib/mixin_bot/api/transfer.rb +64 -32
- data/lib/mixin_bot/api/user.rb +83 -53
- data/lib/mixin_bot/api/withdraw.rb +52 -53
- data/lib/mixin_bot/api.rb +78 -45
- data/lib/mixin_bot/cli/api.rb +151 -8
- data/lib/mixin_bot/cli/utils.rb +14 -4
- data/lib/mixin_bot/cli.rb +13 -10
- data/lib/mixin_bot/client.rb +76 -127
- data/lib/mixin_bot/configuration.rb +98 -0
- data/lib/mixin_bot/nfo.rb +174 -0
- data/lib/mixin_bot/transaction.rb +505 -0
- data/lib/mixin_bot/utils/address.rb +108 -0
- data/lib/mixin_bot/utils/crypto.rb +182 -0
- data/lib/mixin_bot/utils/decoder.rb +58 -0
- data/lib/mixin_bot/utils/encoder.rb +63 -0
- data/lib/mixin_bot/utils.rb +8 -109
- data/lib/mixin_bot/uuid.rb +41 -0
- data/lib/mixin_bot/version.rb +1 -1
- data/lib/mixin_bot.rb +39 -14
- data/lib/mvm/bridge.rb +2 -19
- data/lib/mvm/client.rb +11 -33
- data/lib/mvm/nft.rb +4 -4
- data/lib/mvm/registry.rb +9 -9
- data/lib/mvm/scan.rb +3 -5
- data/lib/mvm.rb +5 -6
- metadata +101 -44
- data/lib/mixin_bot/utils/nfo.rb +0 -176
- data/lib/mixin_bot/utils/transaction.rb +0 -478
- data/lib/mixin_bot/utils/uuid.rb +0 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ebb5e10a678c90007560b0f84676d0545ea510de1cefc5534091e0b1338c13b
|
4
|
+
data.tar.gz: afe4ffc00de92429959bc310a6082112f3dc54d8c48e687165a08e0499a3b1a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 334913613e7a88d94e3783fbf028545ecfa0cecdb0a46c7189a63563be17830d33a1de098714e7c38da97094e041f16805cb5782b1101587629dde8d91d4abe6
|
7
|
+
data.tar.gz: b2ae3479345b421c7e96983c32c0e85c42a028022f74428c90467407eeea93f323b52126d5ab305ee317ae44db69a8e284ec024fdd738fbe095c6a7cbe11e1f4
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MixinBot
|
4
|
+
class API
|
5
|
+
module Address
|
6
|
+
def safe_deposit_entries(**kwargs)
|
7
|
+
path = '/safe/deposit/entries'
|
8
|
+
|
9
|
+
members = [kwargs[:members]] if kwargs[:members].is_a? String
|
10
|
+
|
11
|
+
payload = {
|
12
|
+
members:,
|
13
|
+
threshold: kwargs[:threshold] || 1,
|
14
|
+
chain_id: kwargs[:chain_id]
|
15
|
+
}
|
16
|
+
|
17
|
+
client.post path, **payload, access_token: kwargs[:access_token]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/mixin_bot/api/app.rb
CHANGED
@@ -6,25 +6,19 @@ module MixinBot
|
|
6
6
|
def add_favorite_app(app_id, access_token: nil)
|
7
7
|
path = format('/apps/%<id>s/favorite', id: app_id)
|
8
8
|
|
9
|
-
|
10
|
-
authorization = format('Bearer %<access_token>s', access_token: access_token)
|
11
|
-
client.post(path, headers: { 'Authorization': authorization })
|
9
|
+
client.post path, access_token:
|
12
10
|
end
|
13
11
|
|
14
12
|
def remove_favorite_app(app_id, access_token: nil)
|
15
13
|
path = format('/apps/%<id>s/unfavorite', id: app_id)
|
16
14
|
|
17
|
-
|
18
|
-
authorization = format('Bearer %<access_token>s', access_token: access_token)
|
19
|
-
client.post(path, headers: { 'Authorization': authorization })
|
15
|
+
client.post path, access_token:
|
20
16
|
end
|
21
17
|
|
22
|
-
def favorite_apps(user_id, access_token: nil)
|
23
|
-
path = format('/users/%<id>s/apps/favorite', id: user_id)
|
18
|
+
def favorite_apps(user_id = nil, access_token: nil)
|
19
|
+
path = format('/users/%<id>s/apps/favorite', id: user_id || config.app_id)
|
24
20
|
|
25
|
-
|
26
|
-
authorization = format('Bearer %<access_token>s', access_token: access_token)
|
27
|
-
client.get(path, headers: { 'Authorization': authorization })
|
21
|
+
client.get path, access_token:
|
28
22
|
end
|
29
23
|
end
|
30
24
|
end
|
data/lib/mixin_bot/api/asset.rb
CHANGED
@@ -6,31 +6,24 @@ module MixinBot
|
|
6
6
|
# https://developers.mixin.one/api/alpha-mixin-network/read-assets/
|
7
7
|
def assets(access_token: nil)
|
8
8
|
path = '/assets'
|
9
|
-
|
10
|
-
authorization = format('Bearer %<access_token>s', access_token: access_token)
|
11
|
-
client.get(path, headers: { 'Authorization': authorization })
|
9
|
+
client.get path, access_token:
|
12
10
|
end
|
13
|
-
alias read_assets assets
|
14
11
|
|
15
12
|
# https://developers.mixin.one/api/alpha-mixin-network/read-asset/
|
16
13
|
def asset(asset_id, access_token: nil)
|
17
|
-
path = format('/assets/%<asset_id>s', asset_id:
|
18
|
-
|
19
|
-
authorization = format('Bearer %<access_token>s', access_token: access_token)
|
20
|
-
client.get(path, headers: { 'Authorization': authorization })
|
14
|
+
path = format('/assets/%<asset_id>s', asset_id:)
|
15
|
+
client.get path, access_token:
|
21
16
|
end
|
22
|
-
alias read_asset asset
|
23
17
|
|
24
18
|
# https://developers.mixin.one/document/wallet/api/ticker
|
25
|
-
def ticker(asset_id,
|
26
|
-
offset =
|
19
|
+
def ticker(asset_id, **kwargs)
|
20
|
+
offset = kwargs[:offset]
|
21
|
+
offset = DateTime.rfc3339(offset) if offset.is_a? String
|
27
22
|
offset = offset.rfc3339 if offset.is_a?(DateTime) || offset.is_a?(Time)
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
client.get(path, headers: { 'Authorization': authorization })
|
23
|
+
|
24
|
+
path = '/ticker'
|
25
|
+
client.get path, asset_id:, offset:, access_token: kwargs[:access_token]
|
32
26
|
end
|
33
|
-
alias read_ticker ticker
|
34
27
|
end
|
35
28
|
end
|
36
29
|
end
|
@@ -3,7 +3,6 @@
|
|
3
3
|
module MixinBot
|
4
4
|
class API
|
5
5
|
module Attachment
|
6
|
-
# https://developers.mixin.one/api/beta-mixin-message/create-attachment/
|
7
6
|
# Sample Response
|
8
7
|
# {
|
9
8
|
# "data":{
|
@@ -14,38 +13,44 @@ module MixinBot
|
|
14
13
|
# }
|
15
14
|
# }
|
16
15
|
# Once get the upload_url, use it to upload the your file via PUT request
|
17
|
-
def create_attachment
|
16
|
+
def create_attachment(access_token: nil)
|
18
17
|
path = '/attachments'
|
19
|
-
|
20
|
-
authorization = format('Bearer %<access_token>s', access_token: access_token)
|
21
|
-
client.post(path, headers: { 'Authorization': authorization }, json: {})
|
18
|
+
client.post path, access_token:
|
22
19
|
end
|
23
20
|
|
24
21
|
def upload_attachment(file)
|
25
22
|
attachment = create_attachment['data']
|
26
23
|
|
27
|
-
|
28
|
-
|
29
|
-
.
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
24
|
+
url = attachment.delete('upload_url')
|
25
|
+
conn = Faraday.new(url:) do |f|
|
26
|
+
f.adapter :net_http
|
27
|
+
|
28
|
+
f.request :multipart
|
29
|
+
f.request :retry
|
30
|
+
f.response :raise_error
|
31
|
+
f.response :logger if config.debug
|
32
|
+
end
|
33
|
+
|
34
|
+
conn.put(url) do |req|
|
35
|
+
req.headers = {
|
36
|
+
'x-amz-acl': 'public-read',
|
37
|
+
'Content-Type': 'application/octet-stream'
|
38
|
+
}
|
39
|
+
req.body = Faraday::UploadIO.new(file, 'octet/stream')
|
40
|
+
|
41
|
+
if file.respond_to?(:length)
|
42
|
+
req.headers['Content-Length'] = file.length.to_s
|
43
|
+
elsif file.respond_to?(:stat)
|
44
|
+
req.headers['Content-Length'] = file.stat.size.to_s
|
45
|
+
end
|
46
|
+
end
|
40
47
|
|
41
48
|
attachment
|
42
49
|
end
|
43
50
|
|
44
|
-
def
|
51
|
+
def attachment(attachment_id, access_token: nil)
|
45
52
|
path = format('/attachments/%<id>s', id: attachment_id)
|
46
|
-
|
47
|
-
authorization = format('Bearer %<access_token>s', access_token: access_token)
|
48
|
-
client.get(path, headers: { 'Authorization': authorization })
|
53
|
+
client.get path, access_token:
|
49
54
|
end
|
50
55
|
end
|
51
56
|
end
|
data/lib/mixin_bot/api/auth.rb
CHANGED
@@ -3,85 +3,60 @@
|
|
3
3
|
module MixinBot
|
4
4
|
class API
|
5
5
|
module Auth
|
6
|
-
def access_token(method, uri, body = '', exp_in: 600, scp: 'FULL')
|
7
|
-
sig = Digest::SHA256.hexdigest(method + uri + body.to_s)
|
8
|
-
iat = Time.now.utc.to_i
|
9
|
-
exp = (Time.now.utc + exp_in).to_i
|
10
|
-
jti = SecureRandom.uuid
|
11
|
-
payload = {
|
12
|
-
uid: client_id,
|
13
|
-
sid: session_id,
|
14
|
-
iat: iat,
|
15
|
-
exp: exp,
|
16
|
-
jti: jti,
|
17
|
-
sig: sig,
|
18
|
-
scp: scp
|
19
|
-
}
|
20
|
-
case key_type
|
21
|
-
when :ed25519
|
22
|
-
jwk = JOSE::JWK.from_okp [:Ed25519, private_key]
|
23
|
-
jws = JOSE::JWS.from({ 'alg' => 'EdDSA' })
|
24
|
-
when :rsa
|
25
|
-
jwk = JOSE::JWK.from_pem private_key
|
26
|
-
jws = JOSE::JWS.from({ 'alg' => 'RS512' })
|
27
|
-
end
|
28
|
-
|
29
|
-
jwt = JOSE::JWT.from payload
|
30
|
-
JOSE::JWT.sign(jwk, jws, jwt).compact
|
31
|
-
end
|
32
|
-
|
33
6
|
def oauth_token(code)
|
34
7
|
path = 'oauth/token'
|
35
8
|
payload = {
|
36
|
-
client_id:
|
37
|
-
client_secret: client_secret,
|
38
|
-
code:
|
9
|
+
client_id: config.app_id,
|
10
|
+
client_secret: config.client_secret,
|
11
|
+
code:
|
39
12
|
}
|
40
|
-
|
41
|
-
|
42
|
-
raise r.inspect if r['error'].present?
|
43
|
-
|
44
|
-
r['data']&.[]('access_token')
|
13
|
+
client.post path, **payload
|
45
14
|
end
|
46
15
|
|
47
16
|
def request_oauth(scope = nil)
|
48
|
-
scope ||=
|
17
|
+
scope ||= 'PROFILE:READ'
|
49
18
|
format(
|
50
|
-
'https://mixin.one/oauth/authorize?client_id=%<
|
51
|
-
|
52
|
-
scope:
|
19
|
+
'https://mixin.one/oauth/authorize?client_id=%<app_id>s&scope=%<scope>s',
|
20
|
+
app_id: config.app_id,
|
21
|
+
scope:
|
53
22
|
)
|
54
23
|
end
|
55
24
|
|
56
25
|
def authorize_code(**kwargs)
|
57
|
-
path = '/oauth/authorize'
|
58
26
|
data = authorization_data(
|
59
|
-
kwargs[:
|
27
|
+
kwargs[:app_id],
|
60
28
|
kwargs[:scope] || ['PROFILE:READ']
|
61
29
|
)
|
62
30
|
|
31
|
+
path = '/oauth/authorize'
|
32
|
+
pin = kwargs[:pin] || config.pin
|
63
33
|
payload = {
|
64
34
|
authorization_id: data['authorization_id'],
|
65
35
|
scopes: data['scopes'],
|
66
36
|
pin_base64: encrypt_pin(kwargs[:pin])
|
67
37
|
}
|
68
38
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
39
|
+
raise ArgumentError, 'pin is required' if pin.blank?
|
40
|
+
|
41
|
+
payload[:pin_base64] = if pin.size > 6
|
42
|
+
encrypt_tip_pin(pin, 'TIP:OAUTH:APPROVE:', data['scopes'], data['authorization_id'])
|
43
|
+
else
|
44
|
+
encrypt_pin(pin)
|
45
|
+
end
|
46
|
+
|
47
|
+
client.post path, **payload, access_token: kwargs[:access_token]
|
73
48
|
end
|
74
49
|
|
75
|
-
def authorization_data(
|
76
|
-
@
|
50
|
+
def authorization_data(app_id, scope = ['PROFILE:READ'])
|
51
|
+
@_app_id = app_id
|
77
52
|
@_scope = scope.join(' ')
|
78
53
|
EM.run do
|
79
54
|
start_blaze_connect do
|
80
|
-
def on_open(ws,
|
55
|
+
def on_open(ws, _event)
|
81
56
|
ws.send write_ws_message(
|
82
57
|
action: 'REFRESH_OAUTH_CODE',
|
83
58
|
params: {
|
84
|
-
client_id: @
|
59
|
+
client_id: @_app_id,
|
85
60
|
scope: @_scope,
|
86
61
|
authorization_id: '',
|
87
62
|
code_challenge: ''
|
@@ -90,17 +65,20 @@ module MixinBot
|
|
90
65
|
end
|
91
66
|
|
92
67
|
def on_message(ws, event)
|
93
|
-
raw = JSON.parse
|
94
|
-
@_data = raw
|
68
|
+
raw = JSON.parse ws_message(event.data)
|
69
|
+
@_data = raw
|
95
70
|
ws.close
|
96
71
|
end
|
97
72
|
|
98
|
-
def on_close(
|
73
|
+
def on_close(_ws, _event)
|
99
74
|
EM.stop_event_loop
|
100
75
|
end
|
101
76
|
end
|
102
77
|
end
|
103
|
-
|
78
|
+
|
79
|
+
raise MixinBot::RequestError, @_data if @_data['error'].present?
|
80
|
+
|
81
|
+
@_data['data']
|
104
82
|
end
|
105
83
|
end
|
106
84
|
end
|
data/lib/mixin_bot/api/blaze.rb
CHANGED
@@ -5,9 +5,10 @@ module MixinBot
|
|
5
5
|
module Blaze
|
6
6
|
def blaze
|
7
7
|
access_token = access_token('GET', '/', '')
|
8
|
-
|
8
|
+
|
9
|
+
authorization = format('Bearer %<access_token>s', access_token:)
|
9
10
|
Faye::WebSocket::Client.new(
|
10
|
-
format('wss://%<host>s/', host: blaze_host),
|
11
|
+
format('wss://%<host>s/', host: config.blaze_host),
|
11
12
|
['Mixin-Blaze-1'],
|
12
13
|
headers: { 'Authorization' => authorization },
|
13
14
|
ping: 60
|
@@ -31,7 +32,7 @@ module MixinBot
|
|
31
32
|
if defined? on_message
|
32
33
|
on_message ws, event
|
33
34
|
else
|
34
|
-
raw = JSON.parse
|
35
|
+
raw = JSON.parse ws_message(event.data)
|
35
36
|
p [Time.now.to_s, :message, raw&.[]('action')]
|
36
37
|
|
37
38
|
ws.send acknowledge_message_receipt(raw['data']['message_id']) unless raw&.[]('data')&.[]('message_id').nil?
|
@@ -7,40 +7,37 @@ module MixinBot
|
|
7
7
|
|
8
8
|
def collectible(id, access_token: nil)
|
9
9
|
path = "/collectibles/tokens/#{id}"
|
10
|
-
|
11
|
-
authorization = format('Bearer %<access_token>s', access_token: access_token)
|
12
|
-
client.get(path, headers: { 'Authorization': authorization })
|
10
|
+
client.get path, access_token:
|
13
11
|
end
|
14
12
|
|
15
13
|
def collection(id, access_token: nil)
|
16
14
|
path = "/collectibles/collections/#{id}"
|
17
|
-
|
18
|
-
authorization = format('Bearer %<access_token>s', access_token: access_token)
|
19
|
-
client.get(path, headers: { 'Authorization': authorization })
|
15
|
+
client.get path, access_token:
|
20
16
|
end
|
21
17
|
|
22
|
-
def
|
18
|
+
def collectibles(**kwargs)
|
23
19
|
limit = kwargs[:limit] || 100
|
24
20
|
offset = kwargs[:offset] || ''
|
25
21
|
state = kwargs[:state] || ''
|
26
|
-
|
27
|
-
|
28
|
-
|
22
|
+
|
23
|
+
members = kwargs[:members] || [config.app_id]
|
24
|
+
threshold = kwargs[:threshold] || members.length
|
25
|
+
|
29
26
|
members = SHA3::Digest::SHA256.hexdigest(members&.sort&.join)
|
30
27
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
28
|
+
access_token = kwargs[:access_token]
|
29
|
+
|
30
|
+
path = '/collectibles/outputs'
|
31
|
+
params = {
|
32
|
+
limit:,
|
33
|
+
offset:,
|
34
|
+
state:,
|
35
|
+
members:,
|
36
|
+
threshold:
|
37
|
+
}
|
38
|
+
|
39
|
+
client.get path, **params, access_token:
|
42
40
|
end
|
43
|
-
alias collectibles collectible_outputs
|
44
41
|
|
45
42
|
COLLECTABLE_REQUEST_ACTIONS = %i[sign unlock].freeze
|
46
43
|
def create_collectible_request(action, raw, access_token: nil)
|
@@ -48,50 +45,56 @@ module MixinBot
|
|
48
45
|
|
49
46
|
path = '/collectibles/requests'
|
50
47
|
payload = {
|
51
|
-
action
|
52
|
-
raw:
|
48
|
+
action:,
|
49
|
+
raw:
|
53
50
|
}
|
54
|
-
|
55
|
-
authorization = format('Bearer %<access_token>s', access_token: access_token)
|
56
|
-
client.post(path, headers: { 'Authorization': authorization }, json: payload)
|
51
|
+
client.post path, **payload, access_token:
|
57
52
|
end
|
58
53
|
|
59
54
|
def create_sign_collectible_request(raw, access_token: nil)
|
60
|
-
create_collectible_request 'sign', raw, access_token:
|
55
|
+
create_collectible_request 'sign', raw, access_token:
|
61
56
|
end
|
62
57
|
|
63
58
|
def create_unlock_collectible_request(raw, access_token: nil)
|
64
|
-
create_collectible_request 'unlock', raw, access_token:
|
59
|
+
create_collectible_request 'unlock', raw, access_token:
|
65
60
|
end
|
66
61
|
|
67
|
-
def sign_collectible_request(request_id, pin)
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
62
|
+
def sign_collectible_request(request_id, pin = nil)
|
63
|
+
pin ||= config.pin
|
64
|
+
raise ArgumentError, 'pin is needed for sign collectible request' if pin.blank?
|
65
|
+
|
66
|
+
path = format('/collectibles/requests/%<request_id>s/sign', request_id:)
|
67
|
+
payload =
|
68
|
+
if pin.length > 6
|
69
|
+
pin_base64 = encrypt_tip_pin(pin, 'TIP:COLLECTIBLE:REQUEST:SIGN:', request_id)
|
70
|
+
{
|
71
|
+
pin_base64:
|
72
|
+
}
|
73
|
+
else
|
74
|
+
{
|
75
|
+
pin: encrypt_pin(pin)
|
76
|
+
}
|
77
|
+
end
|
78
|
+
client.post path, **payload
|
75
79
|
end
|
76
80
|
|
77
|
-
def unlock_collectible_request(request_id, pin)
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
client.post(path, headers: { 'Authorization': authorization }, json: payload)
|
81
|
+
def unlock_collectible_request(request_id, pin = nil)
|
82
|
+
pin ||= config.pin
|
83
|
+
raise ArgumentError, 'pin is needed for sign collectible request' if pin.blank?
|
84
|
+
|
85
|
+
path = format('/collectibles/requests/%<request_id>s/unlock', request_id:)
|
86
|
+
payload =
|
87
|
+
if pin.length > 6
|
88
|
+
{
|
89
|
+
pin_base64: encrypt_tip_pin(pin, 'TIP:COLLECTIBLE:REQUEST:UNLOCK:', request_id)
|
90
|
+
}
|
91
|
+
else
|
92
|
+
{
|
93
|
+
pin: encrypt_pin(pin)
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
client.post path, **payload
|
95
98
|
end
|
96
99
|
end
|
97
100
|
|
@@ -123,16 +126,15 @@ module MixinBot
|
|
123
126
|
senders_threshold: collectible['receivers_threshold'],
|
124
127
|
receivers: kwargs['receivers'],
|
125
128
|
receivers_threshold: kwargs['receivers_threshold'],
|
126
|
-
extra: kwargs['nfo'],
|
129
|
+
extra: [kwargs['nfo']].pack('H*'),
|
127
130
|
amount: 1,
|
128
131
|
asset_mixin_id: NFT_ASSET_MIXIN_ID,
|
129
|
-
access_token: kwargs['access_token'],
|
130
132
|
hint: kwargs['hint']
|
131
133
|
)
|
132
134
|
end
|
133
135
|
|
134
136
|
def nft_memo(collection, token_id, meta)
|
135
|
-
MixinBot
|
137
|
+
MixinBot.utils.nft_memo collection, token_id, meta
|
136
138
|
end
|
137
139
|
end
|
138
140
|
end
|