mercado_bitcoin 0.5.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mb_console +3 -2
  3. data/bin/mb_console_new +15 -0
  4. data/lib/mercado_bitcoin.rb +1 -0
  5. data/lib/mercado_bitcoin/base_api_call.rb +3 -3
  6. data/lib/mercado_bitcoin/console.rb +36 -6
  7. data/lib/mercado_bitcoin/console/command_parse.rb +53 -0
  8. data/lib/mercado_bitcoin/console/commands.rb +11 -0
  9. data/lib/mercado_bitcoin/console/commands/account.rb +18 -0
  10. data/lib/mercado_bitcoin/console/commands/account/withdraw.rb +19 -0
  11. data/lib/mercado_bitcoin/console/commands/account/withdraw/brl.rb +12 -0
  12. data/lib/mercado_bitcoin/console/commands/account/withdraw/btc.rb +20 -0
  13. data/lib/mercado_bitcoin/console/commands/account/withdraw/get.rb +13 -0
  14. data/lib/mercado_bitcoin/console/commands/account/withdraw/ltc.rb +12 -0
  15. data/lib/mercado_bitcoin/console/commands/base.rb +55 -0
  16. data/lib/mercado_bitcoin/console/commands/base_no_take_command.rb +5 -0
  17. data/lib/mercado_bitcoin/console/commands/book.rb +20 -0
  18. data/lib/mercado_bitcoin/console/commands/order.rb +15 -0
  19. data/lib/mercado_bitcoin/console/commands/order/buy.rb +14 -0
  20. data/lib/mercado_bitcoin/console/commands/order/cancel.rb +12 -0
  21. data/lib/mercado_bitcoin/console/commands/order/get.rb +12 -0
  22. data/lib/mercado_bitcoin/console/commands/order/list.rb +48 -0
  23. data/lib/mercado_bitcoin/console/commands/order/sell.rb +14 -0
  24. data/lib/mercado_bitcoin/console/commands/system.rb +15 -0
  25. data/lib/mercado_bitcoin/console/commands/ticker.rb +5 -0
  26. data/lib/mercado_bitcoin/errors.rb +1 -0
  27. data/lib/mercado_bitcoin/trade_api.rb +16 -3
  28. data/lib/mercado_bitcoin/version.rb +1 -1
  29. data/mercado_bitcoin.gemspec +1 -0
  30. metadata +36 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6025df04b0aa23fac07d2558151eca505e1b1846
4
- data.tar.gz: 5ef2021541f98e82b7e03a922bb953ac10b95ee1
3
+ metadata.gz: d2c806d3d9c216ed908be9b78444eba4b835d10d
4
+ data.tar.gz: 4d4c4981a3fa9346a9a8125e29b699a500b88718
5
5
  SHA512:
6
- metadata.gz: 18bbaee0f9571f402291a71508145fd367d1c9b0e1ebfcd71ccfeef529fdb80fb61c983750b2ec0115c7f2153488c6a4c32ca8cdc7694862a2ddfb95b43e53db
7
- data.tar.gz: 84329dddeb56770a65daa444234b62fa365184be0573cfb3767fb3460ea5768e2f8b083b6c55dbd16600c3f7a7c1e5544ad7598f25759ec86052041dfc114473
6
+ metadata.gz: 3e91872f735cb238f76ce383dedaa8cbf465d04bddd220da2fa5e89f886fae88fb6f85498db204fe459cf926ff274254dc1146c0ecc240d08923caaa38c9d369
7
+ data.tar.gz: 23fcf50f576909af42e303209f7971debef0154bb877453a0f11d6d162c8fa61b0e048b0ff15e39a5cbc7356432d6c11232af9ec1122d3ed174d66599f7bf484
data/bin/mb_console CHANGED
@@ -17,7 +17,8 @@ def options
17
17
  key: ENV['MB_API_KEY'],
18
18
  code: ENV['MB_SECRET_KEY'],
19
19
  coin_pair: ENV['MB_COIN_PAIR'] || MercadoBitcoin::TradeApi::BTC,
