From e44ae3d75f08a495967862800eee34d10d31adf3 Mon Sep 17 00:00:00 2001 From: Adrian Gallagher Date: Wed, 22 Feb 2023 15:23:18 +1100 Subject: [PATCH] exchanges: Remove LocalBitcoins and fix Bybit tests (#1142) --- README.md | 1 - cmd/apichecker/apicheck.go | 30 - cmd/apichecker/apicheck_test.go | 10 - cmd/apichecker/testupdates.json | 15 - cmd/apichecker/updates.json | 15 - .../exchanges_trade_readme.tmpl | 1 - .../exchanges_templates/localbitcoins.tmpl | 98 - .../root_templates/root_readme.tmpl | 1 - .../wrapperconfig.json | 5 - common/file/archive/zip_test.go | 4 +- config_example.json | 76 - docs/ADD_NEW_EXCHANGE.md | 2 - docs/MULTICHAIN_TRANSFER_SUPPORT.md | 1 - docs/OHLCV.md | 3 +- engine/exchange_manager.go | 3 - engine/exchange_manager_test.go | 2 +- exchanges/bybit/bybit_cfutures.go | 3 + exchanges/bybit/bybit_test.go | 8 +- exchanges/bybit/bybit_ufutures.go | 3 + exchanges/localbitcoins/README.md | 132 - exchanges/localbitcoins/localbitcoins.go | 802 -- .../localbitcoins/localbitcoins_live_test.go | 38 - .../localbitcoins/localbitcoins_mock_test.go | 61 - exchanges/localbitcoins/localbitcoins_test.go | 485 -- .../localbitcoins/localbitcoins_types.go | 342 - .../localbitcoins/localbitcoins_wrapper.go | 709 -- exchanges/localbitcoins/rate_limit.go | 37 - exchanges/support.go | 1 - exchanges/trade/README.md | 1 - testdata/configtest.json | 76 - testdata/exchangelist.csv | 1 - .../localbitcoins/localbitcoins.json | 7686 ----------------- 32 files changed, 14 insertions(+), 10638 deletions(-) delete mode 100644 cmd/documentation/exchanges_templates/localbitcoins.tmpl delete mode 100644 exchanges/localbitcoins/README.md delete mode 100644 exchanges/localbitcoins/localbitcoins.go delete mode 100644 exchanges/localbitcoins/localbitcoins_live_test.go delete mode 100644 exchanges/localbitcoins/localbitcoins_mock_test.go delete mode 100644 exchanges/localbitcoins/localbitcoins_test.go delete mode 100644 exchanges/localbitcoins/localbitcoins_types.go delete mode 100644 exchanges/localbitcoins/localbitcoins_wrapper.go delete mode 100644 exchanges/localbitcoins/rate_limit.go delete mode 100644 testdata/http_mock/localbitcoins/localbitcoins.json diff --git a/README.md b/README.md index cb17c6a7..6d2e10e4 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,6 @@ Join our slack to discuss all things related to GoCryptoTrader! [GoCryptoTrader | ItBit | Yes | NA | No | | Kraken | Yes | Yes | NA | | Lbank | Yes | No | NA | -| LocalBitcoins | Yes | NA | NA | | OKCoin International | Yes | Yes | No | | Okx | Yes | Yes | NA | | Poloniex | Yes | Yes | NA | diff --git a/cmd/apichecker/apicheck.go b/cmd/apichecker/apicheck.go index ecf5a27a..355b7162 100644 --- a/cmd/apichecker/apicheck.go +++ b/cmd/apichecker/apicheck.go @@ -17,7 +17,6 @@ import ( "time" "github.com/thrasher-corp/gocryptotrader/common" - "github.com/thrasher-corp/gocryptotrader/common/crypto" gctfile "github.com/thrasher-corp/gocryptotrader/common/file" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/request" @@ -48,7 +47,6 @@ const ( pathKraken = "https://www.kraken.com/features/api" pathAlphaPoint = "https://alphapoint.github.io/slate/#introduction" pathYobit = "https://www.yobit.net/en/api/" - pathLocalBitcoins = "https://localbitcoins.com/api-docs/" pathGetAllLists = "https://api.trello.com/1/boards/%s/lists?cards=none&card_fields=all&filter=open&fields=all&key=%s&token=%s" pathNewCard = "https://api.trello.com/1/cards?idList=%s&name=%s&key=%s&token=%s" pathChecklists = "https://api.trello.com/1/checklists/%s/checkItems?%s&key=%s&token=%s" @@ -488,8 +486,6 @@ func checkChangeLog(htmlData *HTMLScrapingData) (string, error) { dataStrings, err = htmlScrapeAlphaPoint(htmlData) case pathYobit: dataStrings, err = htmlScrapeYobit(htmlData) - case pathLocalBitcoins: - dataStrings, err = htmlScrapeLocalBitcoins(htmlData) case pathOkCoin: dataStrings, err = htmlScrapeOk(htmlData) default: @@ -1137,32 +1133,6 @@ loop: return resp, nil } -// htmlScrapeLocalBitcoins gets the check string for Yobit Exchange -func htmlScrapeLocalBitcoins(htmlData *HTMLScrapingData) ([]string, error) { - temp, err := sendHTTPGetRequest(htmlData.Path, nil) - if err != nil { - return nil, err - } - defer temp.Body.Close() - - a, err := io.ReadAll(temp.Body) - if err != nil { - return nil, err - } - r, err := regexp.Compile(htmlData.RegExp) - if err != nil { - return nil, err - } - str := r.FindString(string(a)) - sha, err := crypto.GetSHA256([]byte(str)) - if err != nil { - return nil, err - } - var resp []string - resp = append(resp, crypto.HexEncodeToString(sha)) - return resp, nil -} - // trelloCreateNewCheck creates a new checklist item within a given checklist from trello func trelloCreateNewCheck(newCheckName string) error { newName, err := nameStateChanges(newCheckName, "") diff --git a/cmd/apichecker/apicheck_test.go b/cmd/apichecker/apicheck_test.go index d3fd54b0..003483b0 100644 --- a/cmd/apichecker/apicheck_test.go +++ b/cmd/apichecker/apicheck_test.go @@ -386,16 +386,6 @@ func TestHTMLYobit(t *testing.T) { } } -func TestHTMLScrapeLocalBitcoins(t *testing.T) { - t.Parallel() - data := HTMLScrapingData{TokenData: "div", - RegExp: `col-md-12([\s\S]*?)clearfix`, - Path: "https://localbitcoins.com/api-docs/"} - if _, err := htmlScrapeLocalBitcoins(&data); err != nil { - t.Error(err) - } -} - func TestHTMLScrapeOk(t *testing.T) { t.Parallel() data := HTMLScrapingData{TokenData: "a", diff --git a/cmd/apichecker/testupdates.json b/cmd/apichecker/testupdates.json index 2dfd4634..36b850aa 100644 --- a/cmd/apichecker/testupdates.json +++ b/cmd/apichecker/testupdates.json @@ -327,21 +327,6 @@ }, "Disabled": false }, - { - "Name": "LocalBitcoins", - "CheckType": "HTML String Check", - "Data": { - "HTMLData": { - "TokenData": "div", - "Key": "class", - "Val": "col-md-12", - "RegExp": "col-md-12([\\s\\S]*?)clearfix", - "CheckString": "37a144dc619776b87c098da5a88bef7fed6c8a7cea2d4b9a38c96750726c93ff", - "Path": "https://localbitcoins.com/api-docs/" - } - }, - "Disabled": false - }, { "Name": "OkCoin International", "CheckType": "HTML String Check", diff --git a/cmd/apichecker/updates.json b/cmd/apichecker/updates.json index 20b239f9..21be43a5 100644 --- a/cmd/apichecker/updates.json +++ b/cmd/apichecker/updates.json @@ -327,21 +327,6 @@ }, "Disabled": false }, - { - "Name": "LocalBitcoins", - "CheckType": "HTML String Check", - "Data": { - "HTMLData": { - "TokenData": "div", - "Key": "class", - "Val": "col-md-12", - "RegExp": "col-md-12([\\s\\S]*?)clearfix", - "CheckString": "37a144dc619776b87c098da5a88bef7fed6c8a7cea2d4b9a38c96750726c93ff", - "Path": "https://localbitcoins.com/api-docs/" - } - }, - "Disabled": false - }, { "Name": "OkCoin International", "CheckType": "HTML String Check", diff --git a/cmd/documentation/exchanges_templates/exchanges_trade_readme.tmpl b/cmd/documentation/exchanges_templates/exchanges_trade_readme.tmpl index 62fb55e9..32e335ed 100644 --- a/cmd/documentation/exchanges_templates/exchanges_trade_readme.tmpl +++ b/cmd/documentation/exchanges_templates/exchanges_trade_readme.tmpl @@ -63,7 +63,6 @@ _b in this context is an `IBotExchange` implemented struct_ | ItBit | Yes | NA | No | | Kraken | Yes | Yes | No | | Lbank | Yes | No | Yes | -| LocalBitcoins | Yes | NA | No | | OKCoin International | Yes | Yes | No | | Okx | Yes | Yes | Yes | | Poloniex | Yes | Yes | Yes | diff --git a/cmd/documentation/exchanges_templates/localbitcoins.tmpl b/cmd/documentation/exchanges_templates/localbitcoins.tmpl deleted file mode 100644 index 6589d0e4..00000000 --- a/cmd/documentation/exchanges_templates/localbitcoins.tmpl +++ /dev/null @@ -1,98 +0,0 @@ -{{define "exchanges localbitcoins" -}} -{{template "header" .}} -## LocalBitcoins Exchange - -### Current Features - -+ REST Support - -### How to enable - -+ [Enable via configuration](https://github.com/thrasher-corp/gocryptotrader/tree/master/config#enable-exchange-via-config-example) - -+ Individual package example below: - -```go - // Exchanges will be abstracted out in further updates and examples will be - // supplied then -``` - -### How to do REST public/private calls - -+ If enabled via "configuration".json file the exchange will be added to the -IBotExchange array in the ```go var bot Bot``` and you will only be able to use -the wrapper interface functions for accessing exchange data. View routines.go -for an example of integration usage with GoCryptoTrader. Rudimentary example -below: - -main.go -```go -var l exchange.IBotExchange - -for i := range bot.Exchanges { - if bot.Exchanges[i].GetName() == "LocalBitcoins" { - l = bot.Exchanges[i] - } -} - -// Public calls - wrapper functions - -// Fetches current ticker information -tick, err := l.FetchTicker() -if err != nil { - // Handle error -} - -// Fetches current orderbook information -ob, err := l.FetchOrderbook() -if err != nil { - // Handle error -} - -// Private calls - wrapper functions - make sure your APIKEY and APISECRET are -// set and AuthenticatedAPISupport is set to true - -// Fetches current account information -accountInfo, err := l.GetAccountInfo() -if err != nil { - // Handle error -} -``` - -+ If enabled via individually importing package, rudimentary example below: - -```go -// Public calls - -// Fetches current ticker information -ticker, err := l.GetTicker() -if err != nil { - // Handle error -} - -// Fetches current orderbook information -ob, err := l.GetOrderBook() -if err != nil { - // Handle error -} - -// Private calls - make sure your APIKEY and APISECRET are set and -// AuthenticatedAPISupport is set to true - -// GetUserInfo returns account info -accountInfo, err := l.GetUserInfo(...) -if err != nil { - // Handle error -} - -// Submits an order and the exchange and returns its tradeID -tradeID, err := l.Trade(...) -if err != nil { - // Handle error -} -``` - -### Please click GoDocs chevron above to view current GoDoc information for this package -{{template "contributions"}} -{{template "donations" .}} -{{end}} diff --git a/cmd/documentation/root_templates/root_readme.tmpl b/cmd/documentation/root_templates/root_readme.tmpl index 675c96b2..0e7c5acc 100644 --- a/cmd/documentation/root_templates/root_readme.tmpl +++ b/cmd/documentation/root_templates/root_readme.tmpl @@ -41,7 +41,6 @@ Join our slack to discuss all things related to GoCryptoTrader! [GoCryptoTrader | ItBit | Yes | NA | No | | Kraken | Yes | Yes | NA | | Lbank | Yes | No | NA | -| LocalBitcoins | Yes | NA | NA | | OKCoin International | Yes | Yes | No | | Okx | Yes | Yes | NA | | Poloniex | Yes | Yes | NA | diff --git a/cmd/exchange_wrapper_issues/wrapperconfig.json b/cmd/exchange_wrapper_issues/wrapperconfig.json index 4c8cef9f..6b09b519 100644 --- a/cmd/exchange_wrapper_issues/wrapperconfig.json +++ b/cmd/exchange_wrapper_issues/wrapperconfig.json @@ -141,11 +141,6 @@ "secret": "Secret", "otpSecret": "-" }, - "localbitcoins": { - "key": "Key", - "secret": "Secret", - "otpSecret": "-" - }, "okcoin international": { "key": "Key", "secret": "Secret", diff --git a/common/file/archive/zip_test.go b/common/file/archive/zip_test.go index 3df5da9c..f337f9db 100644 --- a/common/file/archive/zip_test.go +++ b/common/file/archive/zip_test.go @@ -57,10 +57,10 @@ func TestZip(t *testing.T) { if err != nil { t.Fatal(err) } - if filepath.Base(o[0]) != "binance.json" || filepath.Base(o[4]) != "localbitcoins.json" { + if filepath.Base(o[0]) != "binance.json" { t.Fatal("unexpected archive result received") } - if expected := 7; len(o) != expected { + if expected := 6; len(o) != expected { t.Fatalf("expected %v files to be extracted received: %v ", expected, len(o)) } diff --git a/config_example.json b/config_example.json index 3e896b50..4bc0098e 100644 --- a/config_example.json +++ b/config_example.json @@ -2020,82 +2020,6 @@ } ] }, - { - "name": "LocalBitcoins", - "enabled": true, - "verbose": false, - "httpTimeout": 15000000000, - "websocketResponseCheckTimeout": 30000000, - "websocketResponseMaxLimit": 7000000000, - "websocketTrafficTimeout": 30000000000, - "websocketOrderbookBufferLimit": 5, - "baseCurrencies": "ARS,AUD,BRL,CAD,CHF,CZK,DKK,EUR,GBP,HKD,ILS,INR,MXN,NOK,NZD,PLN,RUB,SEK,SGD,THB,USD,ZAR", - "currencyPairs": { - "requestFormat": { - "uppercase": true - }, - "configFormat": { - "uppercase": true - }, - "useGlobalFormat": true, - "assetTypes": [ - "spot" - ], - "pairs": { - "spot": { - "enabled": "BTCAUD,BTCUSD", - "available": "BTCBOB,BTCCZK,BTCUAH,BTCKZT,BTCPAB,BTCPLN,BTCJMD,BTCSZL,BTCILS,BTCMAD,BTCCOP,BTCHRK,BTCEUR,BTCUYU,BTCRSD,BTCPEN,BTCJOD,BTCCHF,BTCKWD,BTCAOA,BTCRUB,BTCVND,BTCRON,BTCHNL,BTCLTC,BTCCLP,BTCNOK,BTCINR,BTCQAR,BTCPKR,BTCTZS,BTCUGX,BTCZMW,BTCXAF,BTCBDT,BTCUSD,BTCDKK,BTCPYG,BTCTHB,BTCSEK,BTCSGD,BTCGEL,BTCBYN,BTCTWD,BTCAED,BTCCAD,BTCAUD,BTCKRW,BTCBRL,BTCCRC,BTCETH,BTCHKD,BTCBWP,BTCXRP,BTCZAR,BTCVES,BTCAMD,BTCSAR,BTCPHP,BTCMVR,BTCGTQ,BTCLKR,BTCCDF,BTCARS,BTCEGP,BTCOMR,BTCNZD,BTCNGN,BTCGBP,BTCMWK,BTCXOF,BTCGHS,BTCDOP,BTCKES,BTCIDR,BTCJPY,BTCNAD,BTCMYR,BTCMUR,BTCCNY,BTCRWF,BTCTRY,BTCMXN" - } - } - }, - "api": { - "authenticatedSupport": false, - "authenticatedWebsocketApiSupport": false, - "endpoints": { - "url": "NON_DEFAULT_HTTP_LINK_TO_EXCHANGE_API", - "urlSecondary": "NON_DEFAULT_HTTP_LINK_TO_EXCHANGE_API", - "websocketURL": "NON_DEFAULT_HTTP_LINK_TO_WEBSOCKET_EXCHANGE_API" - }, - "credentials": { - "key": "Key", - "secret": "Secret" - }, - "credentialsValidator": { - "requiresKey": true, - "requiresSecret": true - } - }, - "features": { - "supports": { - "restAPI": true, - "restCapabilities": { - "tickerBatching": true, - "autoPairUpdates": true - }, - "websocketAPI": false, - "websocketCapabilities": {} - }, - "enabled": { - "autoPairUpdates": true, - "websocketAPI": false - } - }, - "bankAccounts": [ - { - "enabled": false, - "bankName": "", - "bankAddress": "", - "bankPostalCode": "", - "bankPostalCity": "", - "bankCountry": "", - "accountName": "", - "accountNumber": "", - "swiftCode": "", - "iban": "", - "supportedCurrencies": "" - } - ] - }, { "name": "OKCOIN International", "enabled": true, diff --git a/docs/ADD_NEW_EXCHANGE.md b/docs/ADD_NEW_EXCHANGE.md index aeb53d5f..3ba22cf0 100644 --- a/docs/ADD_NEW_EXCHANGE.md +++ b/docs/ADD_NEW_EXCHANGE.md @@ -216,7 +216,6 @@ Yes means supported, No means not yet implemented and NA means protocol unsuppor | ItBit | Yes | NA | No | | Kraken | Yes | Yes | NA | | Lbank | Yes | No | NA | -| LocalBitcoins | Yes | NA | NA | | OKCoin International | Yes | Yes | No | | Okx | Yes | Yes | NA | | Poloniex | Yes | Yes | NA | @@ -247,7 +246,6 @@ var Exchanges = []string{ "itbit", "kraken", "lbank", - "localbitcoins", "okcoin international", "okx", "poloniex", diff --git a/docs/MULTICHAIN_TRANSFER_SUPPORT.md b/docs/MULTICHAIN_TRANSFER_SUPPORT.md index 9a0d2b83..f404ae3b 100644 --- a/docs/MULTICHAIN_TRANSFER_SUPPORT.md +++ b/docs/MULTICHAIN_TRANSFER_SUPPORT.md @@ -64,7 +64,6 @@ $ ./gctcli withdrawcryptofunds --exchange=binance --currency=USDT --address=TJU9 | ItBit | No | No | | | Kraken | Yes | Yes | Front-end and API don't match total available transfer chains | | Lbank | No | No | | -| LocalBitcoins | No | No | Supports BTC only | | OKCoin International | No | No | Requires API update to version 5 | | Okx | Yes | Yes | | | Poloniex | Yes | Yes | | diff --git a/docs/OHLCV.md b/docs/OHLCV.md index a693d239..f636badd 100644 --- a/docs/OHLCV.md +++ b/docs/OHLCV.md @@ -85,8 +85,7 @@ A helper tool [cmd/dbseed](../cmd/dbseed/README.md) has been created for assisti | Huobi | Y | | itBIT | | | Kraken | Y | -| lBank | Y | -| Localbitcoins | | +| lBank | Y | | Okcoin | Y | | Okx | Y | | Poloniex | Y | diff --git a/engine/exchange_manager.go b/engine/exchange_manager.go index 61834510..c1c37674 100644 --- a/engine/exchange_manager.go +++ b/engine/exchange_manager.go @@ -28,7 +28,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/itbit" "github.com/thrasher-corp/gocryptotrader/exchanges/kraken" "github.com/thrasher-corp/gocryptotrader/exchanges/lbank" - "github.com/thrasher-corp/gocryptotrader/exchanges/localbitcoins" "github.com/thrasher-corp/gocryptotrader/exchanges/okcoin" "github.com/thrasher-corp/gocryptotrader/exchanges/okx" "github.com/thrasher-corp/gocryptotrader/exchanges/poloniex" @@ -188,8 +187,6 @@ func (m *ExchangeManager) NewExchangeByName(name string) (exchange.IBotExchange, exch = new(kraken.Kraken) case "lbank": exch = new(lbank.Lbank) - case "localbitcoins": - exch = new(localbitcoins.LocalBitcoins) case "okcoin international": exch = new(okcoin.OKCoin) case "okx": diff --git a/engine/exchange_manager_test.go b/engine/exchange_manager_test.go index 13a9f4e4..25415f78 100644 --- a/engine/exchange_manager_test.go +++ b/engine/exchange_manager_test.go @@ -82,7 +82,7 @@ func TestExchangeManagerRemoveExchange(t *testing.T) { func TestNewExchangeByName(t *testing.T) { m := SetupExchangeManager() - exchanges := []string{"binanceus", "binance", "bitfinex", "bitflyer", "bithumb", "bitmex", "bitstamp", "bittrex", "btc markets", "btse", "bybit", "coinut", "exmo", "coinbasepro", "gateio", "gemini", "hitbtc", "huobi", "itbit", "kraken", "lbank", "localbitcoins", "okcoin international", "okx", "poloniex", "yobit", "zb", "fake"} + exchanges := []string{"binanceus", "binance", "bitfinex", "bitflyer", "bithumb", "bitmex", "bitstamp", "bittrex", "btc markets", "btse", "bybit", "coinut", "exmo", "coinbasepro", "gateio", "gemini", "hitbtc", "huobi", "itbit", "kraken", "lbank", "okcoin international", "okx", "poloniex", "yobit", "zb", "fake"} for i := range exchanges { exch, err := m.NewExchangeByName(exchanges[i]) if err != nil && exchanges[i] != "fake" { diff --git a/exchanges/bybit/bybit_cfutures.go b/exchanges/bybit/bybit_cfutures.go index a8c54bda..270ccad0 100644 --- a/exchanges/bybit/bybit_cfutures.go +++ b/exchanges/bybit/bybit_cfutures.go @@ -136,6 +136,9 @@ func (by *Bybit) GetFuturesKlineData(ctx context.Context, symbol currency.Pair, if !common.StringDataCompare(validFuturesIntervals, interval) { return resp.Data, errInvalidInterval } + if startTime.IsZero() { + return nil, errInvalidStartTime + } params.Set("interval", interval) params.Set("from", strconv.FormatInt(startTime.Unix(), 10)) diff --git a/exchanges/bybit/bybit_test.go b/exchanges/bybit/bybit_test.go index e66f2737..b0fc279f 100644 --- a/exchanges/bybit/bybit_test.go +++ b/exchanges/bybit/bybit_test.go @@ -592,8 +592,8 @@ func TestGetFuturesKlineData(t *testing.T) { t.Fatal(err) } _, err = b.GetFuturesKlineData(context.Background(), pair, "M", 5, time.Time{}) - if err != nil { - t.Error(err) + if !errors.Is(err, errInvalidStartTime) { + t.Errorf("received: %s, expected: %s", err, errInvalidStartTime) } _, err = b.GetFuturesKlineData(context.Background(), pair, "60", 5, time.Unix(1577836800, 0)) @@ -1230,8 +1230,8 @@ func TestGetUSDTFuturesKlineData(t *testing.T) { t.Fatal(err) } _, err = b.GetUSDTFuturesKlineData(context.Background(), pair, "M", 5, time.Time{}) - if err != nil { - t.Error(err) + if !errors.Is(err, errInvalidStartTime) { + t.Errorf("received: %s, expected: %s", err, errInvalidStartTime) } _, err = b.GetUSDTFuturesKlineData(context.Background(), pair, "60", 5, time.Unix(1577836800, 0)) diff --git a/exchanges/bybit/bybit_ufutures.go b/exchanges/bybit/bybit_ufutures.go index 1d6d5a14..220cc731 100644 --- a/exchanges/bybit/bybit_ufutures.go +++ b/exchanges/bybit/bybit_ufutures.go @@ -78,6 +78,9 @@ func (by *Bybit) GetUSDTFuturesKlineData(ctx context.Context, symbol currency.Pa if !common.StringDataCompare(validFuturesIntervals, interval) { return resp.Data, errInvalidInterval } + if startTime.IsZero() { + return nil, errInvalidStartTime + } params.Set("interval", interval) params.Set("from", strconv.FormatInt(startTime.Unix(), 10)) diff --git a/exchanges/localbitcoins/README.md b/exchanges/localbitcoins/README.md deleted file mode 100644 index 91500ccb..00000000 --- a/exchanges/localbitcoins/README.md +++ /dev/null @@ -1,132 +0,0 @@ -# GoCryptoTrader package Localbitcoins - - - - -[![Build Status](https://github.com/thrasher-corp/gocryptotrader/actions/workflows/tests.yml/badge.svg?branch=master)](https://github.com/thrasher-corp/gocryptotrader/actions/workflows/tests.yml) -[![Software License](https://img.shields.io/badge/License-MIT-orange.svg?style=flat-square)](https://github.com/thrasher-corp/gocryptotrader/blob/master/LICENSE) -[![GoDoc](https://godoc.org/github.com/thrasher-corp/gocryptotrader?status.svg)](https://godoc.org/github.com/thrasher-corp/gocryptotrader/exchanges/localbitcoins) -[![Coverage Status](http://codecov.io/github/thrasher-corp/gocryptotrader/coverage.svg?branch=master)](http://codecov.io/github/thrasher-corp/gocryptotrader?branch=master) -[![Go Report Card](https://goreportcard.com/badge/github.com/thrasher-corp/gocryptotrader)](https://goreportcard.com/report/github.com/thrasher-corp/gocryptotrader) - - -This localbitcoins package is part of the GoCryptoTrader codebase. - -## This is still in active development - -You can track ideas, planned features and what's in progress on this Trello board: [https://trello.com/b/ZAhMhpOy/gocryptotrader](https://trello.com/b/ZAhMhpOy/gocryptotrader). - -Join our slack to discuss all things related to GoCryptoTrader! [GoCryptoTrader Slack](https://join.slack.com/t/gocryptotrader/shared_invite/enQtNTQ5NDAxMjA2Mjc5LTc5ZDE1ZTNiOGM3ZGMyMmY1NTAxYWZhODE0MWM5N2JlZDk1NDU0YTViYzk4NTk3OTRiMDQzNGQ1YTc4YmRlMTk) - -## LocalBitcoins Exchange - -### Current Features - -+ REST Support - -### How to enable - -+ [Enable via configuration](https://github.com/thrasher-corp/gocryptotrader/tree/master/config#enable-exchange-via-config-example) - -+ Individual package example below: - -```go - // Exchanges will be abstracted out in further updates and examples will be - // supplied then -``` - -### How to do REST public/private calls - -+ If enabled via "configuration".json file the exchange will be added to the -IBotExchange array in the ```go var bot Bot``` and you will only be able to use -the wrapper interface functions for accessing exchange data. View routines.go -for an example of integration usage with GoCryptoTrader. Rudimentary example -below: - -main.go -```go -var l exchange.IBotExchange - -for i := range bot.Exchanges { - if bot.Exchanges[i].GetName() == "LocalBitcoins" { - l = bot.Exchanges[i] - } -} - -// Public calls - wrapper functions - -// Fetches current ticker information -tick, err := l.FetchTicker() -if err != nil { - // Handle error -} - -// Fetches current orderbook information -ob, err := l.FetchOrderbook() -if err != nil { - // Handle error -} - -// Private calls - wrapper functions - make sure your APIKEY and APISECRET are -// set and AuthenticatedAPISupport is set to true - -// Fetches current account information -accountInfo, err := l.GetAccountInfo() -if err != nil { - // Handle error -} -``` - -+ If enabled via individually importing package, rudimentary example below: - -```go -// Public calls - -// Fetches current ticker information -ticker, err := l.GetTicker() -if err != nil { - // Handle error -} - -// Fetches current orderbook information -ob, err := l.GetOrderBook() -if err != nil { - // Handle error -} - -// Private calls - make sure your APIKEY and APISECRET are set and -// AuthenticatedAPISupport is set to true - -// GetUserInfo returns account info -accountInfo, err := l.GetUserInfo(...) -if err != nil { - // Handle error -} - -// Submits an order and the exchange and returns its tradeID -tradeID, err := l.Trade(...) -if err != nil { - // Handle error -} -``` - -### Please click GoDocs chevron above to view current GoDoc information for this package - -## Contribution - -Please feel free to submit any pull requests or suggest any desired features to be added. - -When submitting a PR, please abide by our coding guidelines: - -+ Code must adhere to the official Go [formatting](https://golang.org/doc/effective_go.html#formatting) guidelines (i.e. uses [gofmt](https://golang.org/cmd/gofmt/)). -+ Code must be documented adhering to the official Go [commentary](https://golang.org/doc/effective_go.html#commentary) guidelines. -+ Code must adhere to our [coding style](https://github.com/thrasher-corp/gocryptotrader/blob/master/doc/coding_style.md). -+ Pull requests need to be based on and opened against the `master` branch. - -## Donations - - - -If this framework helped you in any way, or you would like to support the developers working on it, please donate Bitcoin to: - -***bc1qk0jareu4jytc0cfrhr5wgshsq8282awpavfahc*** diff --git a/exchanges/localbitcoins/localbitcoins.go b/exchanges/localbitcoins/localbitcoins.go deleted file mode 100644 index 0744136e..00000000 --- a/exchanges/localbitcoins/localbitcoins.go +++ /dev/null @@ -1,802 +0,0 @@ -package localbitcoins - -import ( - "bytes" - "context" - "errors" - "fmt" - "net/http" - "net/url" - "strconv" - "strings" - - "github.com/thrasher-corp/gocryptotrader/common" - "github.com/thrasher-corp/gocryptotrader/common/crypto" - exchange "github.com/thrasher-corp/gocryptotrader/exchanges" - "github.com/thrasher-corp/gocryptotrader/exchanges/request" -) - -const ( - localbitcoinsAPIURL = "https://localbitcoins.com" - - // Authenticated Calls - localbitcoinsAPIAccountInfo = "api/account_info" - localbitcoinsAPIMyself = "myself/" - localbitcoinsAPIAds = "ads/" - localbitcoinsAPIAdGet = "ad-get/" - localbitcoinsAPIAdEdit = "ad/" - localbitcoinsAPIAdCreate = "ad-create/" - localbitcoinsAPIUpdateEquation = "ad-equation/" - localbitcoinsAPIDeleteAd = "ad-delete/" - localbitcoinsAPIRelease = "contact_release/" - localbitcoinsAPIReleaseByPin = "contact_release_pin/" - localbitcoinsAPIMarkAsPaid = "contact_mark_as_paid/" - localbitcoinsAPIMessages = "contact_messages/" - localbitcoinsAPISendMessage = "contact_message_post/" - localbitcoinsAPIDispute = "contact_dispute/" - localbitcoinsAPICancelTrade = "contact_cancel/" - localbitcoinsAPIFundTrade = "contact_fund/" - localbitcoinsAPIConfirmRealName = "contact_mark_realname/" - localbitcoinsAPIVerifyIdentity = "contact_mark_identified/" - localbitcoinsAPIInitiateTrade = "contact_create/" - localbitcoinsAPITradeInfo = "contact_info/" - localbitcoinsAPIDashboard = "dashboard/" - localbitcoinsAPIDashboardReleased = "dashboard/released/" - localbitcoinsAPIDashboardCancelled = "dashboard/canceled/" - localbitcoinsAPIDashboardClosed = "dashboard/closed/" - localbitcoinsAPIFeedback = "feedback/" - localbitcoinsAPILogout = "logout/" - localbitcoinsAPICreateInvoice = "merchant/new_invoice/" - localbitcoinsAPIGetNotification = "notifications/" - localbitcoinsAPIMarkNotification = "notifications/mark_as_read/" - localbitcoinsAPIPinCode = "pincode/" - localbitcoinsAPIVerifyUsername = "real_name_verifiers/" - localbitcoinsAPIWallet = "wallet/" - localbitcoinsAPIWalletBalance = "wallet-balance/" - localbitcoinsAPIWalletSend = "wallet-send/" - localbitcoinsAPIWalletSendPin = "wallet-send-pin/" - localbitcoinsAPIWalletAddress = "wallet-addr/" - - // Un-Autheticated Calls - localbitcoinsAPICountryCodes = "/api/countrycodes/" - localbitcoinsAPICurrencies = "/api/currencies/" - localbitcoinsAPIPaymentMethods = "/api/payment_methods/" - localbitcoinsAPIPlaces = "/api/places/" - localbitcoinsAPITicker = "/bitcoinaverage/ticker-all-currencies/" - localbitcoinsAPIBitcoincharts = "/bitcoincharts/" - localbitcoinsAPICashBuy = "/buy-bitcoins-with-cash/" - localbitcoinsAPIOnlineBuy = "/buy-bitcoins-online/" - localbitcoinsAPIOrderbook = "/orderbook.json" - localbitcoinsAPITrades = "/trades.json" - - // Trade Types - tradeTypeLocalSell = "LOCAL_SELL" - tradeTypeLocalBuy = "LOCAL_BUY" - tradeTypeOnlineSell = "ONLINE_SELL" - tradeTypeOnlineBuy = "ONLINE_BUY" - - // Reference Types - refTypeShort = "SHORT" - refTypeLong = "LONG" - refTypeNumbers = "NUMBERS" - refTypeLetters = "LETTERS" - - // Feedback Values - feedbackTrust = "trust" - feedbackPositive = "positive" - feedbackNeutral = "neutral" - feedbackBlock = "block" - feedbackBlockWithoutFeedback = "block_without_feedback" - - // State Values - stateNotOpened = "NOT_OPENED" - stateWaitingForPayment = "WAITING_FOR_PAYMENT" - statePaid = "PAID" - stateNotPaid = "DIDNT_PAID" - statePaidLate = "PAID_IN_LATE" - statePartlyPaid = "PAID_PARTLY" - statePaidAndConfirmed = "PAID_AND_CONFIRMED" - statePaidLateConfirmed = "PAID_IN_LATE_AND_CONFIRMED" - statePaidPartlyConfirmed = "PAID_PARTLY_AND_CONFIRMED" - - // String response used with order status - null = "null" -) - -var ( - // Payment Methods - paymentMethodOne string -) - -// LocalBitcoins is the overarching type across the localbitcoins package -type LocalBitcoins struct { - exchange.Base -} - -// GetAccountInformation lets you retrieve the public user information on a -// LocalBitcoins user. The response contains the same information that is found -// on an account's public profile page. -func (l *LocalBitcoins) GetAccountInformation(ctx context.Context, username string, self bool) (AccountInfo, error) { - type response struct { - Data AccountInfo `json:"data"` - } - resp := response{} - - if self { - err := l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, localbitcoinsAPIMyself, nil, &resp) - if err != nil { - return resp.Data, err - } - } else { - path := fmt.Sprintf("/%s/%s/", localbitcoinsAPIAccountInfo, username) - err := l.SendHTTPRequest(ctx, exchange.RestSpot, path, &resp, request.Unset) - if err != nil { - return resp.Data, err - } - } - - return resp.Data, nil -} - -// Getads returns information of single advertisement based on the ad ID, if -// adID omitted. -// -// adID - [optional] string if omitted returns all ads -func (l *LocalBitcoins) Getads(ctx context.Context, args ...string) (AdData, error) { - var resp struct { - Data AdData `json:"data"` - Error struct { - Message string `json:"message"` - Code int `json:"error_code"` - } `json:"error"` - } - - var err error - if len(args) == 0 { - err = l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, - localbitcoinsAPIAds, - nil, - &resp) - } else { - params := url.Values{"ads": {strings.Join(args, ",")}} - err = l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, - localbitcoinsAPIAdGet, - params, - &resp) - } - - if err != nil { - return resp.Data, err - } - - if resp.Error.Message != "" { - return resp.Data, errors.New(resp.Error.Message) - } - return resp.Data, nil -} - -// EditAd updates set advertisements -// -// params - see localbitcoins_types.go AdEdit for reference -// adID - string for the ad you already created -// TODO use parameter -func (l *LocalBitcoins) EditAd(ctx context.Context, _ *AdEdit, adID string) error { - resp := struct { - Data AdData `json:"data"` - Error struct { - Message string `json:"message"` - Code int `json:"error_code"` - } - }{} - - err := l.SendAuthenticatedHTTPRequest(ctx, - exchange.RestSpot, - http.MethodPost, - localbitcoinsAPIAdEdit+adID+"/", - nil, - &resp) - if err != nil { - return err - } - - if resp.Error.Message != "" { - return errors.New(resp.Error.Message) - } - - return nil -} - -// CreateAd creates a new advertisement -// -// params - see localbitcoins_types.go AdCreate for reference -// TODO use parameter -func (l *LocalBitcoins) CreateAd(ctx context.Context, _ *AdCreate) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIAdCreate, nil, nil) -} - -// UpdatePriceEquation updates price equation of an advertisement. If there are -// problems with new equation, the price and equation are not updated and -// advertisement remains visible. -// -// equation - string of equation -// adID - string of specific ad identification -// TODO use parameter -func (l *LocalBitcoins) UpdatePriceEquation(ctx context.Context, adID string) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIUpdateEquation+adID, nil, nil) -} - -// DeleteAd deletes the advertisement by adID. -// -// adID - string of specific ad identification -func (l *LocalBitcoins) DeleteAd(ctx context.Context, adID string) error { - resp := struct { - Error struct { - Message string `json:"message"` - Code int `json:"error_code"` - } `json:"error"` - }{} - - err := l.SendAuthenticatedHTTPRequest(ctx, - exchange.RestSpot, - http.MethodPost, - localbitcoinsAPIDeleteAd+adID+"/", - nil, - &resp) - if err != nil { - return err - } - - if resp.Error.Message != "" { - return errors.New(resp.Error.Message) - } - - return nil -} - -// ReleaseFunds releases Bitcoin trades specified by ID {contact_id}. If the -// release was successful a message is returned on the data key. -func (l *LocalBitcoins) ReleaseFunds(ctx context.Context, contactID string) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIRelease+contactID, nil, nil) -} - -// ReleaseFundsByPin releases Bitcoin trades specified by ID {contact_id}. if -// the current pincode is provided. If the release was successful a message is -// returned on the data key. -func (l *LocalBitcoins) ReleaseFundsByPin(ctx context.Context, contactID string) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIReleaseByPin+contactID, nil, nil) -} - -// MarkAsPaid marks a trade as paid. -func (l *LocalBitcoins) MarkAsPaid(ctx context.Context, contactID string) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIMarkAsPaid+contactID, nil, nil) -} - -// GetMessages returns all chat messages from the trade. Messages are on the message_list key. -func (l *LocalBitcoins) GetMessages(ctx context.Context, contactID string) (Message, error) { - type response struct { - MessageList Message `json:"message_list"` - } - resp := response{} - - return resp.MessageList, - l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIMessages+contactID, nil, &resp) -} - -// SendMessage posts a message and/or uploads an image to the trade. Encode -// images with multipart/form-data encoding. -func (l *LocalBitcoins) SendMessage(ctx context.Context, contactID string) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPISendMessage+contactID, nil, nil) -} - -// Dispute starts a dispute on the specified trade ID if the requirements for -// starting the dispute has been fulfilled. -// -// topic - [optional] String Short description of issue to LocalBitcoins customer support. -// TODO use parameter -func (l *LocalBitcoins) Dispute(ctx context.Context, _, contactID string) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIDispute+contactID, nil, nil) -} - -// CancelTrade cancels the trade if the token owner is the Bitcoin buyer. -// Bitcoin sellers cannot cancel trades. -func (l *LocalBitcoins) CancelTrade(ctx context.Context, contactID string) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPICancelTrade+contactID, nil, nil) -} - -// FundTrade attempts to fund an unfunded local trade from the token owners -// wallet. Works only if the token owner is the Bitcoin seller in the trade. -func (l *LocalBitcoins) FundTrade(ctx context.Context, contactID string) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIFundTrade+contactID, nil, nil) -} - -// ConfirmRealName creates or updates real name confirmation. -func (l *LocalBitcoins) ConfirmRealName(ctx context.Context, contactID string) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIConfirmRealName+contactID, nil, nil) -} - -// VerifyIdentity marks the identity of trade partner as verified. You must be -// the advertiser in this trade. -func (l *LocalBitcoins) VerifyIdentity(ctx context.Context, contactID string) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIVerifyIdentity+contactID, nil, nil) -} - -// InitiateTrade sttempts to start a Bitcoin trade from the specified -// advertisement ID. -func (l *LocalBitcoins) InitiateTrade(ctx context.Context, adID string) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIInitiateTrade+adID, nil, nil) -} - -// GetTradeInfo returns information about a single trade that the token owner is -// part in. -func (l *LocalBitcoins) GetTradeInfo(ctx context.Context, contactID string) (dbi DashBoardInfo, err error) { - err = l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, localbitcoinsAPITradeInfo+contactID+"/", nil, &dbi) - return -} - -// GetCountryCodes returns a list of valid and recognized countrycodes -func (l *LocalBitcoins) GetCountryCodes(ctx context.Context) error { - return l.SendHTTPRequest(ctx, exchange.RestSpot, localbitcoinsAPICountryCodes, nil, request.Unset) -} - -// GetCurrencies returns a list of valid and recognized fiat currencies. Also -// contains human readable name for every currency and boolean that tells if -// currency is an altcoin. -func (l *LocalBitcoins) GetCurrencies(ctx context.Context) error { - return l.SendHTTPRequest(ctx, exchange.RestSpot, localbitcoinsAPICurrencies, nil, request.Unset) -} - -// GetDashboardInfo returns a list of trades on the data key contact_list. This -// API end point mirrors the website's dashboard, allowing access to contacts in -// different states. -// In addition all of these listings have buyer/ and seller/ sub-listings to -// view contacts where the token owner is either buying or selling, respectively. -// E.g. /api/dashboard/buyer/. All contacts where the token owner is -// participating are returned. -func (l *LocalBitcoins) GetDashboardInfo(ctx context.Context) ([]DashBoardInfo, error) { - var resp struct { - Data struct { - ContactList []DashBoardInfo `json:"contact_list"` - ContactCount int `json:"contact_count"` - } - } - - return resp.Data.ContactList, - l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, localbitcoinsAPIDashboard, nil, &resp) -} - -// GetDashboardReleasedTrades returns a list of all released trades where the -// token owner is either a buyer or seller. -func (l *LocalBitcoins) GetDashboardReleasedTrades(ctx context.Context) ([]DashBoardInfo, error) { - var resp struct { - Data struct { - ContactList []DashBoardInfo `json:"contact_list"` - ContactCount int `json:"contact_count"` - } - } - - return resp.Data.ContactList, - l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, localbitcoinsAPIDashboardReleased, nil, &resp) -} - -// GetDashboardCancelledTrades returns a list of all canceled trades where the -// token owner is either a buyer or seller. -func (l *LocalBitcoins) GetDashboardCancelledTrades(ctx context.Context) ([]DashBoardInfo, error) { - var resp struct { - Data struct { - ContactList []DashBoardInfo `json:"contact_list"` - ContactCount int `json:"contact_count"` - } - } - - return resp.Data.ContactList, - l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, localbitcoinsAPIDashboardCancelled, nil, &resp) -} - -// GetDashboardClosedTrades returns a list of all closed trades where the token -// owner is either a buyer or seller. -func (l *LocalBitcoins) GetDashboardClosedTrades(ctx context.Context) ([]DashBoardInfo, error) { - var resp struct { - Data struct { - ContactList []DashBoardInfo `json:"contact_list"` - ContactCount int `json:"contact_count"` - } - } - - return resp.Data.ContactList, - l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, localbitcoinsAPIDashboardClosed, nil, &resp) -} - -// SetFeedback gives feedback to user. Possible feedback values are: trust, -// positive, neutral, block, block_without_feedback, (check const values) -// This is only possible to set if there is a trade between the token owner and -// the user specified in {username} that is canceled or released. You may also -// set feedback message using msg field with few exceptions. Feedback -// block_without_feedback clears the message and with block the message is -// mandatory. -// -// feedback - string (use const valuesfor feedback) -// msg - [optional] Feedback message displayed alongside feedback on receivers -// profile page. -// username - username of trade contact -// TODO add support -func (l *LocalBitcoins) SetFeedback(ctx context.Context) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIFeedback, nil, nil) -} - -// Logout expires the current access token immediately. To get a new token -// afterwards, public apps will need to re-authenticate, confidential apps can -// turn in a refresh token. -func (l *LocalBitcoins) Logout(ctx context.Context) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPILogout, nil, nil) -} - -// CreateNewInvoice creates a new invoice. -// TODO add support -func (l *LocalBitcoins) CreateNewInvoice(ctx context.Context) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPICreateInvoice, nil, nil) -} - -// GetInvoice returns information about a specific invoice created by the token -// owner. -// TODO add support -func (l *LocalBitcoins) GetInvoice(ctx context.Context) (Invoice, error) { - resp := Invoice{} - return resp, l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPICreateInvoice, nil, &resp) -} - -// DeleteInvoice deletes a specific invoice. Deleting invoices is possible when -// it is sure that receiver cannot accidentally pay the invoice at the same time -// as the merchant is deleting it. You can use the API request -// /api/merchant/invoice/{invoice_id}/ to check if deleting is possible. -// TODO add support -func (l *LocalBitcoins) DeleteInvoice(ctx context.Context) (Invoice, error) { - resp := Invoice{} - return resp, l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPICreateInvoice, nil, &resp) -} - -// GetNotifications returns recent notifications. -func (l *LocalBitcoins) GetNotifications(ctx context.Context) ([]NotificationInfo, error) { - var resp []NotificationInfo - return resp, l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIGetNotification, nil, &resp) -} - -// MarkNotifications marks a specific notification as read. -// TODO add support -func (l *LocalBitcoins) MarkNotifications(ctx context.Context) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIMarkNotification, nil, nil) -} - -// GetPaymentMethods returns a list of valid payment methods. Also contains name -// and code for payment methods, and possible limitations in currencies and bank -// name choices. -func (l *LocalBitcoins) GetPaymentMethods(ctx context.Context) error { - return l.SendHTTPRequest(ctx, exchange.RestSpot, localbitcoinsAPIPaymentMethods, nil, request.Unset) -} - -// GetPaymentMethodsByCountry returns a list of valid payment methods filtered -// by countrycodes. -func (l *LocalBitcoins) GetPaymentMethodsByCountry(ctx context.Context, countryCode string) error { - return l.SendHTTPRequest(ctx, exchange.RestSpot, localbitcoinsAPIPaymentMethods+countryCode, nil, request.Unset) -} - -// CheckPincode checks the given PIN code against the token owners currently -// active PIN code. You can use this method to ensure the person using the -// session is the legitimate user. -// Due to only requiring the read scope, the user is not guaranteed to have set -// a PIN code. If you protect your application using this request, please make -// the user has set a PIN code for his account. -func (l *LocalBitcoins) CheckPincode(ctx context.Context, pin int) (bool, error) { - type response struct { - Data struct { - PinOK bool `json:"pincode_ok"` - } `json:"data"` - } - resp := response{} - values := url.Values{} - values.Set("pincode", strconv.Itoa(pin)) - err := l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIPinCode, values, &resp) - - if err != nil { - return false, err - } - - if !resp.Data.PinOK { - return false, errors.New("pin invalid") - } - - return true, nil -} - -// GetPlaces Looks up places near lat, lon and provides full URLs to buy and -// sell listings for each. -// TODO add support -func (l *LocalBitcoins) GetPlaces(ctx context.Context) error { - return l.SendHTTPRequest(ctx, exchange.RestSpot, localbitcoinsAPIPlaces, nil, request.Unset) -} - -// VerifyUsername returns list of real name verifiers for the user. Returns a -// list only when you have a trade with the user where you are the seller. -func (l *LocalBitcoins) VerifyUsername(ctx context.Context) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIVerifyUsername, nil, nil) -} - -// GetRecentMessages returns maximum of 25 newest trade messages. Does not -// return messages older than one month. Messages are ordered by sending time, -// and the newest one is first. -// TODO add support -func (l *LocalBitcoins) GetRecentMessages(ctx context.Context) error { - return l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIVerifyUsername, nil, nil) -} - -// GetWalletInfo gets information about the token owner's wallet balance. -func (l *LocalBitcoins) GetWalletInfo(ctx context.Context) (WalletInfo, error) { - type response struct { - Data WalletInfo `json:"data"` - } - resp := response{} - err := l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, localbitcoinsAPIWallet, nil, &resp) - - if err != nil { - return WalletInfo{}, err - } - - if resp.Data.Message != "OK" { - return WalletInfo{}, errors.New("unable to fetch wallet info") - } - - return resp.Data, nil -} - -// GetWalletBalance Same as GetWalletInfo(), but only returns the message, -// receiving_address and total fields. -// Use this instead if you don't care about transactions at the moment. -func (l *LocalBitcoins) GetWalletBalance(ctx context.Context) (WalletBalanceInfo, error) { - type response struct { - Data WalletBalanceInfo `json:"data"` - } - resp := response{} - err := l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodGet, localbitcoinsAPIWalletBalance, nil, &resp) - - if err != nil { - return WalletBalanceInfo{}, err - } - - if resp.Data.Message != "OK" { - return WalletBalanceInfo{}, errors.New("unable to fetch wallet balance") - } - - return resp.Data, nil -} - -// WalletSend sends amount of bitcoins from the token owner's wallet to address. -// On success, the response returns a message indicating success. It is highly -// recommended to minimize the lifetime of access tokens with the money -// permission. Use Logout() to make the current token expire instantly. -func (l *LocalBitcoins) WalletSend(ctx context.Context, address string, amount float64, pin int64) error { - values := url.Values{} - values.Set("address", address) - values.Set("amount", strconv.FormatFloat(amount, 'f', -1, 64)) - path := localbitcoinsAPIWalletSend - - if pin > 0 { - values.Set("pincode", strconv.FormatInt(pin, 10)) - path = localbitcoinsAPIWalletSendPin - } - - resp := struct { - Error struct { - Message string `json:"message"` - Errors map[string]string `json:"errors"` - Code int `json:"error_code"` - } `json:"error"` - Data struct { - Message string `json:"message"` - } `json:"data"` - }{} - - err := l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, path, values, &resp) - if err != nil { - return err - } - - if resp.Data.Message != "Money is being sent" { - if len(resp.Error.Errors) != 0 { - var details strings.Builder - for x := range resp.Error.Errors { - details.WriteString(resp.Error.Errors[x]) - } - return errors.New(details.String()) - } - return errors.New(resp.Data.Message) - } - - return nil -} - -// GetWalletAddress returns an unused receiving address from the token owner's -// wallet. The address is returned in the address key of the response. Note that -// this API may keep returning the same (unused) address if requested repeatedly. -func (l *LocalBitcoins) GetWalletAddress(ctx context.Context) (string, error) { - type response struct { - Data struct { - Message string `json:"message"` - Address string `json:"address"` - } - } - resp := response{} - err := l.SendAuthenticatedHTTPRequest(ctx, exchange.RestSpot, http.MethodPost, localbitcoinsAPIWalletAddress, nil, &resp) - if err != nil { - return "", err - } - - if resp.Data.Message != "OK!" { - return "", errors.New("unable to fetch wallet address") - } - - return resp.Data.Address, nil -} - -// GetBitcoinsWithCashAd returns buy or sell as cash local advertisements. -// TODO add support -func (l *LocalBitcoins) GetBitcoinsWithCashAd(ctx context.Context) error { - return l.SendHTTPRequest(ctx, exchange.RestSpot, localbitcoinsAPICashBuy, nil, request.Unset) -} - -// GetBitcoinsOnlineAd this API returns buy or sell Bitcoin online ads. -// TODO add support -func (l *LocalBitcoins) GetBitcoinsOnlineAd(ctx context.Context) error { - return l.SendHTTPRequest(ctx, exchange.RestSpot, localbitcoinsAPIOnlineBuy, nil, request.Unset) -} - -// GetTicker returns list of all completed trades. -func (l *LocalBitcoins) GetTicker(ctx context.Context) (map[string]Ticker, error) { - result := make(map[string]Ticker) - return result, l.SendHTTPRequest(ctx, exchange.RestSpot, localbitcoinsAPITicker, &result, tickerLimiter) -} - -// GetTradableCurrencies returns a list of tradable fiat currencies -func (l *LocalBitcoins) GetTradableCurrencies(ctx context.Context) ([]string, error) { - resp, err := l.GetTicker(ctx) - if err != nil { - return nil, err - } - - currencies := make([]string, 0, len(resp)) - for x := range resp { - currencies = append(currencies, x) - } - - return currencies, nil -} - -// GetTrades returns all closed trades in online buy and online sell categories, -// updated every 15 minutes. -func (l *LocalBitcoins) GetTrades(ctx context.Context, currency string, values url.Values) ([]Trade, error) { - endpoint := localbitcoinsAPIBitcoincharts + currency + localbitcoinsAPITrades - path := common.EncodeURLValues(endpoint, values) - var result []Trade - return result, l.SendHTTPRequest(ctx, exchange.RestSpot, path, &result, request.Unset) -} - -// GetOrderbook returns buy and sell bitcoin online advertisements. Amount is -// the maximum amount available for the trade request. Price is the hourly -// updated price. The price is based on the price equation and commission % -// entered by the ad author. -func (l *LocalBitcoins) GetOrderbook(ctx context.Context, curr string) (*Orderbook, error) { - type response struct { - Bids [][2]string `json:"bids"` - Asks [][2]string `json:"asks"` - } - - path := localbitcoinsAPIBitcoincharts + curr + localbitcoinsAPIOrderbook - resp := response{} - if err := l.SendHTTPRequest(ctx, exchange.RestSpot, path, &resp, orderBookLimiter); err != nil { - return nil, err - } - - ob := Orderbook{ - Bids: make([]Price, len(resp.Bids)), - Asks: make([]Price, len(resp.Asks)), - } - for x := range resp.Bids { - price, err := strconv.ParseFloat(resp.Bids[x][0], 64) - if err != nil { - return nil, err - } - amount, err := strconv.ParseFloat(resp.Bids[x][1], 64) - if err != nil { - return nil, err - } - ob.Bids[x] = Price{price, amount} - } - - for x := range resp.Asks { - price, err := strconv.ParseFloat(resp.Asks[x][0], 64) - if err != nil { - return nil, err - } - amount, err := strconv.ParseFloat(resp.Asks[x][1], 64) - if err != nil { - return nil, err - } - ob.Asks[x] = Price{price, amount} - } - - return &ob, nil -} - -// SendHTTPRequest sends an unauthenticated HTTP request -func (l *LocalBitcoins) SendHTTPRequest(ctx context.Context, endpoint exchange.URL, path string, result interface{}, ep request.EndpointLimit) error { - ePoint, err := l.API.Endpoints.GetURL(endpoint) - if err != nil { - return err - } - - item := &request.Item{ - Method: http.MethodGet, - Path: ePoint + path, - Result: result, - Verbose: l.Verbose, - HTTPDebugging: l.HTTPDebugging, - HTTPRecording: l.HTTPRecording, - } - - return l.SendPayload(ctx, ep, func() (*request.Item, error) { - return item, nil - }) -} - -// SendAuthenticatedHTTPRequest sends an authenticated HTTP request to -// localbitcoins -func (l *LocalBitcoins) SendAuthenticatedHTTPRequest(ctx context.Context, ep exchange.URL, method, path string, params url.Values, result interface{}) (err error) { - creds, err := l.GetCredentials(ctx) - if err != nil { - return err - } - endpoint, err := l.API.Endpoints.GetURL(ep) - if err != nil { - return err - } - - return l.SendPayload(ctx, request.Unset, func() (*request.Item, error) { - n := l.Requester.GetNonce(true).String() - - fullPath := "/api/" + path - encoded := params.Encode() - message := n + creds.Key + fullPath + encoded - hmac, err := crypto.GetHMAC(crypto.HashSHA256, - []byte(message), - []byte(creds.Secret)) - if err != nil { - return nil, err - } - headers := make(map[string]string) - headers["Apiauth-Key"] = creds.Key - headers["Apiauth-Nonce"] = n - headers["Apiauth-Signature"] = strings.ToUpper(crypto.HexEncodeToString(hmac)) - headers["Content-Type"] = "application/x-www-form-urlencoded" - - if method == http.MethodGet && len(encoded) > 0 { - fullPath += "?" + encoded - } - - return &request.Item{ - Method: method, - Path: endpoint + fullPath, - Headers: headers, - Body: bytes.NewBufferString(encoded), - Result: result, - AuthRequest: true, - NonceEnabled: true, - Verbose: l.Verbose, - HTTPDebugging: l.HTTPDebugging, - HTTPRecording: l.HTTPRecording, - }, nil - }) -} - -// GetFee returns an estimate of fee based on type of transaction -func (l *LocalBitcoins) GetFee(feeBuilder *exchange.FeeBuilder) (float64, error) { - // No fees will be used - return 0, nil -} diff --git a/exchanges/localbitcoins/localbitcoins_live_test.go b/exchanges/localbitcoins/localbitcoins_live_test.go deleted file mode 100644 index 3bba9113..00000000 --- a/exchanges/localbitcoins/localbitcoins_live_test.go +++ /dev/null @@ -1,38 +0,0 @@ -//+build mock_test_off - -// This will build if build tag mock_test_off is parsed and will do live testing -// using all tests in (exchange)_test.go -package localbitcoins - -import ( - "log" - "os" - "testing" - - "github.com/thrasher-corp/gocryptotrader/config" - "github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues" -) - -var mockTests = false - -func TestMain(m *testing.M) { - cfg := config.GetConfig() - err := cfg.LoadConfig("../../testdata/configtest.json", true) - if err != nil { - log.Fatal("LocalBitcoins load config error", err) - } - localbitcoinsConfig, err := cfg.GetExchangeConfig("LocalBitcoins") - if err != nil { - log.Fatal("LocalBitcoins Setup() init error", err) - } - localbitcoinsConfig.API.AuthenticatedSupport = true - localbitcoinsConfig.API.Credentials.Key = apiKey - localbitcoinsConfig.API.Credentials.Secret = apiSecret - l.SetDefaults() - err = l.Setup(localbitcoinsConfig) - if err != nil { - log.Fatal("Localbitcoins setup error", err) - } - log.Printf(sharedtestvalues.LiveTesting, l.Name) - os.Exit(m.Run()) -} diff --git a/exchanges/localbitcoins/localbitcoins_mock_test.go b/exchanges/localbitcoins/localbitcoins_mock_test.go deleted file mode 100644 index 688d85b8..00000000 --- a/exchanges/localbitcoins/localbitcoins_mock_test.go +++ /dev/null @@ -1,61 +0,0 @@ -//go:build !mock_test_off -// +build !mock_test_off - -// This will build if build tag mock_test_off is not parsed and will try to mock -// all tests in _test.go -package localbitcoins - -import ( - "log" - "os" - "testing" - - "github.com/thrasher-corp/gocryptotrader/config" - "github.com/thrasher-corp/gocryptotrader/exchanges/mock" - "github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues" -) - -const mockfile = "../../testdata/http_mock/localbitcoins/localbitcoins.json" - -var mockTests = true - -func TestMain(m *testing.M) { - cfg := config.GetConfig() - err := cfg.LoadConfig("../../testdata/configtest.json", true) - if err != nil { - log.Fatal("Localbitcoins load config error", err) - } - localbitcoinsConfig, err := cfg.GetExchangeConfig("LocalBitcoins") - if err != nil { - log.Fatal("Localbitcoins Setup() init error", err) - } - l.SkipAuthCheck = true - localbitcoinsConfig.API.AuthenticatedSupport = true - localbitcoinsConfig.API.Credentials.Key = apiKey - localbitcoinsConfig.API.Credentials.Secret = apiSecret - l.SetDefaults() - err = l.Setup(localbitcoinsConfig) - if err != nil { - log.Fatal("Localbitcoins setup error", err) - } - - serverDetails, newClient, err := mock.NewVCRServer(mockfile) - if err != nil { - log.Fatalf("Mock server error %s", err) - } - - err = l.SetHTTPClient(newClient) - if err != nil { - log.Fatalf("Mock server error %s", err) - } - endpoints := l.API.Endpoints.GetURLMap() - for k := range endpoints { - err = l.API.Endpoints.SetRunning(k, serverDetails) - if err != nil { - log.Fatal(err) - } - } - - log.Printf(sharedtestvalues.MockTesting, l.Name) - os.Exit(m.Run()) -} diff --git a/exchanges/localbitcoins/localbitcoins_test.go b/exchanges/localbitcoins/localbitcoins_test.go deleted file mode 100644 index 4e9bd505..00000000 --- a/exchanges/localbitcoins/localbitcoins_test.go +++ /dev/null @@ -1,485 +0,0 @@ -package localbitcoins - -import ( - "context" - "errors" - "sync" - "testing" - "time" - - "github.com/thrasher-corp/gocryptotrader/common" - "github.com/thrasher-corp/gocryptotrader/core" - "github.com/thrasher-corp/gocryptotrader/currency" - exchange "github.com/thrasher-corp/gocryptotrader/exchanges" - "github.com/thrasher-corp/gocryptotrader/exchanges/asset" - "github.com/thrasher-corp/gocryptotrader/exchanges/order" - "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" -) - -// Please supply your own APIKEYS here for due diligence testing - -const ( - apiKey = "" - apiSecret = "" - canManipulateRealOrders = false -) - -var l LocalBitcoins - -func TestStart(t *testing.T) { - t.Parallel() - err := l.Start(nil) - if !errors.Is(err, common.ErrNilPointer) { - t.Fatalf("received: '%v' but expected: '%v'", err, common.ErrNilPointer) - } - var testWg sync.WaitGroup - err = l.Start(&testWg) - if err != nil { - t.Fatal(err) - } - testWg.Wait() -} - -func TestGetTicker(t *testing.T) { - t.Parallel() - - _, err := l.GetTicker(context.Background()) - if err != nil { - t.Errorf("GetTicker() returned: %s", err) - } -} - -func TestGetTradableCurrencies(t *testing.T) { - t.Parallel() - - _, err := l.GetTradableCurrencies(context.Background()) - if err != nil { - t.Errorf("GetTradableCurrencies() returned: %s", err) - } -} - -func TestGetAccountInfo(t *testing.T) { - t.Parallel() - _, err := l.GetAccountInformation(context.Background(), "", true) - switch { - case areTestAPIKeysSet() && err != nil && !mockTests: - t.Errorf("Could not get AccountInformation: %s", err) - case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Expecting an error when no keys are set") - case mockTests && err != nil: - t.Errorf("Could not get AccountInformation: %s", err) - } -} - -func TestGetads(t *testing.T) { - t.Parallel() - _, err := l.Getads(context.Background(), "") - switch { - case areTestAPIKeysSet() && err != nil && !mockTests: - t.Errorf("Could not get ads: %s", err) - case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Expecting an error when no keys are set") - case mockTests && err == nil: - t.Error("Expecting error until QA pass") - } -} - -func TestEditAd(t *testing.T) { - t.Parallel() - - var edit AdEdit - err := l.EditAd(context.Background(), &edit, "1337") - switch { - case areTestAPIKeysSet() && err != nil && !mockTests: - t.Errorf("Could not edit order: %s", err) - case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Expecting an error when no keys are set") - case mockTests && err == nil: - t.Error("Expecting error until QA pass") - } -} - -func setFeeBuilder() *exchange.FeeBuilder { - return &exchange.FeeBuilder{ - Amount: 1, - FeeType: exchange.CryptocurrencyTradeFee, - Pair: currency.NewPairWithDelimiter(currency.LTC.String(), - currency.BTC.String(), - "-"), - PurchasePrice: 1, - FiatCurrency: currency.USD, - BankTransactionType: exchange.WireTransfer, - } -} - -func TestGetTrades(t *testing.T) { - t.Parallel() - _, err := l.GetTrades(context.Background(), "LTC", nil) - if err != nil { - t.Error(err) - } -} - -func TestGetOrderbook(t *testing.T) { - t.Parallel() - ob, err := l.GetOrderbook(context.Background(), "AUD") - if err != nil { - t.Fatal(err) - } - if mockTests { - if ob.Bids[0].Price != 88781.42 && ob.Bids[0].Amount != 10000.00 || - ob.Asks[0].Price != 14400.00 && ob.Asks[0].Amount != 0.77 { - t.Error("incorrect orderbook values") - } - } -} - -// TestGetFeeByTypeOfflineTradeFee logic test -func TestGetFeeByTypeOfflineTradeFee(t *testing.T) { - t.Parallel() - var feeBuilder = setFeeBuilder() - _, err := l.GetFeeByType(context.Background(), feeBuilder) - if err != nil { - t.Fatal(err) - } - if !areTestAPIKeysSet() { - if feeBuilder.FeeType != exchange.OfflineTradeFee { - t.Errorf("Expected %v, received %v", exchange.OfflineTradeFee, feeBuilder.FeeType) - } - } else { - if feeBuilder.FeeType != exchange.CryptocurrencyTradeFee { - t.Errorf("Expected %v, received %v", exchange.CryptocurrencyTradeFee, feeBuilder.FeeType) - } - } -} - -func TestGetFee(t *testing.T) { - t.Parallel() - var feeBuilder = setFeeBuilder() - // CryptocurrencyTradeFee Basic - if _, err := l.GetFee(feeBuilder); err != nil { - t.Error(err) - } - - // CryptocurrencyTradeFee High quantity - feeBuilder = setFeeBuilder() - feeBuilder.Amount = 1000 - feeBuilder.PurchasePrice = 1000 - if _, err := l.GetFee(feeBuilder); err != nil { - t.Error(err) - } - - // CryptocurrencyTradeFee IsMaker - feeBuilder = setFeeBuilder() - feeBuilder.IsMaker = true - if _, err := l.GetFee(feeBuilder); err != nil { - t.Error(err) - } - - // CryptocurrencyTradeFee Negative purchase price - feeBuilder = setFeeBuilder() - feeBuilder.PurchasePrice = -1000 - if _, err := l.GetFee(feeBuilder); err != nil { - t.Error(err) - } - // CryptocurrencyWithdrawalFee Basic - feeBuilder = setFeeBuilder() - feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee - if _, err := l.GetFee(feeBuilder); err != nil { - t.Error(err) - } - - // CryptocurrencyWithdrawalFee Invalid currency - feeBuilder = setFeeBuilder() - feeBuilder.Pair.Base = currency.NewCode("hello") - feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee - if _, err := l.GetFee(feeBuilder); err != nil { - t.Error(err) - } - // CryptocurrencyDepositFee Basic - feeBuilder = setFeeBuilder() - feeBuilder.FeeType = exchange.CryptocurrencyDepositFee - if _, err := l.GetFee(feeBuilder); err != nil { - t.Error(err) - } - // InternationalBankDepositFee Basic - feeBuilder = setFeeBuilder() - feeBuilder.FeeType = exchange.InternationalBankDepositFee - if _, err := l.GetFee(feeBuilder); err != nil { - t.Error(err) - } - // InternationalBankWithdrawalFee Basic - feeBuilder = setFeeBuilder() - feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee - feeBuilder.FiatCurrency = currency.USD - if _, err := l.GetFee(feeBuilder); err != nil { - t.Error(err) - } -} - -func TestFormatWithdrawPermissions(t *testing.T) { - t.Parallel() - - expectedResult := exchange.AutoWithdrawCryptoText + - " & " + - exchange.WithdrawFiatViaWebsiteOnlyText - withdrawPermissions := l.FormatWithdrawPermissions() - if withdrawPermissions != expectedResult { - t.Errorf("Expected: %s, Received: %s", - expectedResult, - withdrawPermissions) - } -} - -func TestGetActiveOrders(t *testing.T) { - t.Parallel() - - var getOrdersRequest = order.GetOrdersRequest{ - Type: order.AnyType, - AssetType: asset.Spot, - Side: order.AnySide, - } - - _, err := l.GetActiveOrders(context.Background(), &getOrdersRequest) - switch { - case areTestAPIKeysSet() && err != nil && !mockTests: - t.Errorf("Could not get active orders: %s", err) - case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Expecting an error when no keys are set") - case mockTests && err != nil: - t.Errorf("Could not get active orders: %s", err) - } -} - -func TestGetOrderHistory(t *testing.T) { - t.Parallel() - - var getOrdersRequest = order.GetOrdersRequest{ - Type: order.AnyType, - AssetType: asset.Spot, - Side: order.AnySide, - } - - _, err := l.GetOrderHistory(context.Background(), &getOrdersRequest) - switch { - case areTestAPIKeysSet() && err != nil && !mockTests: - t.Errorf("Could not get order history: %s", err) - case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Expecting an error when no keys are set") - case mockTests && err != nil: - t.Errorf("Could not get order history: %s", err) - } -} - -// Any tests below this line have the ability to impact your orders on the exchange. Enable canManipulateRealOrders to run them -// ---------------------------------------------------------------------------------------------------------------------------- -func areTestAPIKeysSet() bool { - return l.ValidateAPICredentials(l.GetDefaultCredentials()) == nil -} - -func TestSubmitOrder(t *testing.T) { - t.Parallel() - - if areTestAPIKeysSet() && !canManipulateRealOrders && !mockTests { - t.Skip("API keys set, canManipulateRealOrders false, skipping test") - } - - var orderSubmission = &order.Submit{ - Exchange: l.Name, - Pair: currency.Pair{ - Base: currency.BTC, - Quote: currency.EUR, - }, - Side: order.Buy, - Type: order.Limit, - Price: 1, - Amount: 1, - ClientID: "meowOrder", - AssetType: asset.Spot, - } - response, err := l.SubmitOrder(context.Background(), orderSubmission) - switch { - case areTestAPIKeysSet() && (err != nil || response.Status != order.New) && !mockTests: - t.Errorf("Order failed to be placed: %v", err) - case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Expecting an error when no keys are set") - case mockTests && err == nil: - t.Error("Expecting an error until QA pass") - } -} - -func TestCancelExchangeOrder(t *testing.T) { - t.Parallel() - - if areTestAPIKeysSet() && !canManipulateRealOrders && !mockTests { - t.Skip("API keys set, canManipulateRealOrders false, skipping test") - } - var orderCancellation = &order.Cancel{ - OrderID: "1", - WalletAddress: core.BitcoinDonationAddress, - AccountID: "1", - Pair: currency.NewPair(currency.LTC, currency.BTC), - AssetType: asset.Spot, - } - - err := l.CancelOrder(context.Background(), orderCancellation) - switch { - case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Expecting an error when no keys are set") - case areTestAPIKeysSet() && err != nil && !mockTests: - t.Errorf("Could not cancel orders: %v", err) - case mockTests && err == nil: - t.Error("Expecting an error until QA pass") - } -} - -func TestCancelAllExchangeOrders(t *testing.T) { - t.Parallel() - - if areTestAPIKeysSet() && !canManipulateRealOrders && !mockTests { - t.Skip("API keys set, canManipulateRealOrders false, skipping test") - } - var orderCancellation = &order.Cancel{ - OrderID: "1", - WalletAddress: core.BitcoinDonationAddress, - AccountID: "1", - Pair: currency.NewPair(currency.LTC, currency.BTC), - AssetType: asset.Spot, - } - - resp, err := l.CancelAllOrders(context.Background(), orderCancellation) - switch { - case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Expecting an error when no keys are set") - case areTestAPIKeysSet() && err != nil && !mockTests: - t.Errorf("Could not cancel orders: %v", err) - case mockTests && err != nil: - t.Errorf("Could not cancel orders: %v", err) - } - - if len(resp.Status) > 0 { - t.Errorf("%v orders failed to cancel", len(resp.Status)) - } -} - -func TestModifyOrder(t *testing.T) { - t.Parallel() - - _, err := l.ModifyOrder(context.Background(), - &order.Modify{AssetType: asset.Spot}) - if err != common.ErrFunctionNotSupported { - t.Error("ModifyOrder() error", err) - } -} - -func TestWithdraw(t *testing.T) { - t.Parallel() - - withdrawCryptoRequest := withdraw.Request{ - Exchange: l.Name, - Amount: -1, - Currency: currency.BTC, - Description: "WITHDRAW IT ALL", - Crypto: withdraw.CryptoRequest{ - Address: core.BitcoinDonationAddress, - }, - } - - if areTestAPIKeysSet() && !canManipulateRealOrders && !mockTests { - t.Skip("API keys set, canManipulateRealOrders false, skipping test") - } - - _, err := l.WithdrawCryptocurrencyFunds(context.Background(), - &withdrawCryptoRequest) - switch { - case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Expecting an error when no keys are set") - case areTestAPIKeysSet() && err != nil && !mockTests: - t.Errorf("Withdraw failed to be placed: %v", err) - case mockTests && err == nil: - t.Error("Expecting an error until QA pass") - } -} - -func TestWithdrawFiat(t *testing.T) { - t.Parallel() - - var withdrawFiatRequest = withdraw.Request{} - _, err := l.WithdrawFiatFunds(context.Background(), &withdrawFiatRequest) - if err != common.ErrFunctionNotSupported { - t.Errorf("Expected '%v', received: '%v'", - common.ErrFunctionNotSupported, - err) - } -} - -func TestWithdrawInternationalBank(t *testing.T) { - t.Parallel() - - var withdrawFiatRequest = withdraw.Request{} - _, err := l.WithdrawFiatFundsToInternationalBank(context.Background(), &withdrawFiatRequest) - if err != common.ErrFunctionNotSupported { - t.Errorf("Expected '%v', received: '%v'", - common.ErrFunctionNotSupported, - err) - } -} - -func TestGetDepositAddress(t *testing.T) { - t.Parallel() - - _, err := l.GetDepositAddress(context.Background(), currency.BTC, "", "") - switch { - case areTestAPIKeysSet() && err != nil && !mockTests: - t.Error("GetDepositAddress() error", err) - case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("GetDepositAddress() expecting an error when no APIKeys are set") - case mockTests && err != nil: - t.Error("GetDepositAddress() error", err) - } -} - -func TestGetRecentTrades(t *testing.T) { - t.Parallel() - currencyPair, err := currency.NewPairFromString("BTC-LTC") - if err != nil { - t.Fatal(err) - } - _, err = l.GetRecentTrades(context.Background(), currencyPair, asset.Spot) - if err != nil { - t.Error(err) - } -} - -func TestGetHistoricTrades(t *testing.T) { - t.Parallel() - currencyPair, err := currency.NewPairFromString("BTC-LTC") - if err != nil { - t.Fatal(err) - } - _, err = l.GetHistoricTrades(context.Background(), - currencyPair, asset.Spot, time.Now().Add(-time.Minute*15), time.Now()) - if err != nil && err != common.ErrFunctionNotSupported { - t.Error(err) - } -} - -func TestUpdateTicker(t *testing.T) { - t.Parallel() - cp, err := currency.NewPairFromString("BTCUSD") - if err != nil { - t.Fatal(err) - } - _, err = l.UpdateTicker(context.Background(), cp, asset.Spot) - if err != nil { - t.Error(err) - } -} - -func TestUpdateTickers(t *testing.T) { - t.Parallel() - err := l.UpdateTickers(context.Background(), asset.Spot) - if err != nil { - t.Error(err) - } -} diff --git a/exchanges/localbitcoins/localbitcoins_types.go b/exchanges/localbitcoins/localbitcoins_types.go deleted file mode 100644 index fd75e838..00000000 --- a/exchanges/localbitcoins/localbitcoins_types.go +++ /dev/null @@ -1,342 +0,0 @@ -package localbitcoins - -import ( - "time" -) - -// GeneralError is an error capture type -type GeneralError struct { - Error struct { - Message string `json:"message"` - ErrorCode int `json:"error_code"` - } `json:"error"` -} - -// AccountInfo holds public user information -type AccountInfo struct { - Username string `json:"username"` - FeedbackScore int `json:"feedback_score"` - FeedbackCount int `json:"feedback_count"` - RealNameVeriTrusted int `json:"real_name_verifications_trusted"` - TradingPartners int `json:"trading_partners_count"` - URL string `json:"url"` - RealNameVeriUntrusted int `json:"real_name_verifications_untrusted"` - HasFeedback bool `json:"has_feedback"` - IdentityVerifiedAt string `json:"identify_verified_at"` - TrustedCount int `json:"trusted_count"` - FeedbacksUnconfirmed int `json:"feedbacks_unconfirmed_count"` - BlockedCount int `json:"blocked_count"` - TradeVolumeText string `json:"trade_volume_text"` - HasCommonTrades bool `json:"has_common_trades"` - RealNameVeriRejected int `json:"real_name_verifications_rejected"` - AgeText string `json:"age_text"` - ConfirmedTradesText string `json:"confirmed_trade_count_text"` - CreatedAt string `json:"created_at"` -} - -// AdData references the full possible return of ad data -type AdData struct { - AdList []struct { - Data struct { - Visible bool `json:"visible"` - HiddenByOpeningHours bool `json:"hidden_by_opening_hours"` - Location string `json:"location_string"` - CountryCode string `json:"countrycode"` - City string `json:"city"` - TradeType string `json:"trade_type"` - OnlineProvider string `json:"online_provider"` - FirstTimeLimitBTC string `json:"first_time_limit_btc"` - VolumeCoefficientBTC string `json:"volume_coefficient_btc"` - SMSVerficationRequired bool `json:"sms_verification_required"` - ReferenceType string `json:"reference_type"` - DisplayReference bool `json:"display_reference"` - Currency string `json:"currency"` - Lat float64 `json:"lat"` - Lon float64 `json:"lon"` - MinAmount string `json:"min_amount"` - MaxAmount string `json:"max_amount"` - MaXAmountAvailable string `json:"max_amount_available"` - LimitToFiatAmounts string `json:"limit_to_fiat_amounts"` - AdID int64 `json:"ad_id"` - TempPriceUSD string `json:"temp_price_usd"` - Floating bool `json:"floating"` - Profile interface{} `json:"profile"` - RequireFeedBackScore int `json:"require_feedback_score"` - RequireTradeVolume float64 `json:"require_trade_volume"` - RequireTrustedByAdvertiser bool `json:"require_trusted_by_advertiser"` - PaymentWindowMinutes int `json:"payment_window_minutes"` - BankName string `json:"bank_name"` - TrackMaxAmount bool `json:"track_max_amount"` - ATMModel string `json:"atm_model"` - PriceEquation string `json:"price_equation"` - OpeningHours interface{} `json:"opening_hours"` - AccountInfo string `json:"account_info"` - AccountDetails interface{} `json:"account_details"` - } `json:"data"` - Actions struct { - PublicView string `json:"public_view"` - HTMLEdit string `json:"html_edit"` - ChangeForm string `json:"change_form"` - ContactForm string `json:"contact_form"` - } `json:"actions"` - } `json:"ad_list"` - AdCount int `json:"ad_count"` -} - -// AdEdit references an outgoing parameter type for EditAd() method -type AdEdit struct { - // Required Arguments - PriceEquation string `json:"price_equation"` - Latitude int `json:"lat"` - Longitude int `json:"lon"` - City string `json:"city"` - Location string `json:"location_string"` - CountryCode string `json:"countrycode"` - Currency string `json:"currency"` - AccountInfo string `json:"account_info"` - BankName string `json:"bank_name"` - MSG string `json:"msg"` - SMSVerficationRequired bool `json:"sms_verification_required"` - TrackMaxAmount bool `json:"track_max_amount"` - RequireTrustedByAdvertiser bool `json:"require_trusted_by_advertiser"` - RequireIdentification bool `json:"require_identification"` - - // Optional Arguments - MinAmount int `json:"min_amount"` - MaxAmount int `json:"max_amount"` - OpeningHours []string `json:"opening_hours"` - LimitToFiatAmounts string `json:"limit_to_fiat_amounts"` - Visible bool `json:"visible"` - - // Optional Arguments ONLINE_SELL ads - RequireTradeVolume int `json:"require_trade_volume"` - RequireFeedBackScore int `json:"require_feedback_score"` - FirstTimeLimitBTC int `json:"first_time_limit_btc"` - VolumeCoefficientBTC int `json:"volume_coefficient_btc"` - ReferenceType string `json:"reference_type"` - DisplayReference bool `json:"display_reference"` - - // Optional Arguments ONLINE_BUY - PaymentWindowMinutes int `json:"payment_window_minutes"` - - // Optional Arguments LOCAL_SELL - Floating bool `json:"floating"` -} - -// AdCreate references an outgoing parameter type for CreateAd() method -type AdCreate struct { - // Required Arguments - PriceEquation string `json:"price_equation"` - Latitude int `json:"lat"` - Longitude int `json:"lon"` - City string `json:"city"` - Location string `json:"location_string"` - CountryCode string `json:"countrycode"` - Currency string `json:"currency"` - AccountInfo string `json:"account_info"` - BankName string `json:"bank_name"` - MSG string `json:"msg"` - SMSVerficationRequired bool `json:"sms_verification_required"` - TrackMaxAmount bool `json:"track_max_amount"` - RequireTrustedByAdvertiser bool `json:"require_trusted_by_advertiser"` - RequireIdentification bool `json:"require_identification"` - OnlineProvider string `json:"online_provider"` - TradeType string `json:"trade_type"` - - // Optional Arguments - MinAmount int `json:"min_amount"` - MaxAmount int `json:"max_amount"` - OpeningHours []string `json:"opening_hours"` - LimitToFiatAmounts string `json:"limit_to_fiat_amounts"` - Visible bool `json:"visible"` - - // Optional Arguments ONLINE_SELL ads - RequireTradeVolume int `json:"require_trade_volume"` - RequireFeedBackScore int `json:"require_feedback_score"` - FirstTimeLimitBTC int `json:"first_time_limit_btc"` - VolumeCoefficientBTC int `json:"volume_coefficient_btc"` - ReferenceType string `json:"reference_type"` - DisplayReference bool `json:"display_reference"` - - // Optional Arguments ONLINE_BUY - PaymentWindowMinutes int `json:"payment_window_minutes"` - - // Optional Arguments LOCAL_SELL - Floating bool `json:"floating"` -} - -// Message holds the returned message data from a contact -type Message struct { - MSG string `json:"msg"` - Sender struct { - ID int64 `json:"id"` - Name string `json:"name"` - Username string `json:"username"` - TradeCount int64 `json:"trafe_count"` - LastOnline string `json:"last_online"` - } `json:"sender"` - CreatedAt string `json:"created_at"` - IsAdmin bool `json:"is_admin"` - AttachmentName string `json:"attachment_name"` - AttachmentType string `json:"attachment_type"` - AttachmentURL string `json:"attachment_url"` -} - -// DashBoardInfo holds the full range of metadata for a dashboard image -type DashBoardInfo struct { - Data struct { - CreatedAt string `json:"created_at"` - Buyer struct { - Username string `json:"username"` - TradeCount string `json:"trade_count"` - FeedbackScore int `json:"feedback_score"` - Name string `json:"name"` - LastOnline string `json:"last_online"` - RealName string `json:"real_name"` - CompanyName string `json:"company_name"` - CountryCodeByIP string `json:"countrycode_by_ip"` - CountryCodeByPhoneNUmber string `json:"countrycode_by_phone_number"` - } `json:"buyer"` - Seller struct { - Username string `json:"username"` - TradeCount string `json:"trade_count"` - FeedbackScore int `json:"feedback_score"` - Name string `json:"name"` - LastOnline string `json:"last_online"` - } `json:"seller"` - ReferenceCode string `json:"reference_code"` - Currency string `json:"currency"` - Amount float64 `json:"amount,string"` - AmountBTC float64 `json:"amount_btc,string"` - FeeBTC float64 `json:"fee_btc,string"` - ExchangeRateUpdatedAt string `json:"exchange_rate_updated_at"` - Advertisement struct { - ID int64 `json:"id"` - TradeType string `json:"trade_type"` - Advertiser struct { - Username string `json:"username"` - TradeCount string `json:"trade_count"` - FeedbackScore int `json:"feedback_score"` - Name string `json:"name"` - LastOnline string `json:"last_online"` - } `json:"advertiser"` - } `json:"advertisement"` - ContactID int `json:"contact_id"` - CanceledAt string `json:"canceled_at"` - EscrowedAt string `json:"escrowed_at"` - FundedAt string `json:"funded_at"` - PaymentCompletedAt string `json:"payment_completed_at"` - DisputedAt string `json:"disputed_at"` - ClosedAt string `json:"closed_at"` - ReleasedAt string `json:"released_at"` - IsBuying bool `json:"is_buying"` - IsSelling bool `json:"is_selling"` - AccountDetails interface{} `json:"account_details"` - AccountInfo string `json:"account_info"` - Floating bool `json:"floating"` - } `json:"data"` - Actions struct { - MarkAsPaidURL string `json:"mark_as_paid_url"` - AdvertisementPublicView string `json:"advertisement_public_view"` - MessageURL string `json:"message_url"` - MessagePostURL string `json:"message_post_url"` - } `json:"actions"` -} - -// Invoice contains invoice data -type Invoice struct { - Invoice struct { - Description string `json:"description"` - Created string `json:"created"` - URL string `json:"url"` - Amount float64 `json:"amount,string"` - Internal bool `json:"internal"` - Currency string `json:"currency"` - State string `json:"state"` - ID string `json:"id"` - BTCAmount string `json:"btc_amount"` - BTCAddress string `json:"btc_address"` - DeletingAllowed bool `json:"deleting_allowed"` - } `json:"invoice"` -} - -// NotificationInfo holds Notification data -type NotificationInfo struct { - URL string `json:"url"` - CreatedAt string `json:"created_at"` - ContactID int64 `json:"contact_id"` - Read bool `json:"read"` - MSG string `json:"msg"` - ID string `json:"id"` -} - -// WalletInfo holds full wallet information data -type WalletInfo struct { - Message string `json:"message"` - Total Balance `json:"total"` - SentTransactions30d []WalletTransaction `json:"sent_transactions_30d"` - ReceivedTransactions30d []WalletTransaction `json:"received_transactions_30d"` - ReceivingAddressCount int `json:"receiving_address_count"` - ReceivingAddressList []WalletAddressList `json:"receiving_address_list"` -} - -// Balance is a sub-type for WalletInfo & WalletBalanceInfo -type Balance struct { - Balance float64 `json:"balance,string"` - Sendable float64 `json:"Sendable,string"` -} - -// WalletTransaction is a sub-type for WalletInfo -type WalletTransaction struct { - TXID string `json:"txid"` - Amount float64 `json:"amount,string"` - Description string `json:"description"` - TXType int `json:"tx_type"` - CreatedAt time.Time `json:"created_at"` -} - -// WalletAddressList is a sub-type for WalletInfo & WalletBalanceInfo -type WalletAddressList struct { - Address string `json:"address"` - Received float64 `json:"received,string"` -} - -// WalletBalanceInfo standard wallet balance information -type WalletBalanceInfo struct { - Message string `json:"message"` - Total Balance `json:"total"` - ReceivingAddressCount int `json:"receiving_address_count"` // always 1 - ReceivingAddressList []WalletAddressList `json:"receiving_address_list"` -} - -// Ticker contains ticker information -type Ticker struct { - Avg12h float64 `json:"avg_12h,string"` - Avg1h float64 `json:"avg_1h,string,omitempty"` - Avg6h float64 `json:"avg_6h,string,omitempty"` - Avg24h float64 `json:"avg_24h,string"` - Rates struct { - Last float64 `json:"last,string"` - } `json:"rates"` - VolumeBTC float64 `json:"volume_btc,string"` -} - -// Trade holds closed trade information -type Trade struct { - TID int64 `json:"tid"` - Date int64 `json:"date"` - Amount float64 `json:"amount,string"` - Price float64 `json:"price,string"` -} - -// Orderbook is a full range of bid and asks for localbitcoins -type Orderbook struct { - Bids []Price `json:"bids"` - Asks []Price `json:"asks"` -} - -// Price is a sub-type for orderbook -type Price struct { - Price float64 - Amount float64 -} diff --git a/exchanges/localbitcoins/localbitcoins_wrapper.go b/exchanges/localbitcoins/localbitcoins_wrapper.go deleted file mode 100644 index ced4e98b..00000000 --- a/exchanges/localbitcoins/localbitcoins_wrapper.go +++ /dev/null @@ -1,709 +0,0 @@ -package localbitcoins - -import ( - "context" - "errors" - "fmt" - "math" - "sort" - "strconv" - "strings" - "sync" - "time" - - "github.com/thrasher-corp/gocryptotrader/common" - "github.com/thrasher-corp/gocryptotrader/config" - "github.com/thrasher-corp/gocryptotrader/currency" - exchange "github.com/thrasher-corp/gocryptotrader/exchanges" - "github.com/thrasher-corp/gocryptotrader/exchanges/account" - "github.com/thrasher-corp/gocryptotrader/exchanges/asset" - "github.com/thrasher-corp/gocryptotrader/exchanges/deposit" - "github.com/thrasher-corp/gocryptotrader/exchanges/kline" - "github.com/thrasher-corp/gocryptotrader/exchanges/order" - "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" - "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" - "github.com/thrasher-corp/gocryptotrader/exchanges/request" - "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" - "github.com/thrasher-corp/gocryptotrader/exchanges/trade" - "github.com/thrasher-corp/gocryptotrader/log" - "github.com/thrasher-corp/gocryptotrader/portfolio/withdraw" -) - -// GetDefaultConfig returns a default exchange config -func (l *LocalBitcoins) GetDefaultConfig() (*config.Exchange, error) { - l.SetDefaults() - exchCfg := new(config.Exchange) - exchCfg.Name = l.Name - exchCfg.HTTPTimeout = exchange.DefaultHTTPTimeout - exchCfg.BaseCurrencies = l.BaseCurrencies - - err := l.SetupDefaults(exchCfg) - if err != nil { - return nil, err - } - - if l.Features.Supports.RESTCapabilities.AutoPairUpdates { - err = l.UpdateTradablePairs(context.TODO(), true) - if err != nil { - return nil, err - } - } - - return exchCfg, nil -} - -// SetDefaults sets the package defaults for localbitcoins -func (l *LocalBitcoins) SetDefaults() { - l.Name = "LocalBitcoins" - l.Enabled = true - l.Verbose = true - l.API.CredentialsValidator.RequiresKey = true - l.API.CredentialsValidator.RequiresSecret = true - - requestFmt := ¤cy.PairFormat{Uppercase: true} - configFmt := ¤cy.PairFormat{ - Uppercase: true, - Delimiter: currency.DashDelimiter} - err := l.SetGlobalPairsManager(requestFmt, configFmt, asset.Spot) - if err != nil { - log.Errorln(log.ExchangeSys, err) - } - - l.Features = exchange.Features{ - Supports: exchange.FeaturesSupported{ - REST: true, - Websocket: false, - RESTCapabilities: protocol.Features{ - TickerBatching: true, - TickerFetching: true, - AutoPairUpdates: true, - AccountInfo: true, - GetOrder: true, - CancelOrder: true, - SubmitOrder: true, - DepositHistory: true, - WithdrawalHistory: true, - UserTradeHistory: true, - CryptoDeposit: true, - CryptoWithdrawal: true, - }, - WithdrawPermissions: exchange.AutoWithdrawCrypto | - exchange.WithdrawFiatViaWebsiteOnly, - }, - Enabled: exchange.FeaturesEnabled{ - AutoPairUpdates: true, - }, - } - - l.Requester, err = request.New(l.Name, - common.NewHTTPClientWithTimeout(exchange.DefaultHTTPTimeout)) - if err != nil { - log.Errorln(log.ExchangeSys, err) - } - l.API.Endpoints = l.NewEndpoints() - err = l.API.Endpoints.SetDefaultEndpoints(map[exchange.URL]string{ - exchange.RestSpot: localbitcoinsAPIURL, - }) - if err != nil { - log.Errorln(log.ExchangeSys, err) - } -} - -// Setup sets exchange configuration parameters -func (l *LocalBitcoins) Setup(exch *config.Exchange) error { - if err := exch.Validate(); err != nil { - return err - } - if !exch.Enabled { - l.SetEnabled(false) - return nil - } - return l.SetupDefaults(exch) -} - -// Start starts the LocalBitcoins go routine -func (l *LocalBitcoins) Start(wg *sync.WaitGroup) error { - if wg == nil { - return fmt.Errorf("%T %w", wg, common.ErrNilPointer) - } - wg.Add(1) - go func() { - l.Run() - wg.Done() - }() - return nil -} - -// Run implements the LocalBitcoins wrapper -func (l *LocalBitcoins) Run() { - if l.Verbose { - l.PrintEnabledPairs() - } - - if !l.GetEnabledFeatures().AutoPairUpdates { - return - } - - err := l.UpdateTradablePairs(context.TODO(), false) - if err != nil { - log.Errorf(log.ExchangeSys, "%s failed to update tradable pairs. Err: %s", l.Name, err) - } -} - -// FetchTradablePairs returns a list of the exchanges tradable pairs -func (l *LocalBitcoins) FetchTradablePairs(ctx context.Context, a asset.Item) (currency.Pairs, error) { - currencies, err := l.GetTradableCurrencies(ctx) - if err != nil { - return nil, err - } - - pairs := make([]currency.Pair, len(currencies)) - for x := range currencies { - var pair currency.Pair - pair, err = currency.NewPairFromStrings("BTC", currencies[x]) - if err != nil { - return nil, err - } - pairs[x] = pair - } - return pairs, nil -} - -// UpdateTradablePairs updates the exchanges available pairs and stores -// them in the exchanges config -func (l *LocalBitcoins) UpdateTradablePairs(ctx context.Context, forceUpdate bool) error { - pairs, err := l.FetchTradablePairs(ctx, asset.Spot) - if err != nil { - return err - } - return l.UpdatePairs(pairs, asset.Spot, false, forceUpdate) -} - -// UpdateTickers updates the ticker for all currency pairs of a given asset type -func (l *LocalBitcoins) UpdateTickers(ctx context.Context, a asset.Item) error { - tick, err := l.GetTicker(ctx) - if err != nil { - return err - } - - pairs, err := l.GetEnabledPairs(a) - if err != nil { - return err - } - for i := range pairs { - curr := pairs[i].Quote.String() - if _, ok := tick[curr]; !ok { - continue - } - var tp ticker.Price - tp.Pair = pairs[i] - tp.Last = tick[curr].Avg24h - tp.Volume = tick[curr].VolumeBTC - tp.ExchangeName = l.Name - tp.AssetType = a - - err = ticker.ProcessTicker(&tp) - if err != nil { - return err - } - } - return nil -} - -// UpdateTicker updates and returns the ticker for a currency pair -func (l *LocalBitcoins) UpdateTicker(ctx context.Context, p currency.Pair, a asset.Item) (*ticker.Price, error) { - if err := l.UpdateTickers(ctx, a); err != nil { - return nil, err - } - return ticker.GetTicker(l.Name, p, a) -} - -// FetchTicker returns the ticker for a currency pair -func (l *LocalBitcoins) FetchTicker(ctx context.Context, p currency.Pair, assetType asset.Item) (*ticker.Price, error) { - tickerNew, err := ticker.GetTicker(l.Name, p, assetType) - if err != nil { - return l.UpdateTicker(ctx, p, assetType) - } - return tickerNew, nil -} - -// FetchOrderbook returns orderbook base on the currency pair -func (l *LocalBitcoins) FetchOrderbook(ctx context.Context, p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - ob, err := orderbook.Get(l.Name, p, assetType) - if err != nil { - return l.UpdateOrderbook(ctx, p, assetType) - } - return ob, nil -} - -// UpdateOrderbook updates and returns the orderbook for a currency pair -func (l *LocalBitcoins) UpdateOrderbook(ctx context.Context, p currency.Pair, assetType asset.Item) (*orderbook.Base, error) { - book := &orderbook.Base{ - Exchange: l.Name, - Pair: p, - Asset: assetType, - VerifyOrderbook: l.CanVerifyOrderbook, - } - - orderbookNew, err := l.GetOrderbook(ctx, p.Quote.String()) - if err != nil { - return book, err - } - - book.Bids = make(orderbook.Items, len(orderbookNew.Bids)) - for x := range orderbookNew.Bids { - if orderbookNew.Bids[x].Price == 0 { - return book, errors.New("orderbook bid price is 0") - } - book.Bids[x] = orderbook.Item{ - Amount: orderbookNew.Bids[x].Amount / orderbookNew.Bids[x].Price, - Price: orderbookNew.Bids[x].Price, - } - } - - book.Asks = make(orderbook.Items, len(orderbookNew.Asks)) - for x := range orderbookNew.Asks { - if orderbookNew.Asks[x].Price == 0 { - return book, errors.New("orderbook ask price is 0") - } - book.Asks[x] = orderbook.Item{ - Amount: orderbookNew.Asks[x].Amount / orderbookNew.Asks[x].Price, - Price: orderbookNew.Asks[x].Price, - } - } - - book.PriceDuplication = true - err = book.Process() - if err != nil { - return book, err - } - - return orderbook.Get(l.Name, p, assetType) -} - -// UpdateAccountInfo retrieves balances for all enabled currencies for the -// LocalBitcoins exchange -func (l *LocalBitcoins) UpdateAccountInfo(ctx context.Context, assetType asset.Item) (account.Holdings, error) { - var response account.Holdings - response.Exchange = l.Name - accountBalance, err := l.GetWalletBalance(ctx) - if err != nil { - return response, err - } - - response.Accounts = append(response.Accounts, account.SubAccount{ - AssetType: assetType, - Currencies: []account.Balance{ - { - Currency: currency.BTC, - Total: accountBalance.Total.Balance, - Hold: accountBalance.Total.Balance - accountBalance.Total.Sendable, - Free: accountBalance.Total.Sendable, - }}, - }) - - creds, err := l.GetCredentials(ctx) - if err != nil { - return account.Holdings{}, err - } - err = account.Process(&response, creds) - if err != nil { - return account.Holdings{}, err - } - - return response, nil -} - -// FetchAccountInfo retrieves balances for all enabled currencies -func (l *LocalBitcoins) FetchAccountInfo(ctx context.Context, assetType asset.Item) (account.Holdings, error) { - creds, err := l.GetCredentials(ctx) - if err != nil { - return account.Holdings{}, err - } - acc, err := account.GetHoldings(l.Name, creds, assetType) - if err != nil { - return l.UpdateAccountInfo(ctx, assetType) - } - return acc, nil -} - -// GetFundingHistory returns funding history, deposits and -// withdrawals -func (l *LocalBitcoins) GetFundingHistory(ctx context.Context) ([]exchange.FundHistory, error) { - return nil, common.ErrFunctionNotSupported -} - -// GetWithdrawalsHistory returns previous withdrawals data -func (l *LocalBitcoins) GetWithdrawalsHistory(ctx context.Context, c currency.Code, a asset.Item) (resp []exchange.WithdrawalHistory, err error) { - return nil, common.ErrNotYetImplemented -} - -// GetRecentTrades returns the most recent trades for a currency and asset -func (l *LocalBitcoins) GetRecentTrades(ctx context.Context, p currency.Pair, assetType asset.Item) ([]trade.Data, error) { - var err error - p, err = l.FormatExchangeCurrency(p, assetType) - if err != nil { - return nil, err - } - var tradeData []Trade - tradeData, err = l.GetTrades(ctx, p.Quote.String(), nil) - if err != nil { - return nil, err - } - resp := make([]trade.Data, len(tradeData)) - for i := range tradeData { - resp[i] = trade.Data{ - Exchange: l.Name, - TID: strconv.FormatInt(tradeData[i].TID, 10), - CurrencyPair: p, - AssetType: assetType, - Price: tradeData[i].Price, - Amount: tradeData[i].Amount, - Timestamp: time.Unix(tradeData[i].Date, 0), - } - } - - err = l.AddTradesToBuffer(resp...) - if err != nil { - return nil, err - } - - sort.Sort(trade.ByDate(resp)) - return resp, nil -} - -// GetHistoricTrades returns historic trade data within the timeframe provided -func (l *LocalBitcoins) GetHistoricTrades(_ context.Context, _ currency.Pair, _ asset.Item, _, _ time.Time) ([]trade.Data, error) { - return nil, common.ErrFunctionNotSupported -} - -// SubmitOrder submits a new order -func (l *LocalBitcoins) SubmitOrder(ctx context.Context, s *order.Submit) (*order.SubmitResponse, error) { - if err := s.Validate(); err != nil { - return nil, err - } - - fPair, err := l.FormatExchangeCurrency(s.Pair, s.AssetType) - if err != nil { - return nil, err - } - - // These are placeholder details - // TODO store a user's localbitcoin details to use here - var params = AdCreate{ - PriceEquation: "USD_in_AUD", - Latitude: 1, - Longitude: 1, - City: "City", - Location: "Location", - CountryCode: "US", - Currency: fPair.Quote.String(), - AccountInfo: "-", - BankName: "Bank", - MSG: s.Side.String(), - SMSVerficationRequired: true, - TrackMaxAmount: true, - RequireTrustedByAdvertiser: true, - RequireIdentification: true, - OnlineProvider: "", - TradeType: "", - MinAmount: int(math.Round(s.Amount)), - } - - // Does not return any orderID, so create the add, then get the order - err = l.CreateAd(ctx, ¶ms) - if err != nil { - return nil, err - } - - // Now to figure out what ad we just submitted - // The only details we have are the params above - ads, err := l.Getads(ctx) - if err != nil { - return nil, err - } - - var adID string - for i := range ads.AdList { - if ads.AdList[i].Data.PriceEquation == params.PriceEquation && - ads.AdList[i].Data.Lat == float64(params.Latitude) && - ads.AdList[i].Data.Lon == float64(params.Longitude) && - ads.AdList[i].Data.City == params.City && - ads.AdList[i].Data.Location == params.Location && - ads.AdList[i].Data.CountryCode == params.CountryCode && - ads.AdList[i].Data.Currency == params.Currency && - ads.AdList[i].Data.AccountInfo == params.AccountInfo && - ads.AdList[i].Data.BankName == params.BankName && - ads.AdList[i].Data.SMSVerficationRequired == params.SMSVerficationRequired && - ads.AdList[i].Data.TrackMaxAmount == params.TrackMaxAmount && - ads.AdList[i].Data.RequireTrustedByAdvertiser == params.RequireTrustedByAdvertiser && - ads.AdList[i].Data.OnlineProvider == params.OnlineProvider && - ads.AdList[i].Data.TradeType == params.TradeType && - ads.AdList[i].Data.MinAmount == strconv.FormatInt(int64(params.MinAmount), 10) { - adID = strconv.FormatInt(ads.AdList[i].Data.AdID, 10) - break - } - } - - if adID == "" { - return nil, errors.New("ad placed, but not found via API") - } - return s.DeriveSubmitResponse(adID) -} - -// ModifyOrder will allow of changing orderbook placement and limit to -// market conversion -func (l *LocalBitcoins) ModifyOrder(_ context.Context, _ *order.Modify) (*order.ModifyResponse, error) { - return nil, common.ErrFunctionNotSupported -} - -// CancelOrder cancels an order by its corresponding ID number -func (l *LocalBitcoins) CancelOrder(ctx context.Context, o *order.Cancel) error { - if err := o.Validate(o.StandardCancel()); err != nil { - return err - } - return l.DeleteAd(ctx, o.OrderID) -} - -// CancelBatchOrders cancels an orders by their corresponding ID numbers -func (l *LocalBitcoins) CancelBatchOrders(ctx context.Context, o []order.Cancel) (order.CancelBatchResponse, error) { - return order.CancelBatchResponse{}, common.ErrNotYetImplemented -} - -// CancelAllOrders cancels all orders associated with a currency pair -func (l *LocalBitcoins) CancelAllOrders(ctx context.Context, _ *order.Cancel) (order.CancelAllResponse, error) { - cancelAllOrdersResponse := order.CancelAllResponse{ - Status: make(map[string]string), - } - ads, err := l.Getads(ctx) - if err != nil { - return cancelAllOrdersResponse, err - } - - for i := range ads.AdList { - adIDString := strconv.FormatInt(ads.AdList[i].Data.AdID, 10) - err = l.DeleteAd(ctx, adIDString) - if err != nil { - cancelAllOrdersResponse.Status[adIDString] = err.Error() - } - } - - return cancelAllOrdersResponse, nil -} - -// GetOrderInfo returns order information based on order ID -func (l *LocalBitcoins) GetOrderInfo(ctx context.Context, orderID string, pair currency.Pair, assetType asset.Item) (order.Detail, error) { - var orderDetail order.Detail - return orderDetail, common.ErrNotYetImplemented -} - -// GetDepositAddress returns a deposit address for a specified currency -func (l *LocalBitcoins) GetDepositAddress(ctx context.Context, cryptocurrency currency.Code, _, _ string) (*deposit.Address, error) { - if !strings.EqualFold(currency.BTC.String(), cryptocurrency.String()) { - return nil, fmt.Errorf("%s does not have support for currency %s, it only supports bitcoin", - l.Name, cryptocurrency) - } - - depositAddr, err := l.GetWalletAddress(ctx) - if err != nil { - return nil, err - } - - return &deposit.Address{Address: depositAddr}, nil -} - -// WithdrawCryptocurrencyFunds returns a withdrawal ID when a withdrawal is -// submitted -func (l *LocalBitcoins) WithdrawCryptocurrencyFunds(ctx context.Context, withdrawRequest *withdraw.Request) (*withdraw.ExchangeResponse, error) { - if err := withdrawRequest.Validate(); err != nil { - return nil, err - } - err := l.WalletSend(ctx, - withdrawRequest.Crypto.Address, - withdrawRequest.Amount, - withdrawRequest.PIN) - if err != nil { - return nil, err - } - return &withdraw.ExchangeResponse{}, nil -} - -// WithdrawFiatFunds returns a withdrawal ID when a -// withdrawal is submitted -func (l *LocalBitcoins) WithdrawFiatFunds(_ context.Context, _ *withdraw.Request) (*withdraw.ExchangeResponse, error) { - return nil, common.ErrFunctionNotSupported -} - -// WithdrawFiatFundsToInternationalBank returns a withdrawal ID when a -// withdrawal is submitted -func (l *LocalBitcoins) WithdrawFiatFundsToInternationalBank(_ context.Context, _ *withdraw.Request) (*withdraw.ExchangeResponse, error) { - return nil, common.ErrFunctionNotSupported -} - -// GetFeeByType returns an estimate of fee based on type of transaction -func (l *LocalBitcoins) GetFeeByType(ctx context.Context, feeBuilder *exchange.FeeBuilder) (float64, error) { - if feeBuilder == nil { - return 0, fmt.Errorf("%T %w", feeBuilder, common.ErrNilPointer) - } - if (!l.AreCredentialsValid(ctx) || l.SkipAuthCheck) && // Todo check connection status - feeBuilder.FeeType == exchange.CryptocurrencyTradeFee { - feeBuilder.FeeType = exchange.OfflineTradeFee - } - return l.GetFee(feeBuilder) -} - -// GetActiveOrders retrieves any orders that are active/open -func (l *LocalBitcoins) GetActiveOrders(ctx context.Context, getOrdersRequest *order.GetOrdersRequest) (order.FilteredOrders, error) { - err := getOrdersRequest.Validate() - if err != nil { - return nil, err - } - - resp, err := l.GetDashboardInfo(ctx) - if err != nil { - return nil, err - } - - format, err := l.GetPairFormat(asset.Spot, false) - if err != nil { - return nil, err - } - - orders := make([]order.Detail, len(resp)) - for i := range resp { - var orderDate time.Time - orderDate, err = time.Parse(time.RFC3339, resp[i].Data.CreatedAt) - if err != nil { - log.Errorf(log.ExchangeSys, "Exchange %v Func %v Order %v Could not parse date to unix with value of %v", - l.Name, - "GetActiveOrders", - resp[i].Data.Advertisement.ID, - resp[i].Data.CreatedAt) - } - - side := order.Buy - if resp[i].Data.IsSelling { - side = order.Sell - } - - orders[i] = order.Detail{ - Amount: resp[i].Data.AmountBTC, - Price: resp[i].Data.Amount, - OrderID: strconv.FormatInt(resp[i].Data.Advertisement.ID, 10), - Date: orderDate, - Fee: resp[i].Data.FeeBTC, - Side: side, - Pair: currency.NewPairWithDelimiter(currency.BTC.String(), - resp[i].Data.Currency, - format.Delimiter), - Exchange: l.Name, - } - } - return getOrdersRequest.Filter(l.Name, orders), nil -} - -// GetOrderHistory retrieves account order information -// Can Limit response to specific order status -func (l *LocalBitcoins) GetOrderHistory(ctx context.Context, getOrdersRequest *order.GetOrdersRequest) (order.FilteredOrders, error) { - err := getOrdersRequest.Validate() - if err != nil { - return nil, err - } - - var allTrades []DashBoardInfo - resp, err := l.GetDashboardCancelledTrades(ctx) - if err != nil { - return nil, err - } - allTrades = append(allTrades, resp...) - - resp, err = l.GetDashboardClosedTrades(ctx) - if err != nil { - return nil, err - } - allTrades = append(allTrades, resp...) - - resp, err = l.GetDashboardReleasedTrades(ctx) - if err != nil { - return nil, err - } - allTrades = append(allTrades, resp...) - - format, err := l.GetPairFormat(asset.Spot, false) - if err != nil { - return nil, err - } - - orders := make([]order.Detail, len(allTrades)) - for i := range allTrades { - var orderDate time.Time - orderDate, err = time.Parse(time.RFC3339, allTrades[i].Data.CreatedAt) - if err != nil { - log.Errorf(log.ExchangeSys, - "Exchange %v Func %v Order %v Could not parse date to unix with value of %v", - l.Name, - "GetActiveOrders", - allTrades[i].Data.Advertisement.ID, - allTrades[i].Data.CreatedAt) - } - - var side order.Side - if allTrades[i].Data.IsBuying { - side = order.Buy - } else if allTrades[i].Data.IsSelling { - side = order.Sell - } - - status := "" - - switch { - case allTrades[i].Data.ReleasedAt != "" && - allTrades[i].Data.ReleasedAt != null: - status = "Released" - case allTrades[i].Data.CanceledAt != "" && - allTrades[i].Data.CanceledAt != null: - status = "Cancelled" - case allTrades[i].Data.ClosedAt != "" && - allTrades[i].Data.ClosedAt != null: - status = "Closed" - } - - var orderStatus order.Status - orderStatus, err = order.StringToOrderStatus(status) - if err != nil { - log.Errorf(log.ExchangeSys, "%s %v", l.Name, err) - } - - orders[i] = order.Detail{ - Amount: allTrades[i].Data.AmountBTC, - Price: allTrades[i].Data.Amount, - OrderID: strconv.FormatInt(allTrades[i].Data.Advertisement.ID, 10), - Date: orderDate, - Fee: allTrades[i].Data.FeeBTC, - Side: side, - Status: orderStatus, - Pair: currency.NewPairWithDelimiter(currency.BTC.String(), - allTrades[i].Data.Currency, - format.Delimiter), - Exchange: l.Name, - } - } - return getOrdersRequest.Filter(l.Name, orders), nil -} - -// ValidateCredentials validates current credentials used for wrapper -// functionality -func (l *LocalBitcoins) ValidateCredentials(ctx context.Context, assetType asset.Item) error { - _, err := l.UpdateAccountInfo(ctx, assetType) - return l.CheckTransientError(err) -} - -// GetHistoricCandles returns candles between a time period for a set time interval -func (l *LocalBitcoins) GetHistoricCandles(ctx context.Context, pair currency.Pair, a asset.Item, interval kline.Interval, start, end time.Time) (*kline.Item, error) { - return nil, common.ErrFunctionNotSupported -} - -// GetHistoricCandlesExtended returns candles between a time period for a set time interval -func (l *LocalBitcoins) GetHistoricCandlesExtended(ctx context.Context, pair currency.Pair, a asset.Item, interval kline.Interval, start, end time.Time) (*kline.Item, error) { - return nil, common.ErrFunctionNotSupported -} diff --git a/exchanges/localbitcoins/rate_limit.go b/exchanges/localbitcoins/rate_limit.go deleted file mode 100644 index 45c36e1d..00000000 --- a/exchanges/localbitcoins/rate_limit.go +++ /dev/null @@ -1,37 +0,0 @@ -package localbitcoins - -import ( - "time" - - "github.com/thrasher-corp/gocryptotrader/exchanges/request" - "golang.org/x/time/rate" -) - -const orderBookLimiter request.EndpointLimit = 1 -const tickerLimiter request.EndpointLimit = 2 - -// RateLimit define s custom rate limiter scoped for orderbook requests -type RateLimit struct { - Orderbook *rate.Limiter - Ticker *rate.Limiter -} - -// Limit executes rate limiting functionality for Binance -func (r *RateLimit) Limit(f request.EndpointLimit) error { - if f == orderBookLimiter { - time.Sleep(r.Orderbook.Reserve().Delay()) - } else if f == tickerLimiter { - time.Sleep(r.Ticker.Reserve().Delay()) - } - return nil -} - -// SetRateLimit returns the rate limit for the exchange -func SetRateLimit() *RateLimit { - return &RateLimit{ - // 4 seconds per book fetching is the best time frame to actually - // receive without retrying. There is undocumentated rate limit. - Orderbook: request.NewRateLimit(4*time.Second, 1), - Ticker: request.NewRateLimit(time.Second, 1), - } -} diff --git a/exchanges/support.go b/exchanges/support.go index 25adb755..ac338a5d 100644 --- a/exchanges/support.go +++ b/exchanges/support.go @@ -35,7 +35,6 @@ var Exchanges = []string{ "itbit", "kraken", "lbank", - "localbitcoins", "okcoin international", "okx", "poloniex", diff --git a/exchanges/trade/README.md b/exchanges/trade/README.md index a0ec608a..e77c71fe 100644 --- a/exchanges/trade/README.md +++ b/exchanges/trade/README.md @@ -81,7 +81,6 @@ _b in this context is an `IBotExchange` implemented struct_ | ItBit | Yes | NA | No | | Kraken | Yes | Yes | No | | Lbank | Yes | No | Yes | -| LocalBitcoins | Yes | NA | No | | OKCoin International | Yes | Yes | No | | Okx | Yes | Yes | Yes | | Poloniex | Yes | Yes | Yes | diff --git a/testdata/configtest.json b/testdata/configtest.json index 2f37ba81..93b271b2 100644 --- a/testdata/configtest.json +++ b/testdata/configtest.json @@ -1949,82 +1949,6 @@ } ] }, - { - "name": "LocalBitcoins", - "enabled": true, - "verbose": false, - "httpTimeout": 15000000000, - "websocketResponseCheckTimeout": 30000000, - "websocketResponseMaxLimit": 7000000000, - "websocketTrafficTimeout": 30000000000, - "websocketOrderbookBufferLimit": 5, - "baseCurrencies": "ARS,AUD,BRL,CAD,CHF,CZK,DKK,EUR,GBP,HKD,ILS,INR,MXN,NOK,NZD,PLN,RUB,SEK,SGD,THB,USD,ZAR", - "currencyPairs": { - "requestFormat": { - "uppercase": true - }, - "configFormat": { - "uppercase": true - }, - "useGlobalFormat": true, - "assetTypes": [ - "spot" - ], - "pairs": { - "spot": { - "enabled": "BTCARS,BTCAUD,BTCBRL,BTCCAD,BTCCHF,BTCDKK,BTCEUR,BTCGBP,BTCHKD,BTCILS,BTCINR,BTCMXN,BTCNOK,BTCNZD,BTCPLN,BTCRUB,BTCSEK,BTCSGD,BTCTHB,BTCUSD,BTCZAR", - "available": "BTCRUB,BTCRON,BTCXRP,BTCIRR,BTCKRW,BTCCNY,BTCRWF,BTCRSD,BTCOMR,BTCGTQ,BTCKES,BTCCOP,BTCJPY,BTCIDR,BTCBAM,BTCBDT,BTCDOP,BTCMWK,BTCUGX,BTCAOA,BTCAWG,BTCNZD,BTCGBP,BTCBOB,BTCCHF,BTCBYN,BTCLTC,BTCBRL,BTCTWD,BTCCRC,BTCPKR,BTCMXN,BTCVND,BTCDKK,BTCETB,BTCSEK,BTCAED,BTCTHB,BTCEUR,BTCARS,BTCUAH,BTCCAD,BTCPYG,BTCPEN,BTCUSD,BTCETH,BTCLKR,BTCTTD,BTCMYR,BTCHRK,BTCILS,BTCJOD,BTCKWD,BTCHKD,BTCTRY,BTCPLN,BTCZAR,BTCXOF,BTCSAR,BTCUYU,BTCTZS,BTCVES,BTCXAF,BTCGHS,BTCSGD,BTCNOK,BTCINR,BTCEGP,BTCAUD,BTCZMW,BTCGEL,BTCPAB,BTCCLP,BTCCZK,BTCMAD,BTCNGN,BTCQAR,BTCMDL,BTCCDF,BTCKZT,BTCPHP" - } - } - }, - "api": { - "authenticatedSupport": false, - "authenticatedWebsocketApiSupport": false, - "endpoints": { - "url": "NON_DEFAULT_HTTP_LINK_TO_EXCHANGE_API", - "urlSecondary": "NON_DEFAULT_HTTP_LINK_TO_EXCHANGE_API", - "websocketURL": "NON_DEFAULT_HTTP_LINK_TO_WEBSOCKET_EXCHANGE_API" - }, - "credentials": { - "key": "Key", - "secret": "Secret" - }, - "credentialsValidator": { - "requiresKey": true, - "requiresSecret": true - } - }, - "features": { - "supports": { - "restAPI": true, - "restCapabilities": { - "tickerBatching": true, - "autoPairUpdates": true - }, - "websocketAPI": false, - "websocketCapabilities": {} - }, - "enabled": { - "autoPairUpdates": true, - "websocketAPI": false - } - }, - "bankAccounts": [ - { - "enabled": false, - "bankName": "", - "bankAddress": "", - "bankPostalCode": "", - "bankPostalCity": "", - "bankCountry": "", - "accountName": "", - "accountNumber": "", - "swiftCode": "", - "iban": "", - "supportedCurrencies": "" - } - ] - }, { "name": "OKCOIN International", "enabled": true, diff --git a/testdata/exchangelist.csv b/testdata/exchangelist.csv index 3d8887c0..b272ccb1 100644 --- a/testdata/exchangelist.csv +++ b/testdata/exchangelist.csv @@ -18,7 +18,6 @@ huobi, itbit, kraken, lbank, -localbitcoins, okcoin international, okx, poloniex, diff --git a/testdata/http_mock/localbitcoins/localbitcoins.json b/testdata/http_mock/localbitcoins/localbitcoins.json deleted file mode 100644 index 2aa0fe00..00000000 --- a/testdata/http_mock/localbitcoins/localbitcoins.json +++ /dev/null @@ -1,7686 +0,0 @@ -{ - "routes": { - "/api/ad-create/": { - "POST": [ - { - "data": { - "error": { - "message": "Invalid parameters.", - "errors": { - "bank_name": "* This field is required.", - "trade_type": "* This field is required.", - "countrycode": "* This field is required.", - "lon": "* This field is required.", - "currency": "* This field is required.", - "online_provider": "* This field is required.", - "lat": "* This field is required.", - "price_equation": "* This field is required." - }, - "error_code": 9, - "error_lists": { - "bank_name": [ - "This field is required." - ], - "trade_type": [ - "This field is required." - ], - "countrycode": [ - "This field is required." - ], - "lon": [ - "This field is required." - ], - "currency": [ - "This field is required." - ], - "online_provider": [ - "This field is required." - ], - "lat": [ - "This field is required." - ], - "price_equation": [ - "This field is required." - ] - } - } - }, - "queryString": "", - "bodyParams": "", - "headers": { - "Apiauth-Key": [ - "" - ], - "Apiauth-Nonce": [ - "1560494018449563145" - ], - "Apiauth-Signature": [ - "C369F0749F574A16403D561CD35987F18E956640E320EEEE9B864930050C0242" - ], - "Content-Type": [ - "application/x-www-form-urlencoded" - ] - } - } - ] - }, - "/api/ad-delete/1/": { - "POST": [ - { - "data": { - "error": { - "message": "No resource matching criteria was found.", - "error_code": 6 - } - }, - "queryString": "", - "bodyParams": "", - "headers": { - "Apiauth-Key": [ - "" - ], - "Apiauth-Nonce": [ - "1560493270888731262" - ], - "Apiauth-Signature": [ - "597AF7294B303FA10CA398123133158C0998F37AB93E2DA5D6233F3D4E0E1E2A" - ], - "Content-Type": [ - "application/x-www-form-urlencoded" - ] - } - } - ] - }, - "/api/ad-get/": { - "GET": [ - { - "data": { - "error": { - "error_code": 11, - "message": "One or more of the ad IDs was not a valid integer" - } - }, - "queryString": "ads=", - "bodyParams": "ads=", - "headers": { - "Apiauth-Key": [ - "" - ], - "Apiauth-Nonce": [ - "1561959253543681207" - ], - "Apiauth-Signature": [ - "A81AEA23AB65937ED0F957BAD72AC892E273383C83B6F55A574C3090091D89A0" - ], - "Content-Type": [ - "application/x-www-form-urlencoded" - ] - } - } - ] - }, - "/api/ad/1337/": { - "POST": [ - { - "data": { - "error": { - "message": "No resource matching criteria was found.", - "error_code": 6 - } - }, - "queryString": "", - "bodyParams": "", - "headers": { - "Apiauth-Key": [ - "" - ], - "Apiauth-Nonce": [ - "1560495093788997079" - ], - "Apiauth-Signature": [ - "AE887E05554C9E9DFBD553A3698156D9479576F185BC0C833E6ED38243060848" - ], - "Content-Type": [ - "application/x-www-form-urlencoded" - ] - } - } - ] - }, - "/api/ads/": { - "GET": [ - { - "data": { - "data": { - "ad_list": [], - "ad_count": 0 - } - }, - "queryString": "", - "bodyParams": "", - "headers": { - "Apiauth-Key": [ - "" - ], - "Apiauth-Nonce": [ - "1560492666483445443" - ], - "Apiauth-Signature": [ - "6F5246109A416AD75CC8F1C708BD7CA7426400CBE40464AE119EBE313B4F69BC" - ], - "Content-Type": [ - "application/x-www-form-urlencoded" - ] - } - } - ] - }, - "/api/dashboard/": { - "GET": [ - { - "data": { - "data": { - "contact_count": 0, - "contact_list": [] - } - }, - "queryString": "", - "bodyParams": "", - "headers": { - "Apiauth-Key": [ - "" - ], - "Apiauth-Nonce": [ - "1561960286136838890" - ], - "Apiauth-Signature": [ - "88B82299DB73CA1CE039C13785605AFAFDEBC03B2A1FF5DC93773F30096150D6" - ], - "Content-Type": [ - "application/x-www-form-urlencoded" - ] - } - } - ] - }, - "/api/dashboard/canceled/": { - "GET": [ - { - "data": { - "data": { - "contact_count": 2, - "contact_list": [ - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/32805", - "advertisement_url": "https://localbitcoins.com/api/ad-get/32805/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/16885873/", - "messages_url": "https://localbitcoins.com/api/contact_messages/16885873/", - "release_url": "https://localbitcoins.com/api/contact_release/16885873/" - }, - "data": { - "account_info": "{}", - "advertisement": { - "advertiser": { - "feedback_score": 99, - "last_online": "2019-04-12T07:33:34+00:00", - "name": "", - "trade_count": "3000+", - "username": "" - }, - "id": 32805, - "payment_method": "CASH_DEPOSIT", - "trade_type": "ONLINE_BUY" - }, - "amount": "2000.00", - "amount_btc": "0.08903554", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 99, - "last_online": "2019-04-12T07:33:34+00:00", - "name": "", - "real_name": "", - "trade_count": "3000+", - "username": "" - }, - "canceled_at": "2017-12-08T04:49:40+00:00", - "closed_at": "2017-12-08T04:49:40+00:00", - "contact_id": 16885873, - "created_at": "2017-12-08T04:31:29+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-12-08T04:31:29+00:00", - "exchange_rate_updated_at": "2017-12-08T04:31:29+00:00", - "fee_btc": "0.00089036", - "funded_at": "2017-12-08T04:31:29+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": null, - "reference_code": "L16885873BA1X81", - "released_at": null, - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/556123", - "advertisement_url": "https://localbitcoins.com/api/ad-get/556123/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/15160798/", - "messages_url": "https://localbitcoins.com/api/contact_messages/15160798/", - "release_url": "https://localbitcoins.com/api/contact_release/15160798/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2018-06-25T08:15:40+00:00", - "name": "", - "trade_count": "1000+", - "username": "" - }, - "id": 556123, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1055.84", - "amount_btc": "0.14999986", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2018-06-25T08:15:40+00:00", - "name": "", - "real_name": "", - "trade_count": "1000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-10-16T23:08:02+00:00", - "contact_id": 15160798, - "created_at": "2017-10-16T21:37:44+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-10-16T21:37:44+00:00", - "exchange_rate_updated_at": "2017-10-16T21:37:44+00:00", - "fee_btc": "0.00150000", - "funded_at": "2017-10-16T21:37:44+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": null, - "reference_code": "L15160798B90Y5A", - "released_at": null, - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - } - ] - } - }, - "queryString": "", - "bodyParams": "", - "headers": { - "Apiauth-Key": [ - "" - ], - "Apiauth-Nonce": [ - "1561964296416293293" - ], - "Apiauth-Signature": [ - "DFEC2CF704C6E63A2B7F6C5EB52086BB50737A3AFE8A17517BBA0B216C64C5B6" - ], - "Content-Type": [ - "application/x-www-form-urlencoded" - ] - } - } - ] - }, - "/api/dashboard/closed/": { - "GET": [ - { - "data": { - "data": { - "contact_count": 18, - "contact_list": [ - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/654093", - "advertisement_url": "https://localbitcoins.com/api/ad-get/654093/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/20543871/", - "messages_url": "https://localbitcoins.com/api/contact_messages/20543871/", - "release_url": "https://localbitcoins.com/api/contact_release/20543871/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-06-30T21:32:38+00:00", - "name": "", - "trade_count": "3000+", - "username": "" - }, - "id": 654093, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "3038.91", - "amount_btc": "0.29599994", - "buyer": { - "company_name": null, - "countrycode_by_ip": "GB", - "countrycode_by_phone_number": "GB", - "feedback_score": 100, - "last_online": "2019-06-30T21:32:38+00:00", - "name": "", - "real_name": "", - "trade_count": "3000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2018-04-13T13:02:00+00:00", - "contact_id": 20543871, - "created_at": "2018-04-13T12:50:22+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2018-04-13T12:50:22+00:00", - "exchange_rate_updated_at": "2018-04-13T12:50:22+00:00", - "fee_btc": "0.00296000", - "funded_at": "2018-04-13T12:50:22+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2018-04-13T12:59:04+00:00", - "reference_code": "L20543871BC8BR3", - "released_at": "2018-04-13T13:02:00+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/243945", - "advertisement_url": "https://localbitcoins.com/api/ad-get/243945/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/18364961/", - "messages_url": "https://localbitcoins.com/api/contact_messages/18364961/", - "release_url": "https://localbitcoins.com/api/contact_release/18364961/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "lbrun1.3" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-06-16T02:46:03+00:00", - "name": "", - "trade_count": "10 000+", - "username": "" - }, - "id": 243945, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "304.26", - "amount_btc": "0.02247995", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2019-06-16T02:46:03+00:00", - "name": "", - "real_name": "", - "trade_count": "10 000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2018-01-24T06:31:43+00:00", - "contact_id": 18364961, - "created_at": "2018-01-24T05:58:35+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2018-01-24T05:58:35+00:00", - "exchange_rate_updated_at": "2018-01-24T05:58:35+00:00", - "fee_btc": "0.00022480", - "funded_at": "2018-01-24T05:58:35+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2018-01-24T06:27:05+00:00", - "reference_code": "L18364961BAXMHT", - "released_at": "2018-01-24T06:31:43+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/512104", - "advertisement_url": "https://localbitcoins.com/api/ad-get/512104/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/18364860/", - "messages_url": "https://localbitcoins.com/api/contact_messages/18364860/", - "release_url": "https://localbitcoins.com/api/contact_release/18364860/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "lbrun1.6" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-06-27T12:07:08+00:00", - "name": "", - "trade_count": "30+", - "username": "" - }, - "id": 512104, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "7000.00", - "amount_btc": "0.49696073", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2019-06-27T12:07:08+00:00", - "name": "", - "real_name": "", - "trade_count": "30+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2018-01-24T06:30:07+00:00", - "contact_id": 18364860, - "created_at": "2018-01-24T05:48:23+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2018-01-24T05:48:23+00:00", - "exchange_rate_updated_at": "2018-01-24T05:48:23+00:00", - "fee_btc": "0.00496961", - "funded_at": "2018-01-24T05:48:23+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2018-01-24T06:26:15+00:00", - "reference_code": "L18364860BAXMF0", - "released_at": "2018-01-24T06:30:07+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/367850", - "advertisement_url": "https://localbitcoins.com/api/ad-get/367850/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/18364846/", - "messages_url": "https://localbitcoins.com/api/contact_messages/18364846/", - "release_url": "https://localbitcoins.com/api/contact_release/18364846/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "lbrun1.5" - }, - "advertisement": { - "advertiser": { - "feedback_score": 95, - "last_online": "2019-05-23T11:22:33+00:00", - "name": "", - "trade_count": "500+", - "username": "" - }, - "id": 367850, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "5000.00", - "amount_btc": "0.35453299", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 95, - "last_online": "2019-05-23T11:22:33+00:00", - "name": "", - "real_name": "", - "trade_count": "500+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2018-01-24T06:13:59+00:00", - "contact_id": 18364846, - "created_at": "2018-01-24T05:47:12+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2018-01-24T05:47:12+00:00", - "exchange_rate_updated_at": "2018-01-24T05:47:12+00:00", - "fee_btc": "0.00354533", - "funded_at": "2018-01-24T05:47:12+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2018-01-24T06:05:45+00:00", - "reference_code": "L18364846BAXMEM", - "released_at": "2018-01-24T06:13:59+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/127500", - "advertisement_url": "https://localbitcoins.com/api/ad-get/127500/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/18364904/", - "messages_url": "https://localbitcoins.com/api/contact_messages/18364904/", - "release_url": "https://localbitcoins.com/api/contact_release/18364904/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "lbrun1.4" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-07-01T06:54:40+00:00", - "name": "", - "trade_count": "20 000+", - "username": "" - }, - "id": 127500, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "962.00", - "amount_btc": "0.06836873", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2019-07-01T06:54:40+00:00", - "name": "", - "real_name": "", - "trade_count": "20 000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2018-01-24T06:02:29+00:00", - "contact_id": 18364904, - "created_at": "2018-01-24T05:51:59+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2018-01-24T05:51:59+00:00", - "exchange_rate_updated_at": "2018-01-24T05:51:59+00:00", - "fee_btc": "0.00068369", - "funded_at": "2018-01-24T05:51:59+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2018-01-24T06:00:18+00:00", - "reference_code": "L18364904BAXMG8", - "released_at": "2018-01-24T06:02:29+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/613428", - "advertisement_url": "https://localbitcoins.com/api/ad-get/613428/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/17356107/", - "messages_url": "https://localbitcoins.com/api/contact_messages/17356107/", - "release_url": "https://localbitcoins.com/api/contact_release/17356107/" - }, - "data": { - "account_info": "{}", - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-07-01T06:42:40+00:00", - "name": "", - "trade_count": "10 000+", - "username": "" - }, - "id": 613428, - "payment_method": "SPECIFIC_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "2000.00", - "amount_btc": "0.09279954", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2019-07-01T06:42:40+00:00", - "name": "", - "real_name": "", - "trade_count": "10 000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-12-20T21:04:14+00:00", - "contact_id": 17356107, - "created_at": "2017-12-20T20:57:32+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-12-20T20:57:32+00:00", - "exchange_rate_updated_at": "2017-12-20T20:57:32+00:00", - "fee_btc": "0.00092800", - "funded_at": "2017-12-20T20:57:32+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-12-20T21:02:59+00:00", - "reference_code": "L17356107BAC023", - "released_at": "2017-12-20T21:04:14+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/484383", - "advertisement_url": "https://localbitcoins.com/api/ad-get/484383/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/16887828/", - "messages_url": "https://localbitcoins.com/api/contact_messages/16887828/", - "release_url": "https://localbitcoins.com/api/contact_release/16887828/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-07-01T06:42:40+00:00", - "name": "", - "trade_count": "10 000+", - "username": "" - }, - "id": 484383, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1800.00", - "amount_btc": "0.08733069", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2019-07-01T06:42:40+00:00", - "name": "", - "real_name": "", - "trade_count": "10 000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-12-08T06:30:04+00:00", - "contact_id": 16887828, - "created_at": "2017-12-08T06:16:01+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-12-08T06:16:01+00:00", - "exchange_rate_updated_at": "2017-12-08T06:16:01+00:00", - "fee_btc": "0.00087331", - "funded_at": "2017-12-08T06:16:01+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-12-08T06:25:30+00:00", - "reference_code": "L16887828BA1YQC", - "released_at": "2017-12-08T06:30:04+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/32805", - "advertisement_url": "https://localbitcoins.com/api/ad-get/32805/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/16885873/", - "messages_url": "https://localbitcoins.com/api/contact_messages/16885873/", - "release_url": "https://localbitcoins.com/api/contact_release/16885873/" - }, - "data": { - "account_info": "{}", - "advertisement": { - "advertiser": { - "feedback_score": 99, - "last_online": "2019-04-12T07:33:34+00:00", - "name": "", - "trade_count": "3000+", - "username": "" - }, - "id": 32805, - "payment_method": "CASH_DEPOSIT", - "trade_type": "ONLINE_BUY" - }, - "amount": "2000.00", - "amount_btc": "0.08903554", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 99, - "last_online": "2019-04-12T07:33:34+00:00", - "name": "", - "real_name": "", - "trade_count": "3000+", - "username": "" - }, - "canceled_at": "2017-12-08T04:49:40+00:00", - "closed_at": "2017-12-08T04:49:40+00:00", - "contact_id": 16885873, - "created_at": "2017-12-08T04:31:29+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-12-08T04:31:29+00:00", - "exchange_rate_updated_at": "2017-12-08T04:31:29+00:00", - "fee_btc": "0.00089036", - "funded_at": "2017-12-08T04:31:29+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": null, - "reference_code": "L16885873BA1X81", - "released_at": null, - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/367850", - "advertisement_url": "https://localbitcoins.com/api/ad-get/367850/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/16658839/", - "messages_url": "https://localbitcoins.com/api/contact_messages/16658839/", - "release_url": "https://localbitcoins.com/api/contact_release/16658839/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 95, - "last_online": "2019-05-23T11:22:33+00:00", - "name": "", - "trade_count": "500+", - "username": "" - }, - "id": 367850, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1200.00", - "amount_btc": "0.08218750", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 95, - "last_online": "2019-05-23T11:22:33+00:00", - "name": "", - "real_name": "", - "trade_count": "500+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-12-02T00:24:27+00:00", - "contact_id": 16658839, - "created_at": "2017-12-01T23:57:20+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-12-01T23:57:20+00:00", - "exchange_rate_updated_at": "2017-12-01T23:57:20+00:00", - "fee_btc": "0.00082188", - "funded_at": "2017-12-01T23:57:20+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-12-02T00:23:08+00:00", - "reference_code": "L16658839B9X21J", - "released_at": "2017-12-02T00:24:27+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/600091", - "advertisement_url": "https://localbitcoins.com/api/ad-get/600091/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/16269655/", - "messages_url": "https://localbitcoins.com/api/contact_messages/16269655/", - "release_url": "https://localbitcoins.com/api/contact_release/16269655/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-06-30T21:32:38+00:00", - "name": "", - "trade_count": "3000+", - "username": "" - }, - "id": 600091, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1200.00", - "amount_btc": "0.11403170", - "buyer": { - "company_name": null, - "countrycode_by_ip": "GB", - "countrycode_by_phone_number": "GB", - "feedback_score": 100, - "last_online": "2019-06-30T21:32:38+00:00", - "name": "", - "real_name": "", - "trade_count": "3000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-11-20T06:33:08+00:00", - "contact_id": 16269655, - "created_at": "2017-11-20T06:29:02+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-11-20T06:29:02+00:00", - "exchange_rate_updated_at": "2017-11-20T06:29:02+00:00", - "fee_btc": "0.00114032", - "funded_at": "2017-11-20T06:29:02+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-11-20T06:31:43+00:00", - "reference_code": "L16269655B9OPQV", - "released_at": "2017-11-20T06:33:08+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/557284", - "advertisement_url": "https://localbitcoins.com/api/ad-get/557284/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/16135919/", - "messages_url": "https://localbitcoins.com/api/contact_messages/16135919/", - "release_url": "https://localbitcoins.com/api/contact_release/16135919/" - }, - "data": { - "account_info": "{}", - "advertisement": { - "advertiser": { - "feedback_score": 98, - "last_online": "2019-05-18T23:48:12+00:00", - "name": "", - "trade_count": "3000+", - "username": "" - }, - "id": 557284, - "payment_method": "CASH_DEPOSIT", - "trade_type": "ONLINE_BUY" - }, - "amount": "1000.00", - "amount_btc": "0.10197017", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 98, - "last_online": "2019-05-18T23:48:12+00:00", - "name": "", - "real_name": "", - "trade_count": "3000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-11-16T01:25:10+00:00", - "contact_id": 16135919, - "created_at": "2017-11-15T23:50:30+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-11-15T23:50:30+00:00", - "exchange_rate_updated_at": "2017-11-15T23:50:30+00:00", - "fee_btc": "0.00101970", - "funded_at": "2017-11-15T23:50:30+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-11-16T00:12:48+00:00", - "reference_code": "L16135919B9LUJZ", - "released_at": "2017-11-16T01:25:10+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/556123", - "advertisement_url": "https://localbitcoins.com/api/ad-get/556123/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/15625291/", - "messages_url": "https://localbitcoins.com/api/contact_messages/15625291/", - "release_url": "https://localbitcoins.com/api/contact_release/15625291/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2018-06-25T08:15:40+00:00", - "name": "", - "trade_count": "1000+", - "username": "" - }, - "id": 556123, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1000.00", - "amount_btc": "0.11965859", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2018-06-25T08:15:40+00:00", - "name": "", - "real_name": "", - "trade_count": "1000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-11-01T07:50:21+00:00", - "contact_id": 15625291, - "created_at": "2017-11-01T06:25:20+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-11-01T06:25:20+00:00", - "exchange_rate_updated_at": "2017-11-01T06:25:20+00:00", - "fee_btc": "0.00119659", - "funded_at": "2017-11-01T06:25:20+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-11-01T07:09:10+00:00", - "reference_code": "L15625291B9AWJV", - "released_at": "2017-11-01T07:50:21+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/513602", - "advertisement_url": "https://localbitcoins.com/api/ad-get/513602/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/15326580/", - "messages_url": "https://localbitcoins.com/api/contact_messages/15326580/", - "release_url": "https://localbitcoins.com/api/contact_release/15326580/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-06-29T17:21:27+00:00", - "name": "", - "trade_count": "3000+", - "username": "" - }, - "id": 513602, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1200.00", - "amount_btc": "0.16343052", - "buyer": { - "company_name": null, - "countrycode_by_ip": "BR", - "countrycode_by_phone_number": "BR", - "feedback_score": 100, - "last_online": "2019-06-29T17:21:27+00:00", - "name": "", - "real_name": "", - "trade_count": "3000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-10-22T05:40:05+00:00", - "contact_id": 15326580, - "created_at": "2017-10-22T04:53:51+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-10-22T04:53:51+00:00", - "exchange_rate_updated_at": "2017-10-22T04:53:51+00:00", - "fee_btc": "0.00163431", - "funded_at": "2017-10-22T04:53:51+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-10-22T05:11:29+00:00", - "reference_code": "L15326580B94I2C", - "released_at": "2017-10-22T05:40:05+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/271961", - "advertisement_url": "https://localbitcoins.com/api/ad-get/271961/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/15165674/", - "messages_url": "https://localbitcoins.com/api/contact_messages/15165674/", - "release_url": "https://localbitcoins.com/api/contact_release/15165674/" - }, - "data": { - "account_info": "{}", - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2018-05-24T00:35:20+00:00", - "name": "", - "trade_count": "10 000+", - "username": "" - }, - "id": 271961, - "payment_method": "SPECIFIC_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1049.16", - "amount_btc": "0.15000000", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": null, - "feedback_score": 100, - "last_online": "2018-05-24T00:35:20+00:00", - "name": "", - "real_name": "", - "trade_count": "10 000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-10-17T03:18:50+00:00", - "contact_id": 15165674, - "created_at": "2017-10-17T02:49:59+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-10-17T02:49:59+00:00", - "exchange_rate_updated_at": "2017-10-17T02:49:59+00:00", - "fee_btc": "0.00150000", - "funded_at": "2017-10-17T02:49:59+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-10-17T03:12:46+00:00", - "reference_code": "L15165674B911WQ", - "released_at": "2017-10-17T03:18:50+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/556123", - "advertisement_url": "https://localbitcoins.com/api/ad-get/556123/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/15160798/", - "messages_url": "https://localbitcoins.com/api/contact_messages/15160798/", - "release_url": "https://localbitcoins.com/api/contact_release/15160798/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2018-06-25T08:15:40+00:00", - "name": "", - "trade_count": "1000+", - "username": "" - }, - "id": 556123, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1055.84", - "amount_btc": "0.14999986", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2018-06-25T08:15:40+00:00", - "name": "", - "real_name": "", - "trade_count": "1000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-10-16T23:08:02+00:00", - "contact_id": 15160798, - "created_at": "2017-10-16T21:37:44+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-10-16T21:37:44+00:00", - "exchange_rate_updated_at": "2017-10-16T21:37:44+00:00", - "fee_btc": "0.00150000", - "funded_at": "2017-10-16T21:37:44+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": null, - "reference_code": "L15160798B90Y5A", - "released_at": null, - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/555158", - "advertisement_url": "https://localbitcoins.com/api/ad-get/555158/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/14635637/", - "messages_url": "https://localbitcoins.com/api/contact_messages/14635637/", - "release_url": "https://localbitcoins.com/api/contact_release/14635637/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-05-16T12:33:56+00:00", - "name": "", - "trade_count": "1000+", - "username": "" - }, - "id": 555158, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1039.09", - "amount_btc": "0.20000077", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2019-05-16T12:33:56+00:00", - "name": "", - "real_name": "", - "trade_count": "1000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-09-29T01:11:57+00:00", - "contact_id": 14635637, - "created_at": "2017-09-29T00:56:22+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-09-29T00:56:22+00:00", - "exchange_rate_updated_at": "2017-09-29T00:56:22+00:00", - "fee_btc": "0.00200001", - "funded_at": "2017-09-29T00:56:22+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-09-29T01:10:58+00:00", - "reference_code": "L14635637B8POXH", - "released_at": "2017-09-29T01:11:57+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/72713", - "advertisement_url": "https://localbitcoins.com/api/ad-get/72713/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/14353081/", - "messages_url": "https://localbitcoins.com/api/contact_messages/14353081/", - "release_url": "https://localbitcoins.com/api/contact_release/14353081/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 98, - "last_online": "2019-02-09T05:54:26+00:00", - "name": "", - "trade_count": "15 000+", - "username": "" - }, - "id": 72713, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1046.01", - "amount_btc": "0.20699993", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 98, - "last_online": "2019-02-09T05:54:26+00:00", - "name": "", - "real_name": "", - "trade_count": "15 000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-09-18T23:10:20+00:00", - "contact_id": 14353081, - "created_at": "2017-09-18T21:53:08+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-09-18T21:53:08+00:00", - "exchange_rate_updated_at": "2017-09-18T21:53:08+00:00", - "fee_btc": "0.00207000", - "funded_at": "2017-09-18T21:53:08+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-09-18T22:24:20+00:00", - "reference_code": "L14353081B8JMWP", - "released_at": "2017-09-18T23:10:20+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/243945", - "advertisement_url": "https://localbitcoins.com/api/ad-get/243945/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/13641301/", - "messages_url": "https://localbitcoins.com/api/contact_messages/13641301/", - "release_url": "https://localbitcoins.com/api/contact_release/13641301/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-06-16T02:46:03+00:00", - "name": "", - "trade_count": "10 000+", - "username": "" - }, - "id": 243945, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1272.60", - "amount_btc": "0.25000098", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2019-06-16T02:46:03+00:00", - "name": "", - "real_name": "", - "trade_count": "10 000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-08-24T05:33:01+00:00", - "contact_id": 13641301, - "created_at": "2017-08-24T05:01:24+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-08-24T05:01:24+00:00", - "exchange_rate_updated_at": "2017-08-24T05:01:24+00:00", - "fee_btc": "0.00250001", - "funded_at": "2017-08-24T05:01:24+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-08-24T05:27:34+00:00", - "reference_code": "L13641301B84DP1", - "released_at": "2017-08-24T05:33:01+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - } - ] - } - }, - "queryString": "", - "bodyParams": "", - "headers": { - "Apiauth-Key": [ - "" - ], - "Apiauth-Nonce": [ - "1561964296416293294" - ], - "Apiauth-Signature": [ - "32B5FDB6D38A3D068C9FCB1076F38E6329AEE43C38BBF85F5243ADC7C9EA588E" - ], - "Content-Type": [ - "application/x-www-form-urlencoded" - ] - } - } - ] - }, - "/api/dashboard/released/": { - "GET": [ - { - "data": { - "data": { - "contact_count": 16, - "contact_list": [ - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/654093", - "advertisement_url": "https://localbitcoins.com/api/ad-get/654093/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/20543871/", - "messages_url": "https://localbitcoins.com/api/contact_messages/20543871/", - "release_url": "https://localbitcoins.com/api/contact_release/20543871/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-06-30T21:32:38+00:00", - "name": "", - "trade_count": "3000+", - "username": "" - }, - "id": 654093, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "3038.91", - "amount_btc": "0.29599994", - "buyer": { - "company_name": null, - "countrycode_by_ip": "GB", - "countrycode_by_phone_number": "GB", - "feedback_score": 100, - "last_online": "2019-06-30T21:32:38+00:00", - "name": "", - "real_name": "", - "trade_count": "3000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2018-04-13T13:02:00+00:00", - "contact_id": 20543871, - "created_at": "2018-04-13T12:50:22+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2018-04-13T12:50:22+00:00", - "exchange_rate_updated_at": "2018-04-13T12:50:22+00:00", - "fee_btc": "0.00296000", - "funded_at": "2018-04-13T12:50:22+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2018-04-13T12:59:04+00:00", - "reference_code": "L20543871BC8BR3", - "released_at": "2018-04-13T13:02:00+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/243945", - "advertisement_url": "https://localbitcoins.com/api/ad-get/243945/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/18364961/", - "messages_url": "https://localbitcoins.com/api/contact_messages/18364961/", - "release_url": "https://localbitcoins.com/api/contact_release/18364961/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "lbrun1.3" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-06-16T02:46:03+00:00", - "name": "", - "trade_count": "10 000+", - "username": "" - }, - "id": 243945, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "304.26", - "amount_btc": "0.02247995", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2019-06-16T02:46:03+00:00", - "name": "", - "real_name": "", - "trade_count": "10 000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2018-01-24T06:31:43+00:00", - "contact_id": 18364961, - "created_at": "2018-01-24T05:58:35+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2018-01-24T05:58:35+00:00", - "exchange_rate_updated_at": "2018-01-24T05:58:35+00:00", - "fee_btc": "0.00022480", - "funded_at": "2018-01-24T05:58:35+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2018-01-24T06:27:05+00:00", - "reference_code": "L18364961BAXMHT", - "released_at": "2018-01-24T06:31:43+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/512104", - "advertisement_url": "https://localbitcoins.com/api/ad-get/512104/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/18364860/", - "messages_url": "https://localbitcoins.com/api/contact_messages/18364860/", - "release_url": "https://localbitcoins.com/api/contact_release/18364860/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "lbrun1.6" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-06-27T12:07:08+00:00", - "name": "", - "trade_count": "30+", - "username": "" - }, - "id": 512104, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "7000.00", - "amount_btc": "0.49696073", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2019-06-27T12:07:08+00:00", - "name": "", - "real_name": "", - "trade_count": "30+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2018-01-24T06:30:07+00:00", - "contact_id": 18364860, - "created_at": "2018-01-24T05:48:23+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2018-01-24T05:48:23+00:00", - "exchange_rate_updated_at": "2018-01-24T05:48:23+00:00", - "fee_btc": "0.00496961", - "funded_at": "2018-01-24T05:48:23+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2018-01-24T06:26:15+00:00", - "reference_code": "L18364860BAXMF0", - "released_at": "2018-01-24T06:30:07+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/367850", - "advertisement_url": "https://localbitcoins.com/api/ad-get/367850/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/18364846/", - "messages_url": "https://localbitcoins.com/api/contact_messages/18364846/", - "release_url": "https://localbitcoins.com/api/contact_release/18364846/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "lbrun1.5" - }, - "advertisement": { - "advertiser": { - "feedback_score": 95, - "last_online": "2019-05-23T11:22:33+00:00", - "name": "", - "trade_count": "500+", - "username": "" - }, - "id": 367850, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "5000.00", - "amount_btc": "0.35453299", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 95, - "last_online": "2019-05-23T11:22:33+00:00", - "name": "", - "real_name": "", - "trade_count": "500+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2018-01-24T06:13:59+00:00", - "contact_id": 18364846, - "created_at": "2018-01-24T05:47:12+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2018-01-24T05:47:12+00:00", - "exchange_rate_updated_at": "2018-01-24T05:47:12+00:00", - "fee_btc": "0.00354533", - "funded_at": "2018-01-24T05:47:12+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2018-01-24T06:05:45+00:00", - "reference_code": "L18364846BAXMEM", - "released_at": "2018-01-24T06:13:59+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/127500", - "advertisement_url": "https://localbitcoins.com/api/ad-get/127500/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/18364904/", - "messages_url": "https://localbitcoins.com/api/contact_messages/18364904/", - "release_url": "https://localbitcoins.com/api/contact_release/18364904/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "lbrun1.4" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-07-01T06:54:40+00:00", - "name": "", - "trade_count": "20 000+", - "username": "" - }, - "id": 127500, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "962.00", - "amount_btc": "0.06836873", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2019-07-01T06:54:40+00:00", - "name": "", - "real_name": "", - "trade_count": "20 000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2018-01-24T06:02:29+00:00", - "contact_id": 18364904, - "created_at": "2018-01-24T05:51:59+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2018-01-24T05:51:59+00:00", - "exchange_rate_updated_at": "2018-01-24T05:51:59+00:00", - "fee_btc": "0.00068369", - "funded_at": "2018-01-24T05:51:59+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2018-01-24T06:00:18+00:00", - "reference_code": "L18364904BAXMG8", - "released_at": "2018-01-24T06:02:29+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/613428", - "advertisement_url": "https://localbitcoins.com/api/ad-get/613428/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/17356107/", - "messages_url": "https://localbitcoins.com/api/contact_messages/17356107/", - "release_url": "https://localbitcoins.com/api/contact_release/17356107/" - }, - "data": { - "account_info": "{}", - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-07-01T06:42:40+00:00", - "name": "", - "trade_count": "10 000+", - "username": "" - }, - "id": 613428, - "payment_method": "SPECIFIC_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "2000.00", - "amount_btc": "0.09279954", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2019-07-01T06:42:40+00:00", - "name": "", - "real_name": "", - "trade_count": "10 000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-12-20T21:04:14+00:00", - "contact_id": 17356107, - "created_at": "2017-12-20T20:57:32+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-12-20T20:57:32+00:00", - "exchange_rate_updated_at": "2017-12-20T20:57:32+00:00", - "fee_btc": "0.00092800", - "funded_at": "2017-12-20T20:57:32+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-12-20T21:02:59+00:00", - "reference_code": "L17356107BAC023", - "released_at": "2017-12-20T21:04:14+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/484383", - "advertisement_url": "https://localbitcoins.com/api/ad-get/484383/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/16887828/", - "messages_url": "https://localbitcoins.com/api/contact_messages/16887828/", - "release_url": "https://localbitcoins.com/api/contact_release/16887828/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-07-01T06:42:40+00:00", - "name": "", - "trade_count": "10 000+", - "username": "" - }, - "id": 484383, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1800.00", - "amount_btc": "0.08733069", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2019-07-01T06:42:40+00:00", - "name": "", - "real_name": "", - "trade_count": "10 000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-12-08T06:30:04+00:00", - "contact_id": 16887828, - "created_at": "2017-12-08T06:16:01+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-12-08T06:16:01+00:00", - "exchange_rate_updated_at": "2017-12-08T06:16:01+00:00", - "fee_btc": "0.00087331", - "funded_at": "2017-12-08T06:16:01+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-12-08T06:25:30+00:00", - "reference_code": "L16887828BA1YQC", - "released_at": "2017-12-08T06:30:04+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/367850", - "advertisement_url": "https://localbitcoins.com/api/ad-get/367850/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/16658839/", - "messages_url": "https://localbitcoins.com/api/contact_messages/16658839/", - "release_url": "https://localbitcoins.com/api/contact_release/16658839/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 95, - "last_online": "2019-05-23T11:22:33+00:00", - "name": "", - "trade_count": "500+", - "username": "" - }, - "id": 367850, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1200.00", - "amount_btc": "0.08218750", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 95, - "last_online": "2019-05-23T11:22:33+00:00", - "name": "", - "real_name": "", - "trade_count": "500+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-12-02T00:24:27+00:00", - "contact_id": 16658839, - "created_at": "2017-12-01T23:57:20+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-12-01T23:57:20+00:00", - "exchange_rate_updated_at": "2017-12-01T23:57:20+00:00", - "fee_btc": "0.00082188", - "funded_at": "2017-12-01T23:57:20+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-12-02T00:23:08+00:00", - "reference_code": "L16658839B9X21J", - "released_at": "2017-12-02T00:24:27+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/600091", - "advertisement_url": "https://localbitcoins.com/api/ad-get/600091/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/16269655/", - "messages_url": "https://localbitcoins.com/api/contact_messages/16269655/", - "release_url": "https://localbitcoins.com/api/contact_release/16269655/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-06-30T21:32:38+00:00", - "name": "", - "trade_count": "3000+", - "username": "" - }, - "id": 600091, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1200.00", - "amount_btc": "0.11403170", - "buyer": { - "company_name": null, - "countrycode_by_ip": "GB", - "countrycode_by_phone_number": "GB", - "feedback_score": 100, - "last_online": "2019-06-30T21:32:38+00:00", - "name": "", - "real_name": "", - "trade_count": "3000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-11-20T06:33:08+00:00", - "contact_id": 16269655, - "created_at": "2017-11-20T06:29:02+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-11-20T06:29:02+00:00", - "exchange_rate_updated_at": "2017-11-20T06:29:02+00:00", - "fee_btc": "0.00114032", - "funded_at": "2017-11-20T06:29:02+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-11-20T06:31:43+00:00", - "reference_code": "L16269655B9OPQV", - "released_at": "2017-11-20T06:33:08+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/557284", - "advertisement_url": "https://localbitcoins.com/api/ad-get/557284/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/16135919/", - "messages_url": "https://localbitcoins.com/api/contact_messages/16135919/", - "release_url": "https://localbitcoins.com/api/contact_release/16135919/" - }, - "data": { - "account_info": "{}", - "advertisement": { - "advertiser": { - "feedback_score": 98, - "last_online": "2019-05-18T23:48:12+00:00", - "name": "", - "trade_count": "3000+", - "username": "" - }, - "id": 557284, - "payment_method": "CASH_DEPOSIT", - "trade_type": "ONLINE_BUY" - }, - "amount": "1000.00", - "amount_btc": "0.10197017", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 98, - "last_online": "2019-05-18T23:48:12+00:00", - "name": "", - "real_name": "", - "trade_count": "3000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-11-16T01:25:10+00:00", - "contact_id": 16135919, - "created_at": "2017-11-15T23:50:30+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-11-15T23:50:30+00:00", - "exchange_rate_updated_at": "2017-11-15T23:50:30+00:00", - "fee_btc": "0.00101970", - "funded_at": "2017-11-15T23:50:30+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-11-16T00:12:48+00:00", - "reference_code": "L16135919B9LUJZ", - "released_at": "2017-11-16T01:25:10+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/556123", - "advertisement_url": "https://localbitcoins.com/api/ad-get/556123/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/15625291/", - "messages_url": "https://localbitcoins.com/api/contact_messages/15625291/", - "release_url": "https://localbitcoins.com/api/contact_release/15625291/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2018-06-25T08:15:40+00:00", - "name": "", - "trade_count": "1000+", - "username": "" - }, - "id": 556123, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1000.00", - "amount_btc": "0.11965859", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2018-06-25T08:15:40+00:00", - "name": "", - "real_name": "", - "trade_count": "1000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-11-01T07:50:21+00:00", - "contact_id": 15625291, - "created_at": "2017-11-01T06:25:20+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-11-01T06:25:20+00:00", - "exchange_rate_updated_at": "2017-11-01T06:25:20+00:00", - "fee_btc": "0.00119659", - "funded_at": "2017-11-01T06:25:20+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-11-01T07:09:10+00:00", - "reference_code": "L15625291B9AWJV", - "released_at": "2017-11-01T07:50:21+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/513602", - "advertisement_url": "https://localbitcoins.com/api/ad-get/513602/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/15326580/", - "messages_url": "https://localbitcoins.com/api/contact_messages/15326580/", - "release_url": "https://localbitcoins.com/api/contact_release/15326580/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-06-29T17:21:27+00:00", - "name": "", - "trade_count": "3000+", - "username": "" - }, - "id": 513602, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1200.00", - "amount_btc": "0.16343052", - "buyer": { - "company_name": null, - "countrycode_by_ip": "BR", - "countrycode_by_phone_number": "BR", - "feedback_score": 100, - "last_online": "2019-06-29T17:21:27+00:00", - "name": "", - "real_name": "", - "trade_count": "3000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-10-22T05:40:05+00:00", - "contact_id": 15326580, - "created_at": "2017-10-22T04:53:51+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-10-22T04:53:51+00:00", - "exchange_rate_updated_at": "2017-10-22T04:53:51+00:00", - "fee_btc": "0.00163431", - "funded_at": "2017-10-22T04:53:51+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-10-22T05:11:29+00:00", - "reference_code": "L15326580B94I2C", - "released_at": "2017-10-22T05:40:05+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/271961", - "advertisement_url": "https://localbitcoins.com/api/ad-get/271961/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/15165674/", - "messages_url": "https://localbitcoins.com/api/contact_messages/15165674/", - "release_url": "https://localbitcoins.com/api/contact_release/15165674/" - }, - "data": { - "account_info": "{}", - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2018-05-24T00:35:20+00:00", - "name": "", - "trade_count": "10 000+", - "username": "" - }, - "id": 271961, - "payment_method": "SPECIFIC_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1049.16", - "amount_btc": "0.15000000", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": null, - "feedback_score": 100, - "last_online": "2018-05-24T00:35:20+00:00", - "name": "", - "real_name": "", - "trade_count": "10 000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-10-17T03:18:50+00:00", - "contact_id": 15165674, - "created_at": "2017-10-17T02:49:59+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-10-17T02:49:59+00:00", - "exchange_rate_updated_at": "2017-10-17T02:49:59+00:00", - "fee_btc": "0.00150000", - "funded_at": "2017-10-17T02:49:59+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-10-17T03:12:46+00:00", - "reference_code": "L15165674B911WQ", - "released_at": "2017-10-17T03:18:50+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/555158", - "advertisement_url": "https://localbitcoins.com/api/ad-get/555158/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/14635637/", - "messages_url": "https://localbitcoins.com/api/contact_messages/14635637/", - "release_url": "https://localbitcoins.com/api/contact_release/14635637/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-05-16T12:33:56+00:00", - "name": "", - "trade_count": "1000+", - "username": "" - }, - "id": 555158, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1039.09", - "amount_btc": "0.20000077", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2019-05-16T12:33:56+00:00", - "name": "", - "real_name": "", - "trade_count": "1000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-09-29T01:11:57+00:00", - "contact_id": 14635637, - "created_at": "2017-09-29T00:56:22+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-09-29T00:56:22+00:00", - "exchange_rate_updated_at": "2017-09-29T00:56:22+00:00", - "fee_btc": "0.00200001", - "funded_at": "2017-09-29T00:56:22+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-09-29T01:10:58+00:00", - "reference_code": "L14635637B8POXH", - "released_at": "2017-09-29T01:11:57+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/72713", - "advertisement_url": "https://localbitcoins.com/api/ad-get/72713/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/14353081/", - "messages_url": "https://localbitcoins.com/api/contact_messages/14353081/", - "release_url": "https://localbitcoins.com/api/contact_release/14353081/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 98, - "last_online": "2019-02-09T05:54:26+00:00", - "name": "", - "trade_count": "15 000+", - "username": "" - }, - "id": 72713, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1046.01", - "amount_btc": "0.20699993", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 98, - "last_online": "2019-02-09T05:54:26+00:00", - "name": "", - "real_name": "", - "trade_count": "15 000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-09-18T23:10:20+00:00", - "contact_id": 14353081, - "created_at": "2017-09-18T21:53:08+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-09-18T21:53:08+00:00", - "exchange_rate_updated_at": "2017-09-18T21:53:08+00:00", - "fee_btc": "0.00207000", - "funded_at": "2017-09-18T21:53:08+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-09-18T22:24:20+00:00", - "reference_code": "L14353081B8JMWP", - "released_at": "2017-09-18T23:10:20+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - }, - { - "actions": { - "advertisement_public_view": "https://localbitcoins.com/ad/243945", - "advertisement_url": "https://localbitcoins.com/api/ad-get/243945/", - "message_post_url": "https://localbitcoins.com/api/contact_message_post/13641301/", - "messages_url": "https://localbitcoins.com/api/contact_messages/13641301/", - "release_url": "https://localbitcoins.com/api/contact_release/13641301/" - }, - "data": { - "account_details": { - "account_number": "", - "bsb": "", - "receiver_name": "", - "reference": "" - }, - "advertisement": { - "advertiser": { - "feedback_score": 100, - "last_online": "2019-06-16T02:46:03+00:00", - "name": "", - "trade_count": "10 000+", - "username": "" - }, - "id": 243945, - "payment_method": "NATIONAL_BANK", - "trade_type": "ONLINE_BUY" - }, - "amount": "1272.60", - "amount_btc": "0.25000098", - "buyer": { - "company_name": null, - "countrycode_by_ip": "AU", - "countrycode_by_phone_number": "AU", - "feedback_score": 100, - "last_online": "2019-06-16T02:46:03+00:00", - "name": "", - "real_name": "", - "trade_count": "10 000+", - "username": "" - }, - "canceled_at": null, - "closed_at": "2017-08-24T05:33:01+00:00", - "contact_id": 13641301, - "created_at": "2017-08-24T05:01:24+00:00", - "currency": "AUD", - "disputed_at": null, - "escrowed_at": "2017-08-24T05:01:24+00:00", - "exchange_rate_updated_at": "2017-08-24T05:01:24+00:00", - "fee_btc": "0.00250001", - "funded_at": "2017-08-24T05:01:24+00:00", - "is_buying": false, - "is_selling": true, - "payment_completed_at": "2017-08-24T05:27:34+00:00", - "reference_code": "L13641301B84DP1", - "released_at": "2017-08-24T05:33:01+00:00", - "seller": { - "feedback_score": 100, - "last_online": "2019-07-01T06:56:40+00:00", - "name": "", - "trade_count": "16", - "username": "" - } - } - } - ] - } - }, - "queryString": "", - "bodyParams": "", - "headers": { - "Apiauth-Key": [ - "" - ], - "Apiauth-Nonce": [ - "1561964296416293295" - ], - "Apiauth-Signature": [ - "00C8D42CE7ABC89BB9DD68A839628BC1E482F5A47A9BBC1D5AE12A1601A0434D" - ], - "Content-Type": [ - "application/x-www-form-urlencoded" - ] - } - } - ] - }, - "/api/myself/": { - "GET": [ - { - "data": { - "data": { - "age_text": "4 years, 11 months", - "blocked_count": 0, - "confirmed_trade_count_text": "16", - "created_at": "2014-07-18T21:12:23+00:00", - "feedback_count": 5, - "feedback_score": 100, - "feedbacks_unconfirmed_count": 3, - "has_common_trades": false, - "has_feedback": false, - "identity_verified_at": "2017-12-08T05:59:48+00:00", - "real_name_verifications_rejected": 0, - "real_name_verifications_trusted": 0, - "real_name_verifications_untrusted": 0, - "trade_volume_text": "2-5 BTC", - "trading_partners_count": 12, - "trusted_count": 2, - "url": "", - "username": "" - } - }, - "queryString": "", - "bodyParams": "", - "headers": { - "Apiauth-Key": [ - "" - ], - "Apiauth-Nonce": [ - "1561959130359152477" - ], - "Apiauth-Signature": [ - "80D9F6E9EC1AC1BD30F24C7F74B6D4737052C41D14142422C02FD4DF0E81B291" - ], - "Content-Type": [ - "application/x-www-form-urlencoded" - ] - } - } - ] - }, - "/api/wallet-addr/": { - "POST": [ - { - "data": { - "data": { - "address": "3BxxAysZpNkHL2cFLmft8923cGfMa2WdQw", - "message": "OK!" - } - }, - "queryString": "", - "bodyParams": "", - "headers": { - "Apiauth-Key": [ - "" - ], - "Apiauth-Nonce": [ - "1561957957028764420" - ], - "Apiauth-Signature": [ - "51D4769CC4714D2B459D25A66FF1E72FF46CB8E94B65EA18455BB24AE35C068B" - ], - "Content-Type": [ - "application/x-www-form-urlencoded" - ] - } - } - ] - }, - "/api/wallet-send/": { - "POST": [ - { - "data": { - "error": { - "message": "One or more parameters did not validate. Please check the API documentation for usage.", - "errors": { - "amount": "Not enough balance" - }, - "error_code": 19 - } - }, - "queryString": "", - "bodyParams": "address=bc1qk0jareu4jytc0cfrhr5wgshsq8282awpavfahc\u0026amount=-1", - "headers": { - "Apiauth-Key": [ - "" - ], - "Apiauth-Nonce": [ - "1560491240845487036" - ], - "Apiauth-Signature": [ - "8B7AB8E9648102F2EB7EE55F5A75FCEE4722680516D8CDFA9722942641C28ADA" - ], - "Content-Type": [ - "application/x-www-form-urlencoded" - ] - } - } - ] - }, - "/bitcoinaverage/ticker-all-currencies/": { - "GET": [ - { - "data": { - "COP": { - "avg_12h": "25537196.67", - "volume_btc": "57.30794705", - "avg_24h": "25449596.12", - "avg_1h": "25764777.31", - "rates": { - "last": "25897996.85" - }, - "avg_6h": "25412534.30" - }, - "USD": { - "avg_12h": "8562.48", - "volume_btc": "140.85448370", - "avg_24h": "8586.36", - "avg_1h": "8492.03", - "rates": { - "last": "8214.00" - }, - "avg_6h": "8568.07" - }, - "JPY": { - "avg_12h": "847915.64", - "volume_btc": "0.02230900", - "avg_24h": "847915.64", - "rates": { - "last": "845980.00" - }, - "avg_6h": "845980.00" - }, - "TWD": { - "avg_12h": "281295.08", - "volume_btc": "2.26245037", - "avg_24h": "278202.56", - "avg_1h": "278103.89", - "rates": { - "last": "276672.61" - }, - "avg_6h": "281295.08" - }, - "GHS": { - "avg_12h": "44134.30", - "volume_btc": "1.98283093", - "avg_24h": "43651.70", - "rates": { - "last": "43650.15" - }, - "avg_6h": "44060.04" - }, - "NGN": { - "avg_12h": "2916614.26", - "volume_btc": "72.41011739", - "avg_24h": "2899101.32", - "avg_1h": "2921923.59", - "rates": { - "last": "2923100.01" - }, - "avg_6h": "2916981.81" - }, - "EGP": { - "avg_12h": "151813.87", - "volume_btc": "0.68349646", - "avg_24h": "150018.16", - "rates": { - "last": "209994.20" - } - }, - "IDR": { - "avg_12h": "124164915.73", - "volume_btc": "0.09193647", - "avg_24h": "123191340.72", - "avg_1h": "121643007.78", - "rates": { - "last": "121643007.78" - }, - "avg_6h": "124164915.73" - }, - "MVR": { - "volume_btc": "0.02007789", - "avg_24h": "149418.09", - "rates": { - "last": "149418.09" - } - }, - "SZL": { - "volume_btc": "0.01069374", - "avg_24h": "140268.98", - "rates": { - "last": "150000.15" - } - }, - "ISK": { - "volume_btc": "0.20086962", - "avg_24h": "995670.72", - "rates": { - "last": "995670.72" - } - }, - "CRC": { - "avg_12h": "4757140.30", - "volume_btc": "0.41437268", - "avg_24h": "4811297.94", - "rates": { - "last": "4955842.50" - }, - "avg_6h": "4968659.22" - }, - "XRP": { - "avg_12h": "21090.70", - "volume_btc": "0.25386409", - "avg_24h": "21023.45", - "rates": { - "last": "21124.01" - }, - "avg_6h": "21184.65" - }, - "AED": { - "volume_btc": "2.18671211", - "avg_24h": "29974.93", - "rates": { - "last": "29777.40" - } - }, - "GBP": { - "avg_12h": "6517.46", - "volume_btc": "67.51203997", - "avg_24h": "6430.57", - "avg_1h": "6545.48", - "rates": { - "last": "6159.46" - }, - "avg_6h": "6619.35" - }, - "ETH": { - "avg_12h": "31.98", - "volume_btc": "0.30525867", - "avg_24h": "31.19", - "rates": { - "last": "31.93" - } - }, - "BHD": { - "volume_btc": "0.02748994", - "avg_24h": "3455.81", - "rates": { - "last": "3455.81" - } - }, - "LKR": { - "avg_12h": "1606872.20", - "volume_btc": "0.78053341", - "avg_24h": "1608097.45", - "avg_1h": "1804552.72", - "rates": { - "last": "1804552.72" - }, - "avg_6h": "1606872.20" - }, - "BOB": { - "avg_12h": "59376.89", - "volume_btc": "0.24588149", - "avg_24h": "55902.99", - "rates": { - "last": "59189.11" - }, - "avg_6h": "59189.11" - }, - "RSD": { - "avg_12h": "793701.45", - "volume_btc": "0.01338060", - "avg_24h": "869090.33", - "rates": { - "last": "793701.45" - } - }, - "VES": { - "avg_12h": "59124424.76", - "volume_btc": "138.63954251", - "avg_24h": "58500831.77", - "rates": { - "last": "57319869.26" - }, - "avg_6h": "59157392.40" - }, - "PKR": { - "avg_12h": "1260400.03", - "volume_btc": "4.67788383", - "avg_24h": "1257798.07", - "avg_1h": "1281991.62", - "rates": { - "last": "1278624.55" - }, - "avg_6h": "1273742.81" - }, - "LBP": { - "avg_12h": "13596207.95", - "volume_btc": "0.03653960", - "avg_24h": "13596207.95", - "rates": { - "last": "13596207.95" - } - }, - "TZS": { - "avg_12h": "19530777.00", - "volume_btc": "1.06554909", - "avg_24h": "19227157.06", - "avg_1h": "20357598.44", - "rates": { - "last": "20405664.61" - }, - "avg_6h": "19407156.98" - }, - "VND": { - "avg_12h": "201629484.83", - "volume_btc": "0.26768301", - "avg_24h": "201557439.41", - "rates": { - "last": "206358652.99" - }, - "avg_6h": "201629484.83" - }, - "GEL": { - "avg_12h": "20897.64", - "volume_btc": "0.05139655", - "avg_24h": "22491.78", - "rates": { - "last": "20897.64" - }, - "avg_6h": "20897.64" - }, - "LTC": { - "avg_12h": "64.20", - "volume_btc": "0.21374261", - "avg_24h": "63.91", - "rates": { - "last": "61.25" - } - }, - "RON": { - "avg_12h": "32314.31", - "volume_btc": "3.41826662", - "avg_24h": "32447.47", - "rates": { - "last": "30515.15" - }, - "avg_6h": "32024.17" - }, - "HUF": { - "volume_btc": "0.10050384", - "avg_24h": "2437717.80", - "rates": { - "last": "2819598.69" - } - }, - "MYR": { - "avg_12h": "33996.15", - "volume_btc": "8.81478056", - "avg_24h": "33956.83", - "avg_1h": "34476.72", - "rates": { - "last": "33858.00" - }, - "avg_6h": "33755.81" - }, - "GTQ": { - "avg_12h": "68974.61", - "volume_btc": "0.00959425", - "avg_24h": "69312.35", - "rates": { - "last": "70153.06" - } - }, - "ZMW": { - "avg_12h": "123419.20", - "volume_btc": "0.24337546", - "avg_24h": "124378.68", - "rates": { - "last": "123078.65" - }, - "avg_6h": "123419.20" - }, - "MUR": { - "volume_btc": "0.01487938", - "avg_24h": "349476.93", - "rates": { - "last": "352219.22" - } - }, - "UAH": { - "avg_12h": "211829.83", - "volume_btc": "16.66117945", - "avg_24h": "209677.23", - "avg_1h": "212630.36", - "rates": { - "last": "220388.34" - }, - "avg_6h": "208239.32" - }, - "UGX": { - "avg_12h": "29686183.01", - "volume_btc": "0.37545684", - "avg_24h": "29711353.80", - "avg_1h": "30835713.02", - "rates": { - "last": "30829092.51" - }, - "avg_6h": "29620104.90" - }, - "XOF": { - "avg_12h": "4861132.03", - "volume_btc": "0.09694489", - "avg_24h": "4772973.28", - "rates": { - "last": "4275733.70" - } - }, - "QAR": { - "volume_btc": "0.27356116", - "avg_24h": "33256.77", - "rates": { - "last": "33732.04" - } - }, - "SAR": { - "avg_12h": "32647.94", - "volume_btc": "5.37359276", - "avg_24h": "32537.28", - "rates": { - "last": "33848.64" - }, - "avg_6h": "32663.09" - }, - "DKK": { - "volume_btc": "0.22476957", - "avg_24h": "68590.24", - "rates": { - "last": "70473.55" - } - }, - "CAD": { - "avg_12h": "11078.67", - "volume_btc": "8.94868269", - "avg_24h": "11031.59", - "avg_1h": "10446.42", - "rates": { - "last": "10446.42" - }, - "avg_6h": "10959.13" - }, - "SEK": { - "avg_12h": "80823.78", - "volume_btc": "8.90365116", - "avg_24h": "81244.54", - "avg_1h": "83288.12", - "rates": { - "last": "83343.47" - }, - "avg_6h": "81469.29" - }, - "SGD": { - "avg_12h": "11503.01", - "volume_btc": "5.99224704", - "avg_24h": "11330.54", - "avg_1h": "11532.92", - "rates": { - "last": "13134.52" - }, - "avg_6h": "11360.59" - }, - "HKD": { - "avg_12h": "67815.30", - "volume_btc": "19.69548211", - "avg_24h": "66039.28", - "rates": { - "last": "69484.34" - }, - "avg_6h": "67853.45" - }, - "TTD": { - "avg_12h": "58619.24", - "volume_btc": "0.16048185", - "avg_24h": "73729.08", - "rates": { - "last": "58619.24" - } - }, - "BWP": { - "volume_btc": "0.04654223", - "avg_24h": "107429.32", - "rates": { - "last": "107429.32" - } - }, - "OMR": { - "volume_btc": "0.01492234", - "avg_24h": "3350.68", - "rates": { - "last": "3350.68" - } - }, - "AUD": { - "avg_12h": "12277.45", - "volume_btc": "13.09770688", - "avg_24h": "12128.46", - "avg_1h": "12108.70", - "rates": { - "last": "11641.01" - }, - "avg_6h": "12253.63" - }, - "CHF": { - "avg_12h": "7818.23", - "volume_btc": "0.72358711", - "avg_24h": "8291.80", - "avg_1h": "7800.76", - "rates": { - "last": "7800.76" - }, - "avg_6h": "7800.76" - }, - "IRR": { - "avg_12h": "1114656387.13", - "volume_btc": "1.80755109", - "avg_24h": "1086115901.27", - "rates": { - "last": "1093155904.81" - }, - "avg_6h": "1093155904.81" - }, - "JOD": { - "avg_12h": "6408.70", - "volume_btc": "0.01560379", - "avg_24h": "6408.70", - "rates": { - "last": "6408.70" - } - }, - "KRW": { - "avg_12h": "10521366.18", - "volume_btc": "0.66149015", - "avg_24h": "10241401.49", - "avg_1h": "10484782.42", - "rates": { - "last": "10448609.25" - }, - "avg_6h": "10511052.91" - }, - "CNY": { - "avg_12h": "57135.62", - "volume_btc": "76.07019214", - "avg_24h": "57038.10", - "avg_1h": "57867.84", - "rates": { - "last": "58069.13" - }, - "avg_6h": "57003.97" - }, - "BYN": { - "avg_12h": "17747.08", - "volume_btc": "5.35404022", - "avg_24h": "17605.81", - "avg_1h": "17717.32", - "rates": { - "last": "17517.74" - }, - "avg_6h": "17886.64" - }, - "BDT": { - "volume_btc": "0.05384503", - "avg_24h": "759587.28", - "rates": { - "last": "761916.37" - } - }, - "PAB": { - "avg_12h": "8325.37", - "volume_btc": "10.00787138", - "avg_24h": "8290.60", - "rates": { - "last": "9050.00" - }, - "avg_6h": "8301.55" - }, - "HRK": { - "avg_12h": "49999.80", - "volume_btc": "0.15555978", - "avg_24h": "55059.22", - "rates": { - "last": "49999.80" - } - }, - "NZD": { - "avg_12h": "12810.86", - "volume_btc": "2.47636431", - "avg_24h": "12794.70", - "avg_1h": "13146.12", - "rates": { - "last": "13126.00" - }, - "avg_6h": "12761.27" - }, - "UYU": { - "avg_12h": "322604.75", - "volume_btc": "0.12983623", - "avg_24h": "318832.42", - "rates": { - "last": "324518.87" - } - }, - "DOP": { - "avg_12h": "420879.60", - "volume_btc": "3.19533678", - "avg_24h": "417549.81", - "rates": { - "last": "425721.21" - }, - "avg_6h": "426208.10" - }, - "CLP": { - "avg_12h": "5819221.14", - "volume_btc": "4.28572068", - "avg_24h": "5814758.27", - "rates": { - "last": "6119335.79" - }, - "avg_6h": "5846384.78" - }, - "THB": { - "avg_12h": "259567.58", - "volume_btc": "7.37083947", - "avg_24h": "258321.79", - "avg_1h": "262775.63", - "rates": { - "last": "266794.22" - }, - "avg_6h": "260131.35" - }, - "XAF": { - "volume_btc": "0.02868090", - "avg_24h": "4826286.14", - "rates": { - "last": "5611300.00" - } - }, - "EUR": { - "avg_12h": "7412.86", - "volume_btc": "76.17180176", - "avg_24h": "7287.46", - "avg_1h": "7382.68", - "rates": { - "last": "7397.11" - }, - "avg_6h": "7456.86" - }, - "TRY": { - "avg_12h": "47907.50", - "volume_btc": "1.02053262", - "avg_24h": "47153.18", - "rates": { - "last": "62899.91" - } - }, - "ARS": { - "avg_12h": "382366.90", - "volume_btc": "4.92769759", - "avg_24h": "380152.45", - "rates": { - "last": "365500.00" - }, - "avg_6h": "384722.46" - }, - "ILS": { - "avg_12h": "31194.83", - "volume_btc": "0.10562972", - "avg_24h": "30071.17", - "rates": { - "last": "31194.83" - } - }, - "RWF": { - "avg_12h": "7673007.07", - "volume_btc": "0.08569526", - "avg_24h": "7510809.81", - "rates": { - "last": "7748214.04" - } - }, - "KZT": { - "avg_12h": "3301025.25", - "volume_btc": "2.59196053", - "avg_24h": "3297043.02", - "avg_1h": "3356280.87", - "rates": { - "last": "3384713.28" - }, - "avg_6h": "3350564.14" - }, - "NOK": { - "avg_12h": "79420.45", - "volume_btc": "4.09546929", - "avg_24h": "78398.04", - "avg_1h": "79396.38", - "rates": { - "last": "79396.38" - }, - "avg_6h": "79417.99" - }, - "RUB": { - "avg_12h": "548638.43", - "volume_btc": "302.23941176", - "avg_24h": "543679.83", - "avg_1h": "543842.57", - "rates": { - "last": "563329.00" - }, - "avg_6h": "547455.94" - }, - "KES": { - "avg_12h": "826764.39", - "volume_btc": "8.09195505", - "avg_24h": "818332.89", - "avg_1h": "820436.51", - "rates": { - "last": "810682.85" - }, - "avg_6h": "826962.52" - }, - "KWD": { - "volume_btc": "0.39533718", - "avg_24h": "2605.37", - "rates": { - "last": "2737.64" - } - }, - "PEN": { - "avg_12h": "27718.82", - "volume_btc": "17.70290717", - "avg_24h": "27664.96", - "avg_1h": "28018.35", - "rates": { - "last": "27035.01" - }, - "avg_6h": "27791.63" - }, - "INR": { - "avg_12h": "585205.33", - "volume_btc": "34.16374139", - "avg_24h": "584777.59", - "avg_1h": "585045.89", - "rates": { - "last": "575000.00" - }, - "avg_6h": "585831.47" - }, - "MXN": { - "avg_12h": "157593.02", - "volume_btc": "9.59066308", - "avg_24h": "160108.13", - "avg_1h": "167000.11", - "rates": { - "last": "167000.11" - }, - "avg_6h": "162571.49" - }, - "CZK": { - "volume_btc": "0.41412138", - "avg_24h": "201936.54", - "rates": { - "last": "174537.75" - } - }, - "BRL": { - "avg_12h": "32900.90", - "volume_btc": "8.97094556", - "avg_24h": "32589.27", - "avg_1h": "33176.14", - "rates": { - "last": "33176.14" - }, - "avg_6h": "33886.68" - }, - "MAD": { - "avg_12h": "76479.19", - "volume_btc": "1.14882279", - "avg_24h": "80824.78", - "avg_1h": "74500.77", - "rates": { - "last": "74500.77" - }, - "avg_6h": "74500.77" - }, - "PLN": { - "avg_12h": "29765.85", - "volume_btc": "2.60538097", - "avg_24h": "29825.91", - "avg_1h": "33232.43", - "rates": { - "last": "28826.25" - }, - "avg_6h": "33232.43" - }, - "PHP": { - "avg_12h": "435189.26", - "volume_btc": "7.04342165", - "avg_24h": "433672.76", - "avg_1h": "421470.00", - "rates": { - "last": "508063.17" - }, - "avg_6h": "434893.31" - }, - "ZAR": { - "avg_12h": "126001.90", - "volume_btc": "20.14267295", - "avg_24h": "125704.49", - "avg_1h": "128216.45", - "rates": { - "last": "124066.59" - }, - "avg_6h": "127185.17" - }, - "JMD": { - "volume_btc": "0.00976113", - "avg_24h": "1690378.06", - "rates": { - "last": "1690378.06" - } - } - }, - "queryString": "", - "bodyParams": "\u003cnil\u003e", - "headers": {} - } - ] - }, - "/bitcoincharts/AUD/orderbook.json": { - "GET": [ - { - "data": { - "asks": [ - [ - "14400.00", - "0.77" - ], - [ - "15900.00", - "0.85" - ], - [ - "45200.00", - "385.00" - ], - [ - "61896.90", - "9800.00" - ], - [ - "63147.35", - "4402.63" - ], - [ - "63147.35", - "11.38" - ], - [ - "63772.57", - "7.82" - ], - [ - "63772.57", - "7.82" - ], - [ - "63835.09", - "7.17" - ], - [ - "64022.65", - "22.35" - ], - [ - "64085.18", - "100.00" - ], - [ - "64085.18", - "1018.37" - ], - [ - "64116.44", - "200.00" - ], - [ - "64210.22", - "1.23" - ], - [ - "64397.79", - "3.50" - ], - [ - "64397.79", - "138.55" - ], - [ - "64397.79", - "138.55" - ], - [ - "64397.79", - "0.77" - ], - [ - "64397.79", - "1287.95" - ], - [ - "64397.79", - "6879.09" - ], - [ - "64397.79", - "0.37" - ], - [ - "64772.92", - "3889.05" - ], - [ - "64897.96", - "500.00" - ], - [ - "65011.26", - "47154.43" - ], - [ - "65016.76", - "47158.42" - ], - [ - "65022.96", - "47162.92" - ], - [ - "65023.01", - "500.00" - ], - [ - "65023.01", - "600.00" - ], - [ - "65023.01", - "1033.28" - ], - [ - "65023.01", - "1033.28" - ], - [ - "65023.01", - "20000.00" - ], - [ - "65178.97", - "2000.00" - ], - [ - "65178.97", - "10000.00" - ], - [ - "65178.97", - "30000.00" - ], - [ - "65273.10", - "100.00" - ], - [ - "65648.23", - "50.00" - ], - [ - "65648.23", - "500.00" - ], - [ - "65648.23", - "500.00" - ], - [ - "65648.23", - "656.48" - ], - [ - "65648.23", - "3216.97" - ], - [ - "65648.26", - "3500.00" - ], - [ - "65808.72", - "30000.00" - ], - [ - "65808.72", - "2000.00" - ], - [ - "65808.72", - "9999.00" - ], - [ - "65808.72", - "10000.00" - ], - [ - "65898.35", - "2999.00" - ], - [ - "65960.84", - "1319.21" - ], - [ - "65960.84", - "1000.00" - ], - [ - "65960.84", - "9000.00" - ], - [ - "66200.00", - "7944.00" - ], - [ - "66273.45", - "500.00" - ], - [ - "66273.45", - "11.38" - ], - [ - "66273.45", - "650.00" - ], - [ - "66523.57", - "1999.00" - ], - [ - "66586.06", - "2000.00" - ], - [ - "66586.06", - "18.95" - ], - [ - "66598.57", - "1000.00" - ], - [ - "66733.00", - "2000.00" - ], - [ - "66733.50", - "5000.00" - ], - [ - "66898.00", - "3000.00" - ], - [ - "66898.00", - "3000.00" - ], - [ - "66898.00", - "3344.90" - ], - [ - "66898.00", - "3000.00" - ], - [ - "66898.67", - "500.00" - ], - [ - "66898.67", - "13379.73" - ], - [ - "66898.67", - "100.00" - ], - [ - "67148.79", - "999.00" - ], - [ - "67523.89", - "20.00" - ], - [ - "67523.89", - "500.00" - ], - [ - "67980.86", - "9469.23" - ], - [ - "67980.86", - "9469.23" - ], - [ - "67980.86", - "9469.23" - ], - [ - "67980.86", - "9469.23" - ], - [ - "67980.86", - "9469.23" - ], - [ - "68074.09", - "500.00" - ], - [ - "68080.34", - "500.00" - ], - [ - "68149.00", - "3000.00" - ], - [ - "68149.00", - "3407.45" - ], - [ - "68149.12", - "1111.00" - ], - [ - "68149.12", - "5000.00" - ], - [ - "68604.53", - "500.00" - ], - [ - "68604.53", - "1000.00" - ], - [ - "68604.53", - "500.00" - ], - [ - "68774.34", - "49883.90" - ], - [ - "68774.34", - "687.74" - ], - [ - "68774.34", - "7000.00" - ], - [ - "68774.34", - "14.05" - ], - [ - "68774.34", - "1179.41" - ], - [ - "68774.34", - "5000.00" - ], - [ - "68774.34", - "0.69" - ], - [ - "68774.34", - "144.47" - ], - [ - "68774.34", - "250.00" - ], - [ - "69399.56", - "1.04" - ], - [ - "69399.56", - "0.69" - ], - [ - "70024.78", - "4789.48" - ], - [ - "70024.78", - "3000.00" - ], - [ - "70024.78", - "15000.00" - ], - [ - "70024.78", - "200.00" - ], - [ - "70024.78", - "100.00" - ], - [ - "70024.78", - "2.74" - ], - [ - "70650.00", - "300.00" - ], - [ - "70962.61", - "5000.00" - ], - [ - "71275.22", - "1500.00" - ], - [ - "71722.92", - "1000.00" - ], - [ - "71887.94", - "237.00" - ], - [ - "71900.44", - "1003.59" - ], - [ - "71900.44", - "4.67" - ], - [ - "72213.05", - "4500.00" - ], - [ - "72463.14", - "500.00" - ], - [ - "72525.66", - "1500.00" - ], - [ - "73025.84", - "33.15" - ], - [ - "73150.88", - "731.50" - ], - [ - "73150.88", - "0.73" - ], - [ - "73776.11", - "91.55" - ], - [ - "73776.11", - "1036.85" - ], - [ - "73776.11", - "317.55" - ], - [ - "73776.11", - "0.02" - ], - [ - "73776.11", - "1036.85" - ], - [ - "73776.11", - "317.55" - ], - [ - "74401.33", - "9.23" - ], - [ - "74401.33", - "0.48" - ], - [ - "74401.33", - "1300.00" - ], - [ - "74523.23", - "1000.00" - ], - [ - "74713.94", - "4.39" - ], - [ - "74828.83", - "350.00" - ], - [ - "75026.55", - "1000.00" - ], - [ - "75026.55", - "150.00" - ], - [ - "75026.55", - "1500.00" - ], - [ - "75026.55", - "50.00" - ], - [ - "75026.55", - "2000.00" - ], - [ - "75026.55", - "104.55" - ], - [ - "75026.55", - "156.69" - ], - [ - "75026.55", - "1500.00" - ], - [ - "75651.77", - "173.12" - ], - [ - "75651.77", - "133.00" - ], - [ - "75651.77", - "136.94" - ], - [ - "75651.77", - "0.64" - ], - [ - "75651.77", - "591.34" - ], - [ - "76270.74", - "34.62" - ], - [ - "76276.99", - "130.00" - ], - [ - "76276.99", - "459.42" - ], - [ - "76276.99", - "336.54" - ], - [ - "76339.51", - "119.78" - ], - [ - "76902.21", - "932.74" - ], - [ - "76902.21", - "50.00" - ], - [ - "76902.21", - "13.00" - ], - [ - "76902.21", - "254.59" - ], - [ - "76902.21", - "346.96" - ], - [ - "76902.21", - "1.77" - ], - [ - "76902.21", - "15.00" - ], - [ - "76902.21", - "1.32" - ], - [ - "77329.78", - "129.00" - ], - [ - "77527.43", - "0.02" - ], - [ - "77527.43", - "150.00" - ], - [ - "78152.65", - "0.23" - ], - [ - "78152.65", - "8.35" - ], - [ - "78152.65", - "17000.00" - ], - [ - "78152.65", - "1000.00" - ], - [ - "78152.65", - "1000.00" - ], - [ - "78152.65", - "892.37" - ], - [ - "78152.65", - "4.39" - ], - [ - "78152.65", - "500.00" - ], - [ - "78152.65", - "1284.86" - ], - [ - "78152.65", - "600.00" - ], - [ - "78152.65", - "843.34" - ], - [ - "78152.65", - "150.00" - ], - [ - "78152.65", - "3.75" - ], - [ - "78152.65", - "8.40" - ], - [ - "78152.65", - "85.47" - ], - [ - "78152.65", - "15.96" - ], - [ - "78152.65", - "11.34" - ], - [ - "78152.65", - "2000.00" - ], - [ - "78152.65", - "1284.86" - ], - [ - "78152.65", - "110.41" - ], - [ - "78152.65", - "781.52" - ], - [ - "78777.88", - "787.77" - ], - [ - "79278.05", - "502.15" - ], - [ - "79380.00", - "9.27" - ], - [ - "79403.10", - "0.08" - ], - [ - "79500.00", - "10218.59" - ], - [ - "79716.07", - "299.00" - ], - [ - "79716.07", - "299.00" - ], - [ - "79719.30", - "299.00" - ], - [ - "80028.32", - "5.89" - ], - [ - "80653.54", - "0.17" - ], - [ - "80653.54", - "4.81" - ], - [ - "81278.76", - "1614.21" - ], - [ - "81278.76", - "5763.89" - ], - [ - "81278.76", - "324.64" - ], - [ - "81278.76", - "1287.00" - ], - [ - "81278.76", - "100.00" - ], - [ - "81278.76", - "20000.00" - ], - [ - "81278.76", - "477.53" - ], - [ - "84404.87", - "367.67" - ], - [ - "84404.87", - "5985.58" - ], - [ - "84404.87", - "1500.00" - ], - [ - "85655.31", - "5000.00" - ], - [ - "86280.53", - "3152.48" - ], - [ - "86280.53", - "0.01" - ], - [ - "89000.00", - "2500.00" - ], - [ - "93783.19", - "18756.63" - ], - [ - "93783.19", - "500.00" - ], - [ - "93783.19", - "300.00" - ], - [ - "93783.19", - "700.00" - ], - [ - "93783.19", - "347.76" - ], - [ - "98159.73", - "1500.00" - ], - [ - "99000.00", - "500.00" - ], - [ - "99410.18", - "1500.00" - ], - [ - "100035.40", - "1400.00" - ], - [ - "100035.40", - "1500.00" - ], - [ - "100660.62", - "2000.00" - ], - [ - "101285.84", - "1500.00" - ], - [ - "101285.84", - "1500.00" - ], - [ - "101285.84", - "1300.00" - ], - [ - "101911.06", - "1500.00" - ], - [ - "103161.50", - "1500.00" - ], - [ - "103161.50", - "1500.00" - ], - [ - "103786.73", - "1500.00" - ], - [ - "106287.61", - "394.12" - ], - [ - "106287.61", - "3500.00" - ], - [ - "112539.82", - "500.00" - ], - [ - "162557.52", - "500.00" - ], - [ - "162557.52", - "500.00" - ] - ], - "bids": [ - [ - "88781.42", - "10000.00" - ], - [ - "87530.97", - "2000.00" - ], - [ - "87530.97", - "2000.00" - ], - [ - "87530.97", - "1747.00" - ], - [ - "84404.87", - "1895.00" - ], - [ - "84404.87", - "2000.00" - ], - [ - "81278.76", - "2500.00" - ], - [ - "81278.76", - "314738.82" - ], - [ - "81278.76", - "2000.00" - ], - [ - "80028.32", - "10000.00" - ], - [ - "78152.65", - "37565.71" - ], - [ - "78152.65", - "2000.00" - ], - [ - "75026.55", - "3000.00" - ], - [ - "75026.55", - "254434.18" - ], - [ - "75026.55", - "249512.03" - ], - [ - "75026.55", - "292377.58" - ], - [ - "75026.55", - "22635.11" - ], - [ - "68774.34", - "309390.83" - ], - [ - "65648.23", - "100000.00" - ], - [ - "64710.40", - "6000.00" - ], - [ - "64397.79", - "6000.00" - ], - [ - "63147.35", - "1200.00" - ], - [ - "63000.00", - "55000.00" - ], - [ - "62522.12", - "30555.89" - ], - [ - "62522.12", - "20000.00" - ], - [ - "62522.12", - "58.04" - ], - [ - "62522.12", - "10000.00" - ], - [ - "62310.00", - "51000.00" - ], - [ - "62119.89", - "1000.00" - ], - [ - "61896.90", - "28329.96" - ], - [ - "61646.81", - "9000.00" - ], - [ - "61584.29", - "5000.00" - ], - [ - "61584.29", - "8000.00" - ], - [ - "61584.29", - "2000.00" - ], - [ - "61500.00", - "295.00" - ], - [ - "61466.52", - "800.00" - ], - [ - "61428.01", - "30000.00" - ], - [ - "61428.01", - "30000.00" - ], - [ - "61396.73", - "10000.00" - ], - [ - "61271.68", - "1500.00" - ], - [ - "61271.68", - "2000.00" - ], - [ - "61271.68", - "10000.00" - ], - [ - "61271.68", - "50000.00" - ], - [ - "61271.68", - "50000.00" - ], - [ - "61114.60", - "30000.00" - ], - [ - "61084.12", - "1000.00" - ], - [ - "60959.07", - "178.36" - ], - [ - "60896.55", - "1400.00" - ], - [ - "60646.46", - "10000.00" - ], - [ - "60646.46", - "55000.00" - ], - [ - "60646.46", - "1500.00" - ], - [ - "60333.85", - "2000.00" - ], - [ - "60021.24", - "4000.00" - ], - [ - "60021.24", - "2000.00" - ], - [ - "60021.24", - "60000.00" - ], - [ - "60021.24", - "2000.00" - ], - [ - "60021.24", - "10000.00" - ], - [ - "60021.24", - "10000.00" - ], - [ - "60021.24", - "3000.00" - ], - [ - "60021.24", - "20000.00" - ], - [ - "59396.02", - "2000.00" - ], - [ - "59396.02", - "10000.00" - ], - [ - "59396.02", - "13497.00" - ], - [ - "59396.02", - "100000.00" - ], - [ - "59396.02", - "9500.00" - ], - [ - "59396.02", - "21000.00" - ], - [ - "59396.02", - "500.00" - ], - [ - "59396.02", - "25000.00" - ], - [ - "58833.32", - "125000.00" - ], - [ - "58770.80", - "5000.00" - ], - [ - "58770.80", - "300.00" - ], - [ - "57378.34", - "10000.00" - ], - [ - "57378.34", - "10000.00" - ], - [ - "57378.34", - "10000.00" - ], - [ - "57378.34", - "5000.00" - ], - [ - "57145.22", - "5000.00" - ], - [ - "56957.65", - "9000.00" - ], - [ - "56764.00", - "3000.00" - ], - [ - "56269.91", - "12000.00" - ], - [ - "56269.91", - "5000.00" - ], - [ - "56269.91", - "8000.00" - ], - [ - "56269.91", - "5000.00" - ], - [ - "56143.45", - "1000.00" - ], - [ - "56132.00", - "5000.00" - ], - [ - "56131.00", - "6000.00" - ], - [ - "53637.00", - "500.00" - ], - [ - "53143.81", - "200.00" - ], - [ - "53143.81", - "800.00" - ], - [ - "53143.81", - "1600.00" - ], - [ - "50017.70", - "19630.00" - ], - [ - "50017.70", - "10000.00" - ], - [ - "20000.00", - "250.00" - ] - ] - }, - "queryString": "", - "bodyParams": "", - "headers": {} - } - ] - }, - "/bitcoincharts/LTC/trades.json": { - "GET": [ - { - "data": [ - { - "amount": "0.00052397", - "date": 1598845944, - "price": "190.85", - "tid": 46128396 - }, - { - "amount": "0.00063115", - "date": 1598841630, - "price": "190.13", - "tid": 46127987 - }, - { - "amount": "0.00525956", - "date": 1598837666, - "price": "190.13", - "tid": 46127598 - }, - { - "amount": "0.00345134", - "date": 1598822322, - "price": "191.23", - "tid": 46124282 - }, - { - "amount": "0.00112679", - "date": 1598761827, - "price": "204.12", - "tid": 46107744 - }, - { - "amount": "0.00305976", - "date": 1598742240, - "price": "202.63", - "tid": 46103995 - }, - { - "amount": "0.00083897", - "date": 1598739007, - "price": "202.63", - "tid": 46102862 - }, - { - "amount": "0.00083399", - "date": 1598732906, - "price": "203.84", - "tid": 46100515 - }, - { - "amount": "0.00083897", - "date": 1598729130, - "price": "202.63", - "tid": 46099016 - }, - { - "amount": "0.00098203", - "date": 1598723053, - "price": "203.66", - "tid": 46095549 - }, - { - "amount": "0.00122754", - "date": 1598722254, - "price": "203.66", - "tid": 46095365 - }, - { - "amount": "0.00344387", - "date": 1598721074, - "price": "203.26", - "tid": 46093872 - }, - { - "amount": "0.00088635", - "date": 1598710102, - "price": "203.08", - "tid": 46087785 - }, - { - "amount": "0.00679167", - "date": 1598676510, - "price": "203.19", - "tid": 46078861 - }, - { - "amount": "0.00146944", - "date": 1598664447, - "price": "204.16", - "tid": 46077390 - }, - { - "amount": "0.00121077", - "date": 1598658577, - "price": "206.48", - "tid": 46075681 - }, - { - "amount": "0.00048421", - "date": 1598655635, - "price": "206.52", - "tid": 46074720 - }, - { - "amount": "0.00491102", - "date": 1598650728, - "price": "205.66", - "tid": 46072674 - }, - { - "amount": "0.01195770", - "date": 1598632962, - "price": "202.38", - "tid": 46062024 - }, - { - "amount": "0.01935770", - "date": 1598613396, - "price": "203.02", - "tid": 46051154 - }, - { - "amount": "0.00275835", - "date": 1598613157, - "price": "203.02", - "tid": 46050997 - }, - { - "amount": "0.01956249", - "date": 1598554886, - "price": "207.54", - "tid": 46035405 - }, - { - "amount": "0.00216826", - "date": 1598550980, - "price": "207.54", - "tid": 46033462 - }, - { - "amount": "0.00341642", - "date": 1598550508, - "price": "207.82", - "tid": 46033230 - }, - { - "amount": "0.00109040", - "date": 1598531056, - "price": "201.76", - "tid": 46021471 - }, - { - "amount": "0.00100361", - "date": 1598526626, - "price": "199.28", - "tid": 46019984 - }, - { - "amount": "0.01311132", - "date": 1598504721, - "price": "200.59", - "tid": 46015517 - }, - { - "amount": "0.00099711", - "date": 1598504536, - "price": "200.58", - "tid": 46015472 - }, - { - "amount": "0.00074779", - "date": 1598502494, - "price": "200.59", - "tid": 46015187 - }, - { - "amount": "0.00170026", - "date": 1598487882, - "price": "199.97", - "tid": 46012378 - }, - { - "amount": "0.00175026", - "date": 1598483579, - "price": "199.97", - "tid": 46011261 - }, - { - "amount": "0.00510077", - "date": 1598481177, - "price": "199.97", - "tid": 46010535 - }, - { - "amount": "0.00060009", - "date": 1598480524, - "price": "199.97", - "tid": 46010136 - }, - { - "amount": "0.00165488", - "date": 1598475867, - "price": "199.41", - "tid": 46008112 - }, - { - "amount": "0.01128329", - "date": 1598475088, - "price": "199.41", - "tid": 46008017 - }, - { - "amount": "0.00170503", - "date": 1598474953, - "price": "199.41", - "tid": 46007986 - }, - { - "amount": "0.05137294", - "date": 1598472980, - "price": "200.30", - "tid": 46007262 - }, - { - "amount": "0.00100417", - "date": 1598468514, - "price": "199.17", - "tid": 46004552 - }, - { - "amount": "0.00271125", - "date": 1598466612, - "price": "199.17", - "tid": 46003683 - }, - { - "amount": "0.00306102", - "date": 1598462048, - "price": "199.28", - "tid": 46000738 - }, - { - "amount": "0.00089829", - "date": 1598422897, - "price": "200.38", - "tid": 45985755 - }, - { - "amount": "0.00451785", - "date": 1598413473, - "price": "199.21", - "tid": 45984623 - }, - { - "amount": "0.00140852", - "date": 1598405537, - "price": "198.79", - "tid": 45983428 - }, - { - "amount": "0.00141672", - "date": 1598402904, - "price": "197.64", - "tid": 45982866 - }, - { - "amount": "0.00383819", - "date": 1598391934, - "price": "198.01", - "tid": 45979111 - }, - { - "amount": "0.00582885", - "date": 1598383105, - "price": "199.01", - "tid": 45974893 - }, - { - "amount": "0.00133402", - "date": 1598364684, - "price": "194.90", - "tid": 45962943 - }, - { - "amount": "0.00133149", - "date": 1598360109, - "price": "187.76", - "tid": 45961219 - }, - { - "amount": "0.00051398", - "date": 1598357907, - "price": "194.56", - "tid": 45960457 - }, - { - "amount": "0.02927154", - "date": 1598352392, - "price": "195.07", - "tid": 45958772 - }, - { - "amount": "0.00153799", - "date": 1598351302, - "price": "195.06", - "tid": 45958455 - }, - { - "amount": "0.00051088", - "date": 1598346253, - "price": "195.74", - "tid": 45956834 - }, - { - "amount": "0.00087701", - "date": 1598323062, - "price": "193.84", - "tid": 45953501 - }, - { - "amount": "0.00383837", - "date": 1598314449, - "price": "192.79", - "tid": 45951328 - }, - { - "amount": "0.00238564", - "date": 1598297382, - "price": "192.82", - "tid": 45942969 - }, - { - "amount": "0.00774348", - "date": 1598296397, - "price": "192.42", - "tid": 45942256 - }, - { - "amount": "0.00612245", - "date": 1598292882, - "price": "191.10", - "tid": 45940165 - }, - { - "amount": "0.00130520", - "date": 1598291565, - "price": "183.88", - "tid": 45939547 - }, - { - "amount": "0.00082919", - "date": 1598275570, - "price": "192.96", - "tid": 45930195 - }, - { - "amount": "0.01048633", - "date": 1598256310, - "price": "186.91", - "tid": 45924509 - }, - { - "amount": "0.00056541", - "date": 1598251749, - "price": "194.55", - "tid": 45923910 - }, - { - "amount": "0.05475223", - "date": 1598224842, - "price": "194.33", - "tid": 45920589 - }, - { - "amount": "0.00592722", - "date": 1598215892, - "price": "194.02", - "tid": 45918022 - }, - { - "amount": "0.00052198", - "date": 1598203782, - "price": "191.58", - "tid": 45913783 - }, - { - "amount": "0.00057087", - "date": 1598202077, - "price": "192.69", - "tid": 45913774 - }, - { - "amount": "0.00062581", - "date": 1598201376, - "price": "191.75", - "tid": 45913678 - }, - { - "amount": "0.00124465", - "date": 1598195099, - "price": "200.86", - "tid": 45910835 - }, - { - "amount": "0.00059746", - "date": 1598193137, - "price": "200.85", - "tid": 45910081 - }, - { - "amount": "0.00061862", - "date": 1598189871, - "price": "193.98", - "tid": 45908945 - }, - { - "amount": "0.00061897", - "date": 1598189890, - "price": "193.87", - "tid": 45908936 - }, - { - "amount": "0.00056707", - "date": 1598188731, - "price": "193.98", - "tid": 45908641 - }, - { - "amount": "0.00051403", - "date": 1598188710, - "price": "194.54", - "tid": 45908637 - }, - { - "amount": "0.00169213", - "date": 1598188660, - "price": "200.93", - "tid": 45908534 - }, - { - "amount": "0.00049741", - "date": 1598185211, - "price": "201.04", - "tid": 45907644 - }, - { - "amount": "0.00049278", - "date": 1598152822, - "price": "202.93", - "tid": 45902511 - }, - { - "amount": "0.00101549", - "date": 1598144293, - "price": "196.95", - "tid": 45901047 - }, - { - "amount": "0.00409795", - "date": 1598123955, - "price": "197.66", - "tid": 45894245 - }, - { - "amount": "0.00505817", - "date": 1598116655, - "price": "197.70", - "tid": 45890851 - }, - { - "amount": "0.00080675", - "date": 1598111635, - "price": "136.35", - "tid": 45888000 - }, - { - "amount": "0.00073341", - "date": 1598112086, - "price": "136.35", - "tid": 45887995 - }, - { - "amount": "0.01436520", - "date": 1598110577, - "price": "197.70", - "tid": 45887627 - }, - { - "amount": "0.00095343", - "date": 1598110659, - "price": "136.35", - "tid": 45887425 - }, - { - "amount": "0.00073341", - "date": 1598110636, - "price": "136.35", - "tid": 45887387 - }, - { - "amount": "0.00246628", - "date": 1598110313, - "price": "198.68", - "tid": 45887316 - }, - { - "amount": "0.00062883", - "date": 1598110741, - "price": "190.83", - "tid": 45887084 - }, - { - "amount": "0.00080675", - "date": 1598109617, - "price": "136.35", - "tid": 45886799 - }, - { - "amount": "0.00062762", - "date": 1598106546, - "price": "191.20", - "tid": 45885036 - }, - { - "amount": "0.00110783", - "date": 1598104409, - "price": "135.40", - "tid": 45884103 - }, - { - "amount": "0.00243358", - "date": 1598104539, - "price": "197.24", - "tid": 45883937 - }, - { - "amount": "0.00057712", - "date": 1598103600, - "price": "190.60", - "tid": 45883733 - }, - { - "amount": "0.00073855", - "date": 1598103737, - "price": "135.40", - "tid": 45883719 - }, - { - "amount": "0.00050485", - "date": 1598100497, - "price": "198.08", - "tid": 45882543 - }, - { - "amount": "0.00050241", - "date": 1598097736, - "price": "199.04", - "tid": 45881626 - }, - { - "amount": "0.01307619", - "date": 1598091010, - "price": "198.07", - "tid": 45879706 - }, - { - "amount": "0.00337226", - "date": 1598065701, - "price": "198.68", - "tid": 45875652 - }, - { - "amount": "0.00055823", - "date": 1598047243, - "price": "197.05", - "tid": 45870781 - }, - { - "amount": "0.01469470", - "date": 1598038961, - "price": "197.35", - "tid": 45866701 - }, - { - "amount": "0.00668862", - "date": 1598037246, - "price": "197.35", - "tid": 45865813 - }, - { - "amount": "0.00120998", - "date": 1598035594, - "price": "198.35", - "tid": 45865236 - }, - { - "amount": "0.00101435", - "date": 1598031013, - "price": "197.17", - "tid": 45862489 - }, - { - "amount": "0.00432900", - "date": 1598030113, - "price": "196.35", - "tid": 45861444 - }, - { - "amount": "0.00310670", - "date": 1598029524, - "price": "196.35", - "tid": 45861337 - }, - { - "amount": "0.00051065", - "date": 1598020711, - "price": "195.83", - "tid": 45855897 - }, - { - "amount": "0.00082106", - "date": 1598020439, - "price": "194.87", - "tid": 45855714 - }, - { - "amount": "0.00298339", - "date": 1598017502, - "price": "194.41", - "tid": 45854037 - }, - { - "amount": "0.00102807", - "date": 1598007991, - "price": "194.54", - "tid": 45849712 - }, - { - "amount": "0.04268420", - "date": 1597971431, - "price": "191.64", - "tid": 45842047 - }, - { - "amount": "0.00279851", - "date": 1597968855, - "price": "192.96", - "tid": 45841367 - }, - { - "amount": "0.00067190", - "date": 1597946665, - "price": "193.48", - "tid": 45831454 - }, - { - "amount": "0.00083338", - "date": 1597929752, - "price": "191.99", - "tid": 45821337 - }, - { - "amount": "0.00201908", - "date": 1597927945, - "price": "198.11", - "tid": 45820234 - }, - { - "amount": "0.00051520", - "date": 1597926141, - "price": "194.10", - "tid": 45819806 - }, - { - "amount": "0.00051578", - "date": 1597917852, - "price": "193.88", - "tid": 45817138 - }, - { - "amount": "0.00089010", - "date": 1597898301, - "price": "190.99", - "tid": 45813473 - }, - { - "amount": "0.00054445", - "date": 1597892518, - "price": "183.67", - "tid": 45812789 - }, - { - "amount": "0.03432322", - "date": 1597885623, - "price": "185.88", - "tid": 45811148 - }, - { - "amount": "0.00169274", - "date": 1597878388, - "price": "194.95", - "tid": 45809333 - }, - { - "amount": "0.01066667", - "date": 1597877093, - "price": "187.50", - "tid": 45808483 - }, - { - "amount": "0.01447072", - "date": 1597866314, - "price": "190.73", - "tid": 45804065 - }, - { - "amount": "0.01192853", - "date": 1597863915, - "price": "190.30", - "tid": 45802246 - }, - { - "amount": "0.00143332", - "date": 1597862329, - "price": "195.35", - "tid": 45801290 - }, - { - "amount": "0.00317091", - "date": 1597862501, - "price": "189.22", - "tid": 45801220 - }, - { - "amount": "0.01189092", - "date": 1597860462, - "price": "189.22", - "tid": 45800369 - }, - { - "amount": "0.00107170", - "date": 1597859423, - "price": "195.95", - "tid": 45799834 - }, - { - "amount": "0.00727584", - "date": 1597852675, - "price": "186.92", - "tid": 45795494 - }, - { - "amount": "0.00312272", - "date": 1597844903, - "price": "192.14", - "tid": 45790665 - }, - { - "amount": "0.00120148", - "date": 1597841063, - "price": "191.43", - "tid": 45789233 - }, - { - "amount": "0.00105247", - "date": 1597824875, - "price": "190.03", - "tid": 45784538 - }, - { - "amount": "0.00408274", - "date": 1597802176, - "price": "183.70", - "tid": 45781320 - }, - { - "amount": "0.01103825", - "date": 1597792071, - "price": "183.00", - "tid": 45777549 - }, - { - "amount": "0.00092896", - "date": 1597790372, - "price": "183.00", - "tid": 45777232 - }, - { - "amount": "0.00252456", - "date": 1597787510, - "price": "182.21", - "tid": 45776210 - }, - { - "amount": "0.00189210", - "date": 1597766060, - "price": "184.98", - "tid": 45763779 - }, - { - "amount": "0.00132478", - "date": 1597758122, - "price": "188.71", - "tid": 45758820 - }, - { - "amount": "0.00149214", - "date": 1597749997, - "price": "187.65", - "tid": 45755467 - }, - { - "amount": "0.00053591", - "date": 1597747337, - "price": "186.60", - "tid": 45754816 - }, - { - "amount": "0.00053245", - "date": 1597734636, - "price": "187.81", - "tid": 45751721 - }, - { - "amount": "0.00148344", - "date": 1597731493, - "price": "188.75", - "tid": 45751154 - }, - { - "amount": "0.00866710", - "date": 1597723079, - "price": "185.76", - "tid": 45750110 - }, - { - "amount": "0.00075366", - "date": 1597721290, - "price": "185.76", - "tid": 45749872 - }, - { - "amount": "0.01196237", - "date": 1597705440, - "price": "183.91", - "tid": 45746017 - }, - { - "amount": "0.00218830", - "date": 1597693580, - "price": "187.36", - "tid": 45740579 - }, - { - "amount": "0.00494517", - "date": 1597692351, - "price": "186.04", - "tid": 45739390 - }, - { - "amount": "0.00871507", - "date": 1597687152, - "price": "183.59", - "tid": 45736158 - }, - { - "amount": "0.01103173", - "date": 1597685670, - "price": "190.36", - "tid": 45735466 - }, - { - "amount": "0.00313077", - "date": 1597681626, - "price": "194.84", - "tid": 45732647 - }, - { - "amount": "0.00056792", - "date": 1597678949, - "price": "193.69", - "tid": 45730946 - }, - { - "amount": "0.00172992", - "date": 1597674458, - "price": "190.76", - "tid": 45727719 - }, - { - "amount": "0.00052927", - "date": 1597659738, - "price": "188.94", - "tid": 45722603 - }, - { - "amount": "0.01648939", - "date": 1597612764, - "price": "196.49", - "tid": 45714736 - }, - { - "amount": "0.00496367", - "date": 1597608721, - "price": "195.42", - "tid": 45713667 - }, - { - "amount": "0.00081745", - "date": 1597606218, - "price": "195.73", - "tid": 45712784 - }, - { - "amount": "0.00930425", - "date": 1597604433, - "price": "193.46", - "tid": 45711721 - }, - { - "amount": "0.00092946", - "date": 1597599544, - "price": "193.66", - "tid": 45710090 - }, - { - "amount": "0.00051422", - "date": 1597596379, - "price": "194.47", - "tid": 45708981 - }, - { - "amount": "0.00082039", - "date": 1597594452, - "price": "195.03", - "tid": 45707778 - }, - { - "amount": "0.00086988", - "date": 1597592785, - "price": "195.43", - "tid": 45707221 - }, - { - "amount": "0.00597317", - "date": 1597584040, - "price": "197.55", - "tid": 45703506 - }, - { - "amount": "0.01534684", - "date": 1597574284, - "price": "195.48", - "tid": 45700940 - }, - { - "amount": "0.00051049", - "date": 1597563377, - "price": "195.89", - "tid": 45698739 - }, - { - "amount": "0.00051343", - "date": 1597545512, - "price": "194.77", - "tid": 45696675 - }, - { - "amount": "0.00126243", - "date": 1597541798, - "price": "198.03", - "tid": 45696116 - }, - { - "amount": "0.00066425", - "date": 1597537958, - "price": "195.71", - "tid": 45695205 - }, - { - "amount": "0.00239354", - "date": 1597524023, - "price": "200.54", - "tid": 45690365 - }, - { - "amount": "0.03961585", - "date": 1597522558, - "price": "199.92", - "tid": 45689827 - }, - { - "amount": "0.00946904", - "date": 1597519466, - "price": "201.71", - "tid": 45688166 - }, - { - "amount": "0.00268577", - "date": 1597512002, - "price": "201.06", - "tid": 45684204 - }, - { - "amount": "0.00252826", - "date": 1597497797, - "price": "209.63", - "tid": 45675651 - }, - { - "amount": "0.00047279", - "date": 1597491736, - "price": "211.51", - "tid": 45673557 - }, - { - "amount": "0.00155947", - "date": 1597480151, - "price": "211.61", - "tid": 45670308 - }, - { - "amount": "0.00741987", - "date": 1597470836, - "price": "202.16", - "tid": 45668635 - }, - { - "amount": "0.00198488", - "date": 1597470143, - "price": "211.60", - "tid": 45668527 - }, - { - "amount": "0.00490388", - "date": 1597470053, - "price": "203.92", - "tid": 45668523 - }, - { - "amount": "0.00987313", - "date": 1597470201, - "price": "202.57", - "tid": 45668482 - }, - { - "amount": "0.00118226", - "date": 1597444490, - "price": "211.46", - "tid": 45662886 - }, - { - "amount": "0.01676960", - "date": 1597444775, - "price": "210.50", - "tid": 45662863 - }, - { - "amount": "0.00231722", - "date": 1597442640, - "price": "211.46", - "tid": 45661754 - }, - { - "amount": "0.01040386", - "date": 1597440711, - "price": "211.46", - "tid": 45661164 - }, - { - "amount": "0.00203637", - "date": 1597440496, - "price": "211.16", - "tid": 45660780 - }, - { - "amount": "0.01477323", - "date": 1597439081, - "price": "203.07", - "tid": 45660308 - }, - { - "amount": "0.01023350", - "date": 1597436272, - "price": "208.14", - "tid": 45658692 - }, - { - "amount": "0.00147654", - "date": 1597431375, - "price": "209.95", - "tid": 45656166 - }, - { - "amount": "0.00081309", - "date": 1597431004, - "price": "209.08", - "tid": 45655828 - }, - { - "amount": "0.00172068", - "date": 1597429448, - "price": "209.22", - "tid": 45654726 - }, - { - "amount": "0.00113830", - "date": 1597419865, - "price": "210.84", - "tid": 45647988 - }, - { - "amount": "0.00476440", - "date": 1597409359, - "price": "209.89", - "tid": 45641492 - }, - { - "amount": "0.00094197", - "date": 1597406771, - "price": "212.32", - "tid": 45640497 - }, - { - "amount": "0.00049000", - "date": 1597406550, - "price": "204.08", - "tid": 45640465 - }, - { - "amount": "0.00046871", - "date": 1597403534, - "price": "213.35", - "tid": 45639376 - }, - { - "amount": "0.00047188", - "date": 1597396480, - "price": "211.92", - "tid": 45637426 - }, - { - "amount": "0.00056630", - "date": 1597380144, - "price": "211.90", - "tid": 45634109 - }, - { - "amount": "0.02154806", - "date": 1597374913, - "price": "211.62", - "tid": 45633471 - }, - { - "amount": "0.00623760", - "date": 1597374595, - "price": "211.62", - "tid": 45633409 - }, - { - "amount": "0.00950119", - "date": 1597373462, - "price": "210.50", - "tid": 45633187 - }, - { - "amount": "0.01867871", - "date": 1597364780, - "price": "210.40", - "tid": 45631234 - }, - { - "amount": "0.00385678", - "date": 1597362858, - "price": "210.02", - "tid": 45630691 - }, - { - "amount": "0.00765400", - "date": 1597350070, - "price": "216.88", - "tid": 45625328 - }, - { - "amount": "0.00083045", - "date": 1597345810, - "price": "216.75", - "tid": 45622967 - }, - { - "amount": "0.04624438", - "date": 1597342564, - "price": "215.81", - "tid": 45621219 - }, - { - "amount": "0.00170806", - "date": 1597324614, - "price": "216.62", - "tid": 45610105 - }, - { - "amount": "0.00045496", - "date": 1597312702, - "price": "219.80", - "tid": 45605694 - }, - { - "amount": "0.00045506", - "date": 1597308735, - "price": "219.75", - "tid": 45604761 - }, - { - "amount": "0.00316137", - "date": 1597306299, - "price": "208.77", - "tid": 45604097 - }, - { - "amount": "0.00304512", - "date": 1597306222, - "price": "216.74", - "tid": 45603947 - }, - { - "amount": "0.00506576", - "date": 1597295367, - "price": "215.17", - "tid": 45602439 - }, - { - "amount": "0.00417053", - "date": 1597291670, - "price": "215.80", - "tid": 45602038 - }, - { - "amount": "0.00411843", - "date": 1597289170, - "price": "218.53", - "tid": 45601734 - }, - { - "amount": "0.00279499", - "date": 1597268198, - "price": "214.67", - "tid": 45595400 - }, - { - "amount": "0.00621524", - "date": 1597250720, - "price": "213.99", - "tid": 45585519 - }, - { - "amount": "0.00046637", - "date": 1597239179, - "price": "214.42", - "tid": 45578230 - }, - { - "amount": "0.00070021", - "date": 1597198058, - "price": "214.22", - "tid": 45569003 - }, - { - "amount": "0.00284223", - "date": 1597191548, - "price": "214.62", - "tid": 45567431 - }, - { - "amount": "0.00663272", - "date": 1597186899, - "price": "214.09", - "tid": 45565792 - }, - { - "amount": "0.00115290", - "date": 1597180838, - "price": "208.17", - "tid": 45563418 - }, - { - "amount": "0.00228811", - "date": 1597172564, - "price": "209.78", - "tid": 45558772 - }, - { - "amount": "0.00048828", - "date": 1597165039, - "price": "204.80", - "tid": 45554891 - }, - { - "amount": "0.03370787", - "date": 1597160107, - "price": "201.14", - "tid": 45551231 - }, - { - "amount": "0.00474518", - "date": 1597155791, - "price": "210.74", - "tid": 45548683 - }, - { - "amount": "0.01219512", - "date": 1597150599, - "price": "207.46", - "tid": 45546231 - }, - { - "amount": "0.00097177", - "date": 1597113035, - "price": "205.81", - "tid": 45538457 - }, - { - "amount": "0.01442354", - "date": 1597111088, - "price": "207.30", - "tid": 45537923 - }, - { - "amount": "0.00404644", - "date": 1597107731, - "price": "207.59", - "tid": 45537230 - }, - { - "amount": "0.00520521", - "date": 1597094458, - "price": "199.80", - "tid": 45531500 - }, - { - "amount": "0.00140866", - "date": 1597092640, - "price": "205.87", - "tid": 45530686 - }, - { - "amount": "0.00329346", - "date": 1597091218, - "price": "206.47", - "tid": 45529806 - }, - { - "amount": "0.00247009", - "date": 1597088172, - "price": "206.47", - "tid": 45528192 - }, - { - "amount": "0.00668409", - "date": 1597086946, - "price": "198.98", - "tid": 45526982 - }, - { - "amount": "0.00119281", - "date": 1597074779, - "price": "209.59", - "tid": 45519494 - }, - { - "amount": "0.00607557", - "date": 1597074476, - "price": "202.45", - "tid": 45518965 - }, - { - "amount": "0.00052526", - "date": 1597072735, - "price": "209.42", - "tid": 45517853 - }, - { - "amount": "0.00048121", - "date": 1596998724, - "price": "207.81", - "tid": 45498950 - }, - { - "amount": "0.00197648", - "date": 1596993895, - "price": "207.44", - "tid": 45496950 - }, - { - "amount": "0.00086393", - "date": 1596985948, - "price": "208.35", - "tid": 45493595 - }, - { - "amount": "0.00920186", - "date": 1596985039, - "price": "206.48", - "tid": 45493105 - }, - { - "amount": "0.00629601", - "date": 1596984164, - "price": "206.48", - "tid": 45492852 - }, - { - "amount": "0.01200884", - "date": 1596963647, - "price": "199.02", - "tid": 45487614 - }, - { - "amount": "0.00097059", - "date": 1596945372, - "price": "206.06", - "tid": 45485307 - }, - { - "amount": "0.00189855", - "date": 1596938177, - "price": "205.42", - "tid": 45484427 - }, - { - "amount": "0.00587807", - "date": 1596915685, - "price": "205.85", - "tid": 45477272 - }, - { - "amount": "0.00121330", - "date": 1596908811, - "price": "206.05", - "tid": 45474003 - }, - { - "amount": "0.00275629", - "date": 1596890956, - "price": "206.80", - "tid": 45463942 - }, - { - "amount": "0.00082205", - "date": 1596889102, - "price": "206.80", - "tid": 45463400 - }, - { - "amount": "0.00625188", - "date": 1596864530, - "price": "199.94", - "tid": 45457863 - }, - { - "amount": "0.02944153", - "date": 1596851219, - "price": "207.53", - "tid": 45456205 - }, - { - "amount": "0.00923541", - "date": 1596840883, - "price": "205.73", - "tid": 45452967 - }, - { - "amount": "0.00301205", - "date": 1596833079, - "price": "205.84", - "tid": 45449093 - }, - { - "amount": "0.00571595", - "date": 1596827498, - "price": "206.44", - "tid": 45445598 - }, - { - "amount": "0.00148559", - "date": 1596820928, - "price": "201.94", - "tid": 45441884 - }, - { - "amount": "0.00054827", - "date": 1596804735, - "price": "200.63", - "tid": 45431733 - }, - { - "amount": "0.00084835", - "date": 1596803180, - "price": "200.39", - "tid": 45430908 - }, - { - "amount": "0.00055152", - "date": 1596793708, - "price": "199.45", - "tid": 45427807 - }, - { - "amount": "0.02391541", - "date": 1596778582, - "price": "202.38", - "tid": 45424567 - }, - { - "amount": "0.00509548", - "date": 1596766243, - "price": "194.29", - "tid": 45422584 - }, - { - "amount": "0.00982801", - "date": 1596761549, - "price": "203.50", - "tid": 45421482 - }, - { - "amount": "0.01500552", - "date": 1596740922, - "price": "199.26", - "tid": 45411407 - }, - { - "amount": "0.00162506", - "date": 1596727073, - "price": "203.07", - "tid": 45402795 - }, - { - "amount": "0.00054009", - "date": 1596723275, - "price": "203.67", - "tid": 45400177 - }, - { - "amount": "0.00054009", - "date": 1596722666, - "price": "203.67", - "tid": 45399977 - }, - { - "amount": "0.00267718", - "date": 1596716487, - "price": "205.44", - "tid": 45396911 - }, - { - "amount": "0.00137633", - "date": 1596686442, - "price": "203.44", - "tid": 45390233 - }, - { - "amount": "0.00049155", - "date": 1596681491, - "price": "203.44", - "tid": 45389544 - }, - { - "amount": "0.00098722", - "date": 1596675192, - "price": "202.59", - "tid": 45387960 - }, - { - "amount": "0.00049215", - "date": 1596673450, - "price": "203.19", - "tid": 45387510 - }, - { - "amount": "0.00049478", - "date": 1596645835, - "price": "202.11", - "tid": 45371874 - }, - { - "amount": "0.00298070", - "date": 1596618261, - "price": "197.94", - "tid": 45359406 - }, - { - "amount": "0.00050138", - "date": 1596601220, - "price": "199.45", - "tid": 45356417 - }, - { - "amount": "0.06778977", - "date": 1596595278, - "price": "198.26", - "tid": 45355658 - }, - { - "amount": "0.00332594", - "date": 1596590429, - "price": "198.44", - "tid": 45354575 - }, - { - "amount": "0.04085150", - "date": 1596557664, - "price": "197.30", - "tid": 45337014 - }, - { - "amount": "0.00354072", - "date": 1596551298, - "price": "197.70", - "tid": 45333833 - }, - { - "amount": "0.02074059", - "date": 1596549337, - "price": "197.68", - "tid": 45332776 - }, - { - "amount": "0.00354108", - "date": 1596548586, - "price": "197.68", - "tid": 45332293 - }, - { - "amount": "0.00101569", - "date": 1596499945, - "price": "196.91", - "tid": 45320337 - }, - { - "amount": "0.01042844", - "date": 1596485020, - "price": "194.66", - "tid": 45313437 - }, - { - "amount": "0.00703791", - "date": 1596484240, - "price": "194.66", - "tid": 45312814 - }, - { - "amount": "0.00568091", - "date": 1596481057, - "price": "188.35", - "tid": 45310634 - }, - { - "amount": "0.01023332", - "date": 1596466975, - "price": "195.44", - "tid": 45300559 - }, - { - "amount": "0.00122499", - "date": 1596466394, - "price": "195.92", - "tid": 45300243 - }, - { - "amount": "0.00050375", - "date": 1596451211, - "price": "198.51", - "tid": 45293889 - }, - { - "amount": "0.00131652", - "date": 1596423520, - "price": "197.49", - "tid": 45289361 - }, - { - "amount": "0.00318118", - "date": 1596417667, - "price": "198.04", - "tid": 45288681 - }, - { - "amount": "0.01002414", - "date": 1596402620, - "price": "190.54", - "tid": 45285329 - }, - { - "amount": "0.00303582", - "date": 1596399987, - "price": "197.64", - "tid": 45284517 - }, - { - "amount": "0.00707929", - "date": 1596398709, - "price": "197.76", - "tid": 45283970 - }, - { - "amount": "0.00281464", - "date": 1596381191, - "price": "198.96", - "tid": 45276577 - }, - { - "amount": "0.00049980", - "date": 1596372985, - "price": "200.08", - "tid": 45273549 - }, - { - "amount": "0.00286856", - "date": 1596321390, - "price": "195.22", - "tid": 45262618 - }, - { - "amount": "0.00204803", - "date": 1596310690, - "price": "195.31", - "tid": 45257977 - }, - { - "amount": "0.00254505", - "date": 1596309990, - "price": "196.46", - "tid": 45257642 - }, - { - "amount": "0.00508053", - "date": 1596302910, - "price": "196.83", - "tid": 45253522 - }, - { - "amount": "0.00333165", - "date": 1596300696, - "price": "198.10", - "tid": 45252457 - }, - { - "amount": "0.00501479", - "date": 1596297656, - "price": "199.41", - "tid": 45250042 - }, - { - "amount": "0.00250777", - "date": 1596296615, - "price": "199.38", - "tid": 45249476 - }, - { - "amount": "0.00215712", - "date": 1596296023, - "price": "199.34", - "tid": 45249181 - }, - { - "amount": "0.00135556", - "date": 1596294913, - "price": "199.18", - "tid": 45248025 - }, - { - "amount": "0.00481879", - "date": 1596293175, - "price": "199.22", - "tid": 45247171 - }, - { - "amount": "0.00151141", - "date": 1596289940, - "price": "198.49", - "tid": 45245115 - }, - { - "amount": "0.00252411", - "date": 1596285457, - "price": "198.09", - "tid": 45243578 - }, - { - "amount": "0.00100432", - "date": 1596277463, - "price": "199.14", - "tid": 45242035 - }, - { - "amount": "0.00226586", - "date": 1596264491, - "price": "198.60", - "tid": 45239855 - }, - { - "amount": "0.00086015", - "date": 1596249284, - "price": "197.64", - "tid": 45237764 - }, - { - "amount": "0.00136240", - "date": 1596232650, - "price": "198.18", - "tid": 45232280 - }, - { - "amount": "0.01749404", - "date": 1596223145, - "price": "197.21", - "tid": 45226857 - }, - { - "amount": "0.00761963", - "date": 1596219413, - "price": "196.86", - "tid": 45224402 - }, - { - "amount": "0.00895432", - "date": 1596211831, - "price": "197.67", - "tid": 45218997 - }, - { - "amount": "0.00510334", - "date": 1596208659, - "price": "195.95", - "tid": 45216704 - }, - { - "amount": "0.00304847", - "date": 1596208375, - "price": "196.82", - "tid": 45216274 - }, - { - "amount": "0.00147283", - "date": 1596207316, - "price": "196.90", - "tid": 45215936 - }, - { - "amount": "0.00222988", - "date": 1596202939, - "price": "197.32", - "tid": 45212861 - }, - { - "amount": "0.00095473", - "date": 1596202277, - "price": "199.01", - "tid": 45212510 - }, - { - "amount": "0.00366356", - "date": 1596197069, - "price": "199.26", - "tid": 45210334 - }, - { - "amount": "0.00050777", - "date": 1596151768, - "price": "196.94", - "tid": 45199387 - }, - { - "amount": "0.00507434", - "date": 1596149544, - "price": "197.07", - "tid": 45198612 - }, - { - "amount": "0.00520888", - "date": 1596142404, - "price": "191.98", - "tid": 45195382 - }, - { - "amount": "0.00452102", - "date": 1596135265, - "price": "199.07", - "tid": 45192085 - }, - { - "amount": "0.03659214", - "date": 1596134184, - "price": "198.13", - "tid": 45190983 - }, - { - "amount": "0.00183580", - "date": 1596120639, - "price": "196.10", - "tid": 45182860 - }, - { - "amount": "0.00048955", - "date": 1596086054, - "price": "204.27", - "tid": 45172233 - }, - { - "amount": "0.00131797", - "date": 1596067811, - "price": "204.86", - "tid": 45168535 - }, - { - "amount": "0.00063322", - "date": 1596053774, - "price": "205.30", - "tid": 45162797 - }, - { - "amount": "0.00165611", - "date": 1596052704, - "price": "205.30", - "tid": 45162333 - }, - { - "amount": "0.01319003", - "date": 1596052123, - "price": "204.70", - "tid": 45161960 - }, - { - "amount": "0.00161409", - "date": 1596038652, - "price": "204.45", - "tid": 45153789 - }, - { - "amount": "0.00261767", - "date": 1596030850, - "price": "202.47", - "tid": 45148761 - }, - { - "amount": "0.00110143", - "date": 1595991503, - "price": "199.74", - "tid": 45138809 - }, - { - "amount": "0.00160417", - "date": 1595973134, - "price": "199.48", - "tid": 45133620 - }, - { - "amount": "0.00601583", - "date": 1595968243, - "price": "189.50", - "tid": 45131384 - }, - { - "amount": "0.00526122", - "date": 1595967275, - "price": "190.07", - "tid": 45130687 - }, - { - "amount": "0.00242884", - "date": 1595946519, - "price": "205.86", - "tid": 45118468 - }, - { - "amount": "0.00339469", - "date": 1595945169, - "price": "209.15", - "tid": 45117489 - }, - { - "amount": "0.00052887", - "date": 1595934506, - "price": "207.99", - "tid": 45113388 - }, - { - "amount": "0.00048163", - "date": 1595908965, - "price": "207.63", - "tid": 45107904 - }, - { - "amount": "0.00123551", - "date": 1595901923, - "price": "210.44", - "tid": 45106792 - }, - { - "amount": "0.00275862", - "date": 1595885670, - "price": "203.00", - "tid": 45100767 - }, - { - "amount": "0.00721326", - "date": 1595873323, - "price": "223.20", - "tid": 45092783 - }, - { - "amount": "0.00318211", - "date": 1595866871, - "price": "219.98", - "tid": 45088729 - }, - { - "amount": "0.00200027", - "date": 1595865943, - "price": "219.97", - "tid": 45088372 - }, - { - "amount": "0.00101565", - "date": 1595860947, - "price": "216.61", - "tid": 45084821 - }, - { - "amount": "0.00050783", - "date": 1595860417, - "price": "216.61", - "tid": 45084477 - }, - { - "amount": "0.00118985", - "date": 1595813457, - "price": "210.11", - "tid": 45073343 - }, - { - "amount": "0.00912540", - "date": 1595782552, - "price": "208.21", - "tid": 45063889 - }, - { - "amount": "0.00911184", - "date": 1595782726, - "price": "208.52", - "tid": 45063879 - }, - { - "amount": "0.01343913", - "date": 1595781787, - "price": "201.65", - "tid": 45063731 - }, - { - "amount": "0.00082866", - "date": 1595760500, - "price": "205.15", - "tid": 45056175 - }, - { - "amount": "0.00402564", - "date": 1595724022, - "price": "201.21", - "tid": 45050307 - }, - { - "amount": "0.00109116", - "date": 1595713339, - "price": "201.62", - "tid": 45047110 - }, - { - "amount": "0.02261442", - "date": 1595706010, - "price": "203.41", - "tid": 45044140 - }, - { - "amount": "0.00378509", - "date": 1595697973, - "price": "203.43", - "tid": 45040132 - }, - { - "amount": "0.00584710", - "date": 1595692467, - "price": "205.23", - "tid": 45036835 - }, - { - "amount": "0.00095265", - "date": 1595649376, - "price": "209.94", - "tid": 45024614 - }, - { - "amount": "0.00057159", - "date": 1595646987, - "price": "209.94", - "tid": 45024327 - }, - { - "amount": "0.00109659", - "date": 1595627727, - "price": "218.86", - "tid": 45018698 - }, - { - "amount": "0.00127592", - "date": 1595600777, - "price": "219.45", - "tid": 45002782 - }, - { - "amount": "0.00229040", - "date": 1595557877, - "price": "209.57", - "tid": 44990691 - }, - { - "amount": "0.00064241", - "date": 1595550471, - "price": "217.93", - "tid": 44988854 - }, - { - "amount": "0.01140088", - "date": 1595543785, - "price": "216.65", - "tid": 44986610 - }, - { - "amount": "0.00221228", - "date": 1595534024, - "price": "207.93", - "tid": 44980892 - }, - { - "amount": "0.00465658", - "date": 1595518725, - "price": "214.75", - "tid": 44970919 - }, - { - "amount": "0.00483047", - "date": 1595514357, - "price": "215.30", - "tid": 44968643 - }, - { - "amount": "0.01258958", - "date": 1595475003, - "price": "206.52", - "tid": 44959620 - }, - { - "amount": "0.01002072", - "date": 1595471519, - "price": "207.57", - "tid": 44959210 - }, - { - "amount": "0.00257587", - "date": 1595465654, - "price": "213.52", - "tid": 44957847 - }, - { - "amount": "0.00947867", - "date": 1595465246, - "price": "211.00", - "tid": 44957555 - }, - { - "amount": "0.00047402", - "date": 1595463523, - "price": "210.96", - "tid": 44957176 - }, - { - "amount": "0.02236510", - "date": 1595455093, - "price": "217.75", - "tid": 44953988 - }, - { - "amount": "0.00132662", - "date": 1595453653, - "price": "218.60", - "tid": 44953756 - }, - { - "amount": "0.00170178", - "date": 1595451029, - "price": "217.42", - "tid": 44952385 - }, - { - "amount": "0.00460978", - "date": 1595433874, - "price": "216.93", - "tid": 44943458 - }, - { - "amount": "0.00046098", - "date": 1595434139, - "price": "216.93", - "tid": 44943396 - }, - { - "amount": "0.00275659", - "date": 1595425795, - "price": "217.66", - "tid": 44938692 - }, - { - "amount": "0.00118765", - "date": 1595424883, - "price": "210.50", - "tid": 44938087 - }, - { - "amount": "0.00133235", - "date": 1595420796, - "price": "217.66", - "tid": 44936388 - }, - { - "amount": "0.00057709", - "date": 1595417100, - "price": "225.27", - "tid": 44935150 - }, - { - "amount": "0.00188212", - "date": 1595389095, - "price": "217.84", - "tid": 44929556 - }, - { - "amount": "0.00686499", - "date": 1595375491, - "price": "218.50", - "tid": 44926395 - }, - { - "amount": "0.01230853", - "date": 1595360031, - "price": "219.36", - "tid": 44920326 - }, - { - "amount": "0.00085559", - "date": 1595354204, - "price": "210.38", - "tid": 44916821 - }, - { - "amount": "0.00115001", - "date": 1595333293, - "price": "217.39", - "tid": 44905116 - }, - { - "amount": "0.00158824", - "date": 1595308428, - "price": "220.37", - "tid": 44899323 - }, - { - "amount": "0.00266486", - "date": 1595292754, - "price": "221.40", - "tid": 44896846 - }, - { - "amount": "0.00256364", - "date": 1595287347, - "price": "222.34", - "tid": 44895604 - }, - { - "amount": "0.00217441", - "date": 1595278943, - "price": "220.75", - "tid": 44892332 - }, - { - "amount": "0.00217441", - "date": 1595278845, - "price": "220.75", - "tid": 44892179 - }, - { - "amount": "0.00187389", - "date": 1595265693, - "price": "213.46", - "tid": 44884625 - }, - { - "amount": "0.00155202", - "date": 1595264565, - "price": "219.07", - "tid": 44884462 - }, - { - "amount": "0.00456475", - "date": 1595256755, - "price": "219.07", - "tid": 44879399 - }, - { - "amount": "0.00241932", - "date": 1595253820, - "price": "219.07", - "tid": 44877969 - }, - { - "amount": "0.00190667", - "date": 1595253112, - "price": "209.79", - "tid": 44877404 - }, - { - "amount": "0.00141831", - "date": 1595250863, - "price": "211.52", - "tid": 44876543 - }, - { - "amount": "0.15940112", - "date": 1595219371, - "price": "211.73", - "tid": 44869575 - }, - { - "amount": "0.00445900", - "date": 1595211376, - "price": "219.78", - "tid": 44868854 - }, - { - "amount": "0.00140456", - "date": 1595179233, - "price": "213.59", - "tid": 44860053 - }, - { - "amount": "0.00266751", - "date": 1595178479, - "price": "221.18", - "tid": 44859640 - }, - { - "amount": "0.00051872", - "date": 1595158010, - "price": "212.06", - "tid": 44852388 - }, - { - "amount": "0.04625915", - "date": 1595137081, - "price": "211.85", - "tid": 44848629 - }, - { - "amount": "0.00091000", - "date": 1595127872, - "price": "219.78", - "tid": 44847794 - }, - { - "amount": "0.00822218", - "date": 1595119902, - "price": "218.92", - "tid": 44846388 - }, - { - "amount": "0.00082162", - "date": 1595118324, - "price": "219.08", - "tid": 44845957 - }, - { - "amount": "0.02811903", - "date": 1595111655, - "price": "219.78", - "tid": 44844055 - }, - { - "amount": "0.13240195", - "date": 1595101530, - "price": "219.03", - "tid": 44839914 - }, - { - "amount": "0.00841751", - "date": 1595096417, - "price": "219.78", - "tid": 44837537 - }, - { - "amount": "0.00141924", - "date": 1595094339, - "price": "211.38", - "tid": 44836412 - }, - { - "amount": "0.02197652", - "date": 1595093877, - "price": "219.78", - "tid": 44836048 - }, - { - "amount": "0.01433251", - "date": 1595093910, - "price": "219.78", - "tid": 44835888 - }, - { - "amount": "0.01110201", - "date": 1595091496, - "price": "219.78", - "tid": 44834620 - }, - { - "amount": "0.00045614", - "date": 1595088368, - "price": "219.23", - "tid": 44832482 - }, - { - "amount": "0.06825007", - "date": 1595082734, - "price": "219.78", - "tid": 44829306 - }, - { - "amount": "0.00045500", - "date": 1595081906, - "price": "219.78", - "tid": 44828871 - }, - { - "amount": "0.04568713", - "date": 1595080787, - "price": "218.88", - "tid": 44827873 - }, - { - "amount": "0.00340925", - "date": 1595079027, - "price": "219.99", - "tid": 44827449 - }, - { - "amount": "0.00700723", - "date": 1595078417, - "price": "221.20", - "tid": 44827205 - }, - { - "amount": "0.00054304", - "date": 1595078120, - "price": "220.98", - "tid": 44827044 - }, - { - "amount": "0.00049778", - "date": 1595066737, - "price": "220.98", - "tid": 44823391 - }, - { - "amount": "0.00525347", - "date": 1595061729, - "price": "222.71", - "tid": 44822243 - }, - { - "amount": "0.00152665", - "date": 1595040852, - "price": "222.71", - "tid": 44819000 - }, - { - "amount": "0.00141563", - "date": 1595030853, - "price": "211.92", - "tid": 44816503 - }, - { - "amount": "0.01162005", - "date": 1595020816, - "price": "222.03", - "tid": 44812585 - }, - { - "amount": "0.00212930", - "date": 1595019854, - "price": "220.73", - "tid": 44812355 - }, - { - "amount": "0.00452612", - "date": 1595017473, - "price": "220.94", - "tid": 44810901 - }, - { - "amount": "0.00701548", - "date": 1595016056, - "price": "220.94", - "tid": 44810160 - }, - { - "amount": "0.00054365", - "date": 1595011841, - "price": "220.73", - "tid": 44807799 - }, - { - "amount": "0.00126852", - "date": 1595009917, - "price": "220.73", - "tid": 44806826 - }, - { - "amount": "0.00433233", - "date": 1595003107, - "price": "221.59", - "tid": 44801982 - }, - { - "amount": "0.00906084", - "date": 1594999732, - "price": "220.73", - "tid": 44799115 - }, - { - "amount": "0.00121698", - "date": 1594950270, - "price": "221.86", - "tid": 44784777 - }, - { - "amount": "0.03231768", - "date": 1594947924, - "price": "221.86", - "tid": 44784429 - }, - { - "amount": "0.00302948", - "date": 1594941121, - "price": "221.16", - "tid": 44781823 - }, - { - "amount": "0.01487425", - "date": 1594941135, - "price": "221.86", - "tid": 44781712 - }, - { - "amount": "0.01235344", - "date": 1594934832, - "price": "222.61", - "tid": 44779182 - }, - { - "amount": "0.00429864", - "date": 1594918001, - "price": "221.00", - "tid": 44769862 - }, - { - "amount": "0.00334176", - "date": 1594912092, - "price": "221.44", - "tid": 44765451 - }, - { - "amount": "0.00045126", - "date": 1594909574, - "price": "221.60", - "tid": 44764017 - }, - { - "amount": "0.00265754", - "date": 1594904494, - "price": "222.01", - "tid": 44761518 - }, - { - "amount": "0.00045104", - "date": 1594900598, - "price": "221.71", - "tid": 44759861 - }, - { - "amount": "0.00358986", - "date": 1594884991, - "price": "222.85", - "tid": 44755547 - }, - { - "amount": "0.01212037", - "date": 1594877058, - "price": "216.99", - "tid": 44754170 - }, - { - "amount": "0.00046085", - "date": 1594862487, - "price": "216.99", - "tid": 44751969 - }, - { - "amount": "0.00096828", - "date": 1594847892, - "price": "216.88", - "tid": 44746392 - }, - { - "amount": "0.00507263", - "date": 1594843067, - "price": "216.85", - "tid": 44743502 - }, - { - "amount": "0.00045975", - "date": 1594841653, - "price": "217.51", - "tid": 44743183 - }, - { - "amount": "0.02596780", - "date": 1594821864, - "price": "208.72", - "tid": 44730832 - }, - { - "amount": "0.00101852", - "date": 1594757596, - "price": "216.00", - "tid": 44710507 - }, - { - "amount": "0.01942379", - "date": 1594753391, - "price": "215.20", - "tid": 44708503 - }, - { - "amount": "0.06970260", - "date": 1594752935, - "price": "215.20", - "tid": 44707793 - }, - { - "amount": "0.06970260", - "date": 1594752772, - "price": "215.20", - "tid": 44707739 - }, - { - "amount": "0.00106358", - "date": 1594738452, - "price": "216.25", - "tid": 44698235 - }, - { - "amount": "0.00092855", - "date": 1594736057, - "price": "215.39", - "tid": 44696531 - }, - { - "amount": "0.01025546", - "date": 1594713690, - "price": "216.47", - "tid": 44688485 - }, - { - "amount": "0.00046196", - "date": 1594713498, - "price": "216.47", - "tid": 44688318 - }, - { - "amount": "0.00460358", - "date": 1594690090, - "price": "215.05", - "tid": 44686470 - }, - { - "amount": "0.00209644", - "date": 1594671448, - "price": "214.65", - "tid": 44679161 - }, - { - "amount": "0.03564131", - "date": 1594667306, - "price": "210.43", - "tid": 44676373 - }, - { - "amount": "0.00249181", - "date": 1594666097, - "price": "216.71", - "tid": 44675746 - }, - { - "amount": "0.00152156", - "date": 1594663069, - "price": "210.31", - "tid": 44674285 - }, - { - "amount": "0.00521747", - "date": 1594662573, - "price": "210.83", - "tid": 44673744 - }, - { - "amount": "0.00213280", - "date": 1594625661, - "price": "210.99", - "tid": 44657533 - }, - { - "amount": "0.00286802", - "date": 1594589183, - "price": "212.69", - "tid": 44651620 - }, - { - "amount": "0.01119667", - "date": 1594585945, - "price": "211.67", - "tid": 44650777 - }, - { - "amount": "0.00253962", - "date": 1594584254, - "price": "212.63", - "tid": 44650270 - }, - { - "amount": "0.00234929", - "date": 1594582344, - "price": "212.83", - "tid": 44649613 - }, - { - "amount": "0.02936587", - "date": 1594581359, - "price": "211.47", - "tid": 44649222 - }, - { - "amount": "0.00518501", - "date": 1594571176, - "price": "212.15", - "tid": 44645081 - }, - { - "amount": "0.00057091", - "date": 1594557144, - "price": "210.19", - "tid": 44640222 - }, - { - "amount": "0.00423091", - "date": 1594485235, - "price": "212.72", - "tid": 44621415 - }, - { - "amount": "0.00197266", - "date": 1594480978, - "price": "212.91", - "tid": 44618812 - }, - { - "amount": "0.00490242", - "date": 1594471831, - "price": "212.14", - "tid": 44614817 - }, - { - "amount": "0.00168547", - "date": 1594436069, - "price": "213.59", - "tid": 44607350 - }, - { - "amount": "0.00253022", - "date": 1594419734, - "price": "213.42", - "tid": 44602772 - }, - { - "amount": "0.00051542", - "date": 1594410338, - "price": "213.42", - "tid": 44598184 - }, - { - "amount": "0.00217043", - "date": 1594409426, - "price": "211.94", - "tid": 44597803 - }, - { - "amount": "0.00391620", - "date": 1594409523, - "price": "211.94", - "tid": 44597796 - }, - { - "amount": "0.00146268", - "date": 1594407068, - "price": "211.94", - "tid": 44595878 - }, - { - "amount": "0.00080094", - "date": 1594392377, - "price": "212.25", - "tid": 44585935 - }, - { - "amount": "0.02272505", - "date": 1594379818, - "price": "204.18", - "tid": 44579808 - }, - { - "amount": "0.00126027", - "date": 1594349056, - "price": "214.24", - "tid": 44573529 - }, - { - "amount": "0.00121359", - "date": 1594346549, - "price": "214.24", - "tid": 44573209 - }, - { - "amount": "0.00186706", - "date": 1594346055, - "price": "214.24", - "tid": 44573081 - }, - { - "amount": "0.00470943", - "date": 1594343715, - "price": "212.34", - "tid": 44572577 - }, - { - "amount": "0.00252054", - "date": 1594343055, - "price": "214.24", - "tid": 44572456 - }, - { - "amount": "0.05274459", - "date": 1594330094, - "price": "214.24", - "tid": 44567944 - }, - { - "amount": "0.00133295", - "date": 1594304918, - "price": "210.06", - "tid": 44553439 - }, - { - "amount": "0.00166144", - "date": 1594295799, - "price": "210.66", - "tid": 44549875 - }, - { - "amount": "0.00108281", - "date": 1594254737, - "price": "212.41", - "tid": 44541712 - }, - { - "amount": "0.00579915", - "date": 1594253063, - "price": "212.10", - "tid": 44541252 - }, - { - "amount": "0.01050838", - "date": 1594235162, - "price": "211.26", - "tid": 44532694 - }, - { - "amount": "0.00127467", - "date": 1594234644, - "price": "211.82", - "tid": 44532385 - }, - { - "amount": "0.00056762", - "date": 1594217002, - "price": "211.41", - "tid": 44521189 - }, - { - "amount": "0.00415938", - "date": 1594214537, - "price": "211.57", - "tid": 44520075 - }, - { - "amount": "0.00052421", - "date": 1594212501, - "price": "209.84", - "tid": 44519091 - }, - { - "amount": "0.00653221", - "date": 1594206789, - "price": "209.73", - "tid": 44517028 - }, - { - "amount": "0.00950228", - "date": 1594161098, - "price": "216.79", - "tid": 44507222 - }, - { - "amount": "0.00110162", - "date": 1594159280, - "price": "217.86", - "tid": 44506590 - }, - { - "amount": "0.00555160", - "date": 1594159654, - "price": "210.75", - "tid": 44506394 - }, - { - "amount": "0.00105572", - "date": 1594158503, - "price": "217.86", - "tid": 44506235 - }, - { - "amount": "0.01060314", - "date": 1594157991, - "price": "217.86", - "tid": 44505910 - }, - { - "amount": "0.00220325", - "date": 1594156385, - "price": "217.86", - "tid": 44505387 - }, - { - "amount": "0.01614466", - "date": 1594157076, - "price": "216.79", - "tid": 44505324 - }, - { - "amount": "0.00083169", - "date": 1594138641, - "price": "228.45", - "tid": 44493535 - }, - { - "amount": "0.00115554", - "date": 1594127420, - "price": "216.35", - "tid": 44487564 - }, - { - "amount": "0.00100876", - "date": 1594075597, - "price": "218.09", - "tid": 44475045 - } - ], - "queryString": "", - "bodyParams": "", - "headers": {} - } - ] - } - } -} \ No newline at end of file