Git Product home page Git Product logo

trsathya / cryptex Goto Github PK

View Code? Open in Web Editor NEW
64.0 14.0 23.0 246 KB

Gemini, GDAX, Bitfinex, Poloniex, Binance, Kraken, Cryptopia, Koinex, BitGrail and CoinMarketCap cryptocurrency exchange API clients in Swift / iOS SDK. Check prices and account balances using Sample iOS app.

License: MIT License

Swift 98.37% Ruby 1.36% C 0.06% Objective-C 0.22%
swift koinex cryptocurrency crypto cryptocurrencies bitcoin ethereum litecoin altcoin coinmarketcap

cryptex's Introduction

Cryptex - iOS SDK for crypto currencies in Swift 4

Swift 4.2 CocoaPods GitHub release Github Commits Since last release badge-mit badge-platforms badge-pms

Cryptex, a single Swift 4 library and an iOS app to watch prices and check realtime account balances across multiple cryptocurrency exchanges. Trading features are coming soon.

Sample App UI

Requirements

  • iOS 9.0+ | macOS 10.10+ | tvOS 9.0+ | watchOS 2.0+
  • Xcode 8.3+

Integration

CocoaPods (iOS 9+, OS X 10.9+)

To install all exchanges

pod 'Cryptex', '~> 0.0.6'

To install only one exchange

pod 'Cryptex/Gemini', '~> 0.0.6'

To install two or more exchanges

pod 'Cryptex', '~> 0.0.6', :subspecs => ['Gemini', 'GDAX', "Poloniex"]

Carthage (iOS 8+, OS X 10.9+)

github "trsathya/Cryptex" ~> 0.0.6

Swift Package Manager

dependencies: [
    .Package(url: "https://github.com/trsathya/Cryptex", from: "0.0.6"),
]

Usage

Initialization

import Cryptex
Fetch coinmarketcap.com global data
let coinMarketCapService = CoinMarketCap.Service(key: nil, secret: nil, session: URLSession.shared, userPreference: .USD_BTC, currencyOverrides: nil)
coinMarketCapService.getGlobal { (_) in
    if let data = coinMarketCapService.store.globalMarketDataResponse.globalData {
        print(data)
    }
}
Console logs
GET https://api.coinmarketcap.com/v1/global
200 https://api.coinmarketcap.com/v1/global/
Response Data: {
    "total_market_cap_usd": 585234214361.0,
    "total_24h_volume_usd": 22202189284.0,
    "bitcoin_percentage_of_market_cap": 34.15,
    "active_currencies": 896,
    "active_assets": 567,
    "active_markets": 8187,
    "last_updated": 1517118863
}
Optional(Cryptex.CoinMarketCap.GlobalMarketData(marketCap: 585234214361, volume24Hrs: 22202189284, bitcoinDominance: 34.15, activeCurrencies: 896, activeAssets: 567, activeMarkets: 8187, lastUpdated: 1517118863))

Or

Fetch Gemini public ticker data
let geminiService = Gemini.Service(key: nil, secret: nil, session: URLSession.shared, userPreference: .USD_BTC, currencyOverrides: nil)
geminiService.getTickers { (_) in
    print(geminiService.store.tickerByName)
}
Console logs
GET https://api.gemini.com/v1/symbols
200 https://api.gemini.com/v1/symbols
GET https://api.gemini.com/v1/pubticker/BTCUSD
GET https://api.gemini.com/v1/pubticker/ETHBTC
GET https://api.gemini.com/v1/pubticker/ETHUSD
200 https://api.gemini.com/v1/pubticker/ETHBTC
200 https://api.gemini.com/v1/pubticker/ETHUSD
200 https://api.gemini.com/v1/pubticker/BTCUSD
[
BTCUSD : 11721 USD,
ETHBTC : 0.0977 BTC,
ETHUSD : 1148.99 USD]

Or

Fetch Gemini private account balance data
let geminiService = Gemini.Service(key: <Your gemini account api key>, secret: <Your gemini account api secret>, session: URLSession.shared, userPreference: .USD_BTC, currencyOverrides: nil)
geminiService.getBalances { (_) in
    for balance in self.gemini.store.balances {
        print("\(balance) \(self.gemini.store.balanceInPreferredCurrency(balance: balance).usdFormatted ?? "")")
    }
}
Console logs
GET https://api.gemini.com/v1/symbols
200 https://api.gemini.com/v1/symbols
GET https://api.gemini.com/v1/pubticker/BTCUSD
GET https://api.gemini.com/v1/pubticker/ETHBTC
GET https://api.gemini.com/v1/pubticker/ETHUSD
200 https://api.gemini.com/v1/pubticker/BTCUSD
200 https://api.gemini.com/v1/pubticker/ETHUSD
200 https://api.gemini.com/v1/pubticker/ETHBTC
POST https://api.gemini.com/v1/balances
200 https://api.gemini.com/v1/balances

BTC: 0.29182653 $3,420.49
USD: 26.96 $26.96
ETH: 0.00000017 $0.00

Note: While creating Binance service, pass a currency override array to resolve a currency code difference. This is because Binance chose to use the code BCC for BitcoinCash instead of BCH.

let currencyOverrides = ["BCC": Currency(name: "Bitcoin Cash", code: "BCC")]
let binanceService = Binance.Service(key: key, secret: secret, session: session, userPreference: .USDT_BTC, currencyOverrides: currencyOverrides)

cryptex's People

Contributors

monomadic avatar trsathya avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cryptex's Issues

Binance Exchange example, documentation.

@trsathya Hello again. This Cryptex package installs fine using Swift Package Manager 4.

I would like to import Cryptex but would be grateful for an example of how to use the Cryptex package with the Binance exchange.