20
- pretty_print: true
20
+ pretty_print: true,
21
+ status_list: '2'
21
22
  }
22
23
  end
23
24
 
@@ -73,7 +74,7 @@ opt_parser = OptionParser.new do |opts|
73
74
  options[:order_type] = v
74
75
  end
75
76
 
76
- opts.on("--status-list [STATUS_LIST]", [:open, :cancelled, :filled, 2, 3, 4], "lista separada por virgulas: (open|2)|(cancelled|3)|(filled|4)") do |v|
77
+ opts.on("--status-list [STATUS_LIST]", ['open', 'cancelled', 'filled', 2, 3, 4], "lista separada por virgulas: (open|2)|(cancelled|3)|(filled|4) default: open") do |v|
77
78
  options[:status_list] = v
78
79
  end
79
80
 
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler'
4
+ require 'json'
5
+ Bundler.setup
6
+
7
+ require 'byebug'
8
+ require 'pry'
9
+ require 'dotenv'
10
+ Dotenv.load
11
+
12
+ require 'mercado_bitcoin'
13
+
14
+ console = MercadoBitcoin::Console.new
15
+ console.run!
@@ -6,6 +6,7 @@ require 'json'
6
6
 
7
7
  module MercadoBitcoin
8
8
  require 'mercado_bitcoin/errors'
9
+ require 'mercado_bitcoin/version'
9
10
  autoload :Console, 'mercado_bitcoin/console'
10
11
  autoload :Api, 'mercado_bitcoin/api'
11
12
  autoload :TradeApi, 'mercado_bitcoin/trade_api'
@@ -1,6 +1,6 @@
1
1
  module MercadoBitcoin
2
2
  class BaseApiCall
3
- attr_accessor :coin, :parser, :rest_client, :parser_error_class
3
+ attr_accessor :coin, :parser, :rest_client, :parser_error_class, :parsed
4
4
  def initialize(coin = :bitcoin, opts = {})
5
5
  @coin = coin.to_s.downcase.to_sym
6
6
  raise MercadoBitcoin::CoinTypeError.new("bitcoin or litecoin expected #{coin} received") unless valid_coin?
@@ -14,7 +14,7 @@ module MercadoBitcoin
14
14
  end
15
15
 
16
16
  def fetch
17
- parsed = parse(get(url))
17
+ @parsed = parse(get(url))
18
18
  model.new(parsed)
19
19
  end
20
20
 
@@ -31,7 +31,7 @@ module MercadoBitcoin
31
31
  end
32
32
 
33
33
  def bitcoin?
34
- coin == :bitcoin
34
+ coin == :bitcoin
35
35
  end
36
36
 
37
37
  def litecoin?
@@ -1,18 +1,39 @@
1
1
  class MercadoBitcoin::Console
2
2
  attr_accessor :options
3
3
 
4
- # Laizy way to check parameters :)
5
- def initialize(key:, code:, coin_pair:, **opts)
6
- @options = opts || {}
7
- @options[:key] = key
8
- @options[:code] = code
9
- @options[:coin_pair] = coin_pair
4
+ def initialize(opts = {})
5
+ @options = default_options.merge(opts)
6
+ end
7
+
8
+ def run!
9
+ option_parser.parse(self)
10
+ end
11
+
12
+ def option_parser
13
+ @option_parser ||= MercadoBitcoin::Console::CommandParse.new
14
+ end
15
+
16
+ def default_options
17
+ @options ||= {
18
+ key: ENV['MB_API_KEY'],
19
+ code: ENV['MB_SECRET_KEY'],
20
+ coin_pair: ENV['MB_COIN_PAIR'] || MercadoBitcoin::TradeApi::BTC,
21
+ pretty_print: true,
22
+ status_list: '2'
23
+ }
10
24
  end
11
25
 
12
26
  def exec(command, opts)
13
27
  print send(command, *opts)
14
28
  end
15
29
 
30
+ def ticker(*args)
31
+ MercadoBitcoin::Ticker
32
+ .new(options[:coin_pair] == MercadoBitcoin::TradeApi::BTC ? :bitcoin : :litecoin)
33
+ .tap { |t| t.fetch }
34
+ .parsed
35
+ end
36
+
16
37
  def list_system_messages(*args)
