Introduction
Alcor Exchange has HTTP and WebSocket api. Which can get information on various markets, orderboos, prices, events, and charts. WebSocket allows streaming for orderbook updates, new deals, and account events.
Interaction with Alcor is divided into 2 types:
- Interaction with the contract.
- Place/Cancel order.
- Add/Remove LP position.
- Obtaining information about the markets using the Alcor API services.
- Market Data
- Liquidity pools Data
- WebSocket Stream
Basic documentation can be found here: docs.alcor.exchange
URL Structure
HTTP API URL are separated by chains using following structute. The UI are following same structute as api, they are splitted by subdomains named by chain.
Chain | URL |
---|---|
WAX | https://wax.alcor.exchange/api/v2/ |
EOS | https://eos.alcor.exchange/api/v2/ |
Proton | https://proton.alcor.exchange/api/v2/ |
Telos | https://telos.alcor.exchange/api/v2/ |
Node API
import fetch from 'node-fetch'
import { Api, JsonRpc, RpcError, JsSignatureProvider } from 'eosjs'
const rpc = new JsonRpc('https://eos.greymass.com', { fetch })
const signatureProvider = new JsSignatureProvider(['private key of order owner'])
const api = new Api({ rpc, signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder() });
Alcor is DEX, so, intereations with exchange, such as placing new order or order cancel, requires work with blockchain node api directly. Examples can be found in Trading API section.
Alcor support multiple EOSIO blockchains. Here is dex contract accounts across supported cahins:
- WAX - alcordexmain
- EOS - eostokensdex
- TELOS - eostokensdex
- Proton - alcor
You can easly interacting with alcor contracts using EOSJS library.
Alternatives:
Tokens
Token price
curl https://alcor.exchange/api/v2/tokens/tlm-alien.worlds
The above command returns JSON structured like this:
{
"contract": "alien.worlds",
"decimals": 4,
"symbol": "TLM",
"id": "tlm-alien.worlds",
"system_price": 0.252009,
"usd_price": 0.010197
}
Get single token price by id
HTTP Request
GET https://alcor.exchange/api/v2/tokens/:<token_id>
Responce
Name | Type | Description |
---|---|---|
contract | string | token contract |
decimals | number | token precision |
symbol | string | token symbol |
id | string | token-id |
system_price | number | token price in chain system token |
usd_price | number | token price in USD |
All tokens prices
curl https://alcor.exchange/api/v2/tokens
The above command returns JSON structured like this:
[
{
"contract": "alien.worlds",
"decimals": 4,
"symbol": "TLM",
"id": "tlm-alien.worlds",
"system_price": 0.252009,
"usd_price": 0.010197
},
...
]
Get all tokens with it's prices
HTTP Request
GET https://alcor.exchange/api/v2/tokens
Responce
Name | Type | Description |
---|---|---|
contract | string | token contract |
decimals | number | token precision |
symbol | string | token symbol |
id | string | token-id |
system_price | number | token price in chain system token |
usd_price | number | token price in USD |
Global Data
Stats
Returns global data on TVL, volumes, number of trading pairs, and so on
curl "https://alcor.exchange/api/v2/analytics/global"
The above command returns JSON structured like this:
{
"_id": "wax",
"totalValueLocked": 2240718.758763486,
"swapValueLocked": 943995.9929317994,
"spotValueLocked": 1296722.7658316866,
"swapTradingVolume": 344377.66920321307,
"spotTradingVolume": 26406.316737205285,
"swapFees": 1063.6217236406346,
"spotFees": 409.7303415365396,
"dailyActiveUsers": 4063,
"swapTransactions": 26347,
"spotTransactions": 3163,
"totalLiquidityPools": 1483,
"totalSpotPairs": 808,
"totalTradingVolume": 370783.9859404183
}
HTTP Request
GET https://alcor.exchange/api/v2/analytics/global
Query params:
Name | Type | Description | Default |
---|---|---|---|
resolution | string | Accumulate results over a certain period of time | 1D |
Supported resolutions:
1D, 1W, 1M
Responce
Name | Type | Description |
---|---|---|
totalValueLocked | number | Exchange TVL |
swapValueLocked | number | Total AMM Value locked in USD |
spotValueLocked | number | Total spot value locked in open orders |
swapTradingVolume | number | AMM trading volume |
spotTradingVolume | number | Spot trading volume |
swapFees | number | AMM fees |
spotFees | number | Spot fees |
dailyActiveUsers | number | avg Daily active users |
swapTransactions | number | Total AMM swaps for period(resolution) |
spotTransactions | number | Total spot trades for period(resolution) |
totalLiquidityPools | number | Count of AMM pairs |
totalSpotPairs | number | Count of spot pairs |
totalTradingVolume | number | Total trading volume for given period(resolution) |
Market Data
Token symbol repesented as SYMBOL_contract following the eosio.token standard. As the one symbol can be deployed by multiple contracts.
Trading pairs
Provides a list of all trading pairs on the Alcor DEX.
curl "https://alcor.exchange/api/v2/pairs"
The above command returns JSON structured like this:
[
{
"base": {
"id": "pgl-prospectorsw",
"contract": "prospectorsw",
"symbol": "PGL",
"precision": 4
},
"target": {
"id": "wax-eosio.token",
"contract": "eosio.token",
"symbol": "WAX",
"precision": 8
},
"ticker_id": "pgl-prospectorsw_wax-eosio.token"
}
]
HTTP Request
GET https://alcor.exchange/api/v2/pairs
Query params:
Name | Type | Description |
---|---|---|
base | string | Filter pair by base currency id |
target | string | Filter pair by target currency id |
ie: https://alcor.exchange/api/v2/pairs?base=tlm-alien.worlds
Responce
Name | Type | Description |
---|---|---|
ticker_id | string | Identifier of a ticker with delimiter to separate base/target |
base | string | Symbol code of a the base cryptoasset |
target | string | Symbol code of the target cryptoasset |
Ticker
curl "https://alcor.exchange/api/v2/tickers/tlm-alien.worlds_wax-eosio.token"
The above command returns JSON structured like this:
{
"ticker_id": "tlm-alien.worlds_wax-eosio.token",
"market_id": 26,
"target_currency": "wax-eosio.token",
"base_currency": "tlm-alien.worlds",
"global_ticker_id": "TLM_WAX",
"target_cmc_ucid": 825,
"base_cmc_ucid": 2300
"min_buy": "0.50000000 WAX",
"min_sell": "1.0000 TLM",
"last_price": 0.32448004,
"change24": 3.42,
"high24": 0.34088342,
"low24": 0.30488872,
"bid": 0.32448004,
"ask": 0.32580358,
"base_volume": 100178.36015088,
"target_volume": 314152.7801
"frozen": false,
"fee": 20,
"base_amm_liquidity": 3710.6035,
"target_amm_liquidity": 649.92427661
}
Endpoint provides pricing and volume information on sprcific ticker.
Ticker ID represented as base token (Symbol-contract) _ quote_token (Symbol-contract) example: rda-deadcitytokn_wax-eosio.token
HTTP Request
GET https://alcor.exchange/api/v2/tickers/:ticker_id
Query Parameters
Parameter | Mandatory | Type | Description |
---|---|---|---|
ticker_id | true | string | Ticker id |
Responce
Name | Type | Description |
---|---|---|
ticker_id | string | Identifier of a ticker |
global_ticker_id | string | The ticker ID according to the standard of centralized exchanges (null for unpopular tokens) |
base_currency | string | Symbol code of a the base cryptoasset |
target_currency | string | Symbol code of the target cryptoasset |
target_cmc_ucid | number | CMC integration target token UCID |
base_cmc_ucid | number | CMC integration base token UCID |
min_buy | string | Minimum amount of target currency |
min_sell | string | Minimum amount of base currency |
last_price | number | Price of the latest deal |
change24 | number | Price change in 24 hours positive/negative |
high24 | number | Highest price in 24 hours |
low24 | number | Lowest price in 24 |
bid | number | Price of current highest buy order |
ask | number | Price of current cheapest sell order |
base_volume | number | 24H Volume of base currency |
target_volume | number | 24H Volume of target currency |
frozen | boolean | Trading are frozen |
fee | number | Market fees represented as % of 1000 (fee / 1000) |
base_amm_liquidity | number | Total base token liqiudity available on AMM contract |
target_amm_liquidity | number | Total target token liqiudity available on AMM contract |
Tickers
curl "https://alcor.exchange/api/v2/tickers"
The above command returns JSON structured like this:
[
{
"ticker_id": "tlm-alien.worlds_wax-eosio.token",
"market_id": 26,
"target_currency": "wax-eosio.token",
"base_currency": "tlm-alien.worlds",
"min_buy": "0.50000000 WAX",
"min_sell": "1.0000 TLM",
"last_price": 0.32448004,
"change24": 3.42,
"high24": 0.34088342,
"low24": 0.30488872,
"bid": 0.32448004,
"ask": 0.32580358,
"base_volume": 100178.36015088,
"target_volume": 314152.7801
"frozen": false,
"fee": 20,
"global_ticker_id": "TLM_WAX",
"target_cmc_ucid": 2300,
"base_cmc_ucid": 9119
"base_amm_liquidity": 3710.6035,
"target_amm_liquidity": 649.92427661
}
]
Endpoint provides pricing and volume information on each market pair available on an exchange.
HTTP Request
GET https://alcor.exchange/api/v2/tickers
Without parameters returns all available tickers
Query Parameters
Parameter | Mandatory | Type | Description |
---|---|---|---|
tickers | false | array | Array of ticker_id's, for getting only selected tickers |
Responce
Name | Type | Description |
---|---|---|
ticker_id | string | Identifier of a ticker |
base_currency | string | Symbol code of a the base cryptoasset |
target_currency | string | Symbol code of the target cryptoasset |
min_buy | string | Minimum amount of target currency |
min_sell | string | Minimum amount of base currency |
last_price | number | Price of the latest deal |
change24 | number | Price change in 24 hours positive/negative |
high24 | number | Highest price in 24 hours |
low24 | number | Lowest price in 24 |
bid | number | Price of current highest buy order |
ask | number | Price of current cheapest sell order |
base_volume | number | 24H Volume of base currency |
target_volume | number | 24H Volume of target currency |
frozen | boolean | Trading are frozen |
fee | number | Market fees represented as 0.01% |
global_ticker_id | string | The ticker ID according to the standard of centralized exchanges (null for unpopular tokens) |
target_cmc_ucid | number | target Unified Cryptoasset ID if exist or null |
base_cmc_ucid | numer | base Unified Cryptoasset ID if exist or null |
base_amm_liquidity | number | Total base token liqiudity available on AMM contract |
target_amm_liquidity | number | Total target token liqiudity available on AMM contract |
Orderbook
curl "https://alcor.exchange/api/v2/tickers/pgl-prospectorsw_wax-eosio.token/orderbook?depth=3"
The above command returns JSON structured like this:
{
"ticker_id": "PGL-prospectorsw_WAX-eosio.token",
"asks": [
[
"0.66299999", // PRICE
"111.8101" // QTY
],
[
"0.66300000",
"237.5000"
],
[
"0.66400000",
"500.0000"
],
],
"bids": [
[
"0.64800031",
"74.51997085"
],
[
"0.64800030",
"87.64158563"
],
[
"0.64598927",
"150.00000000"
],
]
}
Endpoint using to provide order book information with at least depth = 3 returned for a given ticker.
HTTP Request
GET https://alcor.exchange/api/v2/tickers/:ticker_id/orderbook
Query Parameters
Parameter | Mandatory | Default | Description |
---|---|---|---|
ticker_id | true | string | ticker id |
depth | false | 300 | The number of market depth to return on each side |
Responce
Name | Type | Description |
---|---|---|
ticker_id | string | Identifier of a ticker with delimiter to separate base/target |
bids | array | Array of bids. bid structure: [price, quantity] |
asks | array | Array of asks. ask structure: [price, quantity] |
Latest Trades
Retrieve the most recent deals of a ticker, sorted by time from latest to oldest.
curl "https://alcor.exchange/api/v2/tickers/pgl-prospectorsw_wax-eosio.token/latest_trades?limit=2"
The above command returns JSON structured like this:
[
{
"trade_id": "61a0fd5b5f0f4674848b26ae",
"base_volume": 48.8126,
"target_volume": 29.52941386,
"price": 0.604955,
"time": 1637929769500,
"type": "buy"
},
{
"trade_id": "61a0fcf65f0f4674848b0cf4",
"base_volume": 12.9939,
"target_volume": 7.86070962,
"price": 0.60495104,
"time": 1637929668000,
"type": "sell"
}
]
HTTP Request
GET https://alcor.exchange/api/v2/tickers/:ticker_id/latest_trades
Query Parameters
Parameter | Mandatory | Default | Description |
---|---|---|---|
limit | false | 300 | The number of latest trades to return |
Trade history
Retrieve the recent transactions of an instrument, sorted by time from earlyer to latest.
curl "https://alcor.exchange/api/v2/tickers/pgl-prospectorsw_wax-eosio.token/historical_trades?limit=2"
The above command returns JSON structured like this:
[
{
"base_volume": 48.8126,
"price": 0.604955,
"target_volume": 29.52941386,
"time": 1637929769500,
"trade_id": "61a0fd5b5f0f4674848b26ae",
"type": "buy"
},
{
"base_volume": 12.9939,
"price": 0.60495104,
"target_volume": 7.86070962,
"time": 1637929668000,
"trade_id": "61a0fcf65f0f4674848b0cf4",
"type": "sell"
}
]
Endpoint using to return data on historical completed trades for a given ticker.
HTTP Request
GET https://alcor.exchange/api/v2/tickers/:ticker_id/historical_trades
Sorting from lasted to oldest deals
Query Parameters
Parameter | Type | Description |
---|---|---|
type | string | Filter by "sell" or "buy" trades |
limit | integer | Number of trades to retrieve |
step | integer | Offset, used for step-by-step loading of the entire history |
from | timestamp | Start time from which to query trades (milliseconds) |
to | timestamp | End time for historical trades (milliseconds) |
Responce
Name | Type | Description |
---|---|---|
trade_id | string | A unique ID associated with the trade |
price | decimal | Transaction price. |
base_volume | decimal | Transaction amount in base pair volume |
target_volume | decimal | Transaction amount in target pair volume. |
time | timestamp | Unix timestamp in milliseconds for when the transaction occurred. |
type | string | Type of the transaction that was completed. |
Klines (Candles)
curl "https://alcor.exchange/api/v2/tickers/pgl-prospectorsw_wax-eosio.token/charts?resolution=60&from=1637856799500&to=1637869859000"
The above command returns JSON structured like this:
[
{
"close": 0.57009415,
"high": 0.58999718,
"low": 0.57009415,
"open": 0.58999718,
"time": 1637856799500,
"volume": 1.34580567 // Volume in TARGET currency
},
{
"close": 0.5889,
"high": 0.5889,
"low": 0.553,
"open": 0.57009415,
"time": 1637859602500,
"volume": 817.85241392
}
]
This endpoint retrieves klines for specific ticker in a specific range.
HTTP Request
GET https://alcor.exchange/api/v2/tickers/:ticker_id/charts
Query Parameters
from, to, resolution, limit
Parameter | Mandatory | Type | Description |
---|---|---|---|
ticker_id | true | string | Ticker id |
resolution | true | string | Resolution |
from | false | timestamp | Start time for getting historical candles |
to | false | timestamp | End time till which query candles |
Supported resolutions:
1, 5, 15, 30, 60, 240, 1D, 1W, 1M
Swap
Alcor is a protocol based on the AMM concept using concentrated liquidity. Allowing you to change one eosio.token to another.
And special Alcor Swap SDK for calculating everything locally, without API.
Pool
curl https://alcor.exchange/api/v2/swap/pools/0
Get pool by ID
The above command returns JSON structured like this:
{
"chain": "wax",
"id": 1095,
"active": true,
"fee": 3000,
"feeGrowthGlobalAX64": "212803631582389957186",
"feeGrowthGlobalBX64": "1171129874747599",
"feeProtocol": 3,
"liquidity": "951789470700",
"maxLiquidityPerTick": "1247497401346422",
"protocolFeeA": 10681.09414088,
"protocolFeeB": 703.6308,
"sqrtPriceX64": "45802571509710763",
"tick": -119973,
"tickSpacing": 60,
"tokenA": {
"contract": "eosio.token",
"decimals": 8,
"symbol": "WAX",
"id": "wax-eosio.token",
"quantity": 1413257.13064633
},
"tokenB": {
"contract": "usdt.alcor",
"decimals": 4,
"symbol": "USDT",
"id": "usdt-usdt.alcor",
"quantity": 81673.5964
},
"volumeA24": 60225.61186526,
"volumeAMonth": 12102207.71289808,
"volumeAWeek": 2865840.95504714,
"volumeB24": 3703.4195999999997,
"volumeBMonth": 823163.2468,
"volumeBWeek": 175806.8865,
"volumeUSD24": 7440.385309538387,
"volumeUSDMonth": 1649849.915091903,
"volumeUSDWeek": 353479.23752087017,
"tvlUSD": 168895.21809226653,
"change24": 0.3,
"changeWeek": -0.49,
"high24": 0,
"low24": 0,
"priceA": 0.0623307,
"priceB": 16.0435
}
Query params:
Pool id should be provided inside the URL structure
Name | Type | Description | required |
---|---|---|---|
pool_id | number | Pool ID | true |
HTTP Request
GET https://alcor.exchange/api/v2/swap/pools/:<pool_id>
Responce
Name | Type | Description |
---|---|---|
id | number | pool ID |
active | number | is pool active |
fee | number | fee percent as part of (fee / 10000) |
feeGrowthGlobalAX64 | number | Global accumulated fee for token A |
feeGrowthGlobalBX64 | number | Global accumulated fee for token B |
feeProtocol | number | Protocol fee percent |
liquidity | number | Pool liquidity amount |
maxLiquidityPerTick | number | Pool max liquidity ber one tick |
protocolFeeA | asset | Protocol earned fees |
protocolFeeB | asset | Protocol earned fees |
sqrtPriceX64 | number | Pool price as sqrtPriceX64 |
tick | number | Pool current tick |
tickSpacing | number | Pool tick spacing |
tokenA | object | Token A |
tokenB | object | Token B |
volumeUSD24 | number | USD Volume for 24H |
volumeUSDWeek | number | USD Volume for 7D |
volumeUSDMonth | number | USD Volume for 30D |
volumeA24 | number | 24H volume of token A |
volumeAWeek | number | 7D volume of token A |
volumeAMonth | number | 30D volume of token A |
volumeB24 | number | 24H volume of token B |
volumeBWeek | number | 7D volume of token B |
volumeBMonth | number | 30D volume of token B |
volumeUSD24 | number | USD Volume for 24H |
volumeUSDWeek | number | USD Volume for 7D |
volumeUSDMonth | number | USD Volume for 30D |
tvlUSD | number | Total Value Locked in USD |
change24 | number | 24H price change |
changeWeek | number | 7D price change |
high24 | number | 24H price high |
low24 | number | 24H price low |
priceA | number | token A price in terms of token B |
priceB | number | token B price in terms of token A |
Pools
curl https://alcor.exchange/api/v2/swap/pools
Get all swap pools
The above command returns JSON structured like this:
[
{
"chain": "wax",
"id": 1095,
"active": true,
"fee": 3000,
"feeGrowthGlobalAX64": "212803631582389957186",
"feeGrowthGlobalBX64": "1171129874747599",
"feeProtocol": 3,
"liquidity": "951789470700",
"maxLiquidityPerTick": "1247497401346422",
"protocolFeeA": 10681.09414088,
"protocolFeeB": 703.6308,
"sqrtPriceX64": "45802571509710763",
"tick": -119973,
"tickSpacing": 60,
"tokenA": {
"contract": "eosio.token",
"decimals": 8,
"symbol": "WAX",
"id": "wax-eosio.token",
"quantity": 1413257.13064633
},
"tokenB": {
"contract": "usdt.alcor",
"decimals": 4,
"symbol": "USDT",
"id": "usdt-usdt.alcor",
"quantity": 81673.5964
},
"volumeA24": 60225.61186526,
"volumeAMonth": 12102207.71289808,
"volumeAWeek": 2865840.95504714,
"volumeB24": 3703.4195999999997,
"volumeBMonth": 823163.2468,
"volumeBWeek": 175806.8865,
"volumeUSD24": 7440.385309538387,
"volumeUSDMonth": 1649849.915091903,
"volumeUSDWeek": 353479.23752087017,
"tvlUSD": 168895.21809226653,
"change24": 0.3,
"changeWeek": -0.49,
"high24": 0,
"low24": 0,
"priceA": 0.0623307,
"priceB": 16.0435
}
...
]
HTTP Request
GET https://alcor.exchange/api/v2/swap/pools
Responce
Name | Type | Description |
---|---|---|
id | number | pool ID |
active | number | is pool active |
fee | number | fee percent as part of (fee / 10000) |
feeGrowthGlobalAX64 | number | Global accumulated fee for token A |
feeGrowthGlobalBX64 | number | Global accumulated fee for token B |
feeProtocol | number | Protocol fee percent |
liquidity | number | Pool liquidity amount |
maxLiquidityPerTick | number | Pool max liquidity ber one tick |
protocolFeeA | asset | Protocol earned fees |
protocolFeeB | asset | Protocol earned fees |
sqrtPriceX64 | number | Pool price as sqrtPriceX64 |
tick | number | Pool current tick |
tickSpacing | number | Pool tick spacing |
tokenA | object | Token A |
tokenB | object | Token B |
volumeA24 | number | 24H volume of token A |
volumeAWeek | number | 7D volume of token A |
volumeAMonth | number | 30D volume of token A |
volumeB24 | number | 24H volume of token B |
volumeBWeek | number | 7D volume of token B |
volumeBMonth | number | 30D volume of token B |
volumeUSD24 | number | USD Volume for 24H |
volumeUSDWeek | number | USD Volume for 7D |
volumeUSDMonth | number | USD Volume for 30D |
tvlUSD | number | Total Value Locked in USD |
change24 | number | 24H price change |
changeWeek | number | 7D price change |
high24 | number | 24H price high |
low24 | number | 24H price low |
priceA | number | token A price in terms of token B |
priceB | number | token B price in terms of token A |
Pool Swaps
Retrieve swap transactions for a specific pool.
curl "https://alcor.exchange/api/v2/swap/pools/1095/swaps"
The above command returns JSON structured like this:
[
{
"_id": "6528d7e4eef91d4d098a39ef",
"pool": 1095,
"recipient": "jollewaxacc1",
"trx_id": "35b62eb272381b6482272f0022d5778e6154a29b334a87a1bda37251c6acbb2e",
"sender": "jollewaxacc1",
"sqrtPriceX64": "44952921109377512",
"totalUSDVolume": 0.9253599213188954,
"tokenA": 17.60908915,
"tokenB": -1.0907,
"time": "2023-05-06T08:59:51.000Z"
},
]
HTTP Request
GET https://alcor.exchange/api/v2/swap/pools/:id/swaps
Query Parameters
Name | Type | Description | Required |
---|---|---|---|
from | timestamp | Start time from which to query swaps (milliseconds) | false |
to | timestamp | End time till which to query swaps (milliseconds) | false |
recipient | string | Account that received the swap | false |
sender | string | Account that sent the swap | false |
limit | integer | Number of swaps to retrieve | false |
skip | integer | Number of swaps to skip | false |
Response
Name | Type | Description |
---|---|---|
pool | number | Pool ID |
recipient | string | Account that received the swap |
trx_id | string | Transaction ID |
sender | string | Account that sent the swap |
sqrtPriceX64 | string | Sqrt price X64 |
totalUSDVolume | number | Total USD volume |
tokenA | object | Token A amount |
tokenB | object | Token B amount |
time | timestamp | Time of the swap (milliseconds) |
Pool Positions
curl https://alcor.exchange/api/v2/swap/pools/0/positions
The above command returns JSON structured like this:
[
{
"id": 0,
"owner": ".11dm.wam",
"tickLower": -443580,
"tickUpper": 443580,
"liquidity": 843101,
"feeGrowthInsideALastX64": "0",
"feeGrowthInsideBLastX64": "0",
"feesA": 0,
"feesB": 0,
"pool": 0,
"amountA": "1.6781 TLM",
"amountB": "0.42356913 WAX"
},
...
]
API for getting all positions of pool
HTTP Request
GET https://alcor.exchange/api/v2/swap/pools/<:pool_id>/positions
Query params:
Pool id should be provided inside the URL structure
Name | Type | Description | required |
---|---|---|---|
pool_id | number | Pool ID | true |
Responce
Name | Type | Description |
---|---|---|
id | number | position id |
owner | string | position owner account |
tickLower | number | lower tick of position |
tickUpper | number | upper tick of position |
liquidity | number | position liquidity amount |
feeGrowthInsideALastX64 | number | token A fees grow value |
feeGrowthInsideBLastX64 | number | token B fees grow value |
feesA | number | token A accumulated fees |
feesB | number | token B accumulated fees |
pool | number | pool ID |
amountA | asset | Positoin token A amount |
amountB | asset | Positoin token B amount |
Output & Route calculation
curl "https://alcor.exchange/api/v2/swapRouter/getRoute?trade_type=EXACT_INPUT&input=wax-eosio.token&output=tlm-alien.worlds&amount=1.00000000&slippage=0.30&receiver=alcordexfund&maxHops=2"
The above command returns JSON structured like this:
{
"executionPrice": {
"denominator": "100000000",
"numerator": "39285"
},
"input": "1.00000000",
"maxSent": "1.00000000",
"memo": "swapexactin#0#alcordexfund#3.9167 TLM@alien.worlds#0",
"minReceived": "3.9167",
"output": "3.9285",
"priceImpact": "0.3",
"route": [
0
]
}
Finding the best route for given input/output
To calculate output amount based on input amount use trade_type EXACT_INPUT To calculate input amount based on output amount use trade_type EXACT_OUTPUT
HTTP Request
GET https://alcor.exchange/api/v2/swapRouter/getRoute
Query params:
Name | Type | Description | required |
---|---|---|---|
trade_type | string | EXACT_OUTPUT or EXACT_INPUT | true |
input | string | Input token ID | true |
output | string | Output token ID | true |
amount | number | Amount of input/output(depends on trade_type) | true |
slippage | number | permissible slippage | false |
receiver | string | Account to receive output | false |
maxHops | number | Maximum number of intermediate pools for exchange route | false |
Responce
Name | Type | Description |
---|---|---|
executionPrice | object | Execution price in format for Price object from Swap-SDK. |
input | number | Input Amount |
output | number | Output Amount |
maxSent | number | Amount(with slippage included) to get exact output |
memo | string | Memo for the transfer action |
minReceived | number | Amount to receive with max slippage |
priceImpact | number | Swap price impact percent |
route | array[number] | Sequence of the pools id's that swap will use |
Account
Account data api
Account Spot Deals
curl https://alcor.exchange/api/v2/account/<account>/deals
The above command returns JSON structured like this:
[
{
"_id": "6675d517cbc8490fd50823ab",
"market": 763,
"type": "buymatch",
"trx_id": "14169e8d274786b984917c79f14cefa4e13d2dc823604d47f88a11c116d9e901",
"unit_price": 0.0410099,
"ask": 2.75797508,
"asker": "foreverstone",
"bid": 0.1131,
"bidder": "alcordexfund",
"time": "2024-06-21T19:31:33.000Z"
},
...
]
API for getting the spot deals history of a specific account.
HTTP Request
GET https://alcor.exchange/api/v2/account/<account>/deals
Query params:
Name | Type | Description | Required |
---|---|---|---|
account | string | Account ID | true |
from | number | Start time in seconds | false |
to | number | End time in seconds | false |
limit | number | Limit of records to return | false |
skip | number | Number of records to skip | false |
market | number | Market ID | false |
Response
Name | Type | Description |
---|---|---|
_id | string | Deal ID |
market | number | Market ID |
type | string | Type of the deal |
trx_id | string | Transaction ID |
unit_price | number | Unit price |
ask | number | Ask amount |
asker | string | Asker account |
bid | number | Bid amount |
bidder | string | Bidder account |
time | string | Time of the deal |
Account Positions
curl https://alcor.exchange/api/v2/account/<account>/positions
The above command returns JSON structured like this:
[
{
"id": 13095,
"owner": "alcordexfund",
"tickLower": 40140,
"tickUpper": 65520,
"liquidity": "1009363631498",
"feeGrowthInsideALastX64": "0",
"feeGrowthInsideBLastX64": "0",
"feesA": "41789.8580 BRWL",
"feesB": "1873.58385095 WAX",
"pool": 667,
"depositedUSDTotal": 9782.8141,
"closed": false,
"collectedFees": {
"tokenA": 0,
"tokenB": 0,
"inUSD": 0
},
"inRange": false,
"amountA": "0.0000 BRWL",
"amountB": "192032.76838783 WAX",
"totalValue": 7755.19,
"pNl": -2027.6241
},
...
]
API for getting all positions belong to specific account
HTTP Request
GET https://alcor.exchange/api/v2/swap/pools/<:pool_id>/positions
Query params:
Pool id should be provided inside the URL structure
Name | Type | Description | required |
---|---|---|---|
pool_id | number | Pool ID | true |
Responce
Name | Type | Description |
---|---|---|
id | number | position id |
owner | string | position owner account |
tickLower | number | lower tick of position |
tickUpper | number | upper tick of position |
liquidity | number | position liquidity amount |
feeGrowthInsideALastX64 | number | token A fees grow value |
feeGrowthInsideBLastX64 | number | token B fees grow value |
feesA | number | token A accumulated fees |
feesB | number | token B accumulated fees |
pool | number | pool ID |
amountA | asset | Positoin token A amount |
amountB | asset | Positoin token B amount |
depositedUSDTotal | number | total USD value deposited to position closed | number | is position closed collectedFees | object | Fees collected by position inRange | Boolean | is position in range totalValue | number | Total position value in USD pNl | number | Profit & Loss (totalValue - depositedUSDTotal)
Account Positions History
curl https://alcor.exchange/api/v2/account/<account>/positions-history
The above command returns JSON structured like this:
[
{
"_id": "666fe1a9248953a275e29568",
"tokenAUSDPrice": 0.04254746,
"tokenBUSDPrice": 0.622996928304,
"owner": "alcordexfund",
"type": "collect",
"id": 43827,
"pool": 1259,
"tokenA": 740.63011288,
"tokenB": 39.0449,
"totalUSDValue": 55.8368,
"trx_id": "cee97277979cee5ffcfa7df078050ecce9026e87b7b3eced7e517e6b10c9348c",
"time": "2024-06-17T07:11:35.000Z"
},
...
]
API for getting the position history of a specific account.
HTTP Request
GET https://alcor.exchange/api/v2/account/<account>/positions-history
Query params:
Name | Type | Description | Required |
---|---|---|---|
account | string | Account ID | true |
limit | number | Limit of records to return | false |
skip | number | Number of records to skip | false |
Response
Name | Type | Description |
---|---|---|
_id | string | Position history ID |
tokenAUSDPrice | number | Token A USD price |
tokenBUSDPrice | number | Token B USD price |
owner | string | Position owner account |
type | string | Type of the position history |
id | number | Position history ID |
pool | number | Pool ID |
tokenA | number | Token A amount |
tokenB | number | Token B amount |
totalUSDValue | number | Total USD value |
trx_id | string | Transaction ID |
time | string | Time of the position history |
Account Swap History
curl https://alcor.exchange/api/v2/account/<account>/swap-history
The above command returns JSON structured like this:
[
{
"_id": "6670108cebb327bcc470ffc3",
"pool": 1166,
"trx_id": "e9815f8ca7af5d56d08a0163ec98f1142db097ee0d356b49cb3fb2182d596006",
"sender": "alcordexfund",
"sqrtPriceX64": "335692961505657228690",
"totalUSDVolume": 20.3636278111581,
"tokenA": 14027.5692,
"tokenB": -480.37435682,
"time": "2024-06-17T10:31:37.500Z"
},
...
]
API for getting the swap history of a specific account.
HTTP Request
GET https://alcor.exchange/api/v2/account/<account>/swap-history
Query params:
Name | Type | Description | Required |
---|---|---|---|
account | string | Account ID | true |
limit | number | Limit of records to return | false |
skip | number | Number of records to skip | false |
Response
Name | Type | Description |
---|---|---|
_id | string | Swap history ID |
pool | number | Pool ID |
trx_id | string | Transaction ID |
sender | string | Swap sender account |
sqrtPriceX64 | string | Square root price X64 |
totalUSDVolume | number | Total USD volume |
tokenA | number | Token A amount |
tokenB | number | Token B amount |
time | string | Time of the swap history |
OnChain Data
To fetch data (orders/markets) directly from blockchain you have to use NodeAPI
Contract tables structute can be found here https://docs.alcor.exchange
Markets
cleos -u https://wax.greymass.com get table alcordexmain alcordexmain markets
import fetch from 'node-fetch'
import { Api, JsonRpc, RpcError } from 'eosjs'
const rpc = new JsonRpc('https://wax.greymass.com', { fetch })
// Get markets
const { rows } = await rpc.get_table_rows({
code: 'alcordexmain', // dex account
table: 'buyorder', // side
limit: 1000,
scope: 'alcordexmain', // scope same as contract name
})
The above command returns JSON structured like this:
{
"rows": [{
"id": 0,
"base_token": {
"sym": "8,WAX",
"contract": "eosio.token"
},
"quote_token": {
"sym": "4,PGL",
"contract": "prospectorsw"
},
"min_buy": "0.00000100 WAX",
"min_sell": "0.0001 PGL",
"frozen": 0,
"fee": 0
}, ...]
}
Markets are stored in markets table, scoped by contract name.
market_id are used as scope for orders table and should be provided as parameter for canceling order.
Table structute
key | description |
---|---|
id | market_id |
base_token | target currency |
quote_token | base_token currency |
min_buy | Min buy amount |
min_sell | Min sell amount |
frozen | Market are frozen if 1 |
fee | Market fee |
Orders
cleos -u https://wax.greymass.com get table alcordexmain 26 buyorder -l 2
import fetch from 'node-fetch'
import { Api, JsonRpc, RpcError } from 'eosjs'
const rpc = new JsonRpc('https://wax.greymass.com', { fetch })
// Get buy orderbook from conract table
const { rows } = await rpc.get_table_rows({
code: 'alcordexmain',
table: 'buyorder',
limit: 1000, // limit up to 1000
scope: 26, // Market id from /api/markets or markets table
key_type: 'i128', // we are using it for getting order sorted by price.
index_position: 2
})
The above command returns JSON structured like this:
{
"rows": [{
"id": 28,
"account": "pxawpxawpxaw",
"bid": "10.00000000 WAX",
"ask": "1999.9560 TLM",
"unit_price": "500012",
"timestamp": 1603653505
},{
"id": 276,
"account": "e43am.waa",
"bid": "35.00000000 WAX",
"ask": "5000.0000 TLM",
"unit_price": "700000",
"timestamp": 1609173873
}
],
"more": true,
"next_key": "558"
}
Orders are stored in buyorder and sellorder tables. Scoped by market_id(you can find one in markets table)
Table structute
key | description |
---|---|
id | order id |
account | order owner account |
unit_price | Price in integer |
timestamp | Order time creation |
WebSocket
import { io } from 'socket.io-client'
const socket = io('https://alcor.exchange')
Alcor using Socket.IO for interact via WebSocket technology.
There are two commands for subscribing to and channel with specific information.
- subscribe: Subscribing for an specific room.
- unsubscribe: Unsubscribe from sprcific room.
You can subscribe to rooms to receive specific event information.
- deals
- ticker
- account
- orderbook
Deals
// Subscribe to deals
socket.emit('subscribe', {
room: 'deals',
params: {
chain: 'wax', // Chain
market: 26 // Market id
}
})
// Handle new deals
socket.on('new_deals', deals => { ... })
// Unsubscribe from deals (will unsubscribe from all markets)
socket.emit('unsubscribe', { room: 'deals', params: { chain: 'wax' } })
Responce:
[
{
"time": 1674820074000,
"ask": 3.5771,
"bid": 0.99799129,
"type": "buymatch",
"unit_price": 0.27899985,
"trx_id": "d4acaa5ae75bccad12ca82dd2d1d3fa5822cece1307ced10ee0daefaeb6d5009"
}
]
Subscribing to new deals for specific market.
Room name: deals
Params:
Key | Value |
---|---|
chain | chain id |
market | market id |
Orderbook
// Subscribe to buy orderbook of 26 (TLM on wax) market.
socket.emit('subscribe', {
room: 'deals',
params: {
chain: 'orderbook', // Chain
market: 26, // Market id,
side: 'buy'
}
})
// On orderbook bid side update
socket.on('orderbook_buy', bids => { ... })
// On orderbook ask side update
socket.on('orderbook_sell', asks => { ... })
// Unsubscribe from orderbook (all, buy and sell)
socket.emit('unsubscribe', { room: 'orderbook', params: { chain: 'wax', market: 26 } })
Responce:
[
[
27899985,
3044158,
8493196253
]
]
Subscribe to orderbook updates. First update is full order book state.
Room name: orderbook
Params:
Key | Value |
---|---|
chain | chain id |
market | market id |
side | sell or buy |
Ticker
// Subscribe
socket.emit('subscribe', {
room: 'ticker',
params: {
chain: 'wax',
market: 26,
resolution: '30'
}
})
// Unsubscribe
socket.emit('unsubscribe', {
room: 'ticker',
params: {
chain: 'wax',
market: 26,
resolution: '30'
}
})
Responce:
[
"tick",
{
"close": 0.01175084,
"open": 0.01175084,
"high": 0.01175084,
"low": 0.01175084,
"volume": 0.11727339,
"time": 1674821301500
}
]
Subscribe for chart updates.
Room name: ticker
Params:
Key | Value |
---|---|
chain | chain id |
market | market id |
resolution | Resolution (see list below) |
Supported resolutions:
1, 5, 15, 30, 60, 240, 1D, 1W, 1M
Account
socket.emit('subscribe', {
room: 'account', params: {
chain: 'wax',
'name': 'randomuser' // Account for listen events
}
})
Responce
[
"match",
{
"ask": 0.11727339,
"market_id": 156,
"price": 0.01175084
}
]
Subscribe to account events/notifications. Only order matches for now.
Room name: account
Params:
Key | Value |
---|---|
chain | chain id |
name | Account |
Trade API
To trade assets you sould use Blockchain API directly. More information on Interaction/NodeAPI.
Place order
cleos push action tktoken transfer \
'[bob, alcordexmain, "0.5000 TKT", "0.0010 EOS@eosio.token"]' -p bob
const actions = [{
account: 'tktoken', // token contract
name: 'transfer',
authorization: [{
actor: 'useraaaaaaaa', // account placing order (owner)
permission: 'active',
}],
data: {
from: 'useraaaaaaaa',
to: 'alcordexmain',
quantity: '0.5000 TKT', // Bid
memo: '0.0001 EOS@eosio.token' // Ask
}
}]
// Result of transaction
const r = await api.transact(actions)
Bob are selling 0.5 TKT and buying 0.001 EOS.
Send the amount(bid) you want to sell to dex contract account, and specify the amount you ask in the memo, the price and market will be automatically determined in the contract.
Memo format(ask token):
<token_amount> <token_symbol>@<token_contract>
Place multiple orders
Same way as described but transaction may contain multiple actions(array).
Cancel order
cleos push action alcordexmain cancelsell \
'[bob, 262, 1284277]' -p bob
const result = await api.transact([
{
account: 'tktoken',
name: 'transfer',
authorization: [{
actor: 'useraccountname',
permission: 'active',
}],
data: {
from: 'useraccountname',
to: 'alcordexmain',
quantity: '0.5000 TKT',
memo: '0.0010 EOS@eosio.token'
}
}
]);
Bob are canceling sell order on 262 market.
Call action cancelsell or cancelbuy with parameters:
- executor - order owner account name
- market_id - id of the order related market
- order_id - order id.
Errors
The Kittn API uses the following error codes:
Error Code | Meaning |
---|---|
400 | Bad Request -- Your request is invalid. |
401 | Unauthorized -- Your API key is wrong. |
403 | Forbidden -- The kitten requested is hidden for administrators only. |
404 | Not Found -- The specified kitten could not be found. |
405 | Method Not Allowed -- You tried to access a kitten with an invalid method. |
406 | Not Acceptable -- You requested a format that isn't json. |
410 | Gone -- The kitten requested has been removed from our servers. |
418 | I'm a teapot. |
429 | Too Many Requests -- You're requesting too many kittens! Slow down! |
500 | Internal Server Error -- We had a problem with our server. Try again later. |
503 | Service Unavailable -- We're temporarily offline for maintenance. Please try again later. |