fcoin_ruby_client 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.github/issue_template.md +12 -0
  3. data/.github/pull_request_template.md +12 -0
  4. data/.gitignore +13 -0
  5. data/.rspec +3 -0
  6. data/.rubocop.yml +12 -0
  7. data/.rubocop_todo.yml +431 -0
  8. data/.travis.yml +26 -0
  9. data/CHANGELOG.md +2 -0
  10. data/Gemfile +6 -0
  11. data/Gemfile.lock +176 -0
  12. data/LICENSE.txt +21 -0
  13. data/README.md +204 -0
  14. data/Rakefile +6 -0
  15. data/bin/console +14 -0
  16. data/bin/fcoin +95 -0
  17. data/bin/setup +8 -0
  18. data/examples/cli/realtime_api.md +78 -0
  19. data/examples/cli/rest_api.md +149 -0
  20. data/examples/cli/setting.md +39 -0
  21. data/examples/realtime_api.rb +43 -0
  22. data/examples/rest_api.rb +47 -0
  23. data/fcoin_ruby_client.gemspec +39 -0
  24. data/lib/fcoin/api.rb +47 -0
  25. data/lib/fcoin/authorization.rb +83 -0
  26. data/lib/fcoin/cli/endpoint/accounts_task.rb +33 -0
  27. data/lib/fcoin/cli/endpoint/market_task.rb +98 -0
  28. data/lib/fcoin/cli/endpoint/orders_task.rb +196 -0
  29. data/lib/fcoin/cli/endpoint/public_task.rb +59 -0
  30. data/lib/fcoin/cli/realtime/endpoint_task.rb +107 -0
  31. data/lib/fcoin/cli.rb +77 -0
  32. data/lib/fcoin/client.rb +7 -0
  33. data/lib/fcoin/config/custom_settings.yml +171 -0
  34. data/lib/fcoin/config/settings.yml +10 -0
  35. data/lib/fcoin/configuration.rb +95 -0
  36. data/lib/fcoin/connection.rb +33 -0
  37. data/lib/fcoin/endpoint/accounts.rb +23 -0
  38. data/lib/fcoin/endpoint/market.rb +91 -0
  39. data/lib/fcoin/endpoint/orders.rb +171 -0
  40. data/lib/fcoin/endpoint/public.rb +51 -0
  41. data/lib/fcoin/endpoint/utility.rb +14 -0
  42. data/lib/fcoin/endpoint.rb +13 -0
  43. data/lib/fcoin/error.rb +4 -0
  44. data/lib/fcoin/faraday/fcoin_formatter.rb +17 -0
  45. data/lib/fcoin/formatter/base_formatter.rb +8 -0
  46. data/lib/fcoin/formatter/depth_formatter.rb +33 -0
  47. data/lib/fcoin/formatter/ticker_formatter.rb +34 -0
  48. data/lib/fcoin/formatter.rb +38 -0
  49. data/lib/fcoin/generators/locale.rb +18 -0
  50. data/lib/fcoin/generators/templates/locale/locales/en.yml +176 -0
  51. data/lib/fcoin/generators/templates/locale/locales/ja.yml +176 -0
  52. data/lib/fcoin/generators/templates/locale/locales/zh_CN.yml +176 -0
  53. data/lib/fcoin/generators/templates/validation/my_settings.yml +171 -0
  54. data/lib/fcoin/generators/validation.rb +18 -0
  55. data/lib/fcoin/realtime/api.rb +38 -0
  56. data/lib/fcoin/realtime/client.rb +9 -0
  57. data/lib/fcoin/realtime/endpoint.rb +160 -0
  58. data/lib/fcoin/realtime/formatter/base_formatter.rb +10 -0
  59. data/lib/fcoin/realtime/formatter/depth_formatter.rb +37 -0
  60. data/lib/fcoin/realtime/formatter/ticker_formatter.rb +36 -0
  61. data/lib/fcoin/realtime/formatter.rb +40 -0
  62. data/lib/fcoin/realtime/wss.rb +113 -0
  63. data/lib/fcoin/request.rb +73 -0
  64. data/lib/fcoin/validator/market_validator.rb +60 -0
  65. data/lib/fcoin/validator/orders/base_validator.rb +96 -0
  66. data/lib/fcoin/validator/orders/create_order_limit_validator.rb +54 -0
  67. data/lib/fcoin/validator/orders/create_order_market_validator.rb +95 -0
  68. data/lib/fcoin/validator/orders/order_list_validator.rb +33 -0
  69. data/lib/fcoin/validator/orders_validator.rb +69 -0
  70. data/lib/fcoin/validator/validator_utility.rb +24 -0
  71. data/lib/fcoin/validator.rb +58 -0
  72. data/lib/fcoin/version.rb +3 -0
  73. data/lib/fcoin.rb +11 -0
  74. metadata +353 -0
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal:true
2
+ require 'faraday'
3
+ require 'config'
4
+
5
+ module Fcoin
6
+ module Configuration
7
+
8
+ # The adapter that will be used to connect if none is set
9
+ #
10
+ # @note The default faraday adapter is Net::HTTP
11
+ DEFAULT_ADAPTER = ::Faraday.default_adapter
12
+
13
+ # The endpoint that will be used to connect if none is set
14
+ #
15
+ # @note There is no reason to use any other endpoint at this time
16
+ DEFAULT_ENDPOINT = 'https://api.fcoin.com/v2/'
17
+ DEFAULT_WSS_ENDPOINT = 'wss://api.fcoin.com/v2/ws'
18
+
19
+ # The user agent that will be sent to the API endpoint if none is set
20
+ DEFAULT_USER_AGENT = "Fcoin Ruby Gem #{Fcoin::VERSION}".freeze
21
+ DEFAULT_PROXY = nil
22
+ DEFAULT_CA_PATH = %x[ openssl version -a | grep OPENSSLDIR | awk '{print $2}'|sed -e 's/\"//g' ].chomp
23
+ DEFAULT_CA_FILE = "#{DEFAULT_CA_PATH}/ca-certificates.crt"
24
+ DEFAULT_MIDDLEWARES = []
25
+ DEFAULT_API_KEY = 'Fcoin API Public Key'
26
+ DEFAULT_SECRET_KEY = 'Fcoin API Secret Key'
27
+ DEFAULT_SKIP_VALIDATION = true
28
+ DEFAULT_VALIDATION_SETTING_PATH = File.expand_path('../config/custom_settings.yml',__FILE__)
29
+ # support ruby Hash or JSON. default is ruby Hash
30
+ DEFAULT_FORMAT_TYPE = :hash
31
+
32
+ # An array of valid keys in the options hash when configuring a Fcoin::API
33
+ VALID_OPTIONS_KEYS = [
34
+ :adapter,
35
+ :endpoint,
36
+ :wss_endpoint,
37
+ :user_agent,
38
+ :api_key,
39
+ :secret_key,
40
+ :proxy,
41
+ :ca_path,
42
+ :ca_file,
43
+ :middlewares,
44
+ :skip_validation,
45
+ :validation_setting_path,
46
+ :format_type
47
+ ].freeze
48
+
49
+ attr_accessor *VALID_OPTIONS_KEYS
50
+
51
+ # When this module is extended, set all configuration options to their default values and load validation setting path
52
+ def self.extended(base)
53
+ base.set_default
54
+ base.load_validation_setting
55
+ end
56
+
57
+ # Convenience method to allow configuration options to be set in block
58
+ def configure
59
+ yield self
60
+ load_validation_setting
61
+ end
62
+
63
+ # Create a hash of options and their values
64
+ def options
65
+ VALID_OPTIONS_KEYS.inject({}) do |option, key|
66
+ option.merge!(key => send(key))
67
+ end
68
+ end
69
+
70
+ # Load a configuration file to use in the gem that config
71
+ def load_validation_setting
72
+ Config.load_and_set_settings([
73
+ File.expand_path('../config/settings.yml', __FILE__),
74
+ validation_setting_path
75
+ ])
76
+ end
77
+
78
+ # Set all configuration options to defaults
79
+ def set_default
80
+ self.adapter = DEFAULT_ADAPTER
81
+ self.endpoint = DEFAULT_ENDPOINT
82
+ self.wss_endpoint = DEFAULT_WSS_ENDPOINT
83
+ self.user_agent = DEFAULT_USER_AGENT
84
+ self.api_key = DEFAULT_API_KEY
85
+ self.secret_key = DEFAULT_SECRET_KEY
86
+ self.proxy = DEFAULT_PROXY
87
+ self.ca_path = DEFAULT_CA_PATH
88
+ self.ca_file = DEFAULT_CA_FILE
89
+ self.middlewares = DEFAULT_MIDDLEWARES
90
+ self.skip_validation = DEFAULT_SKIP_VALIDATION
91
+ self.validation_setting_path = DEFAULT_VALIDATION_SETTING_PATH
92
+ self.format_type = DEFAULT_FORMAT_TYPE
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,33 @@
1
+ require 'faraday_middleware'
2
+ require_relative 'faraday/fcoin_formatter'
3
+
4
+ # Scope Fcoin::API
5
+ module Fcoin
6
+ module Connection
7
+ private
8
+
9
+ # @private
10
+ #
11
+ # To establish a connection using the faraday
12
+ def connection
13
+ options = {
14
+ :headers => { 'Accept' => 'application/json; charset=utf-8', 'User-Agent' => user_agent, 'Content-Type' => 'application/json' },
15
+ :proxy => proxy,
16
+ :url => endpoint,
17
+ :ssl => { :ca_path => ca_path, :ca_file => ca_file }
18
+ }
19
+
20
+ Faraday::Connection.new(options) do |conn|
21
+ Array(middlewares).each do |middleware|
22
+ conn.request middleware
23
+ end
24
+ conn.request :multipart
25
+ conn.request :url_encoded
26
+ conn.request :json
27
+
28
+ conn.response :fcoin_formatter
29
+ conn.adapter(adapter)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,23 @@
1
+ # Scope Fcoin::API
2
+ module Fcoin
3
+ module Endpoint
4
+ module Accounts
5
+ # Get account info
6
+ #
7
+ # curl: GET https://api.fcoin.com/v2/accounts/balance
8
+ #
9
+ # @note This method can not be invoked without authentication.
10
+ #
11
+ # @example get account info
12
+ # client = Fcoin::Client.new(api_key: ENV['FCOIN_API_KEY'], secret_key: ENV['FCOIN_SECRET_KEY'])
13
+ # puts client.accounts_balance # => {"status":0,"data":[{"currency":"maya","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"gene","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"fres","category":"gpm","available":"60.000000000000000000","frozen":"0.000000000000000000","balance":"60.000000000000000000"},{"currency":"oas","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"tos","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"wte","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"zil","category":"gpm","available":"34.104656029395267656","frozen":"0.000000000000000000","balance":"34.104656029395267656"},{"currency":"omg","category":"innovation","available":"0.220459671644954039","frozen":"0.000000000000000000","balance":"0.220459671644954039"},{"currency":"icx","category":"gpm","available":"1.522982867743779579","frozen":"0.000000000000000000","balance":"1.522982867743779579"},{"currency":"btm","category":"innovation","available":"3.918842444121259336","frozen":"0.000000000000000000","balance":"3.918842444121259336"},{"currency":"ae","category":"gpm","available":"0.027787771125676705","frozen":"0.000000000000000000","balance":"0.027787771125676705"},{"currency":"dagt","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"zrx","category":"innovation","available":"0.027426476746268948","frozen":"0.000000000000000000","balance":"0.027426476746268948"},{"currency":"fota","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"xrp","category":"main","available":"0.043566063515862241","frozen":"0.000000000000000000","balance":"0.043566063515862241"},{"currency":"fbc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"bnb","category":"innovation","available":"0.038305939165145111","frozen":"0.000000000000000000","balance":"0.038305939165145111"},{"currency":"iic","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"gtc","category":"gpm","available":"0.000000007538065563","frozen":"0.000000000000000000","balance":"0.000000007538065563"},{"currency":"ges","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"vns","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"jac","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"zsc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"but","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"cofi","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"scl","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"fi","category":"innovation","available":"0.009046890230133252","frozen":"1378.620000000000000000","balance":"1378.629046890230133252"},{"currency":"baic","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"bcv","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"mot","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"wicc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"vlc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"fbee","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"icc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"dht","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"fff","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"mesh","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"ink","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"ruff","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"fuel","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"latx","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"777","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"msc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"cps","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"dta","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"mof","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"beauty","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"edu","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"dscoin","category":"gpm","available":"10.000000000000000000","frozen":"0.000000000000000000","balance":"10.000000000000000000"},{"currency":"musk","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"smt","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"dpn","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"see","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"ccc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"sac","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"aidoc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"18t","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"boc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"hotc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"xps","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"lmm","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"rte","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"rnt","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"vpp","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"pnt","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"idxe","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"mxm","category":"gpm","available":"8.000000000000000000","frozen":"0.000000000000000000","balance":"8.000000000000000000"},{"currency":"newos","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"tst","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"mdt","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"sss","category":"gpm","available":"9.000000000000000000","frozen":"0.000000000000000000","balance":"9.000000000000000000"},{"currency":"dcc","category":"gpm","available":"2650.000000000000000000","frozen":"0.000000000000000000","balance":"2650.000000000000000000"},{"currency":"pra","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"banca","category":"gpm","available":"6.000000000000000000","frozen":"0.000000000000000000","balance":"6.000000000000000000"},{"currency":"cccx","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"dscb","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"gus","category":"gpm","available":"2.000000000000000000","frozen":"0.000000000000000000","balance":"2.000000000000000000"},{"currency":"pmd","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"yee","category":"gpm","available":"6.000000000000000000","frozen":"0.000000000000000000","balance":"6.000000000000000000"},{"currency":"dag","category":"gpm","available":"1.000000000000000000","frozen":"0.000000000000000000","balance":"1.000000000000000000"},{"currency":"let","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"datx","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"ocn","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"blz","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"soc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"at","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"ngot","category":"gpm","available":"1.000000000000000000","frozen":"0.000000000000000000","balance":"1.000000000000000000"},{"currency":"dws","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"tct","category":"gpm","available":"1.830000000000000000","frozen":"0.000000000000000000","balance":"1.830000000000000000"},{"currency":"3db","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"lxt","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"sgcc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"hpc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"ifood","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"tbcoin","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"gram","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"arp","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"ait","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"nc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"aaa","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"cbr","category":"gpm","available":"6.660000000000000000","frozen":"0.000000000000000000","balance":"6.660000000000000000"},{"currency":"sda","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"brm","category":"gpm","available":"0.005000000000000000","frozen":"0.000000000000000000","balance":"0.005000000000000000"},{"currency":"fair","category":"gpm","available":"10.000000000000000000","frozen":"0.000000000000000000","balance":"10.000000000000000000"},{"currency":"ees","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"cit","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"rct","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"xmx","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"ionc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"drct","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"drink","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"iht","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"ejoy","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"iov","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"mst","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"lovc","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"sec","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"btc","category":"main","available":"0.000156995481988083","frozen":"0.000000000000000000","balance":"0.000156995481988083"},{"currency":"eth","category":"main","available":"0.001177659105993741","frozen":"0.000000000000000000","balance":"0.001177659105993741"},{"currency":"pai","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"bch","category":"main","available":"0.000919246371553010","frozen":"0.000000000000000000","balance":"0.000919246371553010"},{"currency":"show","category":"gpm","available":"600.000000000000000000","frozen":"0.000000000000000000","balance":"600.000000000000000000"},{"currency":"ltc","category":"main","available":"0.001735178376909046","frozen":"0.000000000000000000","balance":"0.001735178376909046"},{"currency":"biz","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"usdt","category":"main","available":"1.542208102053158021","frozen":"0.000000000000000000","balance":"1.542208102053158021"},{"currency":"vct","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"tkt","category":"gpm","available":"0.000000000000000000","frozen":"0.000000000000000000","balance":"0.000000000000000000"},{"currency":"ft","category":"innovation","available":"20.671877714849728410","frozen":"0.000000000000000000","balance":"20.671877714849728410"},{"currency":"zip","category":"innovation","available":"3918.597034485853214932","frozen":"10000.000000000000000000","balance":"13918.597034485853214932"},{"currency":"etc","category":"main","available":"0.382569624756478966","frozen":"0.000000000000000000","balance":"0.382569624756478966"}]}
14
+ #
15
+ #
16
+ # @see https://developer.fcoin.com/zh.html#486f6037ed
17
+ # @return [Hash or JSON]
18
+ def accounts_balance
19
+ get('accounts/balance')
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,91 @@
1
+ require_relative 'utility'
2
+ require_relative '../validator'
3
+
4
+ # Scope Fcoin::API
5
+ module Fcoin
6
+ module Endpoint
7
+ module Market
8
+ # Returns ticker info of symbol.
9
+ #
10
+ # curl: GET https://api.fcoin.com/v2/market/ticker/$symbol
11
+ #
12
+ # @example get ethusdt ticker info
13
+ # client = Fcoin::Client.new
14
+ # puts client.market_ticker(symbol: :ethusdt) #=> {"status"=>0, "data"=>{"ticker"=>{"latest_price"=>469.43, "most_recent_trade_vol"=>0.002, "max_buy_price"=>469.43, "max_buy_amount"=>7.6318, "min_sell_price"=>469.44, "min_sell_amount"=>0.0011, "trade_price_yesterday"=>468.75, "highest_price_today"=>472.0, "lowest_price_today"=>461.76, "symbol_base_vol_today"=>44442.419672207, "symbol_base_price_today"=>20784202.592831347}, "type"=>"ticker.ethusdt", "seq"=>100521295}}
15
+ #
16
+ #
17
+ # @see https://developer.fcoin.com/zh.html#ticker
18
+ # @raise [ArgumentError] If the symbol does not have.
19
+ # @param symbol [String or Symbol] Transaction pairs
20
+ # @return [Hash or JSON] Returns ticker info.
21
+ def market_ticker(symbol:)
22
+ get("market/ticker/#{symbol}", false)
23
+ end
24
+
25
+ # Returns depth info of symbol specified by level.
26
+ #
27
+ # curl: GET https://api.fcoin.com/v2/market/depth/$level/$symbol
28
+ #
29
+ # @example get ethusdt depth info specified by L20 level.
30
+ # client = Fcoin::Client.new
31
+ # puts client.market_ticker(symbol: :ethusdt, level: :L20) #=> {"status"=>0, "data"=>{"bids"=>[{"price"=>468.16, "amount"=>0.009}, {"price"=>468.15, "amount"=>0.0077}, {"price"=>468.14, "amount"=>0.02}, {"price"=>468.1, "amount"=>0.3723}, {"price"=>468.09, "amount"=>0.1268}, {"price"=>468.07, "amount"=>0.02}, {"price"=>468.03, "amount"=>0.0025}, {"price"=>468.02, "amount"=>0.01}, {"price"=>468.0, "amount"=>0.0896}, {"price"=>467.97, "amount"=>0.9827}, {"price"=>467.83, "amount"=>0.01}, {"price"=>467.81, "amount"=>0.01}, {"price"=>467.8, "amount"=>0.04}, {"price"=>467.78, "amount"=>0.0146}, {"price"=>467.77, "amount"=>0.0016}, {"price"=>467.76, "amount"=>0.01}, {"price"=>467.75, "amount"=>0.01}, {"price"=>467.74, "amount"=>0.01}, {"price"=>467.73, "amount"=>0.4237}, {"price"=>467.72, "amount"=>0.01}], "asks"=>[{"price"=>468.22, "amount"=>0.7}, {"price"=>468.26, "amount"=>0.7}, {"price"=>468.28, "amount"=>0.5952}, {"price"=>468.56, "amount"=>0.0027}, {"price"=>468.57, "amount"=>0.9921}, {"price"=>468.58, "amount"=>0.06}, {"price"=>468.59, "amount"=>0.3599}, {"price"=>468.6, "amount"=>30.57797087}, {"price"=>468.61, "amount"=>0.01}, {"price"=>468.62, "amount"=>0.003}, {"price"=>468.63, "amount"=>0.005}, {"price"=>468.64, "amount"=>0.03}, {"price"=>468.67, "amount"=>0.0031}, {"price"=>468.68, "amount"=>0.3966}, {"price"=>468.7, "amount"=>0.05}, {"price"=>468.71, "amount"=>0.1}, {"price"=>468.74, "amount"=>0.01}, {"price"=>468.75, "amount"=>0.0021}, {"price"=>468.76, "amount"=>0.0046}, {"price"=>468.77, "amount"=>0.0023}], "ts"=>1532831776008, "seq"=>100535850, "type"=>"depth.L20.ethusdt"}}
32
+ #
33
+ #
34
+ # @see https://developer.fcoin.com/zh.html#50f4407ea4
35
+ # @raise [ArgumentError] If the symbol or level does not have.
36
+ # @raise [InvalidValueError] If symbol or level is invalid.
37
+ # @param symbol [String or Symbol] Transaction pairs
38
+ # @param level [String or Symbol] Level of depth chart. level must be included in [L20, L40, full].
39
+ # @return [Hash or JSON] Returns depth info.
40
+ def market_depth(symbol:, level:)
41
+ validator = Fcoin::Validator.new(level: level, method_name: __method__)
42
+ if skip_validation || validator.valid?
43
+ get("market/depth/#{level}/#{symbol}", false)
44
+ else
45
+ raise InvalidValueError.new validator.messages
46
+ end
47
+ end
48
+
49
+ # Returns trades info of symbol.
50
+ #
51
+ # curl: GET https://api.fcoin.com/v2/market/trades/$symbol
52
+ #
53
+ # @example get ethusdt trades info.
54
+ # client = Fcoin::Client.new
55
+ # puts client.market_trades(symbol: :ethusdt) #=> {"status"=>0, "data"=>[{"amount"=>0.1811, "ts"=>1532832312857, "id"=>100541250000, "side"=>"buy", "price"=>467.95}]}
56
+ #
57
+ #
58
+ # @see https://developer.fcoin.com/zh.html#6477a1394e
59
+ # @raise [ArgumentError] If the symbol does not have.
60
+ # @param symbol [String or Symbol] Transaction pairs
61
+ # @return [Hash or JSON] Returns trades info.
62
+ def market_trades(symbol:)
63
+ get("market/trades/#{symbol}", false)
64
+ end
65
+
66
+ # Returns candles info of symbol specified by resolution.
67
+ #
68
+ # curl: GET https://api.fcoin.com/v2/market/candles/$resolution/$symbol
69
+ #
70
+ # @example get monthly(MN) ethusdt candles info.
71
+ # client = Fcoin::Client.new
72
+ # puts client.market_candles(symbol: :ethusdt, resolution: :D1) #=> {"status"=>0, "data"=>[{"open"=>449.1, "close"=>467.67, "high"=>516.09, "quote_vol"=>1403153842.5110748, "id"=>1530374400, "count"=>6058571, "low"=>418.29, "seq"=>10055429000001, "base_vol"=>3042620.012726224}, {"id"=>1527782400, "seq"=>7385778300000, "high"=>555.13, "low"=>406.11, "open"=>523.97, "close"=>449.04, "count"=>20382481, "base_vol"=>28258854.226292703, "quote_vol"=>13579650310.735054}, {"id"=>1525104000, "seq"=>2847062700000, "high"=>582.99, "low"=>559.66, "open"=>563.23, "close"=>575.77, "count"=>4617, "base_vol"=>4159.317883344, "quote_vol"=>2380070.431548223}]}
73
+ #
74
+ #
75
+ # @see https://developer.fcoin.com/zh.html#candle
76
+ # @raise [ArgumentError] If the symbol or resolution does not have.
77
+ # @raise [InvalidValueError] If symbol or resolution is invalid.
78
+ # @param symbol [String or Symbol] Transaction pairs
79
+ # @param resolution [String or Symbol] period of candles chart. resolution must be included in [M1, M3, M5, M15, M30, H1, H4, H6, D1, W1, MN].
80
+ # @return [Hash or JSON] Returns candles info.
81
+ def market_candles(symbol:, resolution:)
82
+ validator = Fcoin::Validator.new(resolution: resolution, method_name: __method__)
83
+ if skip_validation || validator.valid?
84
+ get("market/candles/#{resolution}/#{symbol}", false)
85
+ else
86
+ raise InvalidValueError.new validator.messages
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,171 @@
1
+ require_relative 'utility'
2
+ require_relative '../validator'
3
+
4
+ # Scope Fcoin::API
5
+ module Fcoin
6
+ module Endpoint
7
+ module Orders
8
+ include Utility
9
+ # Create limit order.
10
+ #
11
+ # curl: POST https://api.fcoin.com/v2/orders
12
+ #
13
+ # @note This method can not be invoked without authentication.
14
+ #
15
+ # @example Create an order to sell 0.010eth at a price of 1000usdt.
16
+ # client = Fcoin::Client.new(api_key: ENV['FCOIN_API_KEY'], secret_key: ENV['FCOIN_SECRET_KEY'])
17
+ # puts client.create_order_limit(symbol: :ethusdt, side: :sell, price: 1000, amount: 0.001) #=> {"status":0,"data":"R0moy92q4Qaf_G*********wwJM2bz_Zyacp-Ek8="}'
18
+ #
19
+ #
20
+ # @see https://developer.fcoin.com/zh.html#4a3e521c3b
21
+ # @raise [ArgumentError] If the symbol or side or type or price or amount does not have.
22
+ # @raise [InvalidValueError] If symbol or side or type or price or amount is invalid.
23
+ # @param symbol [String or Symbol] Transaction of pair
24
+ # @param side [String or Symbol] Direction of the transaction
25
+ # @param type [String or Symbol] Order type.
26
+ # @param price [Float]
27
+ # @param amount [Float]
28
+ # @return [Hash or JSON] Returns receipt contains order_id.
29
+ def create_order_limit(symbol:, side:, price:, amount:)
30
+ payload = { symbol: symbol, side: side, type: :limit, price: price, amount: amount }
31
+ validator = Fcoin::Validator.new(payload.merge(method_name: __method__))
32
+ if skip_validation || validator.valid?
33
+ valid_payload = sort_payload(payload)
34
+ post('orders', true, valid_payload)
35
+ else
36
+ raise InvalidValueError.new(validator.messages)
37
+ end
38
+ end
39
+
40
+ # Get order list.
41
+ #
42
+ # curl: GET https://api.fcoin.com/v2/orders
43
+ #
44
+ # @note This method can not be invoked without authentication.
45
+ #
46
+ # @example get the canceled order list of ethusdt limit 20 per page.
47
+ # client = Fcoin::Client.new(api_key: ENV['FCOIN_API_KEY'], secret_key: ENV['FCOIN_SECRET_KEY'])
48
+ # puts client.order_list(symbol: :ethusdt, states: :canceled, page_before: nil, page_after: nil, per_page: 20) #=> {"status":0,"data":[{"id":"L7rbALEIoI0ymo3uOXBF4gT4BlyTxgHhGoZjvptIv2U=","symbol":"ethusdt","amount":"0.001000000000000000","price":"1000.000000000000000000","created_at":1531714218130,"type":"limit","side":"sell","filled_amount":"0.000000000000000000","executed_value":"0.000000000000000000","fill_fees":"0.000000000000000000","source":"api","state":"canceled"},{"id":"32ZZCBEpPz2J9oFIJ4RMTIbypltjrVD9PAdYxQTHhUE=","symbol":"ethusdt","amount":"0.001000000000000000","price":"1000.000000000000000000","created_at":1531714092732,"type":"limit","side":"sell","filled_amount":"0.000000000000000000","executed_value":"0.000000000000000000","fill_fees":"0.000000000000000000","source":"api","state":"canceled"},{"id":"VotO2IKI2opgyKRd1lhR5bYj9zNZ398IW85gcBNPisU=","symbol":"ethusdt","amount":"0.001000000000000000","price":"1000.000000000000000000","created_at":1531712709955,"type":"limit","side":"sell","filled_amount":"0.000000000000000000","executed_value":"0.000000000000000000","fill_fees":"0.000000000000000000","source":"api","state":"canceled"},{"id":"tYH6LczJxaVe_WhsLOzOk4YM53hK2q169nYn9ReiwGM=","symbol":"ethusdt","amount":"0.001000000000000000","price":"1000.000000000000000000","created_at":1531675732267,"type":"limit","side":"sell","filled_amount":"0.000000000000000000","executed_value":"0.000000000000000000","fill_fees":"0.000000000000000000","source":"web","state":"canceled"},{"id":"U50WtZkmIh_bbuVKoipAMayCIy0A7qk4hBLxpDvKdPk=","symbol":"ethusdt","amount":"0.025800000000000000","price":"491.100000000000000000","created_at":1529665880201,"type":"limit","side":"buy","filled_amount":"0.000000000000000000","executed_value":"0.000000000000000000","fill_fees":"0.000000000000000000","source":"web","state":"canceled"}]}
49
+ #
50
+ #
51
+ # @see https://developer.fcoin.com/zh.html#9094989d10
52
+ # @raise [ArgumentError] If the symbol or states or per_page does not have.
53
+ # @raise [InvalidValueError] If symbol or states or per_page is invalid.
54
+ # @param symbol [String or Symbol] Transaction of pair.
55
+ # @param states [String or Symbol] Order states. states must be incldued in [submitted, partial_filled, canceled, partial_canceled, filled, pending_cancel]
56
+ # @param page_before [Integer] Query order before page number.
57
+ # @param page_after [Integer] Query order after page number.
58
+ # @param per_page [Integer] Order quantity per page. default is 20.
59
+ # @return [Hash or JSON] Returns order list.
60
+ def order_list(symbol:, states:, page_before: nil, page_after: nil, per_page: 20)
61
+ params = { symbol: symbol, states: states.to_s, before: page_before, after: page_after, limit: per_page }
62
+ validator = Fcoin::Validator.new(params.merge(method_name: __method__))
63
+ if skip_validation || validator.valid?
64
+ valid_params = sort_params(params)
65
+ get('orders', true, valid_params)
66
+ else
67
+ raise InvalidValueError.new(validator.messages)
68
+ end
69
+ end
70
+
71
+ # Query order.
72
+ #
73
+ # curl: GET https://api.fcoin.com/v2/orders/$order_id
74
+ #
75
+ # @note This method can not be invoked without authentication.
76
+ #
77
+ # @example query order specified by order_id.
78
+ # client = Fcoin::Client.new(api_key: ENV['FCOIN_API_KEY'], secret_key: ENV['FCOIN_SECRET_KEY'])
79
+ # puts client.reference_order(order_id: "L7rbALEIoI0ymo3uOXBF4gT4Bl********jvptIv2U=") #=> {"status":0,"data":{"id":"L7rbALEIoI0ymo3uOXBF4gT4BlyTxgHhGoZjvptIv2U=","symbol":"ethusdt","amount":"0.001000000000000000","price":"1000.000000000000000000","created_at":1531714218130,"type":"limit","side":"sell","filled_amount":"0.000000000000000000","executed_value":"0.000000000000000000","fill_fees":"0.000000000000000000","source":"api","state":"canceled"}}
80
+ #
81
+ #
82
+ # @see https://developer.fcoin.com/zh.html#5faf03be01
83
+ # @raise [ArgumentError] If the order_id does not have.
84
+ # @param order_id [String]
85
+ # @return [Hash or JSON] Returns order specified by order_id.
86
+ def reference_order(order_id:)
87
+ get("orders/#{order_id}")
88
+ end
89
+ alias :order :reference_order
90
+
91
+ # Cancel order.
92
+ #
93
+ # curl: POST https://api.fcoin.com/v2/orders/$order_id/submit-cancel
94
+ #
95
+ # @note This method can not be invoked without authentication.
96
+ #
97
+ # @example cancel order specified by order_id.
98
+ # client = Fcoin::Client.new(api_key: ENV['FCOIN_API_KEY'], secret_key: ENV['FCOIN_SECRET_KEY'])
99
+ # puts client.cancel_order(order_id: "nMEC_VrW0LYlP4iCcWzmdL50jFrvNWZoaQxvZSjeUSA=") #=> {"status":0}
100
+ #
101
+ #
102
+ # @see https://developer.fcoin.com/zh.html#299126e3bf
103
+ # @raise [ArgumentError] If the order_id does not have.
104
+ # @param order_id [String]
105
+ # @return [Hash or JSON]
106
+ def cancel_order(order_id:)
107
+ post("orders/#{order_id}/submit-cancel")
108
+ end
109
+
110
+ # Query the transaction record for the specified by order_id.
111
+ #
112
+ # curl: GET https://api.fcoin.com/v2/orders/$order_id/match-results
113
+ #
114
+ # @note This method can not be invoked without authentication.
115
+ #
116
+ # @example Query the transaction record for the specified by order_id.
117
+ # client = Fcoin::Client.new(api_key: ENV['FCOIN_API_KEY'], secret_key: ENV['FCOIN_SECRET_KEY'])
118
+ # puts client.order_match_results(order_id: "kW3cRiXIGHG-cHNdter*********qfoMzbeHEQcqp4=") #=> {"status":0,"data":[{"price": "1000","fill_fees": "0.00010000000000000","filled_amount": "0.00500000000000000","side": "buy","type": "limit","created_at": 1531734385085}]}
119
+ #
120
+ #
121
+ # @see https://developer.fcoin.com/zh.html#152112dfd6
122
+ # @raise [ArgumentError] If the order_id does not have.
123
+ # @param order_id [String]
124
+ # @return [Hash or JSON] Returns transaction record for the specified by order_id.
125
+ def order_match_results(order_id:)
126
+ get("orders/#{order_id}/match-results")
127
+ end
128
+ alias :order_transaction :order_match_results
129
+
130
+ private
131
+
132
+ # TODO: After checking the operation, go to the public
133
+ #
134
+ # Create market order.
135
+ #
136
+ # curl: POST https://api.fcoin.com/v2/orders
137
+ #
138
+ # @note This method can not be invoked without authentication.
139
+ #
140
+ # @example Create an order to sell 0.010eth at a price of 1000usdt.
141
+ # client = Fcoin::Client.new(api_key: ENV['FCOIN_API_KEY'], secret_key: ENV['FCOIN_SECRET_KEY'])
142
+ # puts client.create_order_market(symbol: :ethusdt, side: :buy, total: 1)
143
+ #
144
+ #
145
+ # @see https://developer.fcoin.com/zh.html#4a3e521c3b
146
+ # @raise [ArgumentError] If the symbol or side or type or price or amount does not have.
147
+ # @raise [InvalidValueError] If symbol or side or type or price or amount is invalid.
148
+ # @param symbol [String or Symbol] Transaction of pair
149
+ # @param side [String or Symbol] Direction of the transaction
150
+ # @param total [Float]
151
+ # @param amount [Float]
152
+ # @return [Hash or JSON] Returns receipt contains order_id.
153
+ def create_order_market(symbol:, side:, total: nil, amount: nil)
154
+ base_payload = { symbol: symbol, side: side, type: :market }
155
+ payload = case side.to_sym
156
+ when :sell
157
+ base_payload.merge(amount: amount)
158
+ when :buy
159
+ base_payload.merge(amount: total)
160
+ end
161
+ validator = Fcoin::Validator.new(payload.merge(method_name: __method__))
162
+ if skip_validation || validator.valid?
163
+ valid_payload = sort_payload(payload)
164
+ post('orders', true, valid_payload)
165
+ else
166
+ raise InvalidValueError.new(validator.messages)
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,51 @@
1
+ # Scope Fcoin::API
2
+ module Fcoin
3
+ module Endpoint
4
+ module Public
5
+ # Get server time
6
+ #
7
+ # curl: GET https://api.fcoin.com/v2/public/server-time
8
+ #
9
+ # @example get server time
10
+ # client = Fcoin::Client.new
11
+ # puts client.public_server_time #=> {"status":0,"data":1531562028166}
12
+ #
13
+ #
14
+ # @see https://developer.fcoin.com/zh.html#8aa898cda7
15
+ # @return [Hash or JSON]
16
+ def public_server_time
17
+ get('public/server-time', false)
18
+ end
19
+
20
+ # Display available currency
21
+ #
22
+ # curl: GET https://api.fcoin.com/v2/public/currencies
23
+ #
24
+ # @example Display available currency
25
+ # client = Fcoin::Client.new
26
+ # puts cient.public_currencies
27
+ #
28
+ #
29
+ # @see https://developer.fcoin.com/zh.html#0fd2e492e6
30
+ # @return [Hash or JSON]
31
+ def public_currencies
32
+ get('public/currencies', false)
33
+ end
34
+
35
+ # Query available transaction pairs
36
+ #
37
+ # curl: GET https://api.fcoin.com/v2/public/symbols
38
+ #
39
+ # @example Query available transaction pairs
40
+ # client = Fcoin::Client.new
41
+ # puts client.public_symbols
42
+ #
43
+ #
44
+ # @see https://developer.fcoin.com/zh.html#a266e284f4
45
+ # @return [Hash or JSON]
46
+ def public_symbols
47
+ get('public/symbols', false)
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,14 @@
1
+ # Scope Fcoin::API
2
+ module Fcoin
3
+ module Endpoint
4
+ module Utility
5
+ private
6
+
7
+ def sort_payload(data)
8
+ # sort by alphabel ASC
9
+ Hash[ data.sort ]
10
+ end
11
+ alias :sort_params :sort_payload
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ require_relative 'endpoint/public'
2
+ require_relative 'endpoint/market'
3
+ require_relative 'endpoint/accounts'
4
+ require_relative 'endpoint/orders'
5
+
6
+ module Fcoin
7
+ module Endpoint
8
+ include Public
9
+ include Market
10
+ include Accounts
11
+ include Orders
12
+ end
13
+ end
@@ -0,0 +1,4 @@
1
+ # Scope Fcoin::API
2
+ module Fcoin
3
+ class InvalidValueError < StandardError; end
4
+ end
@@ -0,0 +1,17 @@
1
+ require 'faraday'
2
+ require_relative '../formatter'
3
+
4
+ module FaradayMiddleware
5
+ class FcoinFormatter < Faraday::Middleware
6
+ # Format response_env by using Fcoin::Formatter
7
+ def call(request_env)
8
+ @app.call(request_env).on_complete do |response_env|
9
+ body = JSON.parse(response_env.body)
10
+ formatter = Fcoin::Formatter.new(body)
11
+ response_env.body = formatter.formatted_body
12
+ end
13
+ end
14
+ end
15
+
16
+ Faraday::Response.register_middleware(fcoin_formatter: FcoinFormatter)
17
+ end
@@ -0,0 +1,8 @@
1
+ module Fcoin
2
+ class BaseFormatter
3
+ # @abstract Subclass and override {#fromatted_body} to implement
4
+ def formatted_body
5
+ raise 'Please be implemented in inheriting.'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,33 @@
1
+ require_relative 'base_formatter'
2
+
3
+ module Fcoin
4
+ class DepthFormatter < BaseFormatter
5
+
6
+ attr_accessor :body
7
+
8
+ def initialize(body)
9
+ self.body = body
10
+ end
11
+
12
+ # Format response body for JSON
13
+ #
14
+ # @return [Hash]
15
+ def formatted_body
16
+ self.body['data']['bids'] = adjusted('bids')
17
+ self.body['data']['asks'] = adjusted('asks')
18
+ body
19
+ end
20
+
21
+ private
22
+
23
+ def adjusted(type)
24
+ orders = body['data'][type].dup
25
+ orders.in_groups_of(2).map do |order|
26
+ {
27
+ "price" => order[0],
28
+ "amount" => order[1]
29
+ }
30
+ end
31
+ end
32
+ end
33
+ end