17
38
  trade_api.list_system_messages
18
39
  end
@@ -92,6 +113,12 @@ class MercadoBitcoin::Console
92
113
  end
93
114
  end
94
115
 
116
+ def withdrawal_coin(*args)
117
+ prms = params.dup
118
+ prms = params.merge(args.first) if args.count == 1 and args.first.is_a?(Hash)
119
+ trade_api.withdrawal_coin(**prms)
120
+ end
121
+
95
122
  private
96
123
 
97
124
  def print(value)
@@ -114,3 +141,6 @@ class MercadoBitcoin::Console
114
141
  )
115
142
  end
116
143
  end
144
+
145
+ require 'mercado_bitcoin/console/commands'
146
+ require 'mercado_bitcoin/console/command_parse'
@@ -0,0 +1,53 @@
1
+ class MercadoBitcoin::Console::CommandParse
2
+ attr_accessor :console
3
+
4
+ class << self
5
+ def parse(console)
6
+ new.parse(console)
7
+ end
8
+ end
9
+
10
+ def parse(console)
11
+ @console = console
12
+ parser.add_command(CmdParse::HelpCommand.new, default: true)
13
+ parser.add_command(CmdParse::VersionCommand.new)
14
+ MercadoBitcoin::Console::Commands::Base.command_classes.each do |command|
15
+ parser.add_command(command.new(console))
16
+ end
17
+ global_options
18
+ parser.parse
19
+ end
20
+
21
+ def global_options
22
+ parser.global_options do |opts|
23
+ opts.on("-k", "--api-key MB_API_KEY", "api key") do |v|
24
+ console.options[:code] = v
25
+ end
26
+
27
+ opts.on("-s", "--secret-key MB_SECRET_KEY", "secret key") do |v|
28
+ console.options[:key] = v
29
+ end
30
+
31
+ opts.on("--coin-pair MB_COIN_PAIR", [:brlbtc, :brlltc, :brl], "coin_pair (brlbtc | brlltc | brl), padrão: brlbtc") do |v|
32
+ console.options[:coin_pair] = v.to_s.to_upper
33
+ end
34
+
35
+ opts.on("--[no-]pretty-print", "Mostra (ou não) o json de saida formatado, saída formatada é a default") do |v|
36
+ console.options[:pretty_print] = v
37
+ end
38
+
39
+ opts.on("--[no-]debug", "debug info printed") do |v|
40
+ console.options[:debug] = v
41
+ end
42
+ end
43
+ end
44
+
45
+ def parser
46
+ @parser ||= CmdParse::CommandParser.new.tap do |init|
47
+ init.main_options.program_name = "mb_console"
48
+ init.main_options.version = MercadoBitcoin::VERSION
49
+ init.main_options.banner = "MercadoBitcoin Console"
50
+ init.help_line_width = 160
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,11 @@
1
+ module MercadoBitcoin::Console::Commands
2
+ end
3
+
4
+ require 'cmdparse'
5
+ require 'mercado_bitcoin/console/commands/base'
6
+ require 'mercado_bitcoin/console/commands/base_no_take_command'
7
+ require 'mercado_bitcoin/console/commands/account'
8
+ require 'mercado_bitcoin/console/commands/order'
9
+ require 'mercado_bitcoin/console/commands/system'
10
+ require 'mercado_bitcoin/console/commands/book'
11
+ require 'mercado_bitcoin/console/commands/ticker'
@@ -0,0 +1,18 @@
1
+ class MercadoBitcoin::Console::Commands::Account < MercadoBitcoin::Console::Commands::Base
2
+ short_desc 'account operations'
3
+
4
+ def after_initialize
5
+ add_command(Info.new(console))
6
+ add_command(Withdraw.new(console))
7
+ end
8
+
9
+ def execute(*args)
10
+ end
11
+
12
+ class Info < MercadoBitcoin::Console::Commands::BaseNoTakeCommand
13
+ short_desc 'get_account_info'
14
+ long_desc 'Retorna dados da conta, como saldos das moedas (Real, Bitcoin e Litecoin), saldos considerando retenção em ordens abertas, quantidades de ordens abertas por moeda digital, limites de saque/retirada das moedas.'
15
+ end
16
+ end
17
+
18
+ require 'mercado_bitcoin/console/commands/account/withdraw'
@@ -0,0 +1,19 @@
1
+ class MercadoBitcoin::Console::Commands::Account::Withdraw < MercadoBitcoin::Console::Commands::Base
2
+ short_desc 'withdraw'
3
+
4
+ def after_initialize
5
+ add_command(Get.new(console))
6
+ add_command(BTC.new(console))
7
+ add_command(BRL.new(console))
8
+ add_command(LTC.new(console))
9
+ options do |opts|
10
+ opts.on("--description [DESCRIPTION]", "Texto livre para auxiliar o usuário a relacionar a retirada/saque com atividades externas.") do |v|
11
+ console.options[:description] = v
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ Dir[File.expand_path('../withdraw/*.rb', __FILE__)].each do |file|
18
+ require file
19
+ end
@@ -0,0 +1,12 @@
1
+ class MercadoBitcoin::Console::Commands::Account::Withdraw::BRL < MercadoBitcoin::Console::Commands::BaseNoTakeCommand
2
+ short_desc 'withdrawal_coin'
3
+ long_desc 'Saques de Real'
4
+
5
+ def after_initialize
6
+ argument_desc(quantity: 'Valor bruto do saque.', account_ref: 'ID de uma conta bancária já cadastrada e marcada como confiável')
7
+ end
8
+
9
+ def execute(quantity, account_ref)
10
+ super(coin: 'brl', quantity: quantity, account_ref: account_ref)
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ class MercadoBitcoin::Console::Commands::Account::Withdraw::BTC < MercadoBitcoin::Console::Commands::BaseNoTakeCommand
2
+ short_desc 'withdrawal_coin'
3
+ long_desc 'Saques de BTC'
4
+
5
+ def after_initialize
6
+ argument_desc(quantity: 'Valor bruto do saque.', address: 'Endereço Bitcoin marcado como confiável')
7
+ options do |opts|
8
+ opts.on("--[no-]tx-aggregate", "retirada pode ser feita junto de outras retiradas em uma mesma transação no Blockchain.") do |v|
9
+ console.options[:tx_aggregate] = v
10
+ end
11
+ opts.on("--[no-]via-blockchain", "retirada para endereço no Mercado Bitcoin pode ser feita via Blockchain para gerar uma transação na rede Bitcoin.") do |v|
12
+ console.options[:via_blockchain] = v
13
+ end
14
+ end
15
+ end
16
+
17
+ def execute(quantity, address)
18
+ super(coin: 'btc', quantity: quantity, address: address)
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+ class MercadoBitcoin::Console::Commands::Account::Withdraw::Get < MercadoBitcoin::Console::Commands::BaseNoTakeCommand
2
+ short_desc 'get_withdrawal'
3
+ long_desc 'Retorna os dados de uma retirada de moeda digital (BTC, LTC) ou de um saque de Real (BRL).'
4
+
5
+ def after_initialize
6
+ argument_desc(withdraw_id: 'Número de identificação da retirada/saque, único por coin.', coin: 'BRL|BTC|LCT')
7
+ end
8
+
9
+ def execute(coin, withdraw_id)
10
+ console.options[:coin_pair] = coin
11
+ super(withdraw_id)
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ class MercadoBitcoin::Console::Commands::Account::Withdraw::LTC < MercadoBitcoin::Console::Commands::BaseNoTakeCommand
2
+ short_desc 'withdrawal_coin'
3
+ long_desc 'Saques de LTC'
4
+
5
+ def after_initialize
6
+ argument_desc(quantity: 'Valor bruto do saque.', address: 'Endereço Litecoin marcado como confiável')
7
+ end
8
+
9
+ def execute(quantity, address)
10
+ super(coin: 'ltc', quantity: quantity, address: address)
11
+ end
12
+ end
@@ -0,0 +1,55 @@
1
+ class MercadoBitcoin::Console::Commands::Base < CmdParse::Command
2
+ class << self
3
+ def inherited(klass)
4
+ (@klasses ||= []) << klass
5
+ end
6
+
7
+ def command_classes
8
+ @command_classes ||= @klasses.select do |klass|
9
+ !(klass.to_s =~ /Base/) && klass.to_s.split('::').count == 4
10
+ end
11
+ end
12
+
13
+ def short_desc(*args)
14
+ if args.count > 0
15
+ @short_desc = args.first
16
+ end
17
+ @short_desc
18
+ end
19
+
20
+ def long_desc(*args)
21
+ if args.count > 0
22
+ @long_desc = args.first
23
+ end
24
+ @long_desc
25
+ end
26
+
27
+ def take_commands(*args)
28
+ if args.count > 0
29
+ @take_commands = args.first
30
+ end
31
+ @take_commands.nil? ? true : @take_commands
32
+ end
33
+ end
34
+
35
+ attr_accessor :console
36
+
37
+ def initialize(console)
38
+ @console = console
39
+ super(self.class.to_s.split('::').last.downcase, takes_commands: take_commands)
40
+ self.short_desc = self.class.short_desc
41
+ self.long_desc = self.class.long_desc
42
+ after_initialize
43
+ end
44
+
45
+ def take_commands
46
+ self.class.take_commands
47
+ end
48
+
49
+ def after_initialize
50
+ end
51
+
52
+ def execute(*args)
53
+ console.exec short_desc, args
54
+ end
55
+ end
@@ -0,0 +1,5 @@
1
+ class MercadoBitcoin::Console::Commands::BaseNoTakeCommand < MercadoBitcoin::Console::Commands::Base
2
+ def take_commands
3
+ false
4
+ end
5
+ end
@@ -0,0 +1,20 @@
1
+ class MercadoBitcoin::Console::Commands::Book < MercadoBitcoin::Console::Commands::Base
2
+ short_desc 'book operations'
3
+
4
+ def after_initialize
5
+ add_command(List.new(console))
6
+ end
7
+
8
+ class List < MercadoBitcoin::Console::Commands::BaseNoTakeCommand
9
+ short_desc 'list_orderbook'
10
+ long_desc 'Retorna uma lista de até 200 ordens, de acordo com os filtros informados, ordenadas pela data de última atualização. As operações executadas de cada ordem também são retornadas. Apenas ordens que pertencem ao proprietário da chave da TAPI são retornadas. Caso nenhuma ordem seja encontrada, é retornada uma lista vazia.'
11
+
12
+ def after_initialize
13
+ options do |opts|
14
+ opts.on("--[no-]full", "Indica quantidades de ordens retornadas no livro.") do |v|
15
+ console.options[:full] = v
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ class MercadoBitcoin::Console::Commands::Order < MercadoBitcoin::Console::Commands::Base
2
+ short_desc 'order operations'
3
+
4
+ def after_initialize
5
+ add_command(List.new(console))
6
+ add_command(Get.new(console))
7
+ add_command(Cancel.new(console))
8
+ add_command(Buy.new(console))
9
+ add_command(Sell.new(console))
10
+ end
11
+ end
12
+
13
+ Dir[File.expand_path('../order/*.rb', __FILE__)].each do |file|
14
+ require file
15
+ end
@@ -0,0 +1,14 @@
1
+ class MercadoBitcoin::Console::Commands::Order::Buy < MercadoBitcoin::Console::Commands::BaseNoTakeCommand
2
+ short_desc 'place_buy_order'
3
+ long_desc 'Abre uma ordem de compra (buy ou bid) do par de moedas, quantidade de moeda digital e preço unitário limite informados. A criação contempla o processo de confrontamento da ordem com o livro de negociações. Assim, a resposta pode informar se a ordem foi executada (parcialmente ou não) imediatamente após sua criação e, assim, se segue ou não aberta e ativa no livro.'
4
+
5
+ def after_initialize
6
+ argument_desc(quantity: 'Quantidade da moeda digital a comprar/vender ao preço de price. (até 8 decimais, separador decimal: .)'+"\n", price: 'Preço unitário máximo de compra ou mínimo de venda. (até 5 decimais, separador decimal: .)')
7
+ end
8
+
9
+ def execute(quantity, price)
10
+ console.options[:quantity] = quantity.to_f
11
+ console.options[:limit_price] = price.to_f
12
+ super
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ class MercadoBitcoin::Console::Commands::Order::Cancel < MercadoBitcoin::Console::Commands::BaseNoTakeCommand
2
+ short_desc 'cancel_order'
3
+ long_desc 'Retorna uma lista de até 200 ordens, de acordo com os filtros informados, ordenadas pela data de última atualização. As operações executadas de cada ordem também são retornadas. Apenas ordens que pertencem ao proprietário da chave da TAPI são retornadas. Caso nenhuma ordem seja encontrada, é retornada uma lista vazia.'
4
+
5
+ def after_initialize
6
+ argument_desc(order_id: 'Número de identificação único da ordem por coin_pair.')
7
+ end
8
+
9
+ def execute(order_id)
10
+ super
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ class MercadoBitcoin::Console::Commands::Order::Get < MercadoBitcoin::Console::Commands::BaseNoTakeCommand
2
+ short_desc 'get_order'
3
+ long_desc 'Retorna os dados da ordem de acordo com o ID informado. Dentre os dados estão as informações das Operações executadas dessa ordem. Apenas ordens que pertencem ao proprietário da chave da TAPI pode ser consultadas. Erros específicos são retornados para os casos onde o order_id informado não seja de uma ordem válida ou pertença a outro usuário.'
4
+
5
+ def after_initialize
6
+ argument_desc(order_id: 'Número de identificação único da ordem por coin_pair.')
7
+ end
8
+
9
+ def execute(order_id)
10
+ super
11
+ end
12
+ end
@@ -0,0 +1,48 @@
1
+ class MercadoBitcoin::Console::Commands::Order::List < MercadoBitcoin::Console::Commands::BaseNoTakeCommand
2
+ StatusList = ['open', 'cancelled', 'filled', 2, 3, 4]
3
+ StatusListHelper = "lista separada por virgulas: (open|2)|(cancelled|3)|(filled|4) default: open"
4
+
5
+ short_desc 'list_orders'
6
+ long_desc 'Retorna uma lista de até 200 ordens, de acordo com os filtros informados, ordenadas pela data de última atualização. As operações executadas de cada ordem também são retornadas. Apenas ordens que pertencem ao proprietário da chave da TAPI são retornadas. Caso nenhuma ordem seja encontrada, é retornada uma lista vazia.'
7
+
8
+ def after_initialize
9
+ options do |opts|
10
+ opts.on("--order-type [BUY_SELL_OR_CODE]", ['buy', 'sell', '1', '2'], "tipo de ordem, (BUY | SELL | 1 | 2), sem default") do |v|
11
+ console.options[:order_type] = v
12
+ end
13
+
14
+ opts.on("--status-list [STATUS_LIST]", StatusList, StatusListHelper) do |v|
15
+ console.options[:status_list] = v
16
+ end
17
+
18
+ opts.on("--[no-]has-fills", "Filtro para ordens com ou sem execução") do |v|
19
+ console.options[:has_fills] = v
20
+ end
21
+
22
+ opts.on("--from-id [FROM_ID]", "Filtro para orders a partir do ID informado (inclusive).") do |v|
23
+ console.options[:from_id] = v
24
+ end
25
+
26
+ opts.on("--to-id [TO_ID]", "Filtro para orders até do ID informado (inclusive).") do |v|
27
+ console.options[:to_id] = v
28
+ end
29
+
30
+ opts.on("--from-timestamp [FROM_TIMESTAMP]", "Filtro para orders criadas a partir do timestamp informado (inclusive).") do |v|
31
+ console.options[:from_timestamp] = v
32
+ end
33
+
34
+ opts.on("--to-timestamp [TO_TIMESTAMP]", "Filtro para orders criadas até do timestamp informado (inclusive).") do |v|
35
+ console.options[:to_timestamp] = v
36
+ end
37
+ end
38
+
39
+ argument_desc(kind_list: StatusListHelper)
40
+ end
41
+
42
+ def execute(*args)
43
+ if(args.count > 0)
44
+ console.options[:status_list] = (StatusList & args).uniq.join(',')
45
+ end
46
+ console.exec short_desc, console.options
47
+ end
48
+ end
@@ -0,0 +1,14 @@
1
+ class MercadoBitcoin::Console::Commands::Order::Sell < MercadoBitcoin::Console::Commands::BaseNoTakeCommand
2
+ short_desc 'place_sell_order'
3
+ long_desc 'Abre uma ordem de venda (sell ou ask) do par de moedas, quantidade de moeda digital e preço unitário limite informados. A criação contempla o processo de confrontamento da ordem com o livro de negociações. Assim, a resposta pode informar se a ordem foi executada (parcialmente ou não) imediatamente após sua criação e, assim, se segue ou não aberta e ativa no livro.'
4
+
5
+ def after_initialize
6
+ argument_desc(quantity: 'Quantidade da moeda digital a comprar/vender ao preço de price. (até 8 decimais, separador decimal: .)'+"\n", price: 'Preço unitário máximo de compra ou mínimo de venda. (até 5 decimais, separador decimal: .)')
7
+ end
8
+
9
+ def execute(quantity, price)
10
+ console.options[:quantity] = quantity.to_f
11
+ console.options[:limit_price] = price.to_f
12
+ super
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ class MercadoBitcoin::Console::Commands::System < MercadoBitcoin::Console::Commands::Base
2
+ short_desc 'system operations'
3
+
4
+ def after_initialize
5
+ add_command(Messages.new(console))
6
+ end
7
+
8
+ def execute(*args)
9
+ end
10
+
11
+ class Messages < MercadoBitcoin::Console::Commands::BaseNoTakeCommand
12
+ short_desc 'list_system_messages'
13
+ long_desc 'Método para comunicação de eventos do sistema relativos à TAPÌ, entre eles bugs, correções, manutenção programada e novas funcionalidades e versões. O conteúdo muda a medida que os eventos ocorrem. A comunicação externa, feita via Twitter e e-mail aos usuários da TAPI, continuará ocorrendo. Entretanto, essa forma permite ao desenvolvedor tratar as informações juntamente ao seus logs ou até mesmo automatizar comportamentos.'
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ class MercadoBitcoin::Console::Commands::Ticker < MercadoBitcoin::Console::Commands::Base
2
+ take_commands false
3
+ short_desc 'ticker'
4
+ long_desc 'Retorna as informações do mercado de bitcoin ou litecoin.'
5
+ end
@@ -4,4 +4,5 @@ module MercadoBitcoin
4
4
  class CoinTypeError < Error; end
