cbx 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f63ca10d81b008dedae9cbae3d368aae9b15913c
4
+ data.tar.gz: 57838a381e03f8e9b984727113332ac0068dc065
5
+ SHA512:
6
+ metadata.gz: 947eb218522c03eaa6baca54fa9005aad22bb032c5852f92215a8fcac35ac6b94795aa6483e2adf880019997739eda9cc9f7d7a558be82fd0e2843fe32df8768
7
+ data.tar.gz: f7722a5e01299cd37dcaf0e11cc97abaae1cecb68a9883abd2a5cb26b8928db584b0f24acda945f033e9357cb35a3f8b08ce0a6a777d63e14458b5c18bf03a63
@@ -0,0 +1,100 @@
1
+ This is a fork of a project originally authored by Daniel Silver
2
+ (https://github.com/dan-silver/cbx)
3
+
4
+ The fork features convenience methods for all endpoint functionality and
5
+ allows for unauthenticated access to Market Data and the WebSocket feed.
6
+
7
+ # Coinbase Exchange Ruby Client
8
+ The library wraps the http request and message signing. Create an account at https://exchange.coinbase.com to get started.
9
+
10
+ ### NOTE - As a launch promo, there are [no Coinbase Exchange trading fees](http://blog.coinbase.com/post/109202118547/coinbase-launches-first-regulated-bitcoin-exchange) through the end of March.
11
+
12
+ ## Installation
13
+
14
+ Include this in your gemfile:
15
+
16
+ ```gem 'cbx', :git=> 'git://github.com/mikerodrigues/cbx.git'```
17
+
18
+ ## Example
19
+ ```ruby
20
+ require "cbx"
21
+
22
+ # For unauthenticated access:
23
+ cbe = CBX.new
24
+
25
+ # List products
26
+ cbe.products
27
+ => [{"id"=>"BTC-USD", "base_currency"=>"BTC", "quote_currency"=>"USD", "base_min_size"=>0.01, "base_max_size"=>10000, "quote_increment"=>0.01, "display_name"=>"BTC/USD"}]
28
+
29
+ # Get product order book at level 1, 2, or 3, (Defaults to level: 1, product_id "BTC-USD")
30
+ cbe.book(1, 'BTC-USD')
31
+ => {"sequence"=>29349454, "bids"=>[["285.22000000", "0.34800000", 3]], "asks"=>[["285.33000000", "0.28930000", 4]]}
32
+
33
+ # Product tickers (defaults to 'BTC-USD')
34
+ cbe.ticker("BTC-USD")
35
+ => {"trade_id"=>125681, "price"=>"226.20000000", "size"=>"0.01570000", "time"=>"2015-02-08T04:46:17.352746Z"}
36
+
37
+ # Product trades (defaults to 'BTC-USD')
38
+ cbe.trades('BTC-USD')
39
+ => [{"time"=>"2015-03-15 04:43:48.7943+00", "trade_id"=>774500, "price"=>"285.44000000", "size"=>"0.01000000", "side"=>"sell"},
40
+ {"time"=>"2015-03-15 04:42:54.432661+00", "trade_id"=>774499, "price"=>"285.47000000", "size"=>"0.05340000", "side"=>"sell"},
41
+ {"time"=>"2015-03-15 04:42:54.432306+00", "trade_id"=>774498, "price"=>"285.45000000", "size"=>"0.09100000", "side"=>"sell"}]
42
+
43
+
44
+ # For authenticated access:
45
+ cbe = CBX.new API_KEY, API_SECRET, API_PASSPHRASE
46
+
47
+ # List accounts
48
+ cbe.accounts
49
+ => [{"id"=>"000ea663...", "currency"=>"USD", "balance"=>"90.0000114750000000", "hold"=>"0.0000000000000000", "available"=>"0.9000114750000000", "profile_id"=>"4409df27..."}, {"id"=>"8bfe", "currency"=>"BTC", "balance"=>"9.4426882700000000", "hold"=>"0.0000000000000000", "available"=>"5.4426882700000000", "profile_id"=>"a8f2d8..."}]
50
+
51
+ # List orders
52
+ cbe.orders
53
+
54
+ # List orders with pagination
55
+ cbe.order({'limit'=>5, after=>1})
56
+
57
+ # Get specific order by order_id
58
+ cbe.order('4488340..')
59
+
60
+ # Place an order (size, price, side)
61
+ cbe.place_order("0.01", "250.000", "buy")
62
+ cbe.place_order("0.02", "265.000", "sell")
63
+
64
+ # Cancel an order by order_id
65
+ cbe.cancel_order('488224434...')
66
+
67
+ # Product fills
68
+ cbe.fills
69
+
70
+ # Get a live feed from the websocket. You'll need to create a lambda to pass
71
+ messages to as they are received:
72
+ feed = CBX::Feed.new(->{|msg| puts msg.fetch('type')})
73
+
74
+ # Close the feed if needed
75
+ feed.close
76
+
77
+
78
+ ```
79
+
80
+ Block syntax is fully supported
81
+
82
+ ```ruby
83
+
84
+ cbe.accounts do |response|
85
+ puts response
86
+ end
87
+
88
+ cbe.post('orders', {
89
+
90
+ "size" => 1.01,
91
+ "price" => 1.100,
92
+ "side" => "buy",
93
+ "product_id" => "BTC-USD"
94
+ }) do |response|
95
+ puts response
96
+ end
97
+
98
+ ```
99
+
100
+ Use at your own risk. I assume no liability for gains or losses you incur while using this gem.
@@ -0,0 +1,16 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'cbx'
3
+ s.version = '0.0.1'
4
+ s.date = '2015-03-15'
5
+ s.summary = "Ruby wrapper for the Coinbase Exchange API"
6
+ s.description = "A complete interface to Coinbase Exchange's trading API."
7
+ s.authors = ["Michael Rodrigues","Dan Silver"]
8
+ s.email = ['mikebrodrigues@gmail.com', 'dannysilver3@gmail.com']
9
+ s.files = Dir.glob('{bin,config,lib,test,doc}/**/*') + ['cbx.gemspec']
10
+ s.extra_rdoc_files = ['README.md']
11
+ s.license = 'MIT'
12
+ s.homepage = 'https://github.com/mikerodrigues/cbx'
13
+ s.metadata = { "parent_project_homepage" => "https://github.com/dan-silver/coinbase_exchange"}
14
+ s.add_runtime_dependency 'unirest', '~> 1.1', '>= 1.1.2'
15
+ s.add_runtime_dependency 'websocket-client-simple'
16
+ end
@@ -0,0 +1,68 @@
1
+ require 'unirest'
2
+ require "base64"
3
+ require 'openssl'
4
+ require 'json'
5
+ require 'websocket-client-simple'
6
+ require 'cbx/feed'
7
+ require 'cbx/pagination'
8
+ require 'cbx/trading'
9
+ require 'cbx/market_data'
10
+ require 'cbx/coinbase_signature_maker'
11
+ require 'cbx/version'
12
+
13
+ class CBX
14
+ include MarketData
15
+ attr_reader :authenticated
16
+
17
+ API_URL = 'https://api.exchange.coinbase.com/'
18
+
19
+ def initialize(key=nil, secret=nil, passphrase=nil)
20
+ if key && secret && passphrase
21
+ @key = key
22
+ @secret = secret
23
+ @passphrase = passphrase
24
+ @coinbaseExchange = CBXSignatureMaker.new(key, secret, passphrase)
25
+ @authenticated = true
26
+ extend Trading
27
+ else
28
+ @authenticated = false
29
+ end
30
+ end
31
+
32
+ def request(method, uri, json=nil)
33
+ params = json.to_json if json
34
+ if authenticated
35
+ headers = {
36
+ 'CB-ACCESS-SIGN'=> @coinbaseExchange.signature('/'+uri, params, nil, method),
37
+ 'CB-ACCESS-TIMESTAMP'=> Time.now.to_i,
38
+ 'CB-ACCESS-KEY'=> @key,
39
+ 'CB-ACCESS-PASSPHRASE'=> @passphrase,
40
+ 'Content-Type' => 'application/json'
41
+ }
42
+ else
43
+ headers = { 'Content-Type' => 'application/json' }
44
+ end
45
+
46
+ if method == :get
47
+ r=Unirest.get(API_URL + uri, headers: headers)
48
+ elsif method == :post
49
+ r=Unirest.post(API_URL + uri, headers: headers, parameters: params)
50
+ elsif method == :delete
51
+ r=Unirest.delete(API_URL + uri, headers: headers, parameters: params)
52
+ end
53
+ yield r.body if block_given?
54
+ return r.body
55
+ end
56
+
57
+ def get(uri, json=nil, &block)
58
+ request(:get, uri, json, &block)
59
+ end
60
+
61
+ def post(uri, json=nil, &block)
62
+ request(:post, uri, json, &block)
63
+ end
64
+
65
+ def delete(uri, json=nil, &block)
66
+ request(:delete, uri, json, &block)
67
+ end
68
+ end
@@ -0,0 +1,18 @@
1
+ class CBXSignatureMaker
2
+ def initialize(key, secret, passphrase)
3
+ @key = key
4
+ @secret = secret
5
+ @passphrase = passphrase
6
+ end
7
+
8
+ def signature(request_url='', body='', timestamp=nil, method='GET')
9
+ body = body.to_json if body.is_a?(Hash)
10
+ timestamp = Time.now.to_i if !timestamp
11
+
12
+ what = "#{timestamp}#{method.upcase}#{request_url}#{body}";
13
+ # create a sha256 hmac with the secret
14
+ secret = Base64.decode64(@secret)
15
+ hash = OpenSSL::HMAC.digest('sha256', secret, what)
16
+ Base64.strict_encode64(hash)
17
+ end
18
+ end
@@ -0,0 +1,35 @@
1
+ class CBX
2
+ class Feed
3
+ API_URL = 'wss://ws-feed.exchange.coinbase.com'
4
+ def initialize(on_message, on_close=nil, on_error=nil)
5
+ subscription_request = { "type" => "subscribe", "product_id" => "BTC-USD" }
6
+ ws = WebSocket::Client::Simple.connect API_URL
7
+ @ws = ws
8
+ ws.on :message do |event|
9
+ msg = JSON.parse event.data
10
+ on_message.call(msg)
11
+ end
12
+
13
+ ws.on :open do
14
+ ws.send subscription_request.to_json
15
+ end
16
+
17
+ ws.on :close do |e|
18
+ if on_close
19
+ on_close.call(e)
20
+ end
21
+ exit 1
22
+ end
23
+
24
+ ws.on :error do |e|
25
+ if on_error
26
+ on_error.call(e)
27
+ end
28
+ end
29
+ end
30
+
31
+ def close
32
+ @ws.close
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,21 @@
1
+ class CBX
2
+ module MarketData
3
+ include ::CBX::Pagination
4
+
5
+ def products(&block)
6
+ get('products', nil, &block)
7
+ end
8
+
9
+ def orderbook(level='1', product_id='BTC-USD', &block)
10
+ get('products/' + product_id + '/book?level=' + String(level), nil, &block)
11
+ end
12
+
13
+ def ticker(product_id='BTC-USD', &block)
14
+ get('products/' + product_id + '/ticker', nil, &block)
15
+ end
16
+
17
+ def trades(product_id='BTC-USD', &block)
18
+ get('products/' + product_id + '/trades', nil, &block)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ class CBX
2
+ module Pagination
3
+ private
4
+
5
+ def paginate(hash)
6
+ string = ""
7
+ hash.keys.each do |key|
8
+ string << "&#{key}=#{hash.fetch(key)}"
9
+ end
10
+ return string.sub(/^&/, '?')
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,64 @@
1
+ class CBX
2
+ module Trading
3
+ include ::CBX::Pagination
4
+
5
+ # Account methods
6
+ #
7
+ def accounts(account_id=nil, &block)
8
+ if account_id.nil? then
9
+ get('accounts', nil, &block)
10
+ else
11
+ get('accounts/' + account_id.to_s, nil, &block)
12
+ end
13
+ end
14
+
15
+ def ledger(account_id, pagination = {}, &block)
16
+ get('accounts/' + account_id.to_s + '/ledger' + paginate(pagination), nil, &block)
17
+ end
18
+
19
+ def holds(account_id, pagination = {}, &block)
20
+ get('accounts/' + account_id.to_s + '/holds' + paginate(pagination), nil, &block)
21
+ end
22
+
23
+ # Order methods
24
+ #
25
+ def orders(pagination = {}, &block)
26
+ get('orders' + paginate(pagination), nil, &block)
27
+ end
28
+
29
+ def order(order_id=nil, &block)
30
+ if order_id.nil? then
31
+ get('orders', nil, &block)
32
+ else
33
+ get('orders/' + order_id.to_s, nil, &block)
34
+ end
35
+ end
36
+
37
+ def cancel_order(order_id, &block)
38
+ delete('orders/' + order_id.to_s, nil, &block)
39
+ end
40
+
41
+ def place_order(size, price, side, product_id='BTC-USD', &block)
42
+ order = { 'size' => size, 'price' => price, 'side' => side, 'product_id' => product_id}
43
+ post('orders', order, &block)
44
+ end
45
+
46
+ # Transfer funds methods
47
+ #
48
+ def deposit(amount, coinbase_account_id, &block)
49
+ order = { 'type' => 'deposit', 'amount' => amount, 'coinbase_account_id' => coinbase_account_id }
50
+ post('orders', order, &block)
51
+ end
52
+
53
+ def withdraw(amount, coinbase_account_id, &block)
54
+ order = { 'type' => 'withdraw', 'amount' => amount, 'coinbase_account_id' => coinbase_account_id }
55
+ post('orders', order, &block)
56
+ end
57
+
58
+ # Fill methods
59
+ #
60
+ def fills(pagination = {}, &block)
61
+ get('fills' + paginate(pagination), nil, &block)
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,3 @@
1
+ class CBX
2
+ VERSION="0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cbx
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Michael Rodrigues
8
+ - Dan Silver
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-03-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: unirest
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '1.1'
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.1.2
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - "~>"
29
+ - !ruby/object:Gem::Version
30
+ version: '1.1'
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.1.2
34
+ - !ruby/object:Gem::Dependency
35
+ name: websocket-client-simple
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ type: :runtime
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ description: A complete interface to Coinbase Exchange's trading API.
49
+ email:
50
+ - mikebrodrigues@gmail.com
51
+ - dannysilver3@gmail.com
52
+ executables: []
53
+ extensions: []
54
+ extra_rdoc_files:
55
+ - README.md
56
+ files:
57
+ - README.md
58
+ - cbx.gemspec
59
+ - lib/cbx.rb
60
+ - lib/cbx/cbx_signature_maker.rb
61
+ - lib/cbx/feed.rb
62
+ - lib/cbx/market_data.rb
63
+ - lib/cbx/pagination.rb
64
+ - lib/cbx/trading.rb
65
+ - lib/cbx/version.rb
66
+ homepage: https://github.com/mikerodrigues/cbx
67
+ licenses:
68
+ - MIT
69
+ metadata:
70
+ parent_project_homepage: https://github.com/dan-silver/coinbase_exchange
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ requirements: []
86
+ rubyforge_project:
87
+ rubygems_version: 2.4.5
88
+ signing_key:
89
+ specification_version: 4
90
+ summary: Ruby wrapper for the Coinbase Exchange API
91
+ test_files: []