mirror of
https://github.com/LBRYFoundation/pool.git
synced 2025-09-30 15:20:36 +00:00
kraken api, to retrieve markets and btc balance
This commit is contained in:
parent
6d3241d02a
commit
997f0be1b5
11 changed files with 386 additions and 2 deletions
|
@ -42,6 +42,7 @@ define('EXCH_BLEUTRADE_KEY', '');
|
|||
define('EXCH_YOBIT_KEY', '');
|
||||
define('EXCH_CCEX_KEY', '');
|
||||
define('EXCH_SAFECEX_KEY', '');
|
||||
define('EXCH_KRAKEN_KEY', '');
|
||||
define('EXCH_BANX_USERNAME', '');
|
||||
|
||||
// Automatic withdraw to Yaamp btc wallet if btc balance > 0.3
|
||||
|
|
|
@ -73,6 +73,10 @@ class ExchangeCommand extends CConsoleCommand
|
|||
$balance = cryptopia_api_user('GetBalance',array("Currency"=>"BTC"));
|
||||
echo("cryptopia btc: ".json_encode($balance->Data)."\n");
|
||||
}
|
||||
if (!empty(EXCH_KRAKEN_KEY)) {
|
||||
$balance = kraken_api_user('Balance');
|
||||
echo("kraken btc: ".json_encode($balance)."\n");
|
||||
}
|
||||
if (!empty(EXCH_CRYPTSY_KEY)) {
|
||||
$info = cryptsy_api_query('getinfo');
|
||||
if (!arraySafeVal($info,'success',0) || !is_array($info['return'])) echo "error\n";
|
||||
|
|
|
@ -7,6 +7,7 @@ function BackendPricesUpdate()
|
|||
updateBittrexMarkets();
|
||||
updatePoloniexMarkets();
|
||||
updateBleutradeMarkets();
|
||||
updateKrakenMarkets();
|
||||
updateCCexMarkets();
|
||||
updateCryptopiaMarkets();
|
||||
updateYobitMarkets();
|
||||
|
@ -204,6 +205,54 @@ function updateBleutradeMarkets()
|
|||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function updateKrakenMarkets($force = false)
|
||||
{
|
||||
$exchange = 'kraken';
|
||||
$result = kraken_api_query('AssetPairs');
|
||||
if(!is_array($result)) return;
|
||||
|
||||
foreach($result as $pair => $data)
|
||||
{
|
||||
$pairs = explode('-', $pair);
|
||||
$base = reset($pairs); $symbol = end($pairs);
|
||||
if($symbol == 'BTC' || $base != 'BTC') continue;
|
||||
if(in_array($symbol, array('GBP','CAD','EUR','USD','JPY'))) continue;
|
||||
if(strpos($symbol,'.d') !== false) continue;
|
||||
|
||||
$coin = getdbosql('db_coins', "symbol='{$symbol}'");
|
||||
if(!$coin || !$coin->installed) continue;
|
||||
|
||||
debuglog("kraken: $symbol/$base ".json_encode($data));
|
||||
$fees = reset($currency['fees']);
|
||||
$feepct = end($fees);
|
||||
$market = getdbosql('db_markets', "coinid={$coin->id} and name='{$exchange}'");
|
||||
if(!$market) {
|
||||
$market = new db_markets;
|
||||
$market->coinid = $coin->id;
|
||||
$market->name = $exchange;
|
||||
}
|
||||
|
||||
$market->txfee = $feepct;
|
||||
|
||||
sleep(1);
|
||||
$ticker = kraken_api_query('Ticker', $symbol);
|
||||
if(!is_array($ticker) || !isset($ticker[$pair])) continue;
|
||||
|
||||
$ticker = arraySafeVal($ticker,$pair);
|
||||
if(!is_array($ticker) || !isset($ticker['b'])) continue;
|
||||
|
||||
debuglog("kraken: $symbol/$base ticker ".json_encode($ticker));
|
||||
|
||||
$price2 = ($ticker['b'][0] + $ticker['a'][0]) / 2;
|
||||
$market->price2 = AverageIncrement($market->price2, $price2);
|
||||
$market->price = AverageIncrement($market->price, $ticker['b'][0]);
|
||||
|
||||
$market->save();
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function updateBittrexMarkets($force = false)
|
||||
{
|
||||
$exchange = 'bittrex';
|
||||
|
|
|
@ -112,6 +112,21 @@ function updateRawcoins()
|
|||
}
|
||||
}
|
||||
|
||||
$list = kraken_api_query('AssetPairs');
|
||||
if(is_array($list))
|
||||
{
|
||||
dborun("UPDATE markets SET deleted=true WHERE name='kraken'");
|
||||
foreach($list as $pair => $item) {
|
||||
$pairs = explode('-', $pair);
|
||||
$base = reset($pairs); $symbol = end($pairs);
|
||||
if($symbol == 'BTC' || $base != 'BTC') continue;
|
||||
if(in_array($symbol, array('GBP','CAD','EUR','USD','JPY'))) continue;
|
||||
if(strpos($symbol,'.d') !== false) continue;
|
||||
$symbol = strtoupper($symbol);
|
||||
updateRawCoin('kraken', $symbol);
|
||||
}
|
||||
}
|
||||
|
||||
$list = alcurex_api_query('market','?info=on');
|
||||
if(is_object($list) && isset($list->MARKETS))
|
||||
{
|
||||
|
@ -164,7 +179,9 @@ function updateRawcoins()
|
|||
$list = getdbolist('db_coins', "not enable and not installed and id not in (select distinct coinid from markets)");
|
||||
foreach($list as $coin)
|
||||
{
|
||||
debuglog("$coin->symbol is not longer active");
|
||||
if ($coin->visible)
|
||||
debuglog("{$coin->symbol} is no longer active");
|
||||
// todo: proper cleanup in all tables (like "yiimp deletecoin <id>")
|
||||
// if ($coin->symbol != 'BTC')
|
||||
// $coin->delete();
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ require_once("poloniex.php");
|
|||
require_once("bittrex.php");
|
||||
require_once("ccexapi.php");
|
||||
require_once("bleutrade.php");
|
||||
require_once("kraken.php");
|
||||
require_once("yobit.php");
|
||||
require_once("cryptsy.php");
|
||||
require_once("safecex.php");
|
||||
|
|
263
web/yaamp/core/exchange/kraken.php
Normal file
263
web/yaamp/core/exchange/kraken.php
Normal file
|
@ -0,0 +1,263 @@
|
|||
<?php
|
||||
/**
|
||||
* Reference implementation for Kraken's REST API.
|
||||
*
|
||||
* See https://www.kraken.com/help/api for more info.
|
||||
*
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2013 Payward, Inc
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
class KrakenAPIException extends ErrorException {};
|
||||
|
||||
class KrakenAPI
|
||||
{
|
||||
protected $key; // API key
|
||||
protected $secret; // API secret
|
||||
protected $url; // API base URL
|
||||
protected $version; // API version
|
||||
protected $curl; // curl handle
|
||||
|
||||
/**
|
||||
* Constructor for KrakenAPI
|
||||
*
|
||||
* @param string $key API key
|
||||
* @param string $secret API secret
|
||||
* @param string $url base URL for Kraken API
|
||||
* @param string $version API version
|
||||
* @param bool $sslverify enable/disable SSL peer verification. disable if using beta.api.kraken.com
|
||||
*/
|
||||
function __construct($key, $secret, $url='https://api.kraken.com', $version='0', $sslverify=true)
|
||||
{
|
||||
$this->key = $key;
|
||||
$this->secret = $secret;
|
||||
$this->url = $url;
|
||||
$this->version = $version;
|
||||
$this->curl = curl_init();
|
||||
|
||||
curl_setopt_array($this->curl, array(
|
||||
CURLOPT_SSL_VERIFYPEER => $sslverify,
|
||||
CURLOPT_SSL_VERIFYHOST => 2,
|
||||
CURLOPT_USERAGENT => 'Kraken PHP API Agent',
|
||||
CURLOPT_POST => true,
|
||||
CURLOPT_RETURNTRANSFER => true)
|
||||
);
|
||||
}
|
||||
|
||||
function __destruct()
|
||||
{
|
||||
curl_close($this->curl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Query public methods
|
||||
*
|
||||
* @param string $method method name
|
||||
* @param array $request request parameters
|
||||
* @return array request result on success
|
||||
* @throws KrakenAPIException
|
||||
*/
|
||||
function QueryPublic($method, array $request = array())
|
||||
{
|
||||
// build the POST data string
|
||||
$postdata = http_build_query($request, '', '&');
|
||||
|
||||
// make request
|
||||
curl_setopt($this->curl, CURLOPT_URL, $this->url . '/' . $this->version . '/public/' . $method);
|
||||
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $postdata);
|
||||
curl_setopt($this->curl, CURLOPT_HTTPHEADER, array());
|
||||
$result = curl_exec($this->curl);
|
||||
if($result===false)
|
||||
throw new KrakenAPIException('CURL error: ' . curl_error($this->curl));
|
||||
|
||||
// decode results
|
||||
$result = json_decode($result, true);
|
||||
if(!is_array($result))
|
||||
throw new KrakenAPIException('JSON decode error');
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Query private methods
|
||||
*
|
||||
* @param string $path method path
|
||||
* @param array $request request parameters
|
||||
* @return array request result on success
|
||||
* @throws KrakenAPIException
|
||||
*/
|
||||
function QueryPrivate($method, array $request = array())
|
||||
{
|
||||
if(!isset($request['nonce'])) {
|
||||
// generate a 64 bit nonce using a timestamp at microsecond resolution
|
||||
// string functions are used to avoid problems on 32 bit systems
|
||||
$nonce = explode(' ', microtime());
|
||||
$request['nonce'] = $nonce[1] . str_pad(substr($nonce[0], 2, 6), 6, '0');
|
||||
}
|
||||
|
||||
// build the POST data string
|
||||
$postdata = http_build_query($request, '', '&');
|
||||
|
||||
// set API key and sign the message
|
||||
$path = '/' . $this->version . '/private/' . $method;
|
||||
$sign = hash_hmac('sha512', $path . hash('sha256', $request['nonce'] . $postdata, true), base64_decode($this->secret), true);
|
||||
$headers = array(
|
||||
'API-Key: ' . $this->key,
|
||||
'API-Sign: ' . base64_encode($sign)
|
||||
);
|
||||
|
||||
// make request
|
||||
curl_setopt($this->curl, CURLOPT_URL, $this->url . $path);
|
||||
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $postdata);
|
||||
curl_setopt($this->curl, CURLOPT_HTTPHEADER, $headers);
|
||||
$result = curl_exec($this->curl);
|
||||
if($result===false)
|
||||
throw new KrakenAPIException('CURL error: ' . curl_error($this->curl));
|
||||
|
||||
// decode results
|
||||
$result = json_decode($result, true);
|
||||
if(!is_array($result))
|
||||
throw new KrakenAPIException('JSON decode error');
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
// convert ISO-4217-A3-X to generic crypto symbols
|
||||
function kraken_ISOtoSymbol($iso, $default='')
|
||||
{
|
||||
$conv = array(
|
||||
'XXBT'=>'BTC',
|
||||
'XXDG'=>'DOGE',
|
||||
);
|
||||
if (empty($default)) $default = substr($iso, 1);
|
||||
$symbol = arraySafeVal($conv, $iso, $default);
|
||||
return $symbol;
|
||||
}
|
||||
|
||||
// convert yiimp symbols to ISO-4217-A3-X
|
||||
function kraken_symbolToISO($symbol)
|
||||
{
|
||||
$conv = array(
|
||||
'BTC' => 'XXBT',
|
||||
'DOGE' => 'XXDG',
|
||||
);
|
||||
$iso = arraySafeVal($conv, $symbol, 'X'.$symbol);
|
||||
return $iso;
|
||||
}
|
||||
|
||||
function kraken_convertPair($symbol, $base='BTC')
|
||||
{
|
||||
$btc_k = kraken_symbolToISO($base);
|
||||
$sym_k = kraken_symbolToISO($symbol);
|
||||
$pair = $btc_k.$sym_k;
|
||||
return $pair;
|
||||
}
|
||||
|
||||
// https://www.kraken.com/help/api
|
||||
|
||||
function kraken_api_query($method, $params='')
|
||||
{
|
||||
$kraken = new KrakenAPI('', '');
|
||||
|
||||
$arrParams = array();
|
||||
switch ($method) {
|
||||
case 'Ticker':
|
||||
$pair = kraken_convertPair($params);
|
||||
$arrParams = array('pair'=>$pair);
|
||||
break;
|
||||
}
|
||||
|
||||
$res = $kraken->QueryPublic($method, $arrParams);
|
||||
|
||||
$proper = array();
|
||||
if (!empty($res) && isset($res['result']) && !empty($res['result'])) {
|
||||
switch ($method) {
|
||||
case 'Assets':
|
||||
foreach ($res['result'] as $symk => $asset) {
|
||||
$symbol = kraken_ISOtoSymbol($symk, $asset['altname']);
|
||||
$proper[$symbol] = $asset;
|
||||
}
|
||||
return $proper;
|
||||
case 'AssetPairs':
|
||||
foreach ($res['result'] as $pairk => $asset) {
|
||||
$symk = substr($pairk, 0, 4);
|
||||
$symbol1 = kraken_ISOtoSymbol($symk);
|
||||
$symk = substr($pairk, 4);
|
||||
$symbol2 = kraken_ISOtoSymbol($symk);
|
||||
$asset['base'] = kraken_ISOtoSymbol($asset['base']);
|
||||
$asset['quote'] = kraken_ISOtoSymbol($asset['quote']);
|
||||
$asset['fee_volume_currency'] = kraken_ISOtoSymbol($asset['fee_volume_currency']);
|
||||
$proper[$symbol1.'-'.$symbol2] = $asset;
|
||||
}
|
||||
return $proper;
|
||||
case 'Ticker':
|
||||
foreach ($res['result'] as $pairk => $asset) {
|
||||
$symk = substr($pairk, 0, 4);
|
||||
$symbol1 = kraken_ISOtoSymbol($symk);
|
||||
$symk = substr($pairk, 4);
|
||||
$symbol2 = kraken_ISOtoSymbol($symk);
|
||||
$proper[$symbol1.'-'.$symbol2] = $asset;
|
||||
}
|
||||
return $proper;
|
||||
}
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
function kraken_api_user($method, $params='')
|
||||
{
|
||||
require_once('/etc/yiimp/keys.php');
|
||||
if (!defined('EXCH_KRAKEN_SECRET')) return false;
|
||||
|
||||
$apikey = EXCH_KRAKEN_KEY; // your API-key
|
||||
$apisecret = EXCH_KRAKEN_SECRET; // your Secret-key
|
||||
|
||||
$kraken = new KrakenAPI($apikey, $apisecret);
|
||||
|
||||
$arrParams = array();
|
||||
switch ($method) {
|
||||
case 'OpenOrders':
|
||||
$arrParams = array('trades'=> (bool) ($params));
|
||||
break;
|
||||
case 'Withdraw':
|
||||
$arrParams = array('trades'=> (bool) ($params));
|
||||
break;
|
||||
}
|
||||
|
||||
$res = $kraken->QueryPrivate($method, $arrParams);
|
||||
|
||||
$proper = array();
|
||||
if (!empty($res) && isset($res['result']) && !empty($res['result'])) {
|
||||
switch ($method) {
|
||||
case 'Balance':
|
||||
foreach ($res['result'] as $symk => $balance) {
|
||||
$symbol = kraken_ISOtoSymbol($symk);
|
||||
$proper[$symbol] = $balance;
|
||||
}
|
||||
return $proper;
|
||||
}
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
42
web/yaamp/core/trading/kraken_trading.php
Normal file
42
web/yaamp/core/trading/kraken_trading.php
Normal file
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
|
||||
function doKrakenTrading($quick=false)
|
||||
{
|
||||
$flushall = rand(0, 4) == 0;
|
||||
if($quick) $flushall = false;
|
||||
|
||||
$balances = kraken_api_user('Balance');
|
||||
if(!$balances || !is_array($balances)) return;
|
||||
|
||||
$savebalance = getdbosql('db_balances', "name='kraken'");
|
||||
if (!is_object($savebalance)) return;
|
||||
|
||||
$savebalance->balance = 0;
|
||||
|
||||
foreach($balances as $symbol => $balance)
|
||||
{
|
||||
if ($symbol == 'BTC') {
|
||||
$savebalance->balance = $balance;
|
||||
$savebalance->save();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!YAAMP_ALLOW_EXCHANGE) {
|
||||
// store available balance in market table
|
||||
$coins = getdbolist('db_coins', "symbol=:symbol OR symbol2=:symbol",
|
||||
array(':symbol'=>$symbol)
|
||||
);
|
||||
if (empty($coins)) continue;
|
||||
foreach ($coins as $coin) {
|
||||
$market = getdbosql('db_markets', "coinid=:coinid AND name='kraken'", array(':coinid'=>$coin->id));
|
||||
if (!$market) continue;
|
||||
if ($market->balance != $balance) {
|
||||
$market->balance = $balance;
|
||||
$market->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!YAAMP_ALLOW_EXCHANGE) return;
|
||||
}
|
|
@ -5,7 +5,7 @@ require_once('bittrex_trading.php');
|
|||
require_once('bleutrade_trading.php');
|
||||
require_once('cryptsy_trading.php');
|
||||
require_once('c-cex_trading.php');
|
||||
require_once('empoex_trading.php');
|
||||
require_once('kraken_trading.php');
|
||||
require_once('yobit_trading.php');
|
||||
require_once('alcurex_trading.php');
|
||||
require_once('banx_trading.php');
|
||||
|
|
|
@ -30,6 +30,7 @@ if (!defined('EXCH_POLONIEX_KEY')) define('EXCH_POLONIEX_KEY', '');
|
|||
if (!defined('EXCH_SAFECEX_KEY')) define('EXCH_SAFECEX_KEY', '');
|
||||
if (!defined('EXCH_YOBIT_KEY')) define('EXCH_YOBIT_KEY', '');
|
||||
if (!defined('EXCH_BANX_USERNAME')) define('EXCH_BANX_USERNAME', '');
|
||||
if (!defined('EXCH_KRAKEN_KEY')) define('EXCH_KRAKEN_KEY', '');
|
||||
|
||||
if (!defined('YAAMP_BTCADDRESS')) define('YAAMP_BTCADDRESS', '');
|
||||
if (!defined('YAAMP_SITE_URL')) define('YAAMP_SITE_URL', 'localhost');
|
||||
|
|
|
@ -882,6 +882,11 @@ class SiteController extends CommonController
|
|||
updateBleutradeMarkets();
|
||||
break;
|
||||
|
||||
case 'kraken':
|
||||
doKrakenTrading(true);
|
||||
updateKrakenMarkets();
|
||||
break;
|
||||
|
||||
case 'poloniex':
|
||||
doPoloniexTrading(true);
|
||||
updatePoloniexMarkets();
|
||||
|
|
|
@ -134,6 +134,7 @@ class CronjobController extends CommonController
|
|||
doCryptopiaTrading();
|
||||
doSafecexTrading();
|
||||
//doCryptsyTrading();
|
||||
doKrakenTrading();
|
||||
doPoloniexTrading();
|
||||
doYobitTrading();
|
||||
doCCexTrading();
|
||||
|
|
Loading…
Add table
Reference in a new issue