5
5
  class TonceDesyncError < Error; end
6
6
  class TonceAlreadyUsed < Error; end
7
+ class MissingParameter < Error; end
7
8
  end
@@ -84,17 +84,29 @@ module MercadoBitcoin
84
84
  post(params)
85
85
  end
86
86
 
87
- def get_withdrawal(coin_pair: BTC, withdrawal_id:)
87
+ def get_withdrawal(coin: 'BTC', withdrawal_id:)
88
88
  params = base_params('get_withdrawal')
89
+ params[:coin] = coin.upcase
89
90
  params[:withdrawal_id] = withdrawal_id
90
91
  post(params)
91
92
  end
92
93
 
93
- def withdraw_coin(coin_pair: BTC, quantity:, destiny:, description: nil)
94
+ def withdraw_coin(coin: 'BTC', quantity:, description: nil, **opts)
94
95
  params = base_params('withdraw_coin')
95
96
  params[:quantity] = quantity
96
- params[:destiny] = destiny
97
+ params[:coin] = coin.upcase
97
98
  params[:description] = description if description
99
+
100
+ if params[:coin] == 'BRL'
101
+ params[:account_ref] = opts[:account_ref] || (raise MissingParameter.new('account_ref is missing for coin BRL'))
102
+ else
103
+ params[:address] = opts[:address]
104
+ if params[:coin] == 'BTC'
105
+ params[:tx_fee] = opts[:tx_fee] || 0.00005
106
+ params[:tx_aggregate] = opts[:tx_aggregate] unless opts[:tx_aggregate].nil?
107
+ params[:via_blockchain] = opts[:via_blockchain] unless opts[:via_blockchain].nil?
108
+ end
109
+ end
98
110
  post(params)