I'm guessing that I will need to generate an Api Key and Api Secret, but I'm unsure of how to use your module.

Update getAccountBalances method in Kraken to safely unrwarp arrayOfCryptoBalances

Hey,

you should update the getAccountBalances method to this once here and safely unwrap arrayOfCryptoBalances since it will lead to a fatal crash in case a user has once set up the API correctly but then deletes the keys on the website and comes back to the App. This here at least won't lead to the App crashing:

public func getAccountBalances(completion: @escaping (ResponseType) -> Void) {
            let apiType = Kraken.API.getAccountBalance
            if apiType.checkInterval(response: store.balanceResponse) {
                completion(.cached)
            } else {
                krakenDataTaskFor(api: apiType) { (response) in
                    
                    guard let json = response.json as? Dictionary<String, Any> else {
                        print("Error: Cast Failed in \(#function)")
                        return
                    }
                    if let arrayOfCryptoBalances = json["result"] as? Dictionary<String,String> {
                        var balances: [Balance] = []
                        
                        for cryptoBalance in arrayOfCryptoBalances {
                            let newBalance = ["type": cryptoBalance.key,
                                              "amount": cryptoBalance.value,
                                              "available": cryptoBalance.value]
                            
                            balances.append(Balance(json: newBalance, currencyStore: self))
                        }
                        
                        self.store.balances = balances
                        self.store.balanceResponse = response.httpResponse
                        completion(.fetched)
                    }
                }.resume()
            }
        }

Kraken invalid nonce

Hey,

I tried to make a pull request but I can't due to access rights. Kraken has a problem with the nonce, I fixed it on my local branch. You have to change Line 178 in ´Kraken.swift´ from:

let nonce = "\(getTimestampInSeconds())"
postDataDictionary["nonce"] = nonce

to something like this:

let timestamp = NSDate().timeIntervalSince1970
let nonce = "\(Int64(timestamp*1000))"
postDataDictionary["nonce"] = nonce

I assume it has a problem with the format of the nonce, but didn't dig deeper into it, since this fixed it for me.

Best,
Mathias

Carthage won't install

user$ carthage update --platform iOS
*** Fetching Cryptex
*** Checking out Cryptex at "0.0.4"
*** xcodebuild output can be found in /var/folders/vd/3y7vj2s57t1b03cvgxqftrxsdmgrzf/T/carthage-xcodebuild.n7CbMX.log
*** Skipped building Cryptex due to the error:
Dependency "Cryptex" has no shared framework schemes for any of the platforms: iOS

If you believe this to be an error, please file an issue with the maintainers at https://github.com/trsathya/Cryptex/issues/new

Cartfile contents:
github "trsathya/Cryptex" ~> 0.0.4

Cryptex doesn't build with carthage

Hello, xcode 9.3 and swift 4.1 for an ios app.
I have only github "trsathya/Cryptex" ~> 0.0.5 in my cartfile and i launch carthage update --platform iOS then i have the following error :

*** Fetching Cryptex
*** Fetching CryptoSwift
*** Checking out Cryptex at "0.0.5"
*** Checking out CryptoSwift at "0.9.0"
*** xcodebuild output can be found in /var/folders/v3/tmrdqb7j52n5v0bj0_l_d2dm0000gn/T/carthage-xcodebuild.NpjKoX.log
*** Downloading CryptoSwift.framework binary at "CMAC, AEAD and Swift 4.1"
*** Building scheme "Cryptex" in Cryptex.xcworkspace
Build Failed
	Task failed with exit code 6:
	/usr/bin/xcrun simctl list devices

This usually indicates that project itself failed to compile. Please check the xcodebuild log for more details: /var/folders/v3/tmrdqb7j52n5v0bj0_l_d2dm0000gn/T/carthage-xcodebuild.NpjKoX.log

And here is the log : https://pastebin.com/cWsZMWeU

Thanks !

Problem with retrieving getAccountBalances or getBalances for Kraken

Hey Sathya,

Both functions getAccountBalances and getBalances are failing at the guard statement:
print("Error: Cast Failed in \(#function)")

It seems like that response.json is actually not of the type [[String: String]] but actually gives back an answer. I adjusted the function now to this one here which seems works since I am creating a new Balance object and assign the values, though the rest of the krakenService.store.balances object later is then messed up e.g. ...xxx.currency.code etc. My function:

        public func getAccountBalances(completion: @escaping (ResponseType) -> Void) {
            let apiType = Kraken.API.getAccountBalance
            if apiType.checkInterval(response: store.balanceResponse) {
                completion(.cached)
            } else {
                krakenDataTaskFor(api: apiType) { (response) in
                    
                    guard let json = response.json as? Dictionary<String, Any> else {
                        print("Error: Cast Failed in \(#function)")
                        return
                    }
                    let arrayOfCryptoBalances = json["result"] as! Dictionary<String,String>
                    var balances: [Balance] = []

                    for cryptoBalance in arrayOfCryptoBalances {
                        let newBalance = ["type": cryptoBalance.key,
                                       "amount": cryptoBalance.value,
                                       "available": cryptoBalance.value]
                        
                        balances.append(Balance(json: newBalance, currencyStore: self))
                    }

                    self.store.balances = balances
                    self.store.balanceResponse = response.httpResponse
                    completion(.fetched)
                    }.resume()
            }
        }

Do you want me to create a pull request with my solution or are you taking care of it yourself? Maybe Kraken has updated the API since you wrote it. Also I found it annoying by Kraken that they decided to call most of the crypto currencies with own symbols. e.g. XBT instead of BTC for Bitcoin... is this what your overwrite function is for?

Best,
Matt

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.