ccxt-go/p2b.go
zhangkun9038@dingtalk.com 1a2ce7046a first add
2025-02-28 10:33:20 +08:00

1544 lines
64 KiB
Go

package ccxt
// PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
// https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
type p2b struct {
Exchange
}
func NewP2bCore() p2b {
p := p2b{}
setDefaults(&p)
return p
}
func (this *p2b) Describe() interface{} {
return this.DeepExtend(this.Exchange.Describe(), map[string]interface{} {
"id": "p2b",
"name": "p2b",
"countries": []interface{}{"LT"},
"rateLimit": 100,
"version": "v2",
"pro": true,
"has": map[string]interface{} {
"CORS": nil,
"spot": true,
"margin": false,
"swap": false,
"future": false,
"option": false,
"addMargin": false,
"cancelAllOrders": false,
"cancelOrder": true,
"cancelOrders": false,
"closeAllPositions": false,
"closePosition": false,
"createDepositAddress": false,
"createMarketOrder": false,
"createOrder": true,
"createOrders": false,
"createPostOnlyOrder": false,
"createReduceOnlyOrder": false,
"createStopLimitOrder": false,
"createStopMarketOrder": false,
"createStopOrder": false,
"fetchAccounts": false,
"fetchBalance": true,
"fetchBorrowInterest": false,
"fetchBorrowRateHistory": false,
"fetchClosedOrders": true,
"fetchCrossBorrowRate": false,
"fetchCrossBorrowRates": false,
"fetchDeposit": false,
"fetchDepositAddress": false,
"fetchDepositAddresses": false,
"fetchDepositAddressesByNetwork": false,
"fetchDeposits": false,
"fetchDepositsWithdrawals": false,
"fetchFundingHistory": false,
"fetchFundingRate": false,
"fetchFundingRateHistory": false,
"fetchFundingRates": false,
"fetchIndexOHLCV": false,
"fetchIsolatedBorrowRate": false,
"fetchIsolatedBorrowRates": false,
"fetchLedger": false,
"fetchLedgerEntry": false,
"fetchLeverageTiers": false,
"fetchMarketLeverageTiers": false,
"fetchMarkets": true,
"fetchMarkOHLCV": false,
"fetchMyTrades": true,
"fetchOHLCV": true,
"fetchOpenInterest": false,
"fetchOpenInterestHistory": false,
"fetchOpenOrders": true,
"fetchOrderBook": true,
"fetchOrderBooks": false,
"fetchOrders": false,
"fetchOrderTrades": true,
"fetchPosition": false,
"fetchPositionHistory": false,
"fetchPositionMode": false,
"fetchPositions": false,
"fetchPositionsForSymbol": false,
"fetchPositionsHistory": false,
"fetchPositionsRisk": false,
"fetchPremiumIndexOHLCV": false,
"fetchTicker": true,
"fetchTickers": true,
"fetchTrades": true,
"fetchTradingLimits": false,
"fetchTransactionFee": false,
"fetchTransactionFees": false,
"fetchTransactions": false,
"fetchTransfers": false,
"fetchWithdrawAddresses": false,
"fetchWithdrawal": false,
"fetchWithdrawals": false,
"reduceMargin": false,
"setLeverage": false,
"setMargin": false,
"setMarginMode": false,
"setPositionMode": false,
"signIn": false,
"transfer": false,
"withdraw": false,
},
"timeframes": map[string]interface{} {
"1m": "1m",
"1h": "1h",
"1d": "1d",
},
"urls": map[string]interface{} {
"extension": ".json",
"referral": "https://p2pb2b.com?referral=ee784c53",
"logo": "https://github.com/ccxt/ccxt/assets/43336371/8da13a80-1f0a-49be-bb90-ff8b25164755",
"api": map[string]interface{} {
"public": "https://api.p2pb2b.com/api/v2/public",
"private": "https://api.p2pb2b.com/api/v2",
},
"www": "https://p2pb2b.com/",
"doc": "https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md",
"fees": "https://p2pb2b.com/fee-schedule/",
},
"api": map[string]interface{} {
"public": map[string]interface{} {
"get": map[string]interface{} {
"markets": 1,
"market": 1,
"tickers": 1,
"ticker": 1,
"book": 1,
"history": 1,
"depth/result": 1,
"market/kline": 1,
},
},
"private": map[string]interface{} {
"post": map[string]interface{} {
"account/balances": 1,
"account/balance": 1,
"order/new": 1,
"order/cancel": 1,
"orders": 1,
"account/market_order_history": 1,
"account/market_deal_history": 1,
"account/order": 1,
"account/order_history": 1,
"account/executed_history": 1,
},
},
},
"fees": map[string]interface{} {
"trading": map[string]interface{} {
"tierBased": true,
"percentage": true,
"taker": []interface{}{[]interface{}{this.ParseNumber("0"), this.ParseNumber("0.2")}, []interface{}{this.ParseNumber("1"), this.ParseNumber("0.19")}, []interface{}{this.ParseNumber("5"), this.ParseNumber("0.18")}, []interface{}{this.ParseNumber("10"), this.ParseNumber("0.17")}, []interface{}{this.ParseNumber("25"), this.ParseNumber("0.16")}, []interface{}{this.ParseNumber("75"), this.ParseNumber("0.15")}, []interface{}{this.ParseNumber("100"), this.ParseNumber("0.14")}, []interface{}{this.ParseNumber("150"), this.ParseNumber("0.13")}, []interface{}{this.ParseNumber("300"), this.ParseNumber("0.12")}, []interface{}{this.ParseNumber("450"), this.ParseNumber("0.11")}, []interface{}{this.ParseNumber("500"), this.ParseNumber("0.1")}},
"maker": []interface{}{[]interface{}{this.ParseNumber("0"), this.ParseNumber("0.2")}, []interface{}{this.ParseNumber("1"), this.ParseNumber("0.18")}, []interface{}{this.ParseNumber("5"), this.ParseNumber("0.16")}, []interface{}{this.ParseNumber("10"), this.ParseNumber("0.14")}, []interface{}{this.ParseNumber("25"), this.ParseNumber("0.12")}, []interface{}{this.ParseNumber("75"), this.ParseNumber("0.1")}, []interface{}{this.ParseNumber("100"), this.ParseNumber("0.08")}, []interface{}{this.ParseNumber("150"), this.ParseNumber("0.06")}, []interface{}{this.ParseNumber("300"), this.ParseNumber("0.04")}, []interface{}{this.ParseNumber("450"), this.ParseNumber("0.02")}, []interface{}{this.ParseNumber("500"), this.ParseNumber("0.01")}},
},
},
"features": map[string]interface{} {
"spot": map[string]interface{} {
"sandbox": false,
"createOrder": map[string]interface{} {
"marginMode": false,
"triggerPrice": false,
"triggerDirection": false,
"triggerPriceType": nil,
"stopLossPrice": false,
"takeProfitPrice": false,
"attachedStopLossTakeProfit": nil,
"timeInForce": map[string]interface{} {
"IOC": true,
"FOK": true,
"PO": true,
"GTD": false,
},
"hedged": false,
"trailing": false,
"leverage": false,
"marketBuyByCost": false,
"marketBuyRequiresPrice": false,
"selfTradePrevention": false,
"iceberg": false,
},
"createOrders": nil,
"fetchMyTrades": map[string]interface{} {
"marginMode": false,
"limit": 100,
"daysBack": 100000,
"untilDays": 1,
"symbolRequired": true,
},
"fetchOrder": nil,
"fetchOpenOrders": map[string]interface{} {
"marginMode": false,
"limit": 100,
"trigger": false,
"trailing": false,
"symbolRequired": true,
},
"fetchOrders": nil,
"fetchClosedOrders": map[string]interface{} {
"marginMode": false,
"limit": 100,
"daysBack": 100000,
"daysBackCanceled": Divide(1, 12),
"untilDays": 1,
"trigger": false,
"trailing": false,
"symbolRequired": false,
},
"fetchOHLCV": map[string]interface{} {
"limit": 500,
},
},
"swap": map[string]interface{} {
"linear": nil,
"inverse": nil,
},
"future": map[string]interface{} {
"linear": nil,
"inverse": nil,
},
},
"commonCurrencies": map[string]interface{} {},
"precisionMode": TICK_SIZE,
"exceptions": map[string]interface{} {
"1001": AuthenticationError,
"1002": AuthenticationError,
"1003": AuthenticationError,
"1004": AuthenticationError,
"1005": AuthenticationError,
"1006": AuthenticationError,
"1007": AuthenticationError,
"1008": AuthenticationError,
"1009": AuthenticationError,
"1010": AuthenticationError,
"1011": AuthenticationError,
"1012": AuthenticationError,
"1013": AuthenticationError,
"1014": AuthenticationError,
"1015": AuthenticationError,
"1016": AuthenticationError,
"2010": BadRequest,
"2020": BadRequest,
"2021": BadRequest,
"2030": BadRequest,
"2040": InsufficientFunds,
"2050": BadRequest,
"2051": BadRequest,
"2052": BadRequest,
"2060": BadRequest,
"2061": BadRequest,
"2062": BadRequest,
"2070": BadRequest,
"3001": BadRequest,
"3020": BadRequest,
"3030": BadRequest,
"3040": BadRequest,
"3050": BadRequest,
"3060": BadRequest,
"3070": BadRequest,
"3080": BadRequest,
"3090": BadRequest,
"3100": BadRequest,
"3110": BadRequest,
"4001": ExchangeNotAvailable,
"6010": InsufficientFunds,
},
"options": map[string]interface{} {},
})
}
/**
* @method
* @name p2b#fetchMarkets
* @description retrieves data on all markets for bigone
* @see https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md#markets
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object[]} an array of objects representing market data
*/
func (this *p2b) FetchMarkets(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
response:= (<-this.PublicGetMarkets(params))
PanicOnError(response)
//
// {
// "success": true,
// "errorCode": "",
// "message": "",
// "result": [
// {
// "name": "ETH_BTC",
// "stock": "ETH",
// "money": "BTC",
// "precision": {
// "money": "6",
// "stock": "4",
// "fee": "4"
// },
// "limits": {
// "min_amount": "0.001",
// "max_amount": "100000",
// "step_size": "0.0001",
// "min_price": "0.00001",
// "max_price": "922327",
// "tick_size": "0.00001",
// "min_total": "0.0001"
// }
// },
// ...
// ]
// }
//
var markets interface{} = this.SafeValue(response, "result", []interface{}{})
ch <- this.ParseMarkets(markets)
return nil
}()
return ch
}
func (this *p2b) ParseMarket(market interface{}) interface{} {
var marketId interface{} = this.SafeString(market, "name")
var baseId interface{} = this.SafeString(market, "stock")
var quoteId interface{} = this.SafeString(market, "money")
var base interface{} = this.SafeCurrencyCode(baseId)
var quote interface{} = this.SafeCurrencyCode(quoteId)
var limits interface{} = this.SafeValue(market, "limits")
var maxAmount interface{} = this.SafeString(limits, "max_amount")
var maxPrice interface{} = this.SafeString(limits, "max_price")
return map[string]interface{} {
"id": marketId,
"symbol": Add(Add(base, "/"), quote),
"base": base,
"quote": quote,
"settle": nil,
"baseId": baseId,
"quoteId": quoteId,
"settleId": nil,
"type": "spot",
"spot": true,
"margin": false,
"swap": false,
"future": false,
"option": false,
"active": true,
"contract": false,
"linear": nil,
"inverse": nil,
"contractSize": nil,
"expiry": nil,
"expiryDatetime": nil,
"strike": nil,
"optionType": nil,
"precision": map[string]interface{} {
"amount": this.SafeNumber(limits, "step_size"),
"price": this.SafeNumber(limits, "tick_size"),
},
"limits": map[string]interface{} {
"leverage": map[string]interface{} {
"min": nil,
"max": nil,
},
"amount": map[string]interface{} {
"min": this.SafeNumber(limits, "min_amount"),
"max": this.ParseNumber(this.OmitZero(maxAmount)),
},
"price": map[string]interface{} {
"min": this.SafeNumber(limits, "min_price"),
"max": this.ParseNumber(this.OmitZero(maxPrice)),
},
"cost": map[string]interface{} {
"min": nil,
"max": nil,
},
},
"created": nil,
"info": market,
}
}
/**
* @method
* @name p2b#fetchTickers
* @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
* @see https://futures-docs.poloniex.com/#get-real-time-ticker-of-all-symbols
* @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
*/
func (this *p2b) FetchTickers(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbols := GetArg(optionalArgs, 0, nil)
_ = symbols
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
retRes4168 := (<-this.LoadMarkets())
PanicOnError(retRes4168)
response:= (<-this.PublicGetTickers(params))
PanicOnError(response)
//
// {
// success: true,
// errorCode: '',
// message: '',
// result: {
// KNOLIX_BTC: {
// at: '1699252631',
// ticker: {
// bid: '0.0000332',
// ask: '0.0000333',
// low: '0.0000301',
// high: '0.0000338',
// last: '0.0000333',
// vol: '15.66',
// deal: '0.000501828',
// change: '10.63'
// }
// },
// ...
// },
// cache_time: '1699252631.103631',
// current_time: '1699252644.487566'
// }
//
var result interface{} = this.SafeValue(response, "result", map[string]interface{} {})
ch <- this.ParseTickers(result, symbols)
return nil
}()
return ch
}
/**
* @method
* @name p2b#fetchTicker
* @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
* @see https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md#ticker
* @param {string} symbol unified symbol of the market to fetch the ticker for
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
*/
func (this *p2b) FetchTicker(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes4578 := (<-this.LoadMarkets())
PanicOnError(retRes4578)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"market": GetValue(market, "id"),
}
response:= (<-this.PublicGetTicker(this.Extend(request, params)))
PanicOnError(response)
//
// {
// success: true,
// errorCode: '',
// message: '',
// result: {
// bid: '0.342',
// ask: '0.3421',
// open: '0.3317',
// high: '0.3499',
// low: '0.3311',
// last: '0.3421',
// volume: '17855383.1',
// deal: '6107478.3423',
// change: '3.13'
// },
// cache_time: '1699252953.832795',
// current_time: '1699252958.859391'
// }
//
var result interface{} = this.SafeValue(response, "result", map[string]interface{} {})
var timestamp interface{} = this.SafeIntegerProduct(response, "cache_time", 1000)
ch <- this.Extend(map[string]interface{} {
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
}, this.ParseTicker(result, market))
return nil
}()
return ch
}
func (this *p2b) ParseTicker(ticker interface{}, optionalArgs ...interface{}) interface{} {
//
// parseTickers
//
// {
// at: '1699252631',
// ticker: {
// bid: '0.0000332',
// ask: '0.0000333',
// low: '0.0000301',
// high: '0.0000338',
// last: '0.0000333',
// vol: '15.66',
// deal: '0.000501828',
// change: '10.63'
// }
// }
//
// parseTicker
//
// {
// bid: '0.342',
// ask: '0.3421',
// open: '0.3317',
// high: '0.3499',
// low: '0.3311',
// last: '0.3421',
// volume: '17855383.1',
// deal: '6107478.3423',
// change: '3.13'
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var timestamp interface{} = this.SafeIntegerProduct(ticker, "at", 1000)
if IsTrue(InOp(ticker, "ticker")) {
ticker = this.SafeValue(ticker, "ticker")
}
var last interface{} = this.SafeString(ticker, "last")
return this.SafeTicker(map[string]interface{} {
"symbol": this.SafeString(market, "symbol"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"high": this.SafeString(ticker, "high"),
"low": this.SafeString(ticker, "low"),
"bid": this.SafeString(ticker, "bid"),
"bidVolume": nil,
"ask": this.SafeString(ticker, "ask"),
"askVolume": nil,
"vwap": nil,
"open": this.SafeString(ticker, "open"),
"close": last,
"last": last,
"previousClose": nil,
"change": nil,
"percentage": this.SafeString(ticker, "change"),
"average": nil,
"baseVolume": this.SafeString2(ticker, "vol", "volume"),
"quoteVolume": this.SafeString(ticker, "deal"),
"info": ticker,
}, market)
}
/**
* @method
* @name p2b#fetchOrderBook
* @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
* @see https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md#depth-result
* @param {string} symbol unified symbol of the market to fetch the order book for
* @param {int} [limit] the maximum amount of order book entries to return
* @param {object} [params] extra parameters specific to the exchange API endpoint
*
* EXCHANGE SPECIFIC PARAMETERS
* @param {string} [params.interval] 0 (default), 0.00000001, 0.0000001, 0.000001, 0.00001, 0.0001, 0.001, 0.01, 0.1, 1
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
*/
func (this *p2b) FetchOrderBook(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
limit := GetArg(optionalArgs, 0, nil)
_ = limit
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
retRes5668 := (<-this.LoadMarkets())
PanicOnError(retRes5668)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"market": GetValue(market, "id"),
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
response:= (<-this.PublicGetDepthResult(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success": true,
// "errorCode": "",
// "message": "",
// "result": {
// "asks": [
// [
// "4.53", // Price
// "523.95" // Amount
// ],
// ...
// ],
// "bids": [
// [
// "4.51",
// "244.75"
// ],
// ...
// ]
// },
// "cache_time": 1698733470.469175,
// "current_time": 1698733470.469274
// }
//
var result interface{} = this.SafeValue(response, "result", map[string]interface{} {})
var timestamp interface{} = this.SafeIntegerProduct(response, "current_time", 1000)
ch <- this.ParseOrderBook(result, GetValue(market, "symbol"), timestamp, "bids", "asks", 0, 1)
return nil
}()
return ch
}
/**
* @method
* @name p2b#fetchTrades
* @description get the list of most recent trades for a particular symbol
* @see https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md#history
* @param {string} symbol unified symbol of the market to fetch trades for
* @param {int} [since] timestamp in ms of the earliest trade to fetch
* @param {int} [limit] 1-100, default=50
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} params.lastId order id
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
*/
func (this *p2b) FetchTrades(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
since := GetArg(optionalArgs, 0, nil)
_ = since
limit := GetArg(optionalArgs, 1, nil)
_ = limit
params := GetArg(optionalArgs, 2, map[string]interface{} {})
_ = params
retRes6188 := (<-this.LoadMarkets())
PanicOnError(retRes6188)
var lastId interface{} = this.SafeInteger(params, "lastId")
if IsTrue(IsEqual(lastId, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchTrades () requires an extra parameter params[\"lastId\"]")))
}
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"market": GetValue(market, "id"),
"lastId": lastId,
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
response:= (<-this.PublicGetHistory(this.Extend(request, params)))
PanicOnError(response)
//
// {
// success: true,
// errorCode: '',
// message: '',
// result: [
// {
// id: '7495738622',
// type: 'sell',
// time: '1699255565.445418',
// amount: '252.6',
// price: '0.3422'
// },
// ...
// ],
// cache_time: '1699255571.413633',
// current_time: '1699255571.413828'
// }
//
var result interface{} = this.SafeList(response, "result", []interface{}{})
ch <- this.ParseTrades(result, market, since, limit)
return nil
}()
return ch
}
func (this *p2b) ParseTrade(trade interface{}, optionalArgs ...interface{}) interface{} {
//
// fetchTrades
//
// {
// id: '7495738622',
// type: 'sell',
// time: '1699255565.445418',
// amount: '252.6',
// price: '0.3422'
// }
//
// fetchMyTrades
//
// {
// "deal_id": 7450617292, // Deal id
// "deal_time": 1698506956.66224, // Deal execution time
// "deal_order_id": 171955225751, // Deal order id
// "opposite_order_id": 171955110512, // Opposite order id
// "side": "sell", // Deal side
// "price": "0.05231", // Deal price
// "amount": "0.002", // Deal amount
// "deal": "0.00010462", // Total (price * amount)
// "deal_fee": "0.000000188316", // Deal fee
// "role": "taker", // Role. Taker or maker
// "isSelfTrade": false // is self trade
// }
//
// fetchOrderTrades
//
// {
// "id": 7429883128, // Deal id
// "time": 1698237535.41196, // Deal execution time
// "fee": "0.01755848704", // Deal fee
// "price": "34293.92", // Deal price
// "amount": "0.00032", // Deal amount
// "dealOrderId": 171366551416, // Deal order id
// "role": 1, // Deal role (1 - maker, 2 - taker)
// "deal": "10.9740544" // Total (price * amount)
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var timestamp interface{} = this.SafeIntegerProduct2(trade, "time", "deal_time", 1000)
var takerOrMaker interface{} = this.SafeString(trade, "role")
if IsTrue(IsEqual(takerOrMaker, "1")) {
takerOrMaker = "maker"
} else if IsTrue(IsEqual(takerOrMaker, "2")) {
takerOrMaker = "taker"
}
return this.SafeTrade(map[string]interface{} {
"info": trade,
"id": this.SafeString2(trade, "id", "deal_id"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"symbol": this.SafeString(market, "symbol"),
"order": this.SafeString2(trade, "dealOrderId", "deal_order_id"),
"type": nil,
"side": this.SafeString2(trade, "type", "side"),
"takerOrMaker": takerOrMaker,
"price": this.SafeString(trade, "price"),
"amount": this.SafeString(trade, "amount"),
"cost": this.SafeString(trade, "deal"),
"fee": map[string]interface{} {
"currency": GetValue(market, "quote"),
"cost": this.SafeString2(trade, "fee", "deal_fee"),
},
}, market)
}
/**
* @method
* @name p2b#fetchOHLCV
* @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
* @see https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md#kline
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
* @param {string} timeframe 1m, 1h, or 1d
* @param {int} [since] timestamp in ms of the earliest candle to fetch
* @param {int} [limit] 1-500, default=50
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.offset] default=0, with this value the last candles are returned
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
*/
func (this *p2b) FetchOHLCV(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
timeframe := GetArg(optionalArgs, 0, "1m")
_ = timeframe
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes7378 := (<-this.LoadMarkets())
PanicOnError(retRes7378)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"market": GetValue(market, "id"),
"interval": timeframe,
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
response:= (<-this.PublicGetMarketKline(this.Extend(request, params)))
PanicOnError(response)
//
// {
// success: true,
// errorCode: '',
// message: '',
// result: [
// [
// 1699253400, // Kline open time
// '0.3429', // Open price
// '0.3427', // Close price
// '0.3429', // Highest price
// '0.3427', // Lowest price
// '1900.4', // Volume for stock currency
// '651.46278', // Volume for money currency
// 'ADA_USDT' // Market name
// ],
// ...
// ],
// cache_time: '1699256375.030292',
// current_time: '1699256375.030494'
// }
//
var result interface{} = this.SafeList(response, "result", []interface{}{})
ch <- this.ParseOHLCVs(result, market, timeframe, since, limit)
return nil
}()
return ch
}
func (this *p2b) ParseOHLCV(ohlcv interface{}, optionalArgs ...interface{}) interface{} {
//
// [
// 1699253400, // Kline open time
// '0.3429', // Open price
// '0.3427', // Close price
// '0.3429', // Highest price
// '0.3427', // Lowest price
// '1900.4', // Volume for stock currency
// '651.46278', // Volume for money currency
// 'ADA_USDT' // Market name
// ],
//
market := GetArg(optionalArgs, 0, nil)
_ = market
return []interface{}{this.SafeIntegerProduct(ohlcv, 0, 1000), this.SafeNumber(ohlcv, 1), this.SafeNumber(ohlcv, 3), this.SafeNumber(ohlcv, 4), this.SafeNumber(ohlcv, 2), this.SafeNumber(ohlcv, 5)}
}
/**
* @method
* @name p2b#fetchBalance
* @description query for balance and get the amount of funds available for trading or funds locked in orders
* @see https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md#all-balances
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
*/
func (this *p2b) FetchBalance(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes8058 := (<-this.LoadMarkets())
PanicOnError(retRes8058)
response:= (<-this.PrivatePostAccountBalances(params))
PanicOnError(response)
//
// {
// "success": true,
// "errorCode": "",
// "message": "",
// "result": {
// "USDT": {
// "available": "71.81328046",
// "freeze": "10.46103091"
// },
// "BTC": {
// "available": "0.00135674",
// "freeze": "0.00020003"
// }
// }
// }
//
var result interface{} = this.SafeValue(response, "result", map[string]interface{} {})
ch <- this.ParseBalance(result)
return nil
}()
return ch
}
func (this *p2b) ParseBalance(response interface{}) interface{} {
//
// {
// "USDT": {
// "available": "71.81328046",
// "freeze": "10.46103091"
// },
// "BTC": {
// "available": "0.00135674",
// "freeze": "0.00020003"
// }
// }
//
var result interface{} = map[string]interface{} {
"info": response,
}
var keys interface{} = ObjectKeys(response)
for i := 0; IsLessThan(i, GetArrayLength(keys)); i++ {
var currencyId interface{} = GetValue(keys, i)
var balance interface{} = GetValue(response, currencyId)
var code interface{} = this.SafeCurrencyCode(currencyId)
var used interface{} = this.SafeString(balance, "freeze")
var available interface{} = this.SafeString(balance, "available")
var account interface{} = map[string]interface{} {
"free": available,
"used": used,
}
AddElementToObject(result, code, account)
}
return this.SafeBalance(result)
}
/**
* @method
* @name p2b#createOrder
* @description create a trade order
* @see https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md#create-order
* @param {string} symbol unified symbol of the market to create an order in
* @param {string} type must be 'limit'
* @param {string} side 'buy' or 'sell'
* @param {float} amount how much of currency you want to trade in units of base currency
* @param {float} price the price at which the order is to be fulfilled, in units of the quote currency
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *p2b) CreateOrder(symbol interface{}, typeVar interface{}, side interface{}, amount interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
price := GetArg(optionalArgs, 0, nil)
_ = price
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
retRes8748 := (<-this.LoadMarkets())
PanicOnError(retRes8748)
if IsTrue(IsEqual(typeVar, "market")) {
panic(BadRequest(Add(this.Id, " createOrder () can only accept orders with type \"limit\"")))
}
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"market": GetValue(market, "id"),
"side": side,
"amount": this.AmountToPrecision(symbol, amount),
"price": this.PriceToPrecision(symbol, price),
}
response:= (<-this.PrivatePostOrderNew(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success": true,
// "errorCode": "",
// "message": "",
// "result": {
// "orderId": 171906478744, // Order id
// "market": "ETH_BTC", // Market name
// "price": "0.04348", // Price
// "side": "buy", // Side
// "type": "limit", // Order type
// "timestamp": 1698484861.746517, // Order creation time
// "dealMoney": "0", // Filled total
// "dealStock": "0", // Filled amount
// "amount": "0.0277", // Original amount
// "takerFee": "0.002", // taker fee
// "makerFee": "0.002", // maker fee
// "left": "0.0277", // Unfilled amount
// "dealFee": "0" // Filled fee
// }
// }
//
var result interface{} = this.SafeDict(response, "result")
ch <- this.ParseOrder(result, market)
return nil
}()
return ch
}
/**
* @method
* @name p2b#cancelOrder
* @description cancels an open order
* @see https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md#cancel-order
* @param {string} id order id
* @param {string} symbol unified symbol of the market the order was made in
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *p2b) CancelOrder(id interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " cancelOrder() requires a symbol argument")))
}
retRes9268 := (<-this.LoadMarkets())
PanicOnError(retRes9268)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"market": GetValue(market, "id"),
"orderId": id,
}
response:= (<-this.PrivatePostOrderCancel(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success": true,
// "errorCode": "",
// "message": "",
// "result": {
// "orderId": 171906478744,
// "market": "ETH_BTC",
// "price": "0.04348",
// "side": "buy",
// "type": "limit",
// "timestamp": 1698484861.746517,
// "dealMoney": "0",
// "dealStock": "0",
// "amount": "0.0277",
// "takerFee": "0.002",
// "makerFee": "0.002",
// "left": "0.0277",
// "dealFee": "0"
// }
// }
//
var result interface{} = this.SafeDict(response, "result")
ch <- this.ParseOrder(result)
return nil
}()
return ch
}
/**
* @method
* @name p2b#fetchOpenOrders
* @description fetch all unfilled currently open orders
* @see https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md#open-orders
* @param {string} symbol unified market symbol of the market orders were made in
* @param {int} [since] the earliest time in ms to fetch orders for
* @param {int} [limit] the maximum number of order structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
*
* EXCHANGE SPECIFIC PARAMETERS
* @param {int} [params.offset] 0-10000, default=0
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *p2b) FetchOpenOrders(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchOpenOrders () requires the symbol argument")))
}
retRes9778 := (<-this.LoadMarkets())
PanicOnError(retRes9778)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"market": GetValue(market, "id"),
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
response:= (<-this.PrivatePostOrders(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success": true,
// "errorCode": "",
// "message": "",
// "result": [
// {
// "orderId": 171913325964,
// "market": "ETH_BTC",
// "price": "0.06534",
// "side": "sell",
// "type": "limit",
// "timestamp": 1698487986.836821,
// "dealMoney": "0",
// "dealStock": "0",
// "amount": "0.0018",
// "takerFee": "0.0018",
// "makerFee": "0.0016",
// "left": "0.0018",
// "dealFee": "0"
// },
// ...
// ]
// }
//
var result interface{} = this.SafeList(response, "result", []interface{}{})
ch <- this.ParseOrders(result, market, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name p2b#fetchOrderTrades
* @description fetch all the trades made from a single order
* @see https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md#deals-by-order-id
* @param {string} id order id
* @param {string} symbol unified market symbol
* @param {int} [since] the earliest time in ms to fetch trades for
* @param {int} [limit] 1-100, default=50
* @param {object} [params] extra parameters specific to the exchange API endpoint
*
* EXCHANGE SPECIFIC PARAMETERS
* @param {int} [params.offset] 0-10000, default=0
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
*/
func (this *p2b) FetchOrderTrades(id interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes10318 := (<-this.LoadMarkets())
PanicOnError(retRes10318)
var market interface{} = this.SafeMarket(symbol)
var request interface{} = map[string]interface{} {
"orderId": id,
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
response:= (<-this.PrivatePostAccountOrder(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success": true,
// "errorCode": "",
// "message": "",
// "result": {
// "offset": 0,
// "limit": 50,
// "records": [
// {
// "id": 7429883128, // Deal id
// "time": 1698237535.41196, // Deal execution time
// "fee": "0.01755848704", // Deal fee
// "price": "34293.92", // Deal price
// "amount": "0.00032", // Deal amount
// "dealOrderId": 171366551416, // Deal order id
// "role": 1, // Deal role (1 - maker, 2 - taker)
// "deal": "10.9740544" // Total (price * amount)
// }
// ]
// }
// }
//
var result interface{} = this.SafeValue(response, "result", map[string]interface{} {})
var records interface{} = this.SafeList(result, "records", []interface{}{})
ch <- this.ParseTrades(records, market, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name p2b#fetchMyTrades
* @description fetch all trades made by the user, only the transaction records in the past 3 month can be queried, the time between since and params["until"] cannot be longer than 24 hours
* @see https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md#deals-history-by-market
* @param {string} symbol unified market symbol of the market orders were made in
* @param {int} [since] the earliest time in ms to fetch orders for, default = params["until"] - 86400000
* @param {int} [limit] 1-100, default=50
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] the latest time in ms to fetch orders for, default = current timestamp or since + 86400000
*
* EXCHANGE SPECIFIC PARAMETERS
* @param {int} [params.offset] 0-10000, default=0
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
*/
func (this *p2b) FetchMyTrades(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchMyTrades() requires a symbol argument")))
}
retRes10878 := (<-this.LoadMarkets())
PanicOnError(retRes10878)
var until interface{} = this.SafeInteger(params, "until")
params = this.Omit(params, "until")
if IsTrue(IsEqual(until, nil)) {
if IsTrue(IsEqual(since, nil)) {
until = this.Milliseconds()
} else {
until = Add(since, 86400000)
}
}
if IsTrue(IsEqual(since, nil)) {
since = Subtract(until, 86400000)
}
if IsTrue(IsGreaterThan((Subtract(until, since)), 86400000)) {
panic(BadRequest(Add(this.Id, " fetchMyTrades () the time between since and params[\"until\"] cannot be greater than 24 hours")))
}
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"market": GetValue(market, "id"),
"startTime": this.ParseToInt(Divide(since, 1000)),
"endTime": this.ParseToInt(Divide(until, 1000)),
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
response:= (<-this.PrivatePostAccountMarketDealHistory(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success": true,
// "errorCode": "",
// "message": "",
// "result": {
// "total": 2, // Total records in the queried range
// "deals": [
// {
// "deal_id": 7450617292, // Deal id
// "deal_time": 1698506956.66224, // Deal execution time
// "deal_order_id": 171955225751, // Deal order id
// "opposite_order_id": 171955110512, // Opposite order id
// "side": "sell", // Deal side
// "price": "0.05231", // Deal price
// "amount": "0.002", // Deal amount
// "deal": "0.00010462", // Total (price * amount)
// "deal_fee": "0.000000188316", // Deal fee
// "role": "taker", // Role. Taker or maker
// "isSelfTrade": false // is self trade
// },
// ...
// ]
// }
// }
//
var result interface{} = this.SafeValue(response, "result", map[string]interface{} {})
var deals interface{} = this.SafeList(result, "deals", []interface{}{})
ch <- this.ParseTrades(deals, market, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name p2b#fetchClosedOrders
* @description fetches information on multiple closed orders made by the user, the time between since and params["untnil"] cannot be longer than 24 hours
* @see https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md#orders-history-by-market
* @param {string} symbol unified market symbol of the market orders were made in
* @param {int} [since] the earliest time in ms to fetch orders for, default = params["until"] - 86400000
* @param {int} [limit] 1-100, default=50
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] the latest time in ms to fetch orders for, default = current timestamp or since + 86400000
*
* EXCHANGE SPECIFIC PARAMETERS
* @param {int} [params.offset] 0-10000, default=0
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *p2b) FetchClosedOrders(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes11608 := (<-this.LoadMarkets())
PanicOnError(retRes11608)
var until interface{} = this.SafeInteger(params, "until")
params = this.Omit(params, "until")
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
}
if IsTrue(IsEqual(until, nil)) {
if IsTrue(IsEqual(since, nil)) {
until = this.Milliseconds()
} else {
until = Add(since, 86400000)
}
}
if IsTrue(IsEqual(since, nil)) {
since = Subtract(until, 86400000)
}
if IsTrue(IsGreaterThan((Subtract(until, since)), 86400000)) {
panic(BadRequest(Add(this.Id, " fetchClosedOrders () the time between since and params[\"until\"] cannot be greater than 24 hours")))
}
var request interface{} = map[string]interface{} {
"startTime": this.ParseToInt(Divide(since, 1000)),
"endTime": this.ParseToInt(Divide(until, 1000)),
}
if IsTrue(!IsEqual(market, nil)) {
AddElementToObject(request, "market", GetValue(market, "id"))
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
response:= (<-this.PrivatePostAccountOrderHistory(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success": true,
// "errorCode": "",
// "message": "",
// "result": {
// "LTC_USDT": [
// {
// "id": 173985944395,
// "amount": "0.1",
// "price": "73",
// "type": "limit",
// "side": "sell",
// "ctime": 1699436194.390845,
// "ftime": 1699436194.390847,
// "market": "LTC_USDT",
// "takerFee": "0.002",
// "makerFee": "0.002",
// "dealFee": "0.01474",
// "dealStock": "0.1",
// "dealMoney": "7.37"
// }
// ]
// }
// }
//
var result interface{} = this.SafeValue(response, "result")
var orders interface{} = []interface{}{}
var keys interface{} = ObjectKeys(result)
for i := 0; IsLessThan(i, GetArrayLength(keys)); i++ {
var marketId interface{} = GetValue(keys, i)
var marketOrders interface{} = GetValue(result, marketId)
var parsedOrders interface{} = this.ParseOrders(marketOrders, market, since, limit)
orders = this.ArrayConcat(orders, parsedOrders)
}
ch <- orders
return nil
}()
return ch
}
func (this *p2b) ParseOrder(order interface{}, optionalArgs ...interface{}) interface{} {
//
// cancelOrder, fetchOpenOrders, createOrder
//
// {
// "orderId": 171906478744,
// "market": "ETH_BTC",
// "price": "0.04348",
// "side": "buy",
// "type": "limit",
// "timestamp": 1698484861.746517,
// "dealMoney": "0",
// "dealStock": "0",
// "amount": "0.0277",
// "takerFee": "0.002",
// "makerFee": "0.002",
// "left": "0.0277",
// "dealFee": "0"
// }
//
// fetchClosedOrders
//
// {
// "id": 171366547790, // Order id
// "amount": "0.00032", // Original amount
// "price": "34293.92", // Order price
// "type": "limit", // Order type
// "side": "sell", // Order side
// "ctime": 1698237533.497241, // Order creation time
// "ftime": 1698237535.41196, // Order fill time
// "market": "BTC_USDT", // Market name
// "takerFee": "0.0018", // Taker fee
// "makerFee": "0.0016", // Market fee
// "dealFee": "0.01755848704", // Deal fee
// "dealStock": "0.00032", // Filled amount
// "dealMoney": "10.9740544" // Filled total
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var timestamp interface{} = this.SafeIntegerProduct2(order, "timestamp", "ctime", 1000)
var marketId interface{} = this.SafeString(order, "market")
market = this.SafeMarket(marketId, market)
return this.SafeOrder(map[string]interface{} {
"info": order,
"id": this.SafeString2(order, "id", "orderId"),
"clientOrderId": nil,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"lastTradeTimestamp": nil,
"symbol": GetValue(market, "symbol"),
"type": this.SafeString(order, "type"),
"timeInForce": nil,
"postOnly": nil,
"side": this.SafeString(order, "side"),
"price": this.SafeString(order, "price"),
"triggerPrice": nil,
"amount": this.SafeString(order, "amount"),
"cost": nil,
"average": nil,
"filled": this.SafeString(order, "dealStock"),
"remaining": this.SafeString(order, "left"),
"status": nil,
"fee": map[string]interface{} {
"currency": GetValue(market, "quote"),
"cost": this.SafeString(order, "dealFee"),
},
"trades": nil,
}, market)
}
func (this *p2b) Sign(path interface{}, optionalArgs ...interface{}) interface{} {
api := GetArg(optionalArgs, 0, "public")
_ = api
method := GetArg(optionalArgs, 1, "GET")
_ = method
params := GetArg(optionalArgs, 2, map[string]interface{} {})
_ = params
headers := GetArg(optionalArgs, 3, nil)
_ = headers
body := GetArg(optionalArgs, 4, nil)
_ = body
var url interface{} = Add(Add(GetValue(GetValue(this.Urls, "api"), api), "/"), this.ImplodeParams(path, params))
params = this.Omit(params, this.ExtractParams(path))
if IsTrue(IsEqual(method, "GET")) {
if IsTrue(GetArrayLength(ObjectKeys(params))) {
url = Add(url, Add("?", this.Urlencode(params)))
}
}
if IsTrue(IsEqual(api, "private")) {
AddElementToObject(params, "request", Add("/api/v2/", path))
AddElementToObject(params, "nonce", ToString(this.Nonce()))
var payload interface{} = this.StringToBase64(this.Json(params)) // Body json encoded in base64
headers = map[string]interface{} {
"Content-Type": "application/json",
"X-TXC-APIKEY": this.ApiKey,
"X-TXC-PAYLOAD": payload,
"X-TXC-SIGNATURE": this.Hmac(this.Encode(payload), this.Encode(this.Secret), sha512),
}
body = this.Json(params)
}
return map[string]interface{} {
"url": url,
"method": method,
"body": body,
"headers": headers,
}
}
func (this *p2b) HandleErrors(code interface{}, reason interface{}, url interface{}, method interface{}, headers interface{}, body interface{}, response interface{}, requestHeaders interface{}, requestBody interface{}) interface{} {
if IsTrue(IsEqual(response, nil)) {
return nil
}
if IsTrue(IsEqual(code, 400)) {
var error interface{} = this.SafeValue(response, "error")
var errorCode interface{} = this.SafeString(error, "code")
var feedback interface{} = Add(Add(this.Id, " "), this.Json(response))
this.ThrowExactlyMatchedException(this.Exceptions, errorCode, feedback)
}
return nil
}
func (this *p2b) Init(userConfig map[string]interface{}) {
this.Exchange = Exchange{}
this.Exchange.InitParent(userConfig, this.Describe().(map[string]interface{}), this)
this.Exchange.DerivedExchange = this
}