99
111
  end
100
112
 
@@ -197,6 +209,7 @@ module MercadoBitcoin
197
209
  list
198
210
  .gsub(/(cancelled|open|filled)/i, { 'cancelled' => 3, 'open' => 2, 'filled' => 4 })
199
211
  .split(',')
212
+ .map { |i| i.to_i }
200
213
  .to_json
201
214
  end
202
215
 
@@ -1,3 +1,3 @@
1
1
  module MercadoBitcoin
2
- VERSION = "0.5.0"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.add_dependency 'virtus', '~> 1.0'
21
21
  spec.add_dependency 'rest-client', '~> 2.0'
22
22
  spec.add_dependency 'dotenv', '~> 2.1'
23
+ spec.add_dependency 'cmdparse', '~> 3.0'
23
24
  spec.add_development_dependency "bundler", "~> 1.10"
24
25
  spec.add_development_dependency "pry", "~> 0.10"
25
26
  spec.add_development_dependency "byebug", "~> 9.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mercado_bitcoin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marco Carvalho
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-27 00:00:00.000000000 Z
11
+ date: 2017-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: virtus
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '2.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: cmdparse
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: bundler
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -154,6 +168,7 @@ files:
154
168
  - README.md
155
169
  - Rakefile
156
170
  - bin/mb_console
