trident_assistant 0.1.0 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -0
- data/README.md +70 -5
- data/lib/trident_assistant/api/collectible.rb +17 -0
- data/lib/trident_assistant/api/order.rb +98 -6
- data/lib/trident_assistant/cli/base.rb +2 -10
- data/lib/trident_assistant/cli/collectible.rb +16 -7
- data/lib/trident_assistant/cli/nfo.rb +42 -25
- data/lib/trident_assistant/cli/order.rb +32 -29
- data/lib/trident_assistant/cli.rb +1 -2
- data/lib/trident_assistant/utils/memo.rb +1 -1
- data/lib/trident_assistant/utils.rb +8 -0
- data/lib/trident_assistant/version.rb +1 -1
- metadata +2 -3
- data/Gemfile.lock +0 -106
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ca51a3b40da71d8ead06326ccd1377008aafe793e3881b9c4aaede46df73351
|
4
|
+
data.tar.gz: 9bf39cd480e433eab5443db26c57bec9e7c0445bb57aebdeddc2e2c439de03df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2dd9e5df04ccfb3d41bc4c6b2ce1bc3a8b7f48453d692bff4cae9901e3da1c11fd6c2d2cfe9d5cb8dac8e4601b77bdcaea5a75c167b83622027558bd2a57bcb2
|
7
|
+
data.tar.gz: 3791ef7f7ec907f6b0f2a9ce807a1a157b92999291f60c99b24fc27f578af1c33751ac1d86a6c6c0143ddcc2b2cfb75300283cd832dc749e9eeb080af45a0890
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -21,11 +21,76 @@ Commands:
|
|
21
21
|
ta version # Display TridentAssistant version
|
22
22
|
|
23
23
|
Options:
|
24
|
-
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
-E, [--endpoint=ENDPOINT] # Specify an endpoint
|
25
|
+
-P, [--pretty], [--no-pretty] # Print output in pretty
|
26
|
+
# Default: true
|
27
|
+
```
|
28
|
+
|
29
|
+
### Collectible
|
30
|
+
|
31
|
+
$ ta collectible
|
32
|
+
|
33
|
+
```
|
34
|
+
Commands:
|
35
|
+
ta collectible airdrop COLLECTION, TOKEN k, --keystore=KEYSTORE # airdrop NFT
|
36
|
+
ta collectible bulkairdrop DIR k, --keystore=KEYSTORE # Airdrop NFT in bulk
|
37
|
+
ta collectible deposit COLLECTION TOKEN k, --keystore=KEYSTORE # deposit NFT
|
38
|
+
ta collectible help [COMMAND] # Describe subcommands or one specific subcommand
|
39
|
+
ta collectible index k, --keystore=KEYSTORE # query collectibles in wallet
|
40
|
+
ta collectible show COLLECTION TOKEN k, --keystore=KEYSTORE # query collectible
|
41
|
+
ta collectible withdraw COLLECTION TOKEN k, --keystore=KEYSTORE # withdraw NFT
|
42
|
+
```
|
43
|
+
|
44
|
+
### collection
|
45
|
+
|
46
|
+
$ ta collection
|
47
|
+
|
48
|
+
```
|
49
|
+
Commands:
|
50
|
+
ta collection create k, --keystore=KEYSTORE # create a new collection
|
51
|
+
ta collection help [COMMAND] # Describe subcommands or one specific subcommand
|
52
|
+
ta collection index k, --keystore=KEYSTORE # query all collections
|
53
|
+
ta collection show ID k, --keystore=KEYSTORE # query a collection
|
54
|
+
ta collection update ID k, --keystore=KEYSTORE # update collection
|
55
|
+
```
|
56
|
+
|
57
|
+
### metadata
|
58
|
+
|
59
|
+
$ ta metadata
|
60
|
+
|
61
|
+
```
|
62
|
+
Commands:
|
63
|
+
ta metadata help [COMMAND] # Describe subcommands or one specific subcommand
|
64
|
+
ta metadata new k, --keystore=KEYSTORE # generate a new metadata
|
65
|
+
ta metadata show METAHASH k, --keystore=KEYSTORE # query metadata via metahash
|
66
|
+
ta metadata upload k, --keystore=KEYSTORE m, --metadata=METADATA # upload metadata to Trident
|
67
|
+
```
|
68
|
+
|
69
|
+
### nfo
|
70
|
+
|
71
|
+
$ ta nfo
|
72
|
+
|
73
|
+
```
|
74
|
+
Commands:
|
75
|
+
ta nfo bulkmint DIR k, --keystore=KEYSTORE # Mint NFT in bulk
|
76
|
+
ta nfo help [COMMAND] # Describe subcommands or one specific subcommand
|
77
|
+
ta nfo mint k, --keystore=KEYSTORE m, --metadata=METADATA # Mint NFT from NFO
|
78
|
+
```
|
79
|
+
|
80
|
+
### order
|
81
|
+
|
82
|
+
$ ta order
|
83
|
+
|
84
|
+
```
|
85
|
+
Commands:
|
86
|
+
ta order auction # auction NFT
|
87
|
+
ta order bid # bid NFT
|
88
|
+
ta order cancel ID k, --keystore=KEYSTORE # cancel order
|
89
|
+
ta order fill ID k, --keystore=KEYSTORE # fill order
|
90
|
+
ta order help [COMMAND] # Describe subcommands or one specific subcommand
|
91
|
+
ta order index k, --keystore=KEYSTORE # list orders
|
92
|
+
ta order sell # sell NFT at fixed price
|
93
|
+
ta order show ID k, --keystore=KEYSTORE # query order
|
29
94
|
```
|
30
95
|
|
31
96
|
## Development
|
@@ -56,6 +56,23 @@ module TridentAssistant
|
|
56
56
|
)
|
57
57
|
end
|
58
58
|
|
59
|
+
def transfer(collection, token, recipient, **_kwargs)
|
60
|
+
token_id = MixinBot::Utils::Nfo.new(collection: collection, token: token).unique_token_id
|
61
|
+
collectible = mixin_bot.collectibles(state: :unspent)["data"].find(&->(c) { c["token_id"] == token_id })
|
62
|
+
collectible ||= mixin_bot.collectibles(state: :signed)["data"].find(&->(c) { c["token_id"] == token_id })
|
63
|
+
raise "Cannot find collectible in wallet" if collectible.blank?
|
64
|
+
|
65
|
+
memo = "TRANSFER"
|
66
|
+
nfo = MixinBot::Utils::Nfo.new(extra: memo.unpack1("H*")).encode.hex
|
67
|
+
|
68
|
+
_transfer_nft(
|
69
|
+
collectible,
|
70
|
+
nfo,
|
71
|
+
receivers: [recipient],
|
72
|
+
threshold: 1
|
73
|
+
)
|
74
|
+
end
|
75
|
+
|
59
76
|
private
|
60
77
|
|
61
78
|
def _transfer_nft(collectible, nfo, **kwargs)
|
@@ -8,16 +8,18 @@ module TridentAssistant
|
|
8
8
|
MINIMUM_AMOUNT = 0.000_000_01
|
9
9
|
|
10
10
|
def orders(**kwargs)
|
11
|
+
authorization = mixin_bot ? mixin_bot.access_token("GET", "/me") : ""
|
11
12
|
client.get(
|
12
13
|
"api/orders",
|
13
14
|
headers: {
|
14
|
-
Authorization: "Bearer #{
|
15
|
+
Authorization: "Bearer #{authorization}"
|
15
16
|
},
|
16
17
|
params: {
|
17
18
|
collection_id: kwargs[:collection_id],
|
18
19
|
metahash: kwargs[:metahash],
|
19
20
|
state: kwargs[:state],
|
20
|
-
type: kwargs[:type]
|
21
|
+
type: kwargs[:type],
|
22
|
+
page: kwargs[:page]
|
21
23
|
}
|
22
24
|
)
|
23
25
|
end
|
@@ -32,6 +34,96 @@ module TridentAssistant
|
|
32
34
|
)
|
33
35
|
end
|
34
36
|
|
37
|
+
def ask_order(collection, token, **kwargs)
|
38
|
+
raise ArgumentError, "price cannot be blank" if kwargs[:price].blank?
|
39
|
+
raise ArgumentError, "asset_id cannot be blank" if kwargs[:asset_id].blank?
|
40
|
+
|
41
|
+
trace_id = SecureRandom.uuid
|
42
|
+
token_id = MixinBot::Utils::Nfo.new(collection: collection, token: token).unique_token_id
|
43
|
+
memo =
|
44
|
+
TridentAssistant::Utils::Memo
|
45
|
+
.new(
|
46
|
+
type: "A",
|
47
|
+
order_id: trace_id,
|
48
|
+
token_id: token_id,
|
49
|
+
price: kwargs[:price],
|
50
|
+
asset_id: kwargs[:asset_id],
|
51
|
+
expire_at: kwargs[:expire_at]
|
52
|
+
)
|
53
|
+
|
54
|
+
mixin_bot.create_multisig_transaction(
|
55
|
+
keystore[:pin],
|
56
|
+
{
|
57
|
+
asset_id: EXCHANGE_ASSET_ID,
|
58
|
+
trace_id: trace_id,
|
59
|
+
amount: MINIMUM_AMOUNT,
|
60
|
+
memo: memo.encode,
|
61
|
+
receivers: TridentAssistant::Utils::TRIDENT_MTG[:members],
|
62
|
+
threshold: TridentAssistant::Utils::TRIDENT_MTG[:threshold]
|
63
|
+
}
|
64
|
+
)
|
65
|
+
end
|
66
|
+
|
67
|
+
def auction_order(collection, token, **kwargs)
|
68
|
+
raise ArgumentError, "price cannot be blank" if kwargs[:price].blank?
|
69
|
+
raise ArgumentError, "asset_id cannot be blank" if kwargs[:asset_id].blank?
|
70
|
+
|
71
|
+
trace_id = SecureRandom.uuid
|
72
|
+
token_id = MixinBot::Utils::Nfo.new(collection: collection, token: token).unique_token_id
|
73
|
+
memo =
|
74
|
+
TridentAssistant::Utils::Memo
|
75
|
+
.new(
|
76
|
+
type: "AU",
|
77
|
+
order_id: trace_id,
|
78
|
+
token_id: token_id,
|
79
|
+
price: kwargs[:price],
|
80
|
+
reserve_price: kwargs[:reserve_price],
|
81
|
+
asset_id: kwargs[:asset_id],
|
82
|
+
expire_at: kwargs[:expire_at]
|
83
|
+
)
|
84
|
+
|
85
|
+
mixin_bot.create_multisig_transaction(
|
86
|
+
keystore[:pin],
|
87
|
+
{
|
88
|
+
asset_id: EXCHANGE_ASSET_ID,
|
89
|
+
trace_id: trace_id,
|
90
|
+
amount: MINIMUM_AMOUNT,
|
91
|
+
memo: memo.encode,
|
92
|
+
receivers: TridentAssistant::Utils::TRIDENT_MTG[:members],
|
93
|
+
threshold: TridentAssistant::Utils::TRIDENT_MTG[:threshold]
|
94
|
+
}
|
95
|
+
)
|
96
|
+
end
|
97
|
+
|
98
|
+
def bid_order(collection, token, **kwargs)
|
99
|
+
raise ArgumentError, "price cannot be blank" if kwargs[:price].blank?
|
100
|
+
raise ArgumentError, "asset_id cannot be blank" if kwargs[:asset_id].blank?
|
101
|
+
|
102
|
+
trace_id = SecureRandom.uuid
|
103
|
+
token_id = MixinBot::Utils::Nfo.new(collection: collection, token: token).unique_token_id
|
104
|
+
memo =
|
105
|
+
TridentAssistant::Utils::Memo
|
106
|
+
.new(
|
107
|
+
type: "B",
|
108
|
+
order_id: trace_id,
|
109
|
+
token_id: token_id,
|
110
|
+
asset_id: kwargs[:asset_id],
|
111
|
+
expire_at: kwargs[:expire_at]
|
112
|
+
)
|
113
|
+
|
114
|
+
mixin_bot.create_multisig_transaction(
|
115
|
+
keystore[:pin],
|
116
|
+
{
|
117
|
+
asset_id: kwargs[:asset_id],
|
118
|
+
trace_id: trace_id,
|
119
|
+
amount: kwargs[:price],
|
120
|
+
memo: memo.encode,
|
121
|
+
receivers: TridentAssistant::Utils::TRIDENT_MTG[:members],
|
122
|
+
threshold: TridentAssistant::Utils::TRIDENT_MTG[:threshold]
|
123
|
+
}
|
124
|
+
)
|
125
|
+
end
|
126
|
+
|
35
127
|
def fill_order(order_id)
|
36
128
|
info = order order_id
|
37
129
|
raise "Order state: #{info["state"]}" if info["state"] != "open"
|
@@ -42,9 +134,9 @@ module TridentAssistant
|
|
42
134
|
mixin_bot.create_multisig_transaction(
|
43
135
|
keystore[:pin],
|
44
136
|
{
|
45
|
-
asset_id: info["asset_id"],
|
137
|
+
asset_id: info["type"] == "BidOrder" ? EXCHANGE_ASSET_ID : info["asset_id"],
|
46
138
|
trace_id: trace_id,
|
47
|
-
amount: info["price"],
|
139
|
+
amount: info["type"] == "BidOrder" ? MINIMUM_AMOUNT : info["price"],
|
48
140
|
memo: memo.encode,
|
49
141
|
receivers: TridentAssistant::Utils::TRIDENT_MTG[:members],
|
50
142
|
threshold: TridentAssistant::Utils::TRIDENT_MTG[:threshold]
|
@@ -63,9 +155,9 @@ module TridentAssistant
|
|
63
155
|
mixin_bot.create_multisig_transaction(
|
64
156
|
keystore[:pin],
|
65
157
|
{
|
66
|
-
asset_id:
|
158
|
+
asset_id: EXCHANGE_ASSET_ID,
|
67
159
|
trace_id: trace_id,
|
68
|
-
amount:
|
160
|
+
amount: MINIMUM_AMOUNT,
|
69
161
|
memo: memo.encode,
|
70
162
|
receivers: TridentAssistant::Utils::TRIDENT_MTG[:members],
|
71
163
|
threshold: TridentAssistant::Utils::TRIDENT_MTG[:threshold]
|
@@ -14,16 +14,8 @@ module TridentAssistant
|
|
14
14
|
def initialize(*args)
|
15
15
|
super
|
16
16
|
|
17
|
-
endpoint =
|
18
|
-
|
19
|
-
options[:endpoint]
|
20
|
-
else
|
21
|
-
{
|
22
|
-
prod: "https://thetrident.one",
|
23
|
-
test: "https://trident-test.onrender.com",
|
24
|
-
dev: "http://localhost:3000"
|
25
|
-
}[options[:environment].to_sym]
|
26
|
-
end
|
17
|
+
endpoint = options[:endpoint] || "https://thetrident.one"
|
18
|
+
|
27
19
|
@api =
|
28
20
|
begin
|
29
21
|
TridentAssistant::API.new(
|
@@ -25,6 +25,15 @@ module TridentAssistant
|
|
25
25
|
log r["data"]
|
26
26
|
end
|
27
27
|
|
28
|
+
desc "transfer COLLECTION, TOKEN, RECIPIENT", "transfer NFT"
|
29
|
+
option :keystore, type: :string, aliases: "k", required: true, desc: "keystore or keystore.json file of Mixin bot"
|
30
|
+
def transfer(collection, token, recipient)
|
31
|
+
log api.transfer collection, token, recipient
|
32
|
+
log UI.fmt("{{v}} successfully transfer NFT")
|
33
|
+
rescue StandardError => e
|
34
|
+
log UI.fmt("{{x}} failed: #{e.inspect} #{e.backtrace.join("\n")}")
|
35
|
+
end
|
36
|
+
|
28
37
|
desc "deposit COLLECTION TOKEN", "deposit NFT"
|
29
38
|
option :keystore, type: :string, aliases: "k", required: true, desc: "keystore or keystore.json file of Mixin bot"
|
30
39
|
def deposit(collection, token)
|
@@ -60,18 +69,19 @@ module TridentAssistant
|
|
60
69
|
raise "#{dir} is not a directory" unless Dir.exist?(dir)
|
61
70
|
|
62
71
|
Dir.glob("#{dir}/*.json").each do |file|
|
72
|
+
log "-" * 80
|
63
73
|
log UI.fmt("{{v}} found #{file}")
|
64
74
|
data = TridentAssistant::Utils.parse_json file
|
65
|
-
metadata = TridentAssistant::Utils.parse_metadata data
|
66
|
-
log UI.fmt("{{v}} metadata parsed")
|
67
|
-
metadata.validate!
|
68
|
-
log UI.fmt("{{v}} metadata validated")
|
69
|
-
|
70
75
|
if data.dig("_airdrop", "hash").present?
|
71
76
|
log UI.fmt("{{v}} NFT already transferred")
|
72
77
|
next
|
73
78
|
end
|
74
79
|
|
80
|
+
metadata = TridentAssistant::Utils.parse_metadata data
|
81
|
+
log UI.fmt("{{v}} metadata parsed")
|
82
|
+
metadata.validate!
|
83
|
+
log UI.fmt("{{v}} metadata validated")
|
84
|
+
|
75
85
|
receiver_id = data.dig("_airdrop", "receiver_id")
|
76
86
|
start_at = data.dig("_airdrop", "start_at")
|
77
87
|
log UI.fmt("{{v}} airdrop receiver_id: #{receiver_id}")
|
@@ -93,8 +103,7 @@ module TridentAssistant
|
|
93
103
|
|
94
104
|
private
|
95
105
|
|
96
|
-
def _airdrop
|
97
|
-
end
|
106
|
+
def _airdrop; end
|
98
107
|
end
|
99
108
|
end
|
100
109
|
end
|
@@ -21,14 +21,19 @@ module TridentAssistant
|
|
21
21
|
def bulkmint(dir)
|
22
22
|
raise "#{dir} is not a directory" unless Dir.exist?(dir)
|
23
23
|
|
24
|
-
Dir.glob("#{dir}/*.json")
|
24
|
+
files = Dir.glob("#{dir}/*.json")
|
25
|
+
minted = []
|
26
|
+
files.each do |file|
|
27
|
+
log "-" * 80
|
25
28
|
log UI.fmt("{{v}} found #{file}")
|
26
|
-
_mint
|
29
|
+
minted.push(file) if _mint(file)
|
27
30
|
rescue TridentAssistant::Utils::Metadata::InvalidFormatError, JSON::ParserError, Client::RequestError,
|
28
31
|
MixinBot::Error, RuntimeError => e
|
29
32
|
log UI.fmt("{{x}} #{file} failed: #{e.inspect}")
|
30
33
|
next
|
31
34
|
end
|
35
|
+
ensure
|
36
|
+
log UI.fmt("Found #{files.size} json file, minted #{minted.size}")
|
32
37
|
end
|
33
38
|
|
34
39
|
private
|
@@ -45,6 +50,14 @@ module TridentAssistant
|
|
45
50
|
|
46
51
|
raise "Creator ID incompatible with keystore" if metadata.creator[:id] != api.mixin_bot.client_id
|
47
52
|
|
53
|
+
# upload metadata
|
54
|
+
if data.dig("_mint", "metahash").blank?
|
55
|
+
api.upload_metadata metadata: metadata.json, metahash: metadata.metahash
|
56
|
+
data["_mint"] ||= {}
|
57
|
+
data["_mint"]["metahash"] = metadata.metahash
|
58
|
+
end
|
59
|
+
log UI.fmt("{{v}} metadata uploaded: #{options[:endpoint]}/api/collectibles/#{metadata.metahash}")
|
60
|
+
|
48
61
|
token_id = MixinBot::Utils::Nfo.new(collection: metadata.collection[:id],
|
49
62
|
token: metadata.token[:id]).unique_token_id
|
50
63
|
collectible =
|
@@ -55,40 +68,44 @@ module TridentAssistant
|
|
55
68
|
end
|
56
69
|
if collectible.present?
|
57
70
|
log UI.fmt("{{v}} already minted: #{token_id}")
|
58
|
-
return
|
71
|
+
return true
|
59
72
|
end
|
60
73
|
|
61
|
-
# upload metadata
|
62
|
-
if data.dig("_mint", "metahash").blank?
|
63
|
-
api.upload_metadata metadata: metadata.json, metahash: metadata.metahash
|
64
|
-
data["_mint"] ||= {}
|
65
|
-
data["_mint"]["metahash"] = metadata.metahash
|
66
|
-
end
|
67
|
-
log UI.fmt("{{v}} metadata uploaded: #{options[:endpoint]}/api/collectibles/#{metadata.metahash}")
|
68
|
-
|
69
74
|
# pay to NFO
|
70
75
|
trace_id = data.dig("_mint", "trace_id") || SecureRandom.uuid
|
71
76
|
memo = api.mixin_bot.nft_memo metadata.collection[:id], metadata.token[:id].to_i, metadata.metahash
|
72
|
-
payment =
|
73
|
-
api.mixin_bot.create_multisig_transaction(
|
74
|
-
api.keystore[:pin],
|
75
|
-
{
|
76
|
-
asset_id: TridentAssistant::Utils::MINT_ASSET_ID,
|
77
|
-
trace_id: trace_id,
|
78
|
-
amount: TridentAssistant::Utils::MINT_AMOUNT,
|
79
|
-
memo: memo,
|
80
|
-
receivers: TridentAssistant::Utils::NFO_MTG[:members],
|
81
|
-
threshold: TridentAssistant::Utils::NFO_MTG[:threshold]
|
82
|
-
}
|
83
|
-
)
|
84
77
|
|
85
78
|
data["_mint"]["trace_id"] = trace_id
|
86
|
-
|
79
|
+
loop do
|
80
|
+
payment =
|
81
|
+
begin
|
82
|
+
api.mixin_bot.create_multisig_transaction(
|
83
|
+
api.keystore[:pin],
|
84
|
+
{
|
85
|
+
asset_id: TridentAssistant::Utils::MINT_ASSET_ID,
|
86
|
+
trace_id: trace_id,
|
87
|
+
amount: TridentAssistant::Utils::MINT_AMOUNT,
|
88
|
+
memo: memo,
|
89
|
+
receivers: TridentAssistant::Utils::NFO_MTG[:members],
|
90
|
+
threshold: TridentAssistant::Utils::NFO_MTG[:threshold]
|
91
|
+
}
|
92
|
+
)
|
93
|
+
rescue MixinBot::InsufficientPoolError, MixinBot::HttpError => e
|
94
|
+
log UI.fmt("{{x}} #{e.inspect}")
|
95
|
+
log "Retrying to pay..."
|
96
|
+
sleep 1
|
97
|
+
nil
|
98
|
+
end
|
99
|
+
|
100
|
+
next if payment.blank? || payment["errors"].present?
|
101
|
+
|
87
102
|
log UI.fmt("{{v}} NFT mint payment paid: #{payment["data"]}")
|
88
103
|
data["_mint"]["token_id"] = token_id
|
104
|
+
log UI.fmt("{{v}} NFT successfully minted")
|
105
|
+
break
|
89
106
|
end
|
90
107
|
|
91
|
-
|
108
|
+
data.dig("_mint", "token_id").present?
|
92
109
|
ensure
|
93
110
|
if File.file? raw
|
94
111
|
File.write raw, data.to_json
|
@@ -10,17 +10,20 @@ module TridentAssistant
|
|
10
10
|
MINIMUM_AMOUNT = 0.000_000_01
|
11
11
|
|
12
12
|
desc "index", "list orders"
|
13
|
-
option :keystore, type: :string, aliases: "k", required:
|
13
|
+
option :keystore, type: :string, aliases: "k", required: false,
|
14
|
+
desc: "keystore or keystore.json file of Mixin bot"
|
14
15
|
option :collection, type: :string, aliases: "c", required: false, desc: "collection ID"
|
15
16
|
option :metahash, type: :string, aliases: "m", required: false, desc: "metahash"
|
16
17
|
option :type, type: :string, aliases: "t", required: false, desc: "ask | bid | auction"
|
17
18
|
option :state, type: :string, aliases: "s", required: false, desc: "open | completed"
|
19
|
+
option :page, type: :numeric, aliases: "p", required: false, desc: "page"
|
18
20
|
def index
|
19
21
|
log api.orders(
|
20
22
|
collection_id: options[:collection],
|
21
23
|
metahash: options[:metahash],
|
22
24
|
state: options[:state],
|
23
|
-
type: options[:type]
|
25
|
+
type: options[:type],
|
26
|
+
page: options[:page]
|
24
27
|
)
|
25
28
|
end
|
26
29
|
|
@@ -30,14 +33,36 @@ module TridentAssistant
|
|
30
33
|
log api.order id
|
31
34
|
end
|
32
35
|
|
33
|
-
desc "
|
34
|
-
|
36
|
+
desc "ask COLECTION TOKEN", "sell NFT at fixed price"
|
37
|
+
option :asset, type: :string, aliases: "a", required: true, desc: "Order asset ID"
|
38
|
+
option :price, type: :numeric, aliases: "p", required: true, desc: "Order price"
|
39
|
+
option :expiration, type: :string, aliases: "e", required: false, desc: "Order expiration"
|
40
|
+
option :keystore, type: :string, aliases: "k", required: true, desc: "keystore or keystore.json file of Mixin bot"
|
41
|
+
def ask(collection, token)
|
42
|
+
log api.ask_order collection, token, asset_id: options[:asset], price: options[:price],
|
43
|
+
expire_at: options[:expiration]
|
44
|
+
end
|
35
45
|
|
36
46
|
desc "auction", "auction NFT"
|
37
|
-
|
47
|
+
option :asset, type: :string, aliases: "a", required: true, desc: "Order asset ID"
|
48
|
+
option :price, type: :numeric, aliases: "p", required: true, desc: "Order price"
|
49
|
+
option :reserve_price, type: :numeric, aliases: "r", required: true, desc: "Order reserve price"
|
50
|
+
option :expiration, type: :string, aliases: "e", required: false, desc: "Order expiration"
|
51
|
+
option :keystore, type: :string, aliases: "k", required: true, desc: "keystore or keystore.json file of Mixin bot"
|
52
|
+
def auction(collection, token)
|
53
|
+
log api.auction_order collection, token, asset_id: options[:asset], price: options[:price],
|
54
|
+
reserve_price: options[:reserve_price], expire_at: options[:expiration]
|
55
|
+
end
|
38
56
|
|
39
|
-
desc "bid", "bid NFT"
|
40
|
-
|
57
|
+
desc "bid COLECTION TOKEN", "bid NFT"
|
58
|
+
option :asset, type: :string, aliases: "a", required: true, desc: "Order asset ID"
|
59
|
+
option :price, type: :numeric, aliases: "p", required: true, desc: "Order price"
|
60
|
+
option :expiration, type: :string, aliases: "e", required: false, desc: "Order expiration"
|
61
|
+
option :keystore, type: :string, aliases: "k", required: true, desc: "keystore or keystore.json file of Mixin bot"
|
62
|
+
def bid(collection, token)
|
63
|
+
log api.bid_order collection, token, asset_id: options[:asset], price: options[:price],
|
64
|
+
expire_at: options[:expiration]
|
65
|
+
end
|
41
66
|
|
42
67
|
desc "fill ID", "fill order"
|
43
68
|
option :keystore, type: :string, aliases: "k", required: true, desc: "keystore or keystore.json file of Mixin bot"
|
@@ -50,28 +75,6 @@ module TridentAssistant
|
|
50
75
|
def cancel(id)
|
51
76
|
log api.cancel_order id
|
52
77
|
end
|
53
|
-
|
54
|
-
desc "deposit TOKEN", "deposit NFT"
|
55
|
-
def deposit(token)
|
56
|
-
log api.deposit_nft token
|
57
|
-
end
|
58
|
-
|
59
|
-
desc "withdraw TOKEN", "withdraw NFT"
|
60
|
-
option :keystore, type: :string, aliases: "k", required: true, desc: "keystore or keystore.json file of Mixin bot"
|
61
|
-
def withdraw(token)
|
62
|
-
payment =
|
63
|
-
api.mixin_bot.create_multisig_transaction(
|
64
|
-
keystore[:pin],
|
65
|
-
asset_id: EXCHANGE_ASSET_ID,
|
66
|
-
amount: MINIMUM_AMOUNT,
|
67
|
-
receivers: TridentAssistant::Utils::TRIDENT_MTG[:members],
|
68
|
-
threshold: TridentAssistant::Utils::TRIDENT_MTG[:threshold],
|
69
|
-
memo: TridentAssistant::Utils::Memo.new(type: "W", token_id: token).encode,
|
70
|
-
trace_id: SecureRandom.uuid
|
71
|
-
)
|
72
|
-
|
73
|
-
log UI.fmt("{{v}} payment: #{payment}")
|
74
|
-
end
|
75
78
|
end
|
76
79
|
end
|
77
80
|
end
|
@@ -13,9 +13,8 @@ module TridentAssistant
|
|
13
13
|
module CLI
|
14
14
|
# Main commands of CLI
|
15
15
|
class Command < TridentAssistant::CLI::Base
|
16
|
-
class_option :pretty, type: :boolean, aliases: "-p", default: true, desc: "Print output in pretty"
|
17
|
-
class_option :environment, type: :string, aliases: "-e", default: "prod", desc: "prod | test | dev"
|
18
16
|
class_option :endpoint, type: :string, aliases: "-E", desc: "Specify an endpoint"
|
17
|
+
class_option :pretty, type: :boolean, aliases: "-P", default: true, desc: "Print output in pretty"
|
19
18
|
|
20
19
|
desc "version", "Display TridentAssistant version"
|
21
20
|
def version
|
@@ -44,7 +44,7 @@ module TridentAssistant
|
|
44
44
|
R: reserve_price && format("%.8f", reserve_price.to_f).gsub(/(0)+\z/, ""),
|
45
45
|
RC: receiver_id && MixinBot::Utils::UUID.new(hex: receiver_id).packed,
|
46
46
|
S: start_at && Time.parse(start_at).to_i,
|
47
|
-
E: expire_at && Time.parse(
|
47
|
+
E: expire_at && Time.parse(expire_at).to_i
|
48
48
|
}.compact
|
49
49
|
|
50
50
|
@encoded =
|
@@ -30,6 +30,14 @@ module TridentAssistant
|
|
30
30
|
].sort,
|
31
31
|
threshold: 3
|
32
32
|
}.freeze
|
33
|
+
# TRIDENT_MTG = {
|
34
|
+
# members: %w[
|
35
|
+
# 28d390c7-a31b-4c46-bec2-871c86aaec53
|
36
|
+
# 0508a116-1239-4e28-b150-85a8e3e6b400
|
37
|
+
# 7ed9292d-7c95-4333-aa48-a8c640064186
|
38
|
+
# ].sort,
|
39
|
+
# threshold: 2
|
40
|
+
# }.freeze
|
33
41
|
|
34
42
|
class << self
|
35
43
|
def hash_from_url(url)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trident_assistant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- an-lee
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-04-
|
11
|
+
date: 2022-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mixin_bot
|
@@ -36,7 +36,6 @@ files:
|
|
36
36
|
- CHANGELOG.md
|
37
37
|
- CODE_OF_CONDUCT.md
|
38
38
|
- Gemfile
|
39
|
-
- Gemfile.lock
|
40
39
|
- LICENSE.txt
|
41
40
|
- README.md
|
42
41
|
- Rakefile
|
data/Gemfile.lock
DELETED
@@ -1,106 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
trident_assistant (0.1.0)
|
5
|
-
mixin_bot (~> 0.8)
|
6
|
-
|
7
|
-
GEM
|
8
|
-
remote: https://rubygems.org/
|
9
|
-
specs:
|
10
|
-
activesupport (7.0.2.3)
|
11
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
12
|
-
i18n (>= 1.6, < 2)
|
13
|
-
minitest (>= 5.1)
|
14
|
-
tzinfo (~> 2.0)
|
15
|
-
addressable (2.8.0)
|
16
|
-
public_suffix (>= 2.0.2, < 5.0)
|
17
|
-
ast (2.4.2)
|
18
|
-
awesome_print (1.9.2)
|
19
|
-
bcrypt (3.1.17)
|
20
|
-
cli-ui (1.5.1)
|
21
|
-
concurrent-ruby (1.1.10)
|
22
|
-
domain_name (0.5.20190701)
|
23
|
-
unf (>= 0.0.5, < 1.0.0)
|
24
|
-
eventmachine (1.2.7)
|
25
|
-
faye-websocket (0.11.1)
|
26
|
-
eventmachine (>= 0.12.0)
|
27
|
-
websocket-driver (>= 0.5.1)
|
28
|
-
ffi (1.15.5)
|
29
|
-
ffi-compiler (1.0.1)
|
30
|
-
ffi (>= 1.0.0)
|
31
|
-
rake
|
32
|
-
hamster (3.0.0)
|
33
|
-
concurrent-ruby (~> 1.0)
|
34
|
-
http (4.4.1)
|
35
|
-
addressable (~> 2.3)
|
36
|
-
http-cookie (~> 1.0)
|
37
|
-
http-form_data (~> 2.2)
|
38
|
-
http-parser (~> 1.2.0)
|
39
|
-
http-cookie (1.0.4)
|
40
|
-
domain_name (~> 0.5)
|
41
|
-
http-form_data (2.3.0)
|
42
|
-
http-parser (1.2.3)
|
43
|
-
ffi-compiler (>= 1.0, < 2.0)
|
44
|
-
i18n (1.10.0)
|
45
|
-
concurrent-ruby (~> 1.0)
|
46
|
-
jose (1.1.3)
|
47
|
-
hamster
|
48
|
-
minitest (5.15.0)
|
49
|
-
mixin_bot (0.8.4)
|
50
|
-
activesupport (>= 5)
|
51
|
-
awesome_print (~> 1.8)
|
52
|
-
bcrypt (~> 3.1)
|
53
|
-
cli-ui (~> 1.3)
|
54
|
-
faye-websocket (>= 0.11)
|
55
|
-
http (~> 4.1)
|
56
|
-
jose (~> 1.1)
|
57
|
-
msgpack (~> 1.3)
|
58
|
-
rbnacl (~> 7.1)
|
59
|
-
sha3 (~> 1.0)
|
60
|
-
thor (~> 1.0)
|
61
|
-
msgpack (1.5.1)
|
62
|
-
parallel (1.22.1)
|
63
|
-
parser (3.1.1.0)
|
64
|
-
ast (~> 2.4.1)
|
65
|
-
public_suffix (4.0.6)
|
66
|
-
rainbow (3.1.1)
|
67
|
-
rake (13.0.6)
|
68
|
-
rbnacl (7.1.1)
|
69
|
-
ffi
|
70
|
-
regexp_parser (2.2.1)
|
71
|
-
rexml (3.2.5)
|
72
|
-
rubocop (1.26.1)
|
73
|
-
parallel (~> 1.10)
|
74
|
-
parser (>= 3.1.0.0)
|
75
|
-
rainbow (>= 2.2.2, < 4.0)
|
76
|
-
regexp_parser (>= 1.8, < 3.0)
|
77
|
-
rexml
|
78
|
-
rubocop-ast (>= 1.16.0, < 2.0)
|
79
|
-
ruby-progressbar (~> 1.7)
|
80
|
-
unicode-display_width (>= 1.4.0, < 3.0)
|
81
|
-
rubocop-ast (1.16.0)
|
82
|
-
parser (>= 3.1.1.0)
|
83
|
-
ruby-progressbar (1.11.0)
|
84
|
-
sha3 (1.0.4)
|
85
|
-
thor (1.2.1)
|
86
|
-
tzinfo (2.0.4)
|
87
|
-
concurrent-ruby (~> 1.0)
|
88
|
-
unf (0.1.4)
|
89
|
-
unf_ext
|
90
|
-
unf_ext (0.0.8.1)
|
91
|
-
unicode-display_width (2.1.0)
|
92
|
-
websocket-driver (0.7.5)
|
93
|
-
websocket-extensions (>= 0.1.0)
|
94
|
-
websocket-extensions (0.1.5)
|
95
|
-
|
96
|
-
PLATFORMS
|
97
|
-
x86_64-linux
|
98
|
-
|
99
|
-
DEPENDENCIES
|
100
|
-
minitest (~> 5.0)
|
101
|
-
rake (~> 13.0)
|
102
|
-
rubocop (~> 1.21)
|
103
|
-
trident_assistant!
|
104
|
-
|
105
|
-
BUNDLED WITH
|
106
|
-
2.2.30
|