171
+ - bin/mb_console_new
157
172
  - docker-compose.yml
158
173
  - lib/mercado_bitcoin.rb
159
174
  - lib/mercado_bitcoin/api.rb
@@ -165,6 +180,25 @@ files:
165
180
  - lib/mercado_bitcoin/api/data/trade.rb
166
181
  - lib/mercado_bitcoin/base_api_call.rb
167
182
  - lib/mercado_bitcoin/console.rb
183
+ - lib/mercado_bitcoin/console/command_parse.rb
184
+ - lib/mercado_bitcoin/console/commands.rb
185
+ - lib/mercado_bitcoin/console/commands/account.rb
186
+ - lib/mercado_bitcoin/console/commands/account/withdraw.rb
187
+ - lib/mercado_bitcoin/console/commands/account/withdraw/brl.rb
188
+ - lib/mercado_bitcoin/console/commands/account/withdraw/btc.rb
189
+ - lib/mercado_bitcoin/console/commands/account/withdraw/get.rb
190
+ - lib/mercado_bitcoin/console/commands/account/withdraw/ltc.rb
191
+ - lib/mercado_bitcoin/console/commands/base.rb
192
+ - lib/mercado_bitcoin/console/commands/base_no_take_command.rb
193
+ - lib/mercado_bitcoin/console/commands/book.rb
194
+ - lib/mercado_bitcoin/console/commands/order.rb
195
+ - lib/mercado_bitcoin/console/commands/order/buy.rb
196
+ - lib/mercado_bitcoin/console/commands/order/cancel.rb
197
+ - lib/mercado_bitcoin/console/commands/order/get.rb
198
+ - lib/mercado_bitcoin/console/commands/order/list.rb
199
+ - lib/mercado_bitcoin/console/commands/order/sell.rb
200
+ - lib/mercado_bitcoin/console/commands/system.rb
201
+ - lib/mercado_bitcoin/console/commands/ticker.rb
168
202
  - lib/mercado_bitcoin/errors.rb
169
203
  - lib/mercado_bitcoin/order_book.rb
170
204
  - lib/mercado_bitcoin/query_string_refinement.rb