From b1001d3bb564191abe8044937bfc94b8f586fffb Mon Sep 17 00:00:00 2001 From: sdgoh Date: Sat, 30 Jan 2021 21:31:42 +0800 Subject: [PATCH 01/28] (feat) standard endpoints & consolidate protocol library functions * merge balancer & uniswap endpoint to under /eth * consolidate functions on balancer, uniswap swaps price lookup * cache swap pool as class property * replace token contract address with token symbol on request param * add mainnet token list (1inch) * add maxswaps, ethGasStation api, gas level param to .env --- .env.example | 16 +- Dockerfile | 8 + package.json | 3 + src/app.js | 8 +- src/routes/balancer.route.js | 417 +- src/routes/eth.route.js | 52 +- src/routes/terra.route.js | 35 +- src/routes/uniswap.route.js | 382 +- src/services/balancer.js | 53 +- src/services/eth.js | 46 +- src/services/fees.js | 36 + src/services/terra.js | 2 - src/services/uniswap.js | 16 +- src/static/erc20_tokens_kovan.json | 63 +- src/static/erc20_tokens_mainnet.json | 4377 +++++++++++++++++ .../v2/Gateway.postman_collection.json | 996 ++++ .../v2/Gateway.postman_environment.json | 34 + 17 files changed, 6067 insertions(+), 477 deletions(-) create mode 100644 src/services/fees.js create mode 100644 src/static/erc20_tokens_mainnet.json create mode 100644 test/postman/v2/Gateway.postman_collection.json create mode 100644 test/postman/v2/Gateway.postman_environment.json diff --git a/.env.example b/.env.example index ff57de7..c06d6a6 100644 --- a/.env.example +++ b/.env.example @@ -41,6 +41,8 @@ EXCHANGE_PROXY={exchange_proxy} # Uniswap # Reference: https://uniswap.org/docs/v2/smart-contracts/router02/ +# UniswapV2Router02 is deployed at 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D on the Ethereum mainnet, and the Ropsten, Rinkeby, Görli, and Kovan testnets. +# It was built from commit 6961711. UNISWAP_ROUTER=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D # cert @@ -51,5 +53,15 @@ CERT_PASSPHRASE={passphrase} # default to ./logs if path is not set LOG_PATH=/Users/hbot/hummingbot_files/hummingbot_logs -# GMT offset -GMT_OFFSET=-0800 +# GMT offset for logging (alpine docker image default to UTC timezone) +# -0800, -0500, +0200, +0800 +GMT_OFFSET=+0800 + +# EthGasStation +# API key for defipulse.com gas station API +# Gas level you want to use for Ethereum transactions (fast, fastest, safeLow, average) +ETH_GAS_STATION_API_KEY={apikey} +ETH_GAS_STATION_GAS_LEVEL=fast + +# Balancer Config +BALANCER_MAX_SWAPS=4 diff --git a/Dockerfile b/Dockerfile index b81d0b6..47d8c7c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,14 @@ RUN apk add --no-cache tzdata # Set labels LABEL application="gateway-api" +LABEL branch=${BRANCH} +LABEL commit=${COMMIT} +LABEL date=${BUILD_DATE} + +# Set ENV variables +ENV COMMIT_BRANCH=${BRANCH} +ENV COMMIT_SHA=${COMMIT} +ENV BUILD_DATE=${DATE} # app directory WORKDIR /usr/src/app diff --git a/package.json b/package.json index fd26718..225d34e 100644 --- a/package.json +++ b/package.json @@ -44,5 +44,8 @@ "eslint-plugin-standard": "^4.0.1", "nodemon": "^2.0.4" }, + "engines": { + "node" : "10.x" + }, "type": "module" } diff --git a/src/app.js b/src/app.js index 76371c7..f76d574 100644 --- a/src/app.js +++ b/src/app.js @@ -39,13 +39,13 @@ app.use(bodyParser.urlencoded({ extended: true })); app.use(validateAccess) -// mount all routes to this path -app.use('/uniswap', uniswapRoutes); +// mount routes to specific path app.use('/api', apiRoutes); app.use('/eth', ethRoutes); -// app.use('/celo', celoRoutes); +app.use('/eth/uniswap', uniswapRoutes); +app.use('/eth/balancer', balancerRoutes); app.use('/terra', terraRoutes); -app.use('/balancer', balancerRoutes); +// app.use('/celo', celoRoutes); app.get('/', (req, res, next) => { res.send('ok') diff --git a/src/routes/balancer.route.js b/src/routes/balancer.route.js index 11eb975..fe1b3f4 100644 --- a/src/routes/balancer.route.js +++ b/src/routes/balancer.route.js @@ -4,11 +4,15 @@ import express from 'express'; import { getParamData, latency, reportConnectionError, statusMessages } from '../services/utils'; +import Ethereum from '../services/eth'; import Balancer from '../services/balancer'; +// import Fees from '../services/fees'; import { logger } from '../services/logger'; const router = express.Router() +const eth = new Ethereum(process.env.ETHEREUM_CHAIN) const balancer = new Balancer(process.env.ETHEREUM_CHAIN) +// const fees = new Fees() const swapMoreThanMaxPriceError = 'Price too high' const swapLessThanMaxPriceError = 'Price too low' @@ -62,125 +66,71 @@ router.post('/gas-limit', async (req, res) => { } }) -router.post('/sell-price', async (req, res) => { +router.post('/start', async (req, res) => { /* - POST: /sell-price + POST: /eth/balancer/start x-www-form-urlencoded: { - "quote":"0x....." - "base":"0x....." + "quote":"BAT" + "base":"USDC" "amount":0.1 - "maxSwaps":4 - "base_decimals":18 - "quote_decimals":18 + "gasPrice":30 } */ const initTime = Date.now() - // params: base (required), quote (required), amount (required) const paramData = getParamData(req.body) - const baseTokenAddress = paramData.base - const quoteTokenAddress = paramData.quote - const baseDenomMultiplier = 10 ** paramData.base_decimals - const quoteDenomMultiplier = 10 ** paramData.quote_decimals - const amount = new BigNumber(parseInt(paramData.amount * baseDenomMultiplier)) - let maxSwaps - if (paramData.maxSwaps) { - maxSwaps = parseInt(paramData.maxSwaps) - } + const baseTokenSymbol = paramData.base.toUpperCase() + const quoteTokenSymbol = paramData.quote.toUpperCase() + const privateKey = paramData.secret + const gasPrice = paramData.gasPrice - try { - // fetch the optimal pool mix from balancer-sor - const { swaps, expectedOut } = await balancer.priceSwapIn( - baseTokenAddress, // tokenIn is base asset - quoteTokenAddress, // tokenOut is quote asset - amount, - maxSwaps, - ) + // get token contract address and decimal + const baseTokenContractInfo = eth.getERC20TokenAddresses(baseTokenSymbol) + const quoteTokenContractInfo = eth.getERC20TokenAddresses(quoteTokenSymbol) - if (swaps != null && expectedOut != null) { - const gasLimit = estimateGasLimit(swaps.length) - res.status(200).json({ - network: balancer.network, - timestamp: initTime, - latency: latency(initTime, Date.now()), - base: baseTokenAddress, - quote: quoteTokenAddress, - amount: parseFloat(paramData.amount), - expectedOut: parseInt(expectedOut) / quoteDenomMultiplier, - price: expectedOut / amount * baseDenomMultiplier / quoteDenomMultiplier, - gasLimit: gasLimit, - swaps: swaps, - }) - } else { // no pool available - res.status(200).json({ - error: statusMessages.no_pool_available, - message: '' - }) - } + // check allowance + const spender = eth.spenders.balancer + let wallet + try { + wallet = new ethers.Wallet(privateKey, eth.provider) } catch (err) { logger.error(req.originalUrl, { message: err }) let reason - err.reason ? reason = err.reason : reason = statusMessages.operation_error + err.reason ? reason = err.reason : reason = 'Error getting wallet' res.status(500).json({ error: reason, message: err }) + return } -}) -router.post('/buy-price', async (req, res) => { - /* - POST: /buy-price - x-www-form-urlencoded: { - "quote":"0x....." - "base":"0x....." - "amount":0.1 - "maxSwaps":4 - "base_decimals":18 - "quote_decimals":18 - } - */ - const initTime = Date.now() - // params: base (required), quote (required), amount (required) - const paramData = getParamData(req.body) - const baseTokenAddress = paramData.base - const quoteTokenAddress = paramData.quote - const baseDenomMultiplier = 10 ** paramData.base_decimals - const quoteDenomMultiplier = 10 ** paramData.quote_decimals - const amount = new BigNumber(parseInt(paramData.amount * baseDenomMultiplier)) - let maxSwaps - if (paramData.maxSwaps) { - maxSwaps = parseInt(paramData.maxSwaps) - } + const tokenAddressList = {} + tokenAddressList[baseTokenContractInfo.address] = baseTokenContractInfo.decimals + tokenAddressList[quoteTokenContractInfo.address] = quoteTokenContractInfo.decimals + + const allowance = {} + let decimals + let approvalAmount try { - // fetch the optimal pool mix from balancer-sor - const { swaps, expectedIn } = await balancer.priceSwapOut( - quoteTokenAddress, // tokenIn is quote asset - baseTokenAddress, // tokenOut is base asset - amount, - maxSwaps, - ) + // await fees.getETHGasStationFee().then(fee => { + // ethGasStationFee['fast'] = fee + // }) - if (swaps != null && expectedIn != null) { - const gasLimit = estimateGasLimit(swaps.length) - res.status(200).json({ - network: balancer.network, - timestamp: initTime, - latency: latency(initTime, Date.now()), - base: baseTokenAddress, - quote: quoteTokenAddress, - amount: parseFloat(paramData.amount), - expectedIn: parseInt(expectedIn) / quoteDenomMultiplier, - price: expectedIn / amount * baseDenomMultiplier / quoteDenomMultiplier, - gasLimit: gasLimit, - swaps: swaps, - }) - } else { // no pool available - res.status(200).json({ - error: statusMessages.no_pool_available, - message: '' + Promise.all( + Object.keys(tokenAddressList).map(async (key, index) => + allowance[key] = await eth.getERC20Allowance(wallet, spender, key, tokenAddressList[key]) + )).then(() => { + const approvals = {} + Promise.all( + Object.keys(allowance).map(async (address, index) => { + decimals = tokenAddressList[address] + paramData.approvalAmount + ? approvalAmount = ethers.utils.parseUnits(paramData.approvalAmount, decimals) + : approvalAmount = ethers.utils.parseUnits('1000000000', decimals) // approve for 1 billion units if no amount specified + approvals[address] = allowance[address] === 0 ? await eth.approveERC20(wallet, spender, address, approvalAmount, gasPrice) : '' + })).then(() => { }) - } + }) } catch (err) { logger.error(req.originalUrl, { message: err }) let reason @@ -189,92 +139,84 @@ router.post('/buy-price', async (req, res) => { error: reason, message: err }) + return + } + + // update pool + await balancer.fetchPool(baseTokenContractInfo.address, quoteTokenContractInfo.address) + + const result = { + network: eth.network, + timestamp: initTime, + latency: latency(initTime, Date.now()), + success: true, + base: baseTokenContractInfo, + quote: quoteTokenContractInfo, + pools: balancer.cachedPools.pools.length, } + console.log(balancer.cachedPools) + res.status(200).json(result) }) -router.post('/sell', async (req, res) => { +router.post('/price', async (req, res) => { /* - POST: /sell + POST: /eth/balancer/price x-www-form-urlencoded: { - "quote":"0x....." - "base":"0x....." + "quote":"BAT" + "base":"USDC" "amount":0.1 - "base_decimals":18 - "quote_decimals":18 - "minPrice":1 - "gasPrice":10 - "maxSwaps":4 - "privateKey":{{privateKey}} + "side":buy } */ const initTime = Date.now() - // params: privateKey (required), base (required), quote (required), amount (required), maxPrice (required), gasPrice (required) + // params: base (required), quote (required), amount (required) const paramData = getParamData(req.body) - const privateKey = paramData.privateKey - const wallet = new ethers.Wallet(privateKey, balancer.provider) - const baseTokenAddress = paramData.base - const quoteTokenAddress = paramData.quote - const baseDenomMultiplier = 10 ** paramData.base_decimals - const quoteDenomMultiplier = 10 ** paramData.quote_decimals - const amount = new BigNumber(parseInt(paramData.amount * baseDenomMultiplier)) - - let maxPrice - if (paramData.maxPrice) { - maxPrice = parseFloat(paramData.maxPrice) - } - let gasPrice - if (paramData.gasPrice) { - gasPrice = parseFloat(paramData.gasPrice) - } - let maxSwaps - if (paramData.maxSwaps) { - maxSwaps = parseInt(paramData.maxSwaps) - } - - const minAmountOut = maxPrice / amount * baseDenomMultiplier - logger.debug('minAmountOut', minAmountOut) + const baseTokenContractInfo = eth.getERC20TokenAddresses(paramData.base) + const quoteTokenContractInfo = eth.getERC20TokenAddresses(paramData.quote) + const baseTokenAddress = baseTokenContractInfo.address + const quoteTokenAddress = quoteTokenContractInfo.address + const baseDenomMultiplier = 10 ** baseTokenContractInfo.decimals + const quoteDenomMultiplier = 10 ** quoteTokenContractInfo.decimals + const amount = new BigNumber(parseInt(paramData.amount * baseDenomMultiplier)) + const maxSwaps = balancer.maxSwaps + const side = paramData.side try { // fetch the optimal pool mix from balancer-sor - const { swaps, expectedOut } = await balancer.priceSwapIn( - baseTokenAddress, // tokenIn is base asset - quoteTokenAddress, // tokenOut is quote asset - amount, - maxSwaps, - ) - - const price = expectedOut / amount * baseDenomMultiplier / quoteDenomMultiplier - logger.info(`Price: ${price.toString()}`) - if (!maxPrice || price >= maxPrice) { - // pass swaps to exchange-proxy to complete trade - const tx = await balancer.swapExactIn( - wallet, - swaps, - baseTokenAddress, // tokenIn is base asset - quoteTokenAddress, // tokenOut is quote asset - amount.toString(), - parseInt(expectedOut) / quoteDenomMultiplier, - gasPrice, + const { swaps, expectedAmount } = side === 'buy' + ? await balancer.priceSwapOut( + quoteTokenAddress, // tokenIn is quote asset + baseTokenAddress, // tokenOut is base asset + amount, + maxSwaps, + ) + : await balancer.priceSwapIn( + baseTokenAddress, // tokenIn is base asset + quoteTokenAddress, // tokenOut is quote asset + amount, + maxSwaps, ) - // submit response + if (swaps != null && expectedAmount != null) { + const gasLimit = estimateGasLimit(swaps.length) res.status(200).json({ network: balancer.network, timestamp: initTime, latency: latency(initTime, Date.now()), - base: baseTokenAddress, - quote: quoteTokenAddress, + base: baseTokenContractInfo, + quote: quoteTokenContractInfo, amount: parseFloat(paramData.amount), - expectedOut: expectedOut / quoteDenomMultiplier, - price: price, - txHash: tx.hash, + side: side, + expectedAmount: parseInt(expectedAmount) / quoteDenomMultiplier, + price: expectedAmount / amount * baseDenomMultiplier / quoteDenomMultiplier, + gasLimit: gasLimit, + swaps: swaps, }) - } else { + } else { // no pool available res.status(200).json({ - error: swapLessThanMaxPriceError, - message: `Swap price ${price} lower than maxPrice ${maxPrice}` + error: statusMessages.no_pool_available, + message: '' }) - logger.debug(`Swap price ${price} lower than maxPrice ${maxPrice}`) } } catch (err) { logger.error(req.originalUrl, { message: err }) @@ -287,85 +229,128 @@ router.post('/sell', async (req, res) => { } }) -router.post('/buy', async (req, res) => { +router.post('/trade', async (req, res) => { /* - POST: /buy + POST: /trade x-www-form-urlencoded: { - "quote":"0x....." - "base":"0x....." + "quote":"BAT" + "base":"USDC" "amount":0.1 - "base_decimals":18 - "quote_decimals":18 - "maxPrice":1 + "limitPrice":1 "gasPrice":10 - "maxSwaps":4 + "side":{buy|sell} "privateKey":{{privateKey}} } */ const initTime = Date.now() - // params: privateKey (required), base (required), quote (required), amount (required), maxPrice (required), gasPrice (required) const paramData = getParamData(req.body) const privateKey = paramData.privateKey const wallet = new ethers.Wallet(privateKey, balancer.provider) - const baseTokenAddress = paramData.base - const quoteTokenAddress = paramData.quote - const baseDenomMultiplier = 10 ** paramData.base_decimals - const quoteDenomMultiplier = 10 ** paramData.quote_decimals - const amount = new BigNumber(parseInt(paramData.amount * baseDenomMultiplier)) - let maxPrice - if (paramData.maxPrice) { - maxPrice = parseFloat(paramData.maxPrice) + const baseTokenContractInfo = eth.getERC20TokenAddresses(paramData.base) + const quoteTokenContractInfo = eth.getERC20TokenAddresses(paramData.quote) + const baseTokenAddress = baseTokenContractInfo.address + const quoteTokenAddress = quoteTokenContractInfo.address + const baseDenomMultiplier = 10 ** baseTokenContractInfo.decimals + const quoteDenomMultiplier = 10 ** quoteTokenContractInfo.decimals + const amount = new BigNumber(parseInt(paramData.amount * baseDenomMultiplier)) + + const maxSwaps = balancer.maxSwaps + const side = paramData.side + + let limitPrice + if (paramData.limitPrice) { + limitPrice = parseFloat(paramData.limitPrice) } let gasPrice if (paramData.gasPrice) { gasPrice = parseFloat(paramData.gasPrice) } - let maxSwaps - if (paramData.maxSwaps) { - maxSwaps = parseInt(paramData.maxSwaps) - } try { // fetch the optimal pool mix from balancer-sor - const { swaps, expectedIn } = await balancer.priceSwapOut( - quoteTokenAddress, // tokenIn is quote asset - baseTokenAddress, // tokenOut is base asset - amount, - maxSwaps, - ) - - const price = expectedIn / amount * baseDenomMultiplier / quoteDenomMultiplier - logger.info(`Price: ${price.toString()}`) - if (!maxPrice || price <= maxPrice) { - // pass swaps to exchange-proxy to complete trade - const tx = await balancer.swapExactOut( - wallet, - swaps, - quoteTokenAddress, // tokenIn is quote asset - baseTokenAddress, // tokenOut is base asset - expectedIn.toString(), - gasPrice, + const { swaps, expectedAmount } = side === 'buy' + ? await balancer.priceSwapOut( + quoteTokenAddress, // tokenIn is quote asset + baseTokenAddress, // tokenOut is base asset + amount, + maxSwaps, + ) + : await balancer.priceSwapIn( + baseTokenAddress, // tokenIn is base asset + quoteTokenAddress, // tokenOut is quote asset + amount, + maxSwaps, ) + if (side === 'buy') { + const price = expectedAmount / amount * baseDenomMultiplier / quoteDenomMultiplier + logger.info(`Price: ${price.toString()}`) + if (!limitPrice || price <= limitPrice) { + // pass swaps to exchange-proxy to complete trade + const tx = await balancer.swapExactOut( + wallet, + swaps, + quoteTokenAddress, // tokenIn is quote asset + baseTokenAddress, // tokenOut is base asset + expectedAmount.toString(), + gasPrice, + ) - // submit response - res.status(200).json({ - network: balancer.network, - timestamp: initTime, - latency: latency(initTime, Date.now()), - base: baseTokenAddress, - quote: quoteTokenAddress, - amount: parseFloat(paramData.amount), - expectedIn: expectedIn / quoteDenomMultiplier, - price: price, - txHash: tx.hash, - }) + // submit response + res.status(200).json({ + network: balancer.network, + timestamp: initTime, + latency: latency(initTime, Date.now()), + base: baseTokenContractInfo, + quote: quoteTokenContractInfo, + amount: parseFloat(paramData.amount), + expectedIn: expectedAmount / quoteDenomMultiplier, + price: price, + txHash: tx.hash, + }) + } else { + res.status(200).json({ + error: swapMoreThanMaxPriceError, + message: `Swap price ${price} exceeds limitPrice ${limitPrice}` + }) + logger.debug(`Swap price ${price} exceeds limitPrice ${limitPrice}`) + } } else { - res.status(200).json({ - error: swapMoreThanMaxPriceError, - message: `Swap price ${price} exceeds maxPrice ${maxPrice}` - }) - logger.debug(`Swap price ${price} exceeds maxPrice ${maxPrice}`) + // sell + const minAmountOut = limitPrice / amount * baseDenomMultiplier + logger.debug('minAmountOut', minAmountOut) + const price = expectedAmount / amount * baseDenomMultiplier / quoteDenomMultiplier + logger.info(`Price: ${price.toString()}`) + if (!limitPrice || price >= limitPrice) { + // pass swaps to exchange-proxy to complete trade + const tx = await balancer.swapExactIn( + wallet, + swaps, + baseTokenAddress, // tokenIn is base asset + quoteTokenAddress, // tokenOut is quote asset + amount.toString(), + parseInt(expectedAmount) / quoteDenomMultiplier, + gasPrice, + ) + // submit response + res.status(200).json({ + network: balancer.network, + timestamp: initTime, + latency: latency(initTime, Date.now()), + base: baseTokenContractInfo, + quote: quoteTokenContractInfo, + amount: parseFloat(paramData.amount), + expectedOut: expectedAmount / quoteDenomMultiplier, + price: price, + txHash: tx.hash, + }) + } else { + res.status(200).json({ + error: swapLessThanMaxPriceError, + message: `Swap price ${price} lower than limitPrice ${limitPrice}` + }) + logger.debug(`Swap price ${price} lower than limitPrice ${limitPrice}`) + } } } catch (err) { logger.error(req.originalUrl, { message: err }) diff --git a/src/routes/eth.route.js b/src/routes/eth.route.js index c5c8798..822005b 100644 --- a/src/routes/eth.route.js +++ b/src/routes/eth.route.js @@ -1,7 +1,7 @@ import { ethers, BigNumber } from 'ethers'; import express from 'express'; -import { getParamData, latency, reportConnectionError, statusMessages } from '../services/utils'; +import { getParamData, latency, statusMessages } from '../services/utils'; import Ethereum from '../services/eth'; import { logger } from '../services/logger'; @@ -12,6 +12,18 @@ const spenders = { uniswap: process.env.UNISWAP_ROUTER } +router.post('/', async (req, res) => { + /* + POST / + */ + res.status(200).json({ + network: eth.network, + rpcUrl: eth.provider.connection.url, + connection: true, + timestamp: Date.now(), + }) +}) + router.post('/balances', async (req, res) => { /* POST: /balances @@ -36,10 +48,14 @@ router.post('/balances', async (req, res) => { }) return } - let tokenAddressList - if (paramData.tokenAddressList) { - tokenAddressList = JSON.parse(paramData.tokenAddressList) - } + + // populate token contract info using token symbol list + const tokenAddressList = {} + const tokenList = JSON.parse(paramData.tokenList) + tokenList.forEach(symbol => { + const tokenContractInfo = eth.getERC20TokenAddresses(symbol) + tokenAddressList[tokenContractInfo.address] = tokenContractInfo.decimals + }); const balances = {} balances.ETH = await eth.getETHBalance(wallet, privateKey) @@ -93,10 +109,14 @@ router.post('/allowances', async (req, res) => { }) return } - let tokenAddressList - if (paramData.tokenAddressList) { - tokenAddressList = JSON.parse(paramData.tokenAddressList) - } + + // populate token contract info using token symbol list + const tokenAddressList = {} + const tokenList = JSON.parse(paramData.tokenList) + tokenList.forEach(symbol => { + const tokenContractInfo = eth.getERC20TokenAddresses(symbol) + tokenAddressList[tokenContractInfo.address] = tokenContractInfo.decimals + }); const approvals = {} try { @@ -270,10 +290,12 @@ router.post('/approve', async (req, res) => { }) return } - const tokenAddress = paramData.tokenAddress - let amount, decimals - paramData.decimals ? decimals = paramData.decimals - : decimals = 18 + const token = paramData.token + const tokenContractInfo = eth.getERC20TokenAddresses(token) + const tokenAddress = tokenContractInfo.address + const decimals = tokenContractInfo.decimals + + let amount paramData.amount ? amount = ethers.utils.parseUnits(paramData.amount, decimals) : amount = ethers.utils.parseUnits('1000000000', decimals) // approve for 1 billion units if no amount specified let gasPrice @@ -284,7 +306,7 @@ router.post('/approve', async (req, res) => { try { // call approve function const approval = await eth.approveERC20(wallet, spender, tokenAddress, amount, gasPrice) - logger.info('eth.route - Approving allowance', { message: tokenAddress }) + // console.log('eth.route - Approving allowance', { message: approval }) // submit response res.status(200).json({ network: eth.network, @@ -361,7 +383,7 @@ router.post('/get-weth', async (req, res) => { } }) -router.post('/get-receipt', async (req, res) => { +router.post('/poll', async (req, res) => { const initTime = Date.now() const paramData = getParamData(req.body) const txHash = paramData.txHash diff --git a/src/routes/terra.route.js b/src/routes/terra.route.js index 96cab36..366f3fd 100644 --- a/src/routes/terra.route.js +++ b/src/routes/terra.route.js @@ -75,13 +75,38 @@ router.post('/balances', async (req, res) => { } }) +router.post('/start', async (req, res) => { + /* + POST: /terra/start + x-www-form-urlencoded: { + "base":"UST" + "quote":"KRT" + "amount":1 + } + */ + const initTime = Date.now() + const paramData = getParamData(req.body) + const baseTokenSymbol = paramData.base + const quoteTokenSymbol = paramData.quote + + const result = { + network: network, + timestamp: initTime, + latency: latency(initTime, Date.now()), + success: true, + base: baseTokenSymbol, + quote: quoteTokenSymbol, + } + res.status(200).json(result) +}) + router.post('/price', async (req, res) => { /* POST: x-www-form-urlencoded: { "base":"UST" "quote":"KRT" - "trade_type":"buy" or "sell" + "side":"buy" or "sell" "amount":1 } */ @@ -90,7 +115,7 @@ router.post('/price', async (req, res) => { const paramData = getParamData(req.body) const baseToken = paramData.base const quoteToken = paramData.quote - const tradeType = paramData.trade_type + const tradeType = paramData.side const amount = parseFloat(paramData.amount) let exchangeRate @@ -141,7 +166,7 @@ router.post('/trade', async (req, res) => { data: { "base":"UST" "quote":"KRT" - "trade_type":"buy" or "sell" + "side":"buy" or "sell" "amount":1 "secret": "mysupersecret" } @@ -151,11 +176,11 @@ router.post('/trade', async (req, res) => { const paramData = getParamData(req.body) const baseToken = paramData.base const quoteToken = paramData.quote - const tradeType = paramData.trade_type + const tradeType = paramData.side const amount = parseFloat(paramData.amount) const gasPrice = parseFloat(paramData.gas_price) || terra.lcd.config.gasPrices.uluna const gasAdjustment = paramData.gas_adjustment || terra.lcd.config.gasAdjustment - const secret = paramData.secret + const secret = paramData.privateKey let tokenSwaps diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index 6e76505..9530a8a 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -3,11 +3,13 @@ import express from 'express'; import { getParamData, latency, statusMessages } from '../services/utils'; import { logger } from '../services/logger'; +import Ethereum from '../services/eth'; import Uniswap from '../services/uniswap'; require('dotenv').config() const router = express.Router() +const eth = new Ethereum(process.env.ETHEREUM_CHAIN) const uniswap = new Uniswap(process.env.ETHEREUM_CHAIN) uniswap.generate_tokens() setTimeout(uniswap.update_pairs.bind(uniswap), 2000) @@ -72,143 +74,112 @@ router.post('/gas-limit', async (req, res) => { } }) -router.post('/sell-price', async (req, res) => { +router.post('/start', async (req, res) => { /* - POST: /sell-price + POST: /eth/uniswap/start x-www-form-urlencoded: { - "quote":"0x....." - "base":"0x....." + "quote":"BAT" + "base":"DAI" "amount":0.1 + "gasPrice":30 } */ const initTime = Date.now() - // params: base (required), quote (required), amount (required) const paramData = getParamData(req.body) - const baseTokenAddress = paramData.base - const quoteTokenAddress = paramData.quote - const amount = paramData.amount + const baseTokenSymbol = paramData.base.toUpperCase() + const quoteTokenSymbol = paramData.quote.toUpperCase() + const orderType = paramData.side + const privateKey = paramData.secret + const gasPrice = paramData.gasPrice - try { - // fetch the optimal pool mix from uniswap - const { trade, expectedOut } = await uniswap.priceSwapIn( - baseTokenAddress, // tokenIn is base asset - quoteTokenAddress, // tokenOut is quote asset - amount - ) + // get token contract address and decimal + const baseTokenContractInfo = eth.getERC20TokenAddresses(baseTokenSymbol) + const quoteTokenContractInfo = eth.getERC20TokenAddresses(quoteTokenSymbol) - if (trade !== null && expectedOut !== null) { - res.status(200).json({ - network: uniswap.network, - timestamp: initTime, - latency: latency(initTime, Date.now()), - base: baseTokenAddress, - quote: quoteTokenAddress, - amount: amount, - expectedOut: expectedOut.toSignificant(8), - price: trade.executionPrice.toSignificant(8), - trade: trade, - }) - } else { // no pool available - res.status(200).json({ - error: statusMessages.no_pool_available, - message: '' - }) - } + // check allowance + const spender = eth.spenders.balancer + let wallet + try { + wallet = new ethers.Wallet(privateKey, eth.provider) } catch (err) { logger.error(req.originalUrl, { message: err }) let reason - let errCode = 500 - if (Object.keys(err).includes('isInsufficientReservesError')) { - errCode = 200 - reason = statusMessages.insufficient_reserves + ' in Sell at Uniswap' - } else if (Object.getOwnPropertyNames(err).includes('message')) { - reason = getErrorMessage(err.message) - if (reason === statusMessages.no_pool_available) { - errCode = 200 - } - } else { - err.reason ? reason = err.reason : reason = statusMessages.operation_error - } - res.status(errCode).json({ + err.reason ? reason = err.reason : reason = 'Error getting wallet' + res.status(500).json({ error: reason, message: err }) + return } -}) -router.post('/buy-price', async (req, res) => { - /* - POST: /buy-price - x-www-form-urlencoded: { - "quote":"0x....." - "base":"0x....." - "amount":0.1 - } - */ - const initTime = Date.now() - // params: base (required), quote (required), amount (required) - const paramData = getParamData(req.body) - const baseTokenAddress = paramData.base - const quoteTokenAddress = paramData.quote - const amount = paramData.amount + const tokenAddressList = {} + tokenAddressList[baseTokenContractInfo.address] = baseTokenContractInfo.decimals + tokenAddressList[quoteTokenContractInfo.address] = quoteTokenContractInfo.decimals + + const allowance = {} + let decimals + let approvalAmount try { - // fetch the optimal pool mix from uniswap - const { trade, expectedIn } = await uniswap.priceSwapOut( - quoteTokenAddress, // tokenIn is quote asset - baseTokenAddress, // tokenOut is base asset - amount - ) - if (trade !== null && expectedIn !== null) { - res.status(200).json({ - network: uniswap.network, - timestamp: initTime, - latency: latency(initTime, Date.now()), - base: baseTokenAddress, - quote: quoteTokenAddress, - amount: amount, - expectedIn: expectedIn.toSignificant(8), - price: trade.executionPrice.invert().toSignificant(8), - trade: trade, - }) - } else { // no pool available - res.status(200).json({ - error: statusMessages.no_pool_available, - message: '' + // await fees.getETHGasStationFee().then(fee => { + // ethGasStationFee['fast'] = fee + // }) + + Promise.all( + Object.keys(tokenAddressList).map(async (key, index) => + allowance[key] = await eth.getERC20Allowance(wallet, spender, key, tokenAddressList[key]) + )).then(() => { + const approvals = {} + Promise.all( + Object.keys(allowance).map(async (address, index) => { + decimals = tokenAddressList[address] + paramData.approvalAmount + ? approvalAmount = ethers.utils.parseUnits(paramData.approvalAmount, decimals) + : approvalAmount = ethers.utils.parseUnits('1000000000', decimals) // approve for 1 billion units if no amount specified + approvals[address] = allowance[address] === 0 ? await eth.approveERC20(wallet, spender, address, approvalAmount, gasPrice) : '' + })).then(() => { }) - } + }) } catch (err) { logger.error(req.originalUrl, { message: err }) let reason - let errCode = 500 - if (Object.keys(err).includes('isInsufficientReservesError')) { - errCode = 200 - reason = statusMessages.insufficient_reserves + ' in Buy at Uniswap' - } else if (Object.getOwnPropertyNames(err).includes('message')) { - reason = getErrorMessage(err.message) - if (reason === statusMessages.no_pool_available) { - errCode = 200 - } - } else { - err.reason ? reason = err.reason : reason = statusMessages.operation_error - } - res.status(errCode).json({ + err.reason ? reason = err.reason : reason = statusMessages.operation_error + res.status(500).json({ error: reason, message: err }) + return + } + + // update pool + const tokenList = orderType === 'buy' + ? { in: baseTokenContractInfo.address, out: quoteTokenContractInfo.address } + : { in: quoteTokenContractInfo.address, out: baseTokenContractInfo.address } + await uniswap.fetch_route(tokenList.in, tokenList.out) + + const result = { + network: eth.network, + timestamp: initTime, + latency: latency(initTime, Date.now()), + success: true, + base: baseTokenContractInfo, + quote: quoteTokenContractInfo, + pools: uniswap.cachedRoutes.length, } + res.status(200).json(result) }) -router.post('/sell', async (req, res) => { +router.post('/trade', async (req, res) => { /* - POST: /sell + POST: /trade x-www-form-urlencoded: { - "quote":"0x....." - "base":"0x....." + "quote":"BAT" + "base":"DAI" "amount":0.1 - "minPrice":1 + "limitPrice":1 "gasPrice":10 "privateKey":{{privateKey}} + "side":{buy|sell} } */ const initTime = Date.now() @@ -216,13 +187,17 @@ router.post('/sell', async (req, res) => { const paramData = getParamData(req.body) const privateKey = paramData.privateKey const wallet = new ethers.Wallet(privateKey, uniswap.provider) - const baseTokenAddress = paramData.base - const quoteTokenAddress = paramData.quote const amount = paramData.amount - let maxPrice - if (paramData.maxPrice) { - maxPrice = parseFloat(paramData.maxPrice) + const baseTokenContractInfo = eth.getERC20TokenAddresses(paramData.base) + const quoteTokenContractInfo = eth.getERC20TokenAddresses(paramData.quote) + const baseTokenAddress = baseTokenContractInfo.address + const quoteTokenAddress = quoteTokenContractInfo.address + const side = paramData.side + + let limitPrice + if (paramData.limitPrice) { + limitPrice = parseFloat(paramData.limitPrice) } let gasPrice if (paramData.gasPrice) { @@ -231,41 +206,79 @@ router.post('/sell', async (req, res) => { try { // fetch the optimal pool mix from uniswap - const { trade, expectedOut } = await uniswap.priceSwapIn( - baseTokenAddress, // tokenIn is base asset - quoteTokenAddress, // tokenOut is quote asset - amount - ) - - const price = trade.executionPrice.toSignificant(8) - logger.debug(`Price: ${price.toString()}`) - if (!maxPrice || price >= maxPrice) { - // pass swaps to exchange-proxy to complete trade - const tx = await uniswap.swapExactIn( - wallet, - trade, - baseTokenAddress, - gasPrice, + const { trade, expectedAmount } = side === 'buy' + ? await uniswap.priceSwapOut( + quoteTokenAddress, // tokenIn is quote asset + baseTokenAddress, // tokenOut is base asset + amount + ) + : await uniswap.priceSwapIn( + baseTokenAddress, // tokenIn is base asset + quoteTokenAddress, // tokenOut is quote asset + amount ) - // submit response - res.status(200).json({ - network: uniswap.network, - timestamp: initTime, - latency: latency(initTime, Date.now()), - base: baseTokenAddress, - quote: quoteTokenAddress, - amount: amount, - expectedOut: expectedOut.toSignificant(8), - price: price, - txHash: tx.hash, - }) + if (side === 'buy') { + const price = trade.executionPrice.invert().toSignificant(8) + logger.info(`uniswap.route - Price: ${price.toString()}`) + if (!limitPrice || price <= limitPrice) { + // pass swaps to exchange-proxy to complete trade + const tx = await uniswap.swapExactOut( + wallet, + trade, + baseTokenAddress, + gasPrice, + ) + // submit response + res.status(200).json({ + network: uniswap.network, + timestamp: initTime, + latency: latency(initTime, Date.now()), + base: baseTokenAddress, + quote: quoteTokenAddress, + amount: amount, + expectedIn: expectedAmount.toSignificant(8), + price: price, + txHash: tx.hash, + }) + } else { + res.status(200).json({ + error: swapMoreThanMaxPriceError, + message: `Swap price ${price} exceeds limitPrice ${limitPrice}` + }) + logger.info(`uniswap.route - Swap price ${price} exceeds limitPrice ${limitPrice}`) + } } else { - res.status(200).json({ - error: swapLessThanMaxPriceError, - message: `Swap price ${price} lower than maxPrice ${maxPrice}` - }) - logger.info(`uniswap.route - Swap price ${price} lower than maxPrice ${maxPrice}`) + // sell + const price = trade.executionPrice.toSignificant(8) + logger.debug(`Price: ${price.toString()}`) + if (!limitPrice || price >= limitPrice) { + // pass swaps to exchange-proxy to complete trade + const tx = await uniswap.swapExactIn( + wallet, + trade, + baseTokenAddress, + gasPrice, + ) + // submit response + res.status(200).json({ + network: uniswap.network, + timestamp: initTime, + latency: latency(initTime, Date.now()), + base: baseTokenAddress, + quote: quoteTokenAddress, + amount: amount, + expectedOut: expectedAmount.toSignificant(8), + price: price, + txHash: tx.hash, + }) + } else { + res.status(200).json({ + error: swapLessThanMaxPriceError, + message: `Swap price ${price} lower than limitPrice ${limitPrice}` + }) + logger.info(`uniswap.route - Swap price ${price} lower than limitPrice ${limitPrice}`) + } } } catch (err) { logger.error(req.originalUrl, { message: err }) @@ -278,56 +291,45 @@ router.post('/sell', async (req, res) => { } }) -router.post('/buy', async (req, res) => { +router.post('/price', async (req, res) => { /* - POST: /buy + POST: /price x-www-form-urlencoded: { - "quote":"0x....." - "base":"0x....." - "amount":0.1 - "maxPrice":1 - "gasPrice":10 - "privateKey":{{privateKey}} + "quote":"BAT" + "base":"DAI" + "amount":1 } */ const initTime = Date.now() - // params: privateKey (required), base (required), quote (required), amount (required), maxPrice (required), gasPrice (required) + // params: base (required), quote (required), amount (required) const paramData = getParamData(req.body) - const privateKey = paramData.privateKey - const wallet = new ethers.Wallet(privateKey, uniswap.provider) - const baseTokenAddress = paramData.base - const quoteTokenAddress = paramData.quote const amount = paramData.amount - let maxPrice - if (paramData.maxPrice) { - maxPrice = parseFloat(paramData.maxPrice) - } - let gasPrice - if (paramData.gasPrice) { - gasPrice = parseFloat(paramData.gasPrice) - } + const baseTokenContractInfo = eth.getERC20TokenAddresses(paramData.base) + const quoteTokenContractInfo = eth.getERC20TokenAddresses(paramData.quote) + const baseTokenAddress = baseTokenContractInfo.address + const quoteTokenAddress = quoteTokenContractInfo.address + const side = paramData.side try { // fetch the optimal pool mix from uniswap - const { trade, expectedIn } = await uniswap.priceSwapOut( - quoteTokenAddress, // tokenIn is quote asset - baseTokenAddress, // tokenOut is base asset - amount, - ) - - const price = trade.executionPrice.invert().toSignificant(8) - logger.info(`uniswap.route - Price: ${price.toString()}`) - if (!maxPrice || price <= maxPrice) { - // pass swaps to exchange-proxy to complete trade - const tx = await uniswap.swapExactOut( - wallet, - trade, - baseTokenAddress, - gasPrice, + const { trade, expectedAmount } = side === 'buy' + ? await uniswap.priceSwapOut( + quoteTokenAddress, // tokenIn is quote asset + baseTokenAddress, // tokenOut is base asset + amount + ) + : await uniswap.priceSwapIn( + baseTokenAddress, // tokenIn is base asset + quoteTokenAddress, // tokenOut is quote asset + amount ) - // submit response + if (trade !== null && expectedAmount !== null) { + const price = side === 'buy' + ? trade.executionPrice.invert().toSignificant(8) + : trade.executionPrice.toSignificant(8) + res.status(200).json({ network: uniswap.network, timestamp: initTime, @@ -335,22 +337,32 @@ router.post('/buy', async (req, res) => { base: baseTokenAddress, quote: quoteTokenAddress, amount: amount, - expectedIn: expectedIn.toSignificant(8), + expectedAmount: expectedAmount.toSignificant(8), price: price, - txHash: tx.hash, + trade: trade, }) - } else { + } else { // no pool available res.status(200).json({ - error: swapMoreThanMaxPriceError, - message: `Swap price ${price} exceeds maxPrice ${maxPrice}` + error: statusMessages.no_pool_available, + message: '' }) - logger.info(`uniswap.route - Swap price ${price} exceeds maxPrice ${maxPrice}`) } } catch (err) { logger.error(req.originalUrl, { message: err }) let reason - err.reason ? reason = err.reason : reason = statusMessages.operation_error - res.status(500).json({ + let errCode = 500 + if (Object.keys(err).includes('isInsufficientReservesError')) { + errCode = 200 + reason = statusMessages.insufficient_reserves + ' in ' + side.toUpperCase() + ' at Uniswap' + } else if (Object.getOwnPropertyNames(err).includes('message')) { + reason = getErrorMessage(err.message) + if (reason === statusMessages.no_pool_available) { + errCode = 200 + } + } else { + err.reason ? reason = err.reason : reason = statusMessages.operation_error + } + res.status(errCode).json({ error: reason, message: err }) diff --git a/src/services/balancer.js b/src/services/balancer.js index d151230..39323bd 100644 --- a/src/services/balancer.js +++ b/src/services/balancer.js @@ -11,7 +11,6 @@ const MULTI_KOVAN = ' 0x2cc8688C5f75E365aaEEb4ea8D6a480405A48D2A'; const EXCHANGE_PROXY = '0x3E66B66Fd1d0b02fDa6C811Da9E0547970DB2f21'; const EXCHANGE_PROXY_KOVAN = '0x4e67bf5bD28Dd4b570FBAFe11D0633eCbA2754Ec'; const MAX_UINT = ethers.constants.MaxUint256; -const MAX_SWAPS = 4; const GAS_BASE = 200688; const GAS_PER_SWAP = 100000; @@ -23,7 +22,7 @@ export default class Balancer { this.subgraphUrl = process.env.REACT_APP_SUBGRAPH_URL this.gasBase = GAS_BASE this.gasPerSwap = GAS_PER_SWAP - this.maxSwaps = MAX_SWAPS + this.maxSwaps = process.env.BALANCER_MAX_SWAPS switch (network) { case 'mainnet': @@ -41,23 +40,29 @@ export default class Balancer { } } - async priceSwapIn (tokenIn, tokenOut, tokenInAmount, maxSwaps = MAX_SWAPS) { + async fetchPool (tokenIn, tokenOut) { + // console.log('fetchPool', tokenIn, tokenOut) + + const pools = await sor.getPoolsWithTokens(tokenIn, tokenOut) + this.cachedPools = pools + + if (pools.pools.length === 0) { + logger.debug('>>> No pools contain the tokens provided.', { message: this.network }); + return {}; + } + logger.debug('>>> Pools Retrieved.', { message: this.network }) + } + + async priceSwapIn (tokenIn, tokenOut, tokenInAmount, maxSwaps = this.maxSwaps) { // Fetch all the pools that contain the tokens provided try { - const pools = await sor.getPoolsWithTokens(tokenIn, tokenOut) - if (pools.pools.length === 0) { - logger.debug('No pools contain the tokens provided.', { message: this.network }) - return {}; - } - logger.debug('Pools Retrieved.', { message: this.network }) - // Get current on-chain data about the fetched pools let poolData if (this.network === 'mainnet') { - poolData = await sor.parsePoolDataOnChain(pools.pools, tokenIn, tokenOut, this.multiCall, this.provider) + poolData = await sor.parsePoolDataOnChain(this.cachedPools.pools, tokenIn, tokenOut, this.multiCall, this.provider) } else { // Kovan multicall throws an ENS error - poolData = await sor.parsePoolData(pools.pools, tokenIn, tokenOut) + poolData = await sor.parsePoolData(this.cachedPools.pools, tokenIn, tokenOut) } // Parse the pools and pass them to smart order outer to get the swaps needed @@ -70,8 +75,8 @@ export default class Balancer { ) const swapsFormatted = sor.formatSwapsExactAmountIn(sorSwaps, MAX_UINT, 0) - const expectedOut = sor.calcTotalOutput(swapsFormatted, poolData) - logger.debug(`Expected Out: ${expectedOut.toString()} (${tokenOut})`); + const expectedAmount = sor.calcTotalOutput(swapsFormatted, poolData) + logger.debug(`Expected Out: ${expectedAmount.toString()} (${tokenOut})`); // Create correct swap format for new proxy let swaps = []; @@ -86,7 +91,7 @@ export default class Balancer { }; swaps.push(swap); } - return { swaps, expectedOut } + return { swaps, expectedAmount } } catch (err) { logger.error(err) let reason @@ -95,22 +100,16 @@ export default class Balancer { } } - async priceSwapOut (tokenIn, tokenOut, tokenOutAmount, maxSwaps = MAX_SWAPS) { + async priceSwapOut (tokenIn, tokenOut, tokenOutAmount, maxSwaps = this.maxSwaps) { // Fetch all the pools that contain the tokens provided try { - const pools = await sor.getPoolsWithTokens(tokenIn, tokenOut) - if (pools.pools.length === 0) { - logger.debug('No pools contain the tokens provided.', { message: this.network }); - return {}; - } - logger.debug('Pools Retrieved.', { message: this.network }) // Get current on-chain data about the fetched pools let poolData if (this.network === 'mainnet') { - poolData = await sor.parsePoolDataOnChain(pools.pools, tokenIn, tokenOut, this.multiCall, this.provider) + poolData = await sor.parsePoolDataOnChain(this.cachedPools.pools, tokenIn, tokenOut, this.multiCall, this.provider) } else { // Kovan multicall throws an ENS error - poolData = await sor.parsePoolData(pools.pools, tokenIn, tokenOut) + poolData = await sor.parsePoolData(this.cachedPools.pools, tokenIn, tokenOut) } // Parse the pools and pass them to smart order outer to get the swaps needed @@ -122,8 +121,8 @@ export default class Balancer { 0 // costOutputToken: BigNumber ) const swapsFormatted = sor.formatSwapsExactAmountOut(sorSwaps, MAX_UINT, MAX_UINT) - const expectedIn = sor.calcTotalInput(swapsFormatted, poolData) - logger.debug(`Expected In: ${expectedIn.toString()} (${tokenIn})`); + const expectedAmount = sor.calcTotalInput(swapsFormatted, poolData) + logger.debug(`Expected In: ${expectedAmount.toString()} (${tokenIn})`); // Create correct swap format for new proxy let swaps = []; @@ -138,7 +137,7 @@ export default class Balancer { }; swaps.push(swap); } - return { swaps, expectedIn } + return { swaps, expectedAmount } } catch (err) { logger.error(err) let reason diff --git a/src/services/eth.js b/src/services/eth.js index 8aa280b..9a067fb 100644 --- a/src/services/eth.js +++ b/src/services/eth.js @@ -1,4 +1,5 @@ import { logger } from './logger'; +import axios from 'axios' require('dotenv').config() const fs = require('fs'); @@ -13,13 +14,16 @@ export default class Ethereum { const providerUrl = process.env.ETHEREUM_RPC_URL this.provider = new ethers.providers.JsonRpcProvider(providerUrl) this.network = network - + this.spenders = { + balancer: process.env.EXCHANGE_PROXY, + uniswap: process.env.UNISWAP_ROUTER + } + this.tokenListUrl = process.env.ETHEREUM_TOKEN_LIST_URL if (network === 'kovan') { // for kovan testing only this.erc20KovanTokens = JSON.parse(fs.readFileSync('src/static/erc20_tokens_kovan.json')) } else if (network === 'mainnet') { - // contract list no longer maintained here. changed to accept contract address via request data - // this.erc20Tokens = JSON.parse(fs.readFileSync('src/static/erc20_tokens_hummingbot.json')) + this.erc20MainnetTokens = JSON.parse(fs.readFileSync('src/static/erc20_tokens_mainnet.json')) } else { throw Error(`Invalid network ${network}`) } @@ -123,4 +127,40 @@ export default class Ethereum { return reason } } + + // get remote token list + async getTokenList (tokenListUrl) { + try { + axios.get(tokenListUrl) + .then(function (response) { + // handle success + const tokenList = response.data + return tokenList + }) + .catch(function (error) { + // handle error + console.log(error); + }) + } catch (err) { + logger.error(err) + let reason + err.reason ? reason = err.reason : reason = 'error remote token list retrieval' + return reason + } + } + + getERC20TokenAddresses (tokenSymbol) { + let tokenList + if (this.network === 'kovan') { + tokenList = this.erc20KovanTokens.tokens + } else if (this.network === 'mainnet') { + tokenList = this.erc20MainnetTokens.tokens + } else { + throw Error(`Invalid network ${this.network}`) + } + const tokenContractAddress = tokenList.filter(obj => { + return obj.symbol === tokenSymbol + }) + return tokenContractAddress[0] + } } diff --git a/src/services/fees.js b/src/services/fees.js new file mode 100644 index 0000000..22b497a --- /dev/null +++ b/src/services/fees.js @@ -0,0 +1,36 @@ +import { logger } from './logger'; +import axios from 'axios' + +require('dotenv').config() + +// constants +const ethGasStationHost = 'https://ethgasstation.info' +// const ethGasStation = process.env.ETH_GAS_STATION +const ethGasStationApiKey = process.env.ETH_GAS_STATION_API_KEY +const ethGasStationURL = ethGasStationHost + '/api/ethgasAPI.json?api-key=' + ethGasStationApiKey + +export default class Fees { + constructor () { + this.ethGasStationGasLevel = process.env.ETH_GAS_STATION_GAS_LEVEL + this.ethGasStationRefreshTime = process.env.ETH_GAS_STATION_REFRESH_TIME + } + + // get ETH Gas Station + async getETHGasStationFee (gasLevel = this.ethGasStationGasLevel) { + try { + axios.get(ethGasStationURL) + .then(function (response) { + // handle success + const gasFee = response.data[gasLevel] + // console.log(`getETHGasStationFee(${gasLevel})`, gasFee) + return gasFee + }) + } catch (err) { + console.log(err); + logger.error(err) + let reason + err.reason ? reason = err.reason : reason = 'error ETH gas fee lookup' + return reason + } + } +} diff --git a/src/services/terra.js b/src/services/terra.js index 2d57d5b..119322b 100644 --- a/src/services/terra.js +++ b/src/services/terra.js @@ -251,7 +251,6 @@ export default class Terra { const offerAmount = parseInt((swaps.offer.amount) * DENOM_UNIT) const offerCoin = new Coin(offerDenom, offerAmount) - // debug('offerCoin', offerCoin, offerAmount, 'gasPrice', gasPrice) // Create and Sign Transaction const msgSwap = new MsgSwap(address, offerCoin, swapDenom); @@ -281,7 +280,6 @@ export default class Terra { tokenSwap.txSuccess = !swapSuccess throw new Error(`encountered an error while running the transaction: ${txResult.code} ${txResult.codespace}`); } - const txHash = txResult.txhash const events = JSON.parse(txResult.raw_log)[0].events const swap = events.find(obj => { diff --git a/src/services/uniswap.js b/src/services/uniswap.js index ea732d1..98eb377 100644 --- a/src/services/uniswap.js +++ b/src/services/uniswap.js @@ -107,17 +107,17 @@ export default class Uniswap { const route = await this.fetch_route(tIn, tOut); const trade = uni.Trade.exactIn(route, tokenAmountIn); if ( trade !== undefined ){ - const expectedOut = trade.minimumAmountOut(this.allowedSlippage); + const expectedAmount = trade.minimumAmountOut(this.allowedSlippage); this.cachedRoutes[tIn.symbol + tOut.Symbol] = trade; - return { trade, expectedOut } + return { trade, expectedAmount } } return "Can't find route to swap, kindly update " } const trade = uni.Trade.bestTradeExactIn(this.pairs, tokenAmountIn, this.tokenList[tokenOut], { maxHops: 5 })[0]; if (trade === undefined){trade = this.cachedRoutes[tIn.symbol + tOut.Symbol];} else{this.cachedRoutes[tIn.symbol + tOut.Symbol] = trade;} - const expectedOut = trade.minimumAmountOut(this.allowedSlippage); - return { trade, expectedOut } + const expectedAmount = trade.minimumAmountOut(this.allowedSlippage); + return { trade, expectedAmount } } async priceSwapOut (tokenIn, tokenOut, tokenOutAmount) { @@ -129,17 +129,17 @@ export default class Uniswap { const route = await this.fetch_route(tIn, tOut); const trade = uni.Trade.exactOut(route, tokenAmountOut); if ( trade !== undefined ){ - const expectedIn = trade.maximumAmountIn(this.allowedSlippage); + const expectedAmount = trade.maximumAmountIn(this.allowedSlippage); this.cachedRoutes[tIn.symbol + tOut.Symbol] = trade; - return { trade, expectedIn } + return { trade, expectedAmount } } return } const trade = uni.Trade.bestTradeExactOut(this.pairs, this.tokenList[tokenIn], tokenAmountOut, { maxHops: 5 })[0]; if (trade === undefined){trade = this.cachedRoutes[tIn.symbol + tOut.Symbol];} else{this.cachedRoutes[tIn.symbol + tOut.Symbol] = trade;} - const expectedIn = trade.maximumAmountIn(this.allowedSlippage); - return { trade, expectedIn } + const expectedAmount = trade.maximumAmountIn(this.allowedSlippage); + return { trade, expectedAmount } } async swapExactIn (wallet, trade, tokenAddress, gasPrice) { diff --git a/src/static/erc20_tokens_kovan.json b/src/static/erc20_tokens_kovan.json index 06590e9..d4bb4e5 100644 --- a/src/static/erc20_tokens_kovan.json +++ b/src/static/erc20_tokens_kovan.json @@ -1,12 +1,55 @@ { - "BAT": "0x1f1f156E0317167c11Aa412E3d1435ea29Dc3cCE", - "WETH": "0xd0A1E359811322d97991E03f863a0C30C2cF029C", - "DAI": "0x1528F3FCc26d13F7079325Fb78D9442607781c8C", - "MKR": "0xef13C0c8abcaf5767160018d268f9697aE4f5375", - "USDC": "0x2F375e94FC336Cdec2Dc0cCB5277FE59CBf1cAe5", - "REP": "0x8c9e6c40d3402480ACE624730524fACC5482798c", - "WBTC": "0xe0C9275E44Ea80eF17579d33c55136b7DA269aEb", - "SNX": "0x86436BcE20258a6DcfE48C9512d4d49A30C4d8c4", - "ANT": "0x37f03a12241E9FD3658ad6777d289c3fb8512Bc9", - "ZRX": "0xccb0F4Cf5D3F97f4a55bb5f5cA321C3ED033f244" + "name": "kovan", + "tokens": [ + { + "symbol": "BAT", + "address": "0x1f1f156E0317167c11Aa412E3d1435ea29Dc3cCE", + "decimals": 18 + }, + { + "symbol": "WETH", + "address": "0xd0A1E359811322d97991E03f863a0C30C2cF029C", + "decimals": 18 + }, + { + "symbol": "DAI", + "address": "0x1528F3FCc26d13F7079325Fb78D9442607781c8C", + "decimals": 18 + }, + { + "symbol": "MKR", + "address": "0xef13C0c8abcaf5767160018d268f9697aE4f5375", + "decimals": 18 + }, + { + "symbol": "USDC", + "address": "0x2F375e94FC336Cdec2Dc0cCB5277FE59CBf1cAe5", + "decimals": 6 + }, + { + "symbol": "REP", + "address": "0x8c9e6c40d3402480ACE624730524fACC5482798c", + "decimals": 18 + }, + { + "symbol": "WBTC", + "address": "0xe0C9275E44Ea80eF17579d33c55136b7DA269aEb", + "decimals": 18 + }, + { + "symbol": "SNX", + "address": "0x86436BcE20258a6DcfE48C9512d4d49A30C4d8c4", + "decimals": 18 + }, + { + "symbol": "ANT", + "address": "0x37f03a12241E9FD3658ad6777d289c3fb8512Bc9", + "decimals": 18 + }, + { + "symbol": "ZRX", + "address": "0xccb0F4Cf5D3F97f4a55bb5f5cA321C3ED033f244", + "decimals": 18 + } + ] } diff --git a/src/static/erc20_tokens_mainnet.json b/src/static/erc20_tokens_mainnet.json new file mode 100644 index 0000000..b6c36f6 --- /dev/null +++ b/src/static/erc20_tokens_mainnet.json @@ -0,0 +1,4377 @@ +{ + "name": "1inch", + "timestamp": "2021-01-12T10:50:04+00:00", + "version": { "major": 37, "minor": 0, "patch": 0 }, + "keywords": ["1inch", "default", "list"], + "tokens": [ + { + "address": "0x006BeA43Baa3f7A6f765F14f10A1a1b08334EF45", + "chainId": 1, + "name": "Stox", + "symbol": "STX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x006bea43baa3f7a6f765f14f10a1a1b08334ef45.png" + }, + { + "address": "0x0327112423F3A68efdF1fcF402F6c5CB9f7C33fd", + "chainId": 1, + "name": "PieDAOBTC++", + "symbol": "BTC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0327112423f3a68efdf1fcf402f6c5cb9f7c33fd.png" + }, + { + "address": "0x0417912b3a7AF768051765040A55BB0925D4DDcF", + "chainId": 1, + "name": "LiquidityDividendsProtocol", + "symbol": "LID", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0417912b3a7af768051765040a55bb0925d4ddcf.png" + }, + { + "address": "0x04Fa0d235C4abf4BcF4787aF4CF447DE572eF828", + "chainId": 1, + "name": "UMAVotingTokenv1", + "symbol": "UMA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x04fa0d235c4abf4bcf4787af4cf447de572ef828.png" + }, + { + "address": "0x07597255910a51509CA469568B048F2597E72504", + "chainId": 1, + "name": "Uptrennd", + "symbol": "1UP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x07597255910a51509ca469568b048f2597e72504.png" + }, + { + "address": "0x08d967bb0134F2d07f7cfb6E246680c53927DD30", + "chainId": 1, + "name": "MATHToken", + "symbol": "MATH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x08d967bb0134f2d07f7cfb6e246680c53927dd30.png" + }, + { + "address": "0x0A913beaD80F321E7Ac35285Ee10d9d922659cB7", + "chainId": 1, + "name": "DOSNetworkToken", + "symbol": "DOS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0a913bead80f321e7ac35285ee10d9d922659cb7.png" + }, + { + "address": "0x0Ae055097C6d159879521C384F1D2123D1f195e6", + "chainId": 1, + "name": "STAKE", + "symbol": "STAKE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0ae055097c6d159879521c384f1d2123d1f195e6.png" + }, + { + "address": "0x0Ba45A8b5d5575935B8158a88C631E9F9C95a2e5", + "chainId": 1, + "name": "TellorTributes", + "symbol": "TRB", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0ba45a8b5d5575935b8158a88c631e9f9c95a2e5.png" + }, + { + "address": "0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e", + "chainId": 1, + "name": "yearn.finance", + "symbol": "YFI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e.png" + }, + { + "address": "0x0Cf0Ee63788A0849fE5297F3407f701E122cC023", + "chainId": 1, + "name": "Streamr", + "symbol": "DATA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0cf0ee63788a0849fe5297f3407f701e122cc023.png" + }, + { + "address": "0x0d438F3b5175Bebc262bF23753C1E53d03432bDE", + "chainId": 1, + "name": "WrappedNXM", + "symbol": "wNXM", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0d438f3b5175bebc262bf23753c1e53d03432bde.png" + }, + { + "address": "0x0D8775F648430679A709E98d2b0Cb6250d2887EF", + "chainId": 1, + "name": "BasicAttentionToken", + "symbol": "BAT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0d8775f648430679a709e98d2b0cb6250d2887ef.png" + }, + { + "address": "0x0E22734e078d6e399BCeE40a549DB591C4EA46cB", + "chainId": 1, + "name": "Streamity", + "symbol": "STM", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0e22734e078d6e399bcee40a549db591c4ea46cb.png" + }, + { + "address": "0x0E8d6b471e332F140e7d9dbB99E5E3822F728DA6", + "chainId": 1, + "name": "Abyss", + "symbol": "ABYSS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0e8d6b471e332f140e7d9dbb99e5e3822f728da6.png" + }, + { + "address": "0x0F5D2fB29fb7d3CFeE444a200298f468908cC942", + "chainId": 1, + "name": "Mana", + "symbol": "MANA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0f5d2fb29fb7d3cfee444a200298f468908cc942.png" + }, + { + "address": "0x0f7F961648aE6Db43C75663aC7E5414Eb79b5704", + "chainId": 1, + "name": "XIONetwork", + "symbol": "XIO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0f7f961648ae6db43c75663ac7e5414eb79b5704.png" + }, + { + "address": "0x1234567461d3f8Db7496581774Bd869C83D51c93", + "chainId": 1, + "name": "BitClave", + "symbol": "CAT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1234567461d3f8db7496581774bd869c83d51c93.png" + }, + { + "address": "0x12B19D3e2ccc14Da04FAe33e63652ce469b3F2FD", + "chainId": 1, + "name": "GRID", + "symbol": "GRID", + "decimals": 12, + "logoURI": "https://tokens.1inch.exchange/0x12b19d3e2ccc14da04fae33e63652ce469b3f2fd.png" + }, + { + "address": "0x12f649A9E821F90BB143089a6e56846945892ffB", + "chainId": 1, + "name": "uDOO", + "symbol": "uDOO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x12f649a9e821f90bb143089a6e56846945892ffb.png" + }, + { + "address": "0x13339fD07934CD674269726EdF3B5ccEE9DD93de", + "chainId": 1, + "name": "CurToken", + "symbol": "CUR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x13339fd07934cd674269726edf3b5ccee9dd93de.png" + }, + { + "address": "0x1453Dbb8A29551ADe11D89825CA812e05317EAEB", + "chainId": 1, + "name": "TendiesToken", + "symbol": "TEND", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1453dbb8a29551ade11d89825ca812e05317eaeb.png" + }, + { + "address": "0x1776e1F26f98b1A5dF9cD347953a26dd3Cb46671", + "chainId": 1, + "name": "Numeraire", + "symbol": "NMR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1776e1f26f98b1a5df9cd347953a26dd3cb46671.png" + }, + { + "address": "0x178c820f862B14f316509ec36b13123DA19A6054", + "chainId": 1, + "name": "EnergyWebTokenBridged", + "symbol": "EWTB", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x178c820f862b14f316509ec36b13123da19a6054.png" + }, + { + "address": "0x1985365e9f78359a9B6AD760e32412f4a445E862", + "chainId": 1, + "name": "Augur", + "symbol": "REP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1985365e9f78359a9b6ad760e32412f4a445e862.png" + }, + { + "address": "0x1A5F9352Af8aF974bFC03399e3767DF6370d82e4", + "chainId": 1, + "name": "OWLToken", + "symbol": "OWL", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1a5f9352af8af974bfc03399e3767df6370d82e4.png" + }, + { + "address": "0x1BeEF31946fbbb40B877a72E4ae04a8D1A5Cee06", + "chainId": 1, + "name": "Parachute", + "symbol": "PAR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1beef31946fbbb40b877a72e4ae04a8d1a5cee06.png" + }, + { + "address": "0x196f4727526eA7FB1e17b2071B3d8eAA38486988", + "chainId": 1, + "name": "Reserve", + "symbol": "RSV", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x196f4727526ea7fb1e17b2071b3d8eaa38486988.png" + }, + { + "address": "0x1dEa979ae76f26071870F824088dA78979eb91C8", + "chainId": 1, + "name": "Spindle", + "symbol": "SPD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1dea979ae76f26071870f824088da78979eb91c8.png" + }, + { + "address": "0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C", + "chainId": 1, + "name": "Bancor", + "symbol": "BNT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c.png" + }, + { + "address": "0x20F7A3DdF244dc9299975b4Da1C39F8D5D75f05A", + "chainId": 1, + "name": "SapienNetwork", + "symbol": "SPN", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0x20f7a3ddf244dc9299975b4da1c39f8d5d75f05a.png" + }, + { + "address": "0x221657776846890989a759BA2973e427DfF5C9bB", + "chainId": 1, + "name": "ReputationV2", + "symbol": "REPv2", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x221657776846890989a759ba2973e427dff5c9bb.png" + }, + { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "chainId": 1, + "name": "WrappedBTC", + "symbol": "WBTC", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x2260fac5e5542a773aa44fbcfedf7c193bc2c599.png" + }, + { + "address": "0x255Aa6DF07540Cb5d3d297f0D0D4D84cb52bc8e6", + "chainId": 1, + "name": "RaidenNetworkToken", + "symbol": "RDN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x255aa6df07540cb5d3d297f0d0d4d84cb52bc8e6.png" + }, + { + "address": "0x26B3038a7Fc10b36c426846a9086Ef87328dA702", + "chainId": 1, + "name": "YieldFarmingToken", + "symbol": "YFT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x26b3038a7fc10b36c426846a9086ef87328da702.png" + }, + { + "address": "0x26CE25148832C04f3d7F26F32478a9fe55197166", + "chainId": 1, + "name": "DEXTools", + "symbol": "DEXT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x26ce25148832c04f3d7f26f32478a9fe55197166.png" + }, + { + "address": "0x27054b13b1B798B345b591a4d22e6562d47eA75a", + "chainId": 1, + "name": "AirSwap", + "symbol": "AST", + "decimals": 4, + "logoURI": "https://tokens.1inch.exchange/0x27054b13b1b798b345b591a4d22e6562d47ea75a.png" + }, + { + "address": "0x28cb7e841ee97947a86B06fA4090C8451f64c0be", + "chainId": 1, + "name": "YFLink", + "symbol": "YFL", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x28cb7e841ee97947a86b06fa4090c8451f64c0be.png" + }, + { + "address": "0x28dee01D53FED0Edf5f6E310BF8Ef9311513Ae40", + "chainId": 1, + "name": "BlitzPredict", + "symbol": "XBP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x28dee01d53fed0edf5f6e310bf8ef9311513ae40.png" + }, + { + "address": "0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39", + "chainId": 1, + "name": "HEX", + "symbol": "HEX", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x2b591e99afe9f32eaa6214f7b7629768c40eeb39.png" + }, + { + "address": "0x2ba592F78dB6436527729929AAf6c908497cB200", + "chainId": 1, + "name": "Cream", + "symbol": "CREAM", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x2ba592f78db6436527729929aaf6c908497cb200.png" + }, + { + "address": "0x2C4e8f2D746113d0696cE89B35F0d8bF88E0AEcA", + "chainId": 1, + "name": "OpenSimpleToken", + "symbol": "OST", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x2c4e8f2d746113d0696ce89b35f0d8bf88e0aeca.png" + }, + { + "address": "0x2C537E5624e4af88A7ae4060C022609376C8D0EB", + "chainId": 1, + "name": "BiLira", + "symbol": "TRYB", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0x2c537e5624e4af88a7ae4060c022609376c8d0eb.png" + }, + { + "address": "0x2C974B2d0BA1716E644c1FC59982a89DDD2fF724", + "chainId": 1, + "name": "Viberate", + "symbol": "VIB", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x2c974b2d0ba1716e644c1fc59982a89ddd2ff724.png" + }, + { + "address": "0x2dAEE1AA61D60A252DC80564499A69802853583A", + "chainId": 1, + "name": "Authorship", + "symbol": "ATS", + "decimals": 4, + "logoURI": "https://tokens.1inch.exchange/0x2daee1aa61d60a252dc80564499a69802853583a.png" + }, + { + "address": "0x301C755bA0fcA00B1923768Fffb3Df7f4E63aF31", + "chainId": 1, + "name": "GlobalDigitalContent", + "symbol": "GDC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x301c755ba0fca00b1923768fffb3df7f4e63af31.png" + }, + { + "address": "0x309627af60F0926daa6041B8279484312f2bf060", + "chainId": 1, + "name": "USDB", + "symbol": "USDB", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x309627af60f0926daa6041b8279484312f2bf060.png" + }, + { + "address": "0x30f271C9E86D2B7d00a6376Cd96A1cFBD5F0b9b3", + "chainId": 1, + "name": "Decentr", + "symbol": "DEC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x30f271c9e86d2b7d00a6376cd96a1cfbd5f0b9b3.png" + }, + { + "address": "0x3166C570935a7D8554c8f4eA792ff965D2EFe1f2", + "chainId": 1, + "name": "QDAO", + "symbol": "QDAO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3166c570935a7d8554c8f4ea792ff965d2efe1f2.png" + }, + { + "address": "0x340D2bdE5Eb28c1eed91B2f790723E3B160613B7", + "chainId": 1, + "name": "BLOCKv", + "symbol": "VEE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x340d2bde5eb28c1eed91b2f790723e3b160613b7.png" + }, + { + "address": "0x37E8789bB9996CaC9156cD5F5Fd32599E6b91289", + "chainId": 1, + "name": "AidCoin", + "symbol": "AID", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x37e8789bb9996cac9156cd5f5fd32599e6b91289.png" + }, + { + "address": "0x3A92bD396aEf82af98EbC0Aa9030D25a23B11C6b", + "chainId": 1, + "name": "Tokenbox", + "symbol": "TBX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3a92bd396aef82af98ebc0aa9030d25a23b11c6b.png" + }, + { + "address": "0x3C6ff50c9Ec362efa359317009428d52115fe643", + "chainId": 1, + "name": "PeerExNetwork", + "symbol": "PERX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3c6ff50c9ec362efa359317009428d52115fe643.png" + }, + { + "address": "0x3d1BA9be9f66B8ee101911bC36D3fB562eaC2244", + "chainId": 1, + "name": "Rivetz", + "symbol": "RVT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3d1ba9be9f66b8ee101911bc36d3fb562eac2244.png" + }, + { + "address": "0x408e41876cCCDC0F92210600ef50372656052a38", + "chainId": 1, + "name": "Republic", + "symbol": "REN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x408e41876cccdc0f92210600ef50372656052a38.png" + }, + { + "address": "0x40FD72257597aA14C7231A7B1aaa29Fce868F677", + "chainId": 1, + "name": "SoraToken", + "symbol": "XOR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x40fd72257597aa14c7231a7b1aaa29fce868f677.png" + }, + { + "address": "0x419D0d8BdD9aF5e606Ae2232ed285Aff190E711b", + "chainId": 1, + "name": "FunFair", + "symbol": "FUN", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x419d0d8bdd9af5e606ae2232ed285aff190e711b.png" + }, + { + "address": "0x41AB1b6fcbB2fA9DCEd81aCbdeC13Ea6315F2Bf2", + "chainId": 1, + "name": "XinFin", + "symbol": "XDCE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x41ab1b6fcbb2fa9dced81acbdec13ea6315f2bf2.png" + }, + { + "address": "0x41e5560054824eA6B0732E656E3Ad64E20e94E45", + "chainId": 1, + "name": "Civic", + "symbol": "CVC", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x41e5560054824ea6b0732e656e3ad64e20e94e45.png" + }, + { + "address": "0x42d6622deCe394b54999Fbd73D108123806f6a18", + "chainId": 1, + "name": "SPANK", + "symbol": "SPANK", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x42d6622dece394b54999fbd73d108123806f6a18.png" + }, + { + "address": "0x43044f861ec040DB59A7e324c40507adDb673142", + "chainId": 1, + "name": "Cap", + "symbol": "CAP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x43044f861ec040db59a7e324c40507addb673142.png" + }, + { + "address": "0xfeF4185594457050cC9c23980d301908FE057Bb1", + "chainId": 1, + "name": "VIDTDatalink", + "symbol": "VIDT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xfef4185594457050cc9c23980d301908fe057bb1.png" + }, + { + "address": "0x4470BB87d77b963A013DB939BE332f927f2b992e", + "chainId": 1, + "name": "AdExNetworkV1", + "symbol": "ADXv1", + "decimals": 4, + "logoURI": "https://tokens.1inch.exchange/0x4470bb87d77b963a013db939be332f927f2b992e.png" + }, + { + "address": "0x456AE45c0CE901E2e7c99c0718031cEc0A7A59Ff", + "chainId": 1, + "name": "VisionNetwork", + "symbol": "VSN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x456ae45c0ce901e2e7c99c0718031cec0a7a59ff.png" + }, + { + "address": "0x49184E6dAe8C8ecD89d8Bdc1B950c597b8167c90", + "chainId": 1, + "name": "LIBERTAS", + "symbol": "LIBERTAS", + "decimals": 2, + "logoURI": "https://tokens.1inch.exchange/0x49184e6dae8c8ecd89d8bdc1b950c597b8167c90.png" + }, + { + "address": "0x4946Fcea7C692606e8908002e55A582af44AC121", + "chainId": 1, + "name": "FOAMToken", + "symbol": "FOAM", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4946fcea7c692606e8908002e55a582af44ac121.png" + }, + { + "address": "0x4954Db6391F4feB5468b6B943D4935353596aEC9", + "chainId": 1, + "name": "USDQ", + "symbol": "USDQ", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4954db6391f4feb5468b6b943d4935353596aec9.png" + }, + { + "address": "0x4a220E6096B25EADb88358cb44068A3248254675", + "chainId": 1, + "name": "Quant", + "symbol": "QNT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4a220e6096b25eadb88358cb44068a3248254675.png" + }, + { + "address": "0x4a57E687b9126435a9B19E4A802113e266AdeBde", + "chainId": 1, + "name": "Flexacoin", + "symbol": "FXC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4a57e687b9126435a9b19e4a802113e266adebde.png" + }, + { + "address": "0x4AaC461C86aBfA71e9d00d9a2cde8d74E4E1aeEa", + "chainId": 1, + "name": "ZINC", + "symbol": "ZINC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4aac461c86abfa71e9d00d9a2cde8d74e4e1aeea.png" + }, + { + "address": "0x4B3a0c6d668B43F3f07904E124328659b90Bb4Ca", + "chainId": 1, + "name": "AceD", + "symbol": "AceD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4b3a0c6d668b43f3f07904e124328659b90bb4ca.png" + }, + { + "address": "0x4c327471C44B2dacD6E90525f9D629bd2e4f662C", + "chainId": 1, + "name": "GHOST", + "symbol": "GHOST", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4c327471c44b2dacd6e90525f9d629bd2e4f662c.png" + }, + { + "address": "0x4CC19356f2D37338b9802aa8E8fc58B0373296E7", + "chainId": 1, + "name": "SelfKey", + "symbol": "KEY", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4cc19356f2d37338b9802aa8e8fc58b0373296e7.png" + }, + { + "address": "0x4D953cf077c0C95Ba090226E59A18FcF97db44EC", + "chainId": 1, + "name": "MINISWAP", + "symbol": "MINI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4d953cf077c0c95ba090226e59a18fcf97db44ec.png" + }, + { + "address": "0x4DA9b813057D04BAef4e5800E36083717b4a0341", + "chainId": 1, + "name": "AaveInterestbearingTUSD", + "symbol": "aTUSDv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4da9b813057d04baef4e5800e36083717b4a0341.png" + }, + { + "address": "0x4e352cF164E64ADCBad318C3a1e222E9EBa4Ce42", + "chainId": 1, + "name": "MCDEXToken", + "symbol": "MCB", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4e352cf164e64adcbad318c3a1e222e9eba4ce42.png" + }, + { + "address": "0x4f3AfEC4E5a3F2A6a1A411DEF7D7dFe50eE057bF", + "chainId": 1, + "name": "DigixGoldToken", + "symbol": "DGX", + "decimals": 9, + "logoURI": "https://tokens.1inch.exchange/0x4f3afec4e5a3f2a6a1a411def7d7dfe50ee057bf.png" + }, + { + "address": "0x4Fabb145d64652a948d72533023f6E7A623C7C53", + "chainId": 1, + "name": "BinanceUSD", + "symbol": "BUSD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4fabb145d64652a948d72533023f6e7a623c7c53.png" + }, + { + "address": "0x5102791cA02FC3595398400BFE0e33d7B6C82267", + "chainId": 1, + "name": "LeadCoin", + "symbol": "LDC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5102791ca02fc3595398400bfe0e33d7b6c82267.png" + }, + { + "address": "0x514910771AF9Ca656af840dff83E8264EcF986CA", + "chainId": 1, + "name": "ChainLink", + "symbol": "LINK", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x514910771af9ca656af840dff83e8264ecf986ca.png" + }, + { + "address": "0x543Ff227F64Aa17eA132Bf9886cAb5DB55DCAddf", + "chainId": 1, + "name": "DAOStack", + "symbol": "GEN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x543ff227f64aa17ea132bf9886cab5db55dcaddf.png" + }, + { + "address": "0x56d811088235F11C8920698a204A5010a788f4b3", + "chainId": 1, + "name": "bZxProtocolToken", + "symbol": "BZRX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x56d811088235f11c8920698a204a5010a788f4b3.png" + }, + { + "address": "0x5732046A883704404F284Ce41FfADd5b007FD668", + "chainId": 1, + "name": "Bluzelle", + "symbol": "BLZ", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5732046a883704404f284ce41ffadd5b007fd668.png" + }, + { + "address": "0x57700244B20f84799a31c6C96DadFF373ca9D6c5", + "chainId": 1, + "name": "TRUSTDAO", + "symbol": "TRUST", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x57700244b20f84799a31c6c96dadff373ca9d6c5.png" + }, + { + "address": "0x58b6A8A3302369DAEc383334672404Ee733aB239", + "chainId": 1, + "name": "LivepeerToken", + "symbol": "LPT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x58b6a8a3302369daec383334672404ee733ab239.png" + }, + { + "address": "0x595832F8FC6BF59c85C527fEC3740A1b7a361269", + "chainId": 1, + "name": "PowerLedger", + "symbol": "POWR", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0x595832f8fc6bf59c85c527fec3740a1b7a361269.png" + }, + { + "address": "0x5adc961D6AC3f7062D2eA45FEFB8D8167d44b190", + "chainId": 1, + "name": "Dether", + "symbol": "DTH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5adc961d6ac3f7062d2ea45fefb8d8167d44b190.png" + }, + { + "address": "0x5C406D99E04B8494dc253FCc52943Ef82bcA7D75", + "chainId": 1, + "name": "CUSD", + "symbol": "CUSD", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0x5c406d99e04b8494dc253fcc52943ef82bca7d75.png" + }, + { + "address": "0x5c872500c00565505F3624AB435c222E558E9ff8", + "chainId": 1, + "name": "CoTrader", + "symbol": "COT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5c872500c00565505f3624ab435c222e558e9ff8.png" + }, + { + "address": "0x5cAf454Ba92e6F2c929DF14667Ee360eD9fD5b26", + "chainId": 1, + "name": "Dev", + "symbol": "DEV", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5caf454ba92e6f2c929df14667ee360ed9fd5b26.png" + }, + { + "address": "0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643", + "chainId": 1, + "name": "CompoundDai", + "symbol": "cDAI", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x5d3a536e4d6dbd6114cc1ead35777bab948e3643.png" + }, + { + "address": "0x5d60d8d7eF6d37E16EBABc324de3bE57f135e0BC", + "chainId": 1, + "name": "MyBit", + "symbol": "MYB", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5d60d8d7ef6d37e16ebabc324de3be57f135e0bc.png" + }, + { + "address": "0x5e3346444010135322268a4630d2ED5F8D09446c", + "chainId": 1, + "name": "LockTrip", + "symbol": "LOC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5e3346444010135322268a4630d2ed5f8d09446c.png" + }, + { + "address": "0x5e74C9036fb86BD7eCdcb084a0673EFc32eA31cb", + "chainId": 1, + "name": "SynthsETH", + "symbol": "sETH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5e74c9036fb86bd7ecdcb084a0673efc32ea31cb.png" + }, + { + "address": "0x607C794cDa77efB21F8848B7910ecf27451Ae842", + "chainId": 1, + "name": "DeFiPIEToken", + "symbol": "PIE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x607c794cda77efb21f8848b7910ecf27451ae842.png" + }, + { + "address": "0x607F4C5BB672230e8672085532f7e901544a7375", + "chainId": 1, + "name": "iExecRLC", + "symbol": "RLC", + "decimals": 9, + "logoURI": "https://tokens.1inch.exchange/0x607f4c5bb672230e8672085532f7e901544a7375.png" + }, + { + "address": "0x6226caA1857AFBc6DFB6ca66071Eb241228031A1", + "chainId": 1, + "name": "Linkart", + "symbol": "LAR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6226caa1857afbc6dfb6ca66071eb241228031a1.png" + }, + { + "address": "0x6251E725CD45Fb1AF99354035a414A2C0890B929", + "chainId": 1, + "name": "MixTrust", + "symbol": "MXT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6251e725cd45fb1af99354035a414a2c0890b929.png" + }, + { + "address": "0x625aE63000f46200499120B906716420bd059240", + "chainId": 1, + "name": "AaveInterestbearingSUSD", + "symbol": "aSUSDv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x625ae63000f46200499120b906716420bd059240.png" + }, + { + "address": "0x667088b212ce3d06a1b553a7221E1fD19000d9aF", + "chainId": 1, + "name": "Wings", + "symbol": "WINGS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x667088b212ce3d06a1b553a7221e1fd19000d9af.png" + }, + { + "address": "0x6710c63432A2De02954fc0f851db07146a6c0312", + "chainId": 1, + "name": "SyncFab", + "symbol": "MFG", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6710c63432a2de02954fc0f851db07146a6c0312.png" + }, + { + "address": "0x6758B7d441a9739b98552B373703d8d3d14f9e62", + "chainId": 1, + "name": "POA", + "symbol": "POA20", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6758b7d441a9739b98552b373703d8d3d14f9e62.png" + }, + { + "address": "0x6810e776880C02933D47DB1b9fc05908e5386b96", + "chainId": 1, + "name": "Gnosis", + "symbol": "GNO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6810e776880c02933d47db1b9fc05908e5386b96.png" + }, + { + "address": "0x68d57c9a1C35f63E2c83eE8e49A64e9d70528D25", + "chainId": 1, + "name": "SirinLabs", + "symbol": "SRN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x68d57c9a1c35f63e2c83ee8e49a64e9d70528d25.png" + }, + { + "address": "0x6b785a0322126826d8226d77e173d75DAfb84d11", + "chainId": 1, + "name": "BankrollVault", + "symbol": "VLT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6b785a0322126826d8226d77e173d75dafb84d11.png" + }, + { + "address": "0x6B9f031D718dDed0d681c20cB754F97b3BB81b78", + "chainId": 1, + "name": "Geeq", + "symbol": "GEEQ", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6b9f031d718dded0d681c20cb754f97b3bb81b78.png" + }, + { + "address": "0x6Ba460AB75Cd2c56343b3517ffeBA60748654D26", + "chainId": 1, + "name": "UpToken", + "symbol": "UP", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x6ba460ab75cd2c56343b3517ffeba60748654d26.png" + }, + { + "address": "0x6c6EE5e31d828De241282B9606C8e98Ea48526E2", + "chainId": 1, + "name": "HoloToken", + "symbol": "HOT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6c6ee5e31d828de241282b9606c8e98ea48526e2.png" + }, + { + "address": "0x6F87D756DAf0503d08Eb8993686c7Fc01Dc44fB1", + "chainId": 1, + "name": "UniTrade", + "symbol": "TRADE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6f87d756daf0503d08eb8993686c7fc01dc44fb1.png" + }, + { + "address": "0x6fe56C0bcdD471359019FcBC48863d6c3e9d4F41", + "chainId": 1, + "name": "PropsToken", + "symbol": "PROPS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6fe56c0bcdd471359019fcbc48863d6c3e9d4f41.png" + }, + { + "address": "0x71fc860F7D3A592A4a98740e39dB31d25db65ae8", + "chainId": 1, + "name": "AaveInterestbearingUSDT", + "symbol": "aUSDTv1", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0x71fc860f7d3a592a4a98740e39db31d25db65ae8.png" + }, + { + "address": "0x737F98AC8cA59f2C68aD658E3C3d8C8963E40a4c", + "chainId": 1, + "name": "Amon", + "symbol": "AMN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x737f98ac8ca59f2c68ad658e3c3d8c8963e40a4c.png" + }, + { + "address": "0x744d70FDBE2Ba4CF95131626614a1763DF805B9E", + "chainId": 1, + "name": "Status", + "symbol": "SNT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x744d70fdbe2ba4cf95131626614a1763df805b9e.png" + }, + { + "address": "0x763186eB8d4856D536eD4478302971214FEbc6A9", + "chainId": 1, + "name": "BetterBetting", + "symbol": "BETR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x763186eb8d4856d536ed4478302971214febc6a9.png" + }, + { + "address": "0x780116D91E5592E58a3b3c76A351571b39abCEc6", + "chainId": 1, + "name": "Blockparty", + "symbol": "BOXX", + "decimals": 15, + "logoURI": "https://tokens.1inch.exchange/0x780116d91e5592e58a3b3c76a351571b39abcec6.png" + }, + { + "address": "0x7B0C06043468469967DBA22d1AF33d77d44056c8", + "chainId": 1, + "name": "MorpheusNetwork", + "symbol": "MRPH", + "decimals": 4, + "logoURI": "https://tokens.1inch.exchange/0x7b0c06043468469967dba22d1af33d77d44056c8.png" + }, + { + "address": "0x7b123f53421b1bF8533339BFBdc7C98aA94163db", + "chainId": 1, + "name": "dfohub", + "symbol": "buidl", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x7b123f53421b1bf8533339bfbdc7c98aa94163db.png" + }, + { + "address": "0x7C5A0CE9267ED19B22F8cae653F198e3E8daf098", + "chainId": 1, + "name": "Santiment", + "symbol": "SAN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x7c5a0ce9267ed19b22f8cae653f198e3e8daf098.png" + }, + { + "address": "0x7dE91B204C1C737bcEe6F000AAA6569Cf7061cb7", + "chainId": 1, + "name": "Robonomics", + "symbol": "XRT", + "decimals": 9, + "logoURI": "https://tokens.1inch.exchange/0x7de91b204c1c737bcee6f000aaa6569cf7061cb7.png" + }, + { + "address": "0x80fB784B7eD66730e8b1DBd9820aFD29931aab03", + "chainId": 1, + "name": "EthLend", + "symbol": "LEND", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x80fb784b7ed66730e8b1dbd9820afd29931aab03.png" + }, + { + "address": "0x814e0908b12A99FeCf5BC101bB5d0b8B5cDf7d26", + "chainId": 1, + "name": "MeasurableDataToken", + "symbol": "MDT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x814e0908b12a99fecf5bc101bb5d0b8b5cdf7d26.png" + }, + { + "address": "0x8207c1FfC5B6804F6024322CcF34F29c3541Ae26", + "chainId": 1, + "name": "OriginProtocol", + "symbol": "OGN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x8207c1ffc5b6804f6024322ccf34f29c3541ae26.png" + }, + { + "address": "0x821144518dfE9e7b44fCF4d0824e15e8390d4637", + "chainId": 1, + "name": "ATISToken", + "symbol": "ATIS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x821144518dfe9e7b44fcf4d0824e15e8390d4637.png" + }, + { + "address": "0x83984d6142934bb535793A82ADB0a46EF0F66B6d", + "chainId": 1, + "name": "Remme", + "symbol": "REM", + "decimals": 4, + "logoURI": "https://tokens.1inch.exchange/0x83984d6142934bb535793a82adb0a46ef0f66b6d.png" + }, + { + "address": "0x83cee9e086A77e492eE0bB93C2B0437aD6fdECCc", + "chainId": 1, + "name": "Goldmint", + "symbol": "MNTP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x83cee9e086a77e492ee0bb93c2b0437ad6fdeccc.png" + }, + { + "address": "0x8400D94A5cb0fa0D041a3788e395285d61c9ee5e", + "chainId": 1, + "name": "UniBright", + "symbol": "UBT", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x8400d94a5cb0fa0d041a3788e395285d61c9ee5e.png" + }, + { + "address": "0x84cA8bc7997272c7CfB4D0Cd3D55cd942B3c9419", + "chainId": 1, + "name": "DIAToken", + "symbol": "DIA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x84ca8bc7997272c7cfb4d0cd3d55cd942b3c9419.png" + }, + { + "address": "0x8762db106B2c2A0bccB3A80d1Ed41273552616E8", + "chainId": 1, + "name": "ReserveRights", + "symbol": "RSR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x8762db106b2c2a0bccb3a80d1ed41273552616e8.png" + }, + { + "address": "0x89Ab32156e46F46D02ade3FEcbe5Fc4243B9AAeD", + "chainId": 1, + "name": "pNetworkToken", + "symbol": "PNT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x89ab32156e46f46d02ade3fecbe5fc4243b9aaed.png" + }, + { + "address": "0x8Ab7404063Ec4DBcfd4598215992DC3F8EC853d7", + "chainId": 1, + "name": "Akropolis", + "symbol": "AKRO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x8ab7404063ec4dbcfd4598215992dc3f8ec853d7.png" + }, + { + "address": "0x7b6F71c8B123b38aa8099e0098bEC7fbc35B8a13", + "chainId": 1, + "name": "NerveNetwork", + "symbol": "NVT", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x7b6f71c8b123b38aa8099e0098bec7fbc35b8a13.png" + }, + { + "address": "0x8CE9137d39326AD0cD6491fb5CC0CbA0e089b6A9", + "chainId": 1, + "name": "Swipe", + "symbol": "SXP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x8ce9137d39326ad0cd6491fb5cc0cba0e089b6a9.png" + }, + { + "address": "0x8E870D67F660D95d5be530380D0eC0bd388289E1", + "chainId": 1, + "name": "PaxosStandard", + "symbol": "PAX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x8e870d67f660d95d5be530380d0ec0bd388289e1.png" + }, + { + "address": "0x8eB24319393716668D768dCEC29356ae9CfFe285", + "chainId": 1, + "name": "SingularityNETToken", + "symbol": "AGI", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x8eb24319393716668d768dcec29356ae9cffe285.png" + }, + { + "address": "0x8f8221aFbB33998d8584A2B05749bA73c37a938a", + "chainId": 1, + "name": "Request", + "symbol": "REQ", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x8f8221afbb33998d8584a2b05749ba73c37a938a.png" + }, + { + "address": "0x0258F474786DdFd37ABCE6df6BBb1Dd5dfC4434a", + "chainId": 1, + "name": "OrionProtocol", + "symbol": "ORN", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x0258f474786ddfd37abce6df6bbb1dd5dfc4434a.png" + }, + { + "address": "0x910Dfc18D6EA3D6a7124A6F8B5458F281060fa4c", + "chainId": 1, + "name": "x8currency", + "symbol": "X8X", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x910dfc18d6ea3d6a7124a6f8b5458f281060fa4c.png" + }, + { + "address": "0x9214eC02CB71CbA0ADA6896b8dA260736a67ab10", + "chainId": 1, + "name": "REAL", + "symbol": "REAL", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x9214ec02cb71cba0ada6896b8da260736a67ab10.png" + }, + { + "address": "0x93ED3FBe21207Ec2E8f2d3c3de6e058Cb73Bc04d", + "chainId": 1, + "name": "Kleros", + "symbol": "PNK", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x93ed3fbe21207ec2e8f2d3c3de6e058cb73bc04d.png" + }, + { + "address": "0x95172ccBe8344fecD73D0a30F54123652981BD6F", + "chainId": 1, + "name": "MeridianNetwork", + "symbol": "LOCK", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x95172ccbe8344fecd73d0a30f54123652981bd6f.png" + }, + { + "address": "0x960b236A07cf122663c4303350609A66A7B288C0", + "chainId": 1, + "name": "AragonNetworkToken", + "symbol": "ANTv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x960b236a07cf122663c4303350609a66a7b288c0.png" + }, + { + "address": "0x97af10D3fc7C70F67711Bf715d8397C6Da79C1Ab", + "chainId": 1, + "name": "DipperNetwork", + "symbol": "DIP", + "decimals": 12, + "logoURI": "https://tokens.1inch.exchange/0x97af10d3fc7c70f67711bf715d8397c6da79c1ab.png" + }, + { + "address": "0x967da4048cD07aB37855c090aAF366e4ce1b9F48", + "chainId": 1, + "name": "OceanToken", + "symbol": "OCEAN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x967da4048cd07ab37855c090aaf366e4ce1b9f48.png" + }, + { + "address": "0x990f341946A3fdB507aE7e52d17851B87168017c", + "chainId": 1, + "name": "Strong", + "symbol": "STRONG", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x990f341946a3fdb507ae7e52d17851b87168017c.png" + }, + { + "address": "0x9992eC3cF6A55b00978cdDF2b27BC6882d88D1eC", + "chainId": 1, + "name": "Polymath", + "symbol": "POLY", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x9992ec3cf6a55b00978cddf2b27bc6882d88d1ec.png" + }, + { + "address": "0x9bA00D6856a4eDF4665BcA2C2309936572473B7E", + "chainId": 1, + "name": "AaveInterestbearingUSDC", + "symbol": "aUSDCv1", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0x9ba00d6856a4edf4665bca2c2309936572473b7e.png" + }, + { + "address": "0x9Cb2f26A23b8d89973F08c957C4d7cdf75CD341c", + "chainId": 1, + "name": "DigitalRand", + "symbol": "DZAR", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0x9cb2f26a23b8d89973f08c957c4d7cdf75cd341c.png" + }, + { + "address": "0x9f49ed43C90A540d1cF12f6170aCE8d0B88a14E6", + "chainId": 1, + "name": "ETHRSI6040YieldII", + "symbol": "ETHRSIAPY", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x9f49ed43c90a540d1cf12f6170ace8d0b88a14e6.png" + }, + { + "address": "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2", + "chainId": 1, + "name": "Maker", + "symbol": "MKR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2.png" + }, + { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "chainId": 1, + "name": "USDCoin", + "symbol": "USDC", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48.png" + }, + { + "address": "0xA15C7Ebe1f07CaF6bFF097D8a589fb8AC49Ae5B3", + "chainId": 1, + "name": "PundiX", + "symbol": "NPXS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa15c7ebe1f07caf6bff097d8a589fb8ac49ae5b3.png" + }, + { + "address": "0xa1d0E215a23d7030842FC67cE582a6aFa3CCaB83", + "chainId": 1, + "name": "YFII.finance", + "symbol": "YFII", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa1d0e215a23d7030842fc67ce582a6afa3ccab83.png" + }, + { + "address": "0xa1d65E8fB6e87b60FECCBc582F7f97804B725521", + "chainId": 1, + "name": "DXdao", + "symbol": "DXD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa1d65e8fb6e87b60feccbc582f7f97804b725521.png" + }, + { + "address": "0xa3BeD4E1c75D00fa6f4E5E6922DB7261B5E9AcD2", + "chainId": 1, + "name": "Meta", + "symbol": "MTA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa3bed4e1c75d00fa6f4e5e6922db7261b5e9acd2.png" + }, + { + "address": "0xa3d58c4E56fedCae3a7c43A725aeE9A71F0ece4e", + "chainId": 1, + "name": "Metronome", + "symbol": "MET", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa3d58c4e56fedcae3a7c43a725aee9a71f0ece4e.png" + }, + { + "address": "0xa462d0E6Bb788c7807B1B1C96992CE1f7069E195", + "chainId": 1, + "name": "EQUUSMiningToken", + "symbol": "EQMT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa462d0e6bb788c7807b1b1c96992ce1f7069e195.png" + }, + { + "address": "0xA4Bdb11dc0a2bEC88d24A3aa1E6Bb17201112eBe", + "chainId": 1, + "name": "StableUSD", + "symbol": "USDS", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0xa4bdb11dc0a2bec88d24a3aa1e6bb17201112ebe.png" + }, + { + "address": "0xA4e8C3Ec456107eA67d3075bF9e3DF3A75823DB0", + "chainId": 1, + "name": "LoomNetwork", + "symbol": "LOOM", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa4e8c3ec456107ea67d3075bf9e3df3a75823db0.png" + }, + { + "address": "0xA64BD6C70Cb9051F6A9ba1F163Fdc07E0DfB5F84", + "chainId": 1, + "name": "AaveInterestbearingLINK", + "symbol": "aLINKv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa64bd6c70cb9051f6a9ba1f163fdc07e0dfb5f84.png" + }, + { + "address": "0xa704fCe7b309Ec09DF16e2F5Ab8cAf6Fe8A4BAA9", + "chainId": 1, + "name": "AgriChain", + "symbol": "AGRI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa704fce7b309ec09df16e2f5ab8caf6fe8a4baa9.png" + }, + { + "address": "0xaaAEBE6Fe48E54f431b0C390CfaF0b017d09D42d", + "chainId": 1, + "name": "Celsius", + "symbol": "CEL", + "decimals": 4, + "logoURI": "https://tokens.1inch.exchange/0xaaaebe6fe48e54f431b0c390cfaf0b017d09d42d.png" + }, + { + "address": "0xaAAf91D9b90dF800Df4F55c205fd6989c977E73a", + "chainId": 1, + "name": "Monolith", + "symbol": "TKN", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0xaaaf91d9b90df800df4f55c205fd6989c977e73a.png" + }, + { + "address": "0xb0280743b44bF7db4B6bE482b2Ba7b75E5dA096C", + "chainId": 1, + "name": "Transcodium", + "symbol": "TNS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb0280743b44bf7db4b6be482b2ba7b75e5da096c.png" + }, + { + "address": "0xb056c38f6b7Dc4064367403E26424CD2c60655e1", + "chainId": 1, + "name": "CEEKVR", + "symbol": "CEEK", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb056c38f6b7dc4064367403e26424cd2c60655e1.png" + }, + { + "address": "0xB3319f5D18Bc0D84dD1b4825Dcde5d5f7266d407", + "chainId": 1, + "name": "Compound0x", + "symbol": "cZRX", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0xb3319f5d18bc0d84dd1b4825dcde5d5f7266d407.png" + }, + { + "address": "0xB4272071eCAdd69d933AdcD19cA99fe80664fc08", + "chainId": 1, + "name": "CryptoFranc", + "symbol": "XCHF", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb4272071ecadd69d933adcd19ca99fe80664fc08.png" + }, + { + "address": "0xB4EFd85c19999D84251304bDA99E90B92300Bd93", + "chainId": 1, + "name": "RocketPool", + "symbol": "RPL", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb4efd85c19999d84251304bda99e90b92300bd93.png" + }, + { + "address": "0xeca82185adCE47f39c684352B0439f030f860318", + "chainId": 1, + "name": "Perlin", + "symbol": "PERL", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xeca82185adce47f39c684352b0439f030f860318.png" + }, + { + "address": "0xb4058411967D5046f3510943103805be61f0600E", + "chainId": 1, + "name": "STONK", + "symbol": "STONK", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb4058411967d5046f3510943103805be61f0600e.png" + }, + { + "address": "0xb683D83a532e2Cb7DFa5275eED3698436371cc9f", + "chainId": 1, + "name": "BTUProtocol", + "symbol": "BTU", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb683d83a532e2cb7dfa5275eed3698436371cc9f.png" + }, + { + "address": "0xb6c4267C4877BB0D6b1685Cfd85b0FBe82F105ec", + "chainId": 1, + "name": "Relevant", + "symbol": "REL", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb6c4267c4877bb0d6b1685cfd85b0fbe82f105ec.png" + }, + { + "address": "0xB97048628DB6B661D4C2aA833e95Dbe1A905B280", + "chainId": 1, + "name": "TenX", + "symbol": "PAY", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb97048628db6b661d4c2aa833e95dbe1a905b280.png" + }, + { + "address": "0xba100000625a3754423978a60c9317c58a424e3D", + "chainId": 1, + "name": "Balancer", + "symbol": "BAL", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xba100000625a3754423978a60c9317c58a424e3d.png" + }, + { + "address": "0xBA11D00c5f74255f56a5E366F4F77f5A186d7f55", + "chainId": 1, + "name": "BandProtocol", + "symbol": "BAND", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xba11d00c5f74255f56a5e366f4f77f5a186d7f55.png" + }, + { + "address": "0xBB1fA4FdEB3459733bF67EbC6f893003fA976a82", + "chainId": 1, + "name": "Bitnation", + "symbol": "XPAT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xbb1fa4fdeb3459733bf67ebc6f893003fa976a82.png" + }, + { + "address": "0xBBbbCA6A901c926F240b89EacB641d8Aec7AEafD", + "chainId": 1, + "name": "Loopring", + "symbol": "LRC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xbbbbca6a901c926f240b89eacb641d8aec7aeafd.png" + }, + { + "address": "0xBC86727E770de68B1060C91f6BB6945c73e10388", + "chainId": 1, + "name": "InkProtocol", + "symbol": "XNK", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xbc86727e770de68b1060c91f6bb6945c73e10388.png" + }, + { + "address": "0xBd2949F67DcdC549c6Ebe98696449Fa79D988A9F", + "chainId": 1, + "name": "MeterGovernancemappedbyMeter.io", + "symbol": "eMTRG", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xbd2949f67dcdc549c6ebe98696449fa79d988a9f.png" + }, + { + "address": "0xD9Ec3ff1f8be459Bb9369b4E79e9Ebcf7141C093", + "chainId": 1, + "name": "KardiaChainToken", + "symbol": "KAI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xd9ec3ff1f8be459bb9369b4e79e9ebcf7141c093.png" + }, + { + "address": "0xbE9375C6a420D2eEB258962efB95551A5b722803", + "chainId": 1, + "name": "KyberStormXToken", + "symbol": "STMX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xbe9375c6a420d2eeb258962efb95551a5b722803.png" + }, + { + "address": "0xbf2179859fc6D5BEE9Bf9158632Dc51678a4100e", + "chainId": 1, + "name": "Aelf", + "symbol": "ELF", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xbf2179859fc6d5bee9bf9158632dc51678a4100e.png" + }, + { + "address": "0xc00e94Cb662C3520282E6f5717214004A7f26888", + "chainId": 1, + "name": "Compound", + "symbol": "COMP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc00e94cb662c3520282e6f5717214004a7f26888.png" + }, + { + "address": "0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F", + "chainId": 1, + "name": "SynthetixNetworkToken", + "symbol": "SNX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f.png" + }, + { + "address": "0x27702a26126e0B3702af63Ee09aC4d1A084EF628", + "chainId": 1, + "name": "aleph.imv2", + "symbol": "ALEPH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x27702a26126e0b3702af63ee09ac4d1a084ef628.png" + }, + { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "chainId": 1, + "name": "WrappedEther", + "symbol": "WETH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2.png" + }, + { + "address": "0xC11b1268C1A384e55C48c2391d8d480264A3A7F4", + "chainId": 1, + "name": "CompoundWrappedBTC", + "symbol": "cWBTC", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0xc11b1268c1a384e55c48c2391d8d480264a3a7f4.png" + }, + { + "address": "0xc12d099be31567add4e4e4d0D45691C3F58f5663", + "chainId": 1, + "name": "Auctus", + "symbol": "AUC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc12d099be31567add4e4e4d0d45691c3f58f5663.png" + }, + { + "address": "0xc27A2F05fa577a83BA0fDb4c38443c0718356501", + "chainId": 1, + "name": "LamdenTau", + "symbol": "TAU", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc27a2f05fa577a83ba0fdb4c38443c0718356501.png" + }, + { + "address": "0xC28e931814725BbEB9e670676FaBBCb694Fe7DF2", + "chainId": 1, + "name": "QuadrantProtocol", + "symbol": "EQUAD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc28e931814725bbeb9e670676fabbcb694fe7df2.png" + }, + { + "address": "0xc3dD23A0a854b4f9aE80670f528094E9Eb607CCb", + "chainId": 1, + "name": "Trendering", + "symbol": "TRND", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc3dd23a0a854b4f9ae80670f528094e9eb607ccb.png" + }, + { + "address": "0xC5bBaE50781Be1669306b9e001EFF57a2957b09d", + "chainId": 1, + "name": "Gifto", + "symbol": "GTO", + "decimals": 5, + "logoURI": "https://tokens.1inch.exchange/0xc5bbae50781be1669306b9e001eff57a2957b09d.png" + }, + { + "address": "0xc75F15AdA581219c95485c578E124df3985e4CE0", + "chainId": 1, + "name": "zzz.finance", + "symbol": "ZZZ", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc75f15ada581219c95485c578e124df3985e4ce0.png" + }, + { + "address": "0xC76FB75950536d98FA62ea968E1D6B45ffea2A55", + "chainId": 1, + "name": "COL", + "symbol": "COL", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc76fb75950536d98fa62ea968e1d6b45ffea2a55.png" + }, + { + "address": "0xCC4304A31d09258b0029eA7FE63d032f52e44EFe", + "chainId": 1, + "name": "TrustSwapToken", + "symbol": "SWAP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xcc4304a31d09258b0029ea7fe63d032f52e44efe.png" + }, + { + "address": "0xCc80C051057B774cD75067Dc48f8987C4Eb97A5e", + "chainId": 1, + "name": "EthfinexNectarToken", + "symbol": "NEC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xcc80c051057b774cd75067dc48f8987c4eb97a5e.png" + }, + { + "address": "0xcD62b1C403fa761BAadFC74C525ce2B51780b184", + "chainId": 1, + "name": "AragonNetworkJuror", + "symbol": "ANJ", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xcd62b1c403fa761baadfc74c525ce2b51780b184.png" + }, + { + "address": "0xCee1d3c3A02267e37E6B373060F79d5d7b9e1669", + "chainId": 1, + "name": "yffi.finance", + "symbol": "YFFI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xcee1d3c3a02267e37e6b373060f79d5d7b9e1669.png" + }, + { + "address": "0xCf8f9555D55CE45a3A33a81D6eF99a2a2E71Dee2", + "chainId": 1, + "name": "CBIIndex7", + "symbol": "CBIX7", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xcf8f9555d55ce45a3a33a81d6ef99a2a2e71dee2.png" + }, + { + "address": "0xd15eCDCF5Ea68e3995b2D0527A0aE0a3258302F8", + "chainId": 1, + "name": "MachiXToken", + "symbol": "MCX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xd15ecdcf5ea68e3995b2d0527a0ae0a3258302f8.png" + }, + { + "address": "0xd26114cd6EE289AccF82350c8d8487fedB8A0C07", + "chainId": 1, + "name": "OmiseGO", + "symbol": "OMG", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xd26114cd6ee289accf82350c8d8487fedb8a0c07.png" + }, + { + "address": "0xd341d1680Eeee3255b8C4c75bCCE7EB57f144dAe", + "chainId": 1, + "name": "onG.social", + "symbol": "ONG", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xd341d1680eeee3255b8c4c75bcce7eb57f144dae.png" + }, + { + "address": "0xD46bA6D942050d489DBd938a2C909A5d5039A161", + "chainId": 1, + "name": "Ampleforth", + "symbol": "AMPL", + "decimals": 9, + "logoURI": "https://tokens.1inch.exchange/0xd46ba6d942050d489dbd938a2c909a5d5039a161.png" + }, + { + "address": "0xd4c435F5B09F855C3317c8524Cb1F586E42795fa", + "chainId": 1, + "name": "Cindicator", + "symbol": "CND", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xd4c435f5b09f855c3317c8524cb1f586e42795fa.png" + }, + { + "address": "0xd559f20296FF4895da39b5bd9ADd54b442596a61", + "chainId": 1, + "name": "FintruX", + "symbol": "FTX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xd559f20296ff4895da39b5bd9add54b442596a61.png" + }, + { + "address": "0xD6F0Bb2A45110f819e908a915237D652Ac7c5AA8", + "chainId": 1, + "name": "DFOHub", + "symbol": "BUIDL", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xd6f0bb2a45110f819e908a915237d652ac7c5aa8.png" + }, + { + "address": "0xd7631787B4dCc87b1254cfd1e5cE48e96823dEe8", + "chainId": 1, + "name": "Sociall", + "symbol": "SCL", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0xd7631787b4dcc87b1254cfd1e5ce48e96823dee8.png" + }, + { + "address": "0xD8912C10681D8B21Fd3742244f44658dBA12264E", + "chainId": 1, + "name": "Pluton", + "symbol": "PLU", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xd8912c10681d8b21fd3742244f44658dba12264e.png" + }, + { + "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7", + "chainId": 1, + "name": "TetherUSD", + "symbol": "USDT", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0xdac17f958d2ee523a2206206994597c13d831ec7.png" + }, + { + "address": "0xdB25f211AB05b1c97D595516F45794528a807ad8", + "chainId": 1, + "name": "STASISEURS", + "symbol": "EURS", + "decimals": 2, + "logoURI": "https://tokens.1inch.exchange/0xdb25f211ab05b1c97d595516f45794528a807ad8.png" + }, + { + "address": "0xdd974D5C2e2928deA5F71b9825b8b646686BD200", + "chainId": 1, + "name": "KyberNetwork", + "symbol": "KNC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xdd974d5c2e2928dea5f71b9825b8b646686bd200.png" + }, + { + "address": "0xDF2C7238198Ad8B389666574f2d8bc411A4b7428", + "chainId": 1, + "name": "Mainframe", + "symbol": "MFT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xdf2c7238198ad8b389666574f2d8bc411a4b7428.png" + }, + { + "address": "0xdF574c24545E5FfEcb9a659c229253D4111d87e1", + "chainId": 1, + "name": "HUSD", + "symbol": "HUSD", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0xdf574c24545e5ffecb9a659c229253d4111d87e1.png" + }, + { + "address": "0xdfe691F37b6264a90Ff507EB359C45d55037951C", + "chainId": 1, + "name": "Karma", + "symbol": "KARMA", + "decimals": 4, + "logoURI": "https://tokens.1inch.exchange/0xdfe691f37b6264a90ff507eb359c45d55037951c.png" + }, + { + "address": "0xE17f017475a709De58E976081eB916081ff4c9d5", + "chainId": 1, + "name": "RMPL", + "symbol": "RMPL", + "decimals": 9, + "logoURI": "https://tokens.1inch.exchange/0xe17f017475a709de58e976081eb916081ff4c9d5.png" + }, + { + "address": "0xe25b0BBA01Dc5630312B6A21927E578061A13f55", + "chainId": 1, + "name": "ShipChainSHIP", + "symbol": "SHIP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xe25b0bba01dc5630312b6a21927e578061a13f55.png" + }, + { + "address": "0xe3818504c1B32bF1557b16C238B2E01Fd3149C17", + "chainId": 1, + "name": "Pillar", + "symbol": "PLR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xe3818504c1b32bf1557b16c238b2e01fd3149c17.png" + }, + { + "address": "0xE41d2489571d322189246DaFA5ebDe1F4699F498", + "chainId": 1, + "name": "0xProtocol", + "symbol": "ZRX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xe41d2489571d322189246dafa5ebde1f4699f498.png" + }, + { + "address": "0xE48972fCd82a274411c01834e2f031D4377Fa2c0", + "chainId": 1, + "name": "2key.network", + "symbol": "2KEY", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xe48972fcd82a274411c01834e2f031d4377fa2c0.png" + }, + { + "address": "0xE5a3229CCb22b6484594973A03a3851dCd948756", + "chainId": 1, + "name": "ReceiveAccessEcosystem", + "symbol": "RAE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xe5a3229ccb22b6484594973a03a3851dcd948756.png" + }, + { + "address": "0xEA26c4aC16D4a5A106820BC8AEE85fd0b7b2b664", + "chainId": 1, + "name": "QuarkChain", + "symbol": "QKC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xea26c4ac16d4a5a106820bc8aee85fd0b7b2b664.png" + }, + { + "address": "0xEB4C2781e4ebA804CE9a9803C67d0893436bB27D", + "chainId": 1, + "name": "renBTC", + "symbol": "renBTC", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0xeb4c2781e4eba804ce9a9803c67d0893436bb27d.png" + }, + { + "address": "0xec67005c4E498Ec7f55E092bd1d35cbC47C91892", + "chainId": 1, + "name": "MelonToken", + "symbol": "MLN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xec67005c4e498ec7f55e092bd1d35cbc47c91892.png" + }, + { + "address": "0xEd91879919B71bB6905f23af0A68d231EcF87b14", + "chainId": 1, + "name": "DMMGovernance", + "symbol": "DMG", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xed91879919b71bb6905f23af0a68d231ecf87b14.png" + }, + { + "address": "0xEDD7c94FD7B4971b916d15067Bc454b9E1bAD980", + "chainId": 1, + "name": "Zippie", + "symbol": "ZIPT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xedd7c94fd7b4971b916d15067bc454b9e1bad980.png" + }, + { + "address": "0xeEEE2a622330E6d2036691e983DEe87330588603", + "chainId": 1, + "name": "AskobarNetwork", + "symbol": "ASKO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xeeee2a622330e6d2036691e983dee87330588603.png" + }, + { + "address": "0xEeEeeeeEe2aF8D0e1940679860398308e0eF24d6", + "chainId": 1, + "name": "EthverseToken", + "symbol": "ETHV", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xeeeeeeeee2af8d0e1940679860398308e0ef24d6.png" + }, + { + "address": "0xeF9Cd7882c067686691B6fF49e650b43AFBBCC6B", + "chainId": 1, + "name": "FinNexus", + "symbol": "FNX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xef9cd7882c067686691b6ff49e650b43afbbcc6b.png" + }, + { + "address": "0xefBd6D7deF37ffae990503EcdB1291B2f7E38788", + "chainId": 1, + "name": "Evolution", + "symbol": "EVO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xefbd6d7def37ffae990503ecdb1291b2f7e38788.png" + }, + { + "address": "0xf04a8ac553FceDB5BA99A64799155826C136b0Be", + "chainId": 1, + "name": "Flixxo", + "symbol": "FLIXX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf04a8ac553fcedb5ba99a64799155826c136b0be.png" + }, + { + "address": "0xF0FAC7104aAC544e4a7CE1A55ADF2B5a25c65bD1", + "chainId": 1, + "name": "PampNetwork", + "symbol": "PAMP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf0fac7104aac544e4a7ce1a55adf2b5a25c65bd1.png" + }, + { + "address": "0xF1290473E210b2108A85237fbCd7b6eb42Cc654F", + "chainId": 1, + "name": "HedgeTrade", + "symbol": "HEDG", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf1290473e210b2108a85237fbcd7b6eb42cc654f.png" + }, + { + "address": "0xF29992D7b589A0A6bD2de7Be29a97A6EB73EaF85", + "chainId": 1, + "name": "DMScript", + "symbol": "DMST", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf29992d7b589a0a6bd2de7be29a97a6eb73eaf85.png" + }, + { + "address": "0xf29e46887FFAE92f1ff87DfE39713875Da541373", + "chainId": 1, + "name": "UniCrypt", + "symbol": "UNC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf29e46887ffae92f1ff87dfe39713875da541373.png" + }, + { + "address": "0xF2f9A7e93f845b3ce154EfbeB64fB9346FCCE509", + "chainId": 1, + "name": "UniPower", + "symbol": "POWER", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf2f9a7e93f845b3ce154efbeb64fb9346fcce509.png" + }, + { + "address": "0xF433089366899D83a9f26A773D59ec7eCF30355e", + "chainId": 1, + "name": "Metal", + "symbol": "MTL", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0xf433089366899d83a9f26a773d59ec7ecf30355e.png" + }, + { + "address": "0xF629cBd94d3791C9250152BD8dfBDF380E2a3B9c", + "chainId": 1, + "name": "EnjinCoin", + "symbol": "ENJ", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf629cbd94d3791c9250152bd8dfbdf380e2a3b9c.png" + }, + { + "address": "0xf650C3d88D12dB855b8bf7D11Be6C55A4e07dCC9", + "chainId": 1, + "name": "CompoundUSDT", + "symbol": "cUSDT", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0xf650c3d88d12db855b8bf7d11be6c55a4e07dcc9.png" + }, + { + "address": "0xf8e386EDa857484f5a12e4B5DAa9984E06E73705", + "chainId": 1, + "name": "Indorse", + "symbol": "IND", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf8e386eda857484f5a12e4b5daa9984e06e73705.png" + }, + { + "address": "0xf911a7ec46a2c6fa49193212fe4a2a9B95851c27", + "chainId": 1, + "name": "Antiample", + "symbol": "XAMP", + "decimals": 9, + "logoURI": "https://tokens.1inch.exchange/0xf911a7ec46a2c6fa49193212fe4a2a9b95851c27.png" + }, + { + "address": "0xF970b8E36e23F7fC3FD752EeA86f8Be8D83375A6", + "chainId": 1, + "name": "Ripio", + "symbol": "RCN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf970b8e36e23f7fc3fd752eea86f8be8d83375a6.png" + }, + { + "address": "0xfC1E690f61EFd961294b3e1Ce3313fBD8aa4f85d", + "chainId": 1, + "name": "AaveInterestbearingDAI", + "symbol": "aDAIv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xfc1e690f61efd961294b3e1ce3313fbd8aa4f85d.png" + }, + { + "address": "0x00006100F7090010005F1bd7aE6122c3C2CF0090", + "chainId": 1, + "name": "TrueAUD", + "symbol": "TAUD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x00006100f7090010005f1bd7ae6122c3c2cf0090.png" + }, + { + "address": "0x00000000441378008EA67F4284A57932B1c000a5", + "chainId": 1, + "name": "TrueGBP", + "symbol": "TGBP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x00000000441378008ea67f4284a57932b1c000a5.png" + }, + { + "address": "0x00000100F2A2bd000715001920eB70D229700085", + "chainId": 1, + "name": "TrueCAD", + "symbol": "TCAD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x00000100f2a2bd000715001920eb70d229700085.png" + }, + { + "address": "0x0000852600CEB001E08e00bC008be620d60031F2", + "chainId": 1, + "name": "TrueHKD", + "symbol": "THKD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0000852600ceb001e08e00bc008be620d60031f2.png" + }, + { + "address": "0x0000000000b3F879cb30FE243b4Dfee438691c04", + "chainId": 1, + "name": "Gastoken.io2", + "symbol": "GST2", + "decimals": 2, + "logoURI": "https://tokens.1inch.exchange/0x0000000000b3f879cb30fe243b4dfee438691c04.png" + }, + { + "address": "0x06AF07097C9Eeb7fD685c692751D5C66dB49c215", + "chainId": 1, + "name": "ChaiToken", + "symbol": "CHAI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x06af07097c9eeb7fd685c692751d5c66db49c215.png" + }, + { + "address": "0x6C8c6b02E7b2BE14d4fA6022Dfd6d75921D90E4E", + "chainId": 1, + "name": "CompoundBasicAttentionToken", + "symbol": "cBAT", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x6c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e.png" + }, + { + "address": "0xF5DCe57282A584D2746FaF1593d3121Fcac444dC", + "chainId": 1, + "name": "CompoundSai", + "symbol": "cSAI", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0xf5dce57282a584d2746faf1593d3121fcac444dc.png" + }, + { + "address": "0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5", + "chainId": 1, + "name": "CompoundETH", + "symbol": "cETH", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5.png" + }, + { + "address": "0x39AA39c021dfbaE8faC545936693aC917d5E7563", + "chainId": 1, + "name": "CompoundUSDCoin", + "symbol": "cUSDC", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x39aa39c021dfbae8fac545936693ac917d5e7563.png" + }, + { + "address": "0x158079Ee67Fce2f58472A96584A73C7Ab9AC95c1", + "chainId": 1, + "name": "CompoundAugur", + "symbol": "cREP", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x158079ee67fce2f58472a96584a73c7ab9ac95c1.png" + }, + { + "address": "0x493C57C4763932315A328269E1ADaD09653B9081", + "chainId": 1, + "name": "bZxDAIiToken", + "symbol": "fiDAI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x493c57c4763932315a328269e1adad09653b9081.png" + }, + { + "address": "0x77f973FCaF871459aa58cd81881Ce453759281bC", + "chainId": 1, + "name": "bZxETHiToken", + "symbol": "fiETH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x77f973fcaf871459aa58cd81881ce453759281bc.png" + }, + { + "address": "0x8A8079c7149B8A1611e5C5d978DCA3bE16545F83", + "chainId": 1, + "name": "SynthiADA", + "symbol": "iADA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x8a8079c7149b8a1611e5c5d978dca3be16545f83.png" + }, + { + "address": "0x2AF5D2aD76741191D15Dfe7bF6aC92d4Bd912Ca3", + "chainId": 1, + "name": "BitfinexLEOToken", + "symbol": "LEO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x2af5d2ad76741191d15dfe7bf6ac92d4bd912ca3.png" + }, + { + "address": "0x6f259637dcD74C767781E37Bc6133cd6A68aa161", + "chainId": 1, + "name": "HuobiToken", + "symbol": "HT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6f259637dcd74c767781e37bc6133cd6a68aa161.png" + }, + { + "address": "0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0", + "chainId": 1, + "name": "MaticToken", + "symbol": "MATIC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0.png" + }, + { + "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "chainId": 1, + "name": "DaiStablecoin", + "symbol": "DAI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6b175474e89094c44da98b954eedeac495271d0f.png" + }, + { + "address": "0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359", + "chainId": 1, + "name": "SaiStablecoin", + "symbol": "SAI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359.png" + }, + { + "address": "0x57Ab1ec28D129707052df4dF418D58a2D46d5f51", + "chainId": 1, + "name": "SynthsUSD", + "symbol": "sUSD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x57ab1ec28d129707052df4df418d58a2d46d5f51.png" + }, + { + "address": "0xD71eCFF9342A5Ced620049e616c5035F1dB98620", + "chainId": 1, + "name": "SynthsEUR", + "symbol": "sEUR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xd71ecff9342a5ced620049e616c5035f1db98620.png" + }, + { + "address": "0xD6014EA05BDe904448B743833dDF07c3C7837481", + "chainId": 1, + "name": "SynthiBTC", + "symbol": "iBTC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xd6014ea05bde904448b743833ddf07c3c7837481.png" + }, + { + "address": "0xfE18be6b3Bd88A2D2A7f928d00292E7a9963CfC6", + "chainId": 1, + "name": "SynthsBTC", + "symbol": "sBTC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xfe18be6b3bd88a2d2a7f928d00292e7a9963cfc6.png" + }, + { + "address": "0xF48e200EAF9906362BB1442fca31e0835773b8B4", + "chainId": 1, + "name": "SynthsAUD", + "symbol": "sAUD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf48e200eaf9906362bb1442fca31e0835773b8b4.png" + }, + { + "address": "0xeABACD844A196D7Faf3CE596edeBF9900341B420", + "chainId": 1, + "name": "SynthsCEX", + "symbol": "sCEX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xeabacd844a196d7faf3ce596edebf9900341b420.png" + }, + { + "address": "0x27269b3e45A4D3E79A3D6BFeE0C8fB13d0D711A6", + "chainId": 1, + "name": "SynthiXRP", + "symbol": "iXRP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x27269b3e45a4d3e79a3d6bfee0c8fb13d0d711a6.png" + }, + { + "address": "0x336213e1DDFC69f4701Fc3F86F4ef4A160c1159d", + "chainId": 1, + "name": "SynthiCEX", + "symbol": "iCEX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x336213e1ddfc69f4701fc3f86f4ef4a160c1159d.png" + }, + { + "address": "0xCB98f42221b2C251A4E74A1609722eE09f0cc08E", + "chainId": 1, + "name": "SynthiDASH", + "symbol": "iDASH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xcb98f42221b2c251a4e74a1609722ee09f0cc08e.png" + }, + { + "address": "0xd50c1746D835d2770dDA3703B69187bFfeB14126", + "chainId": 1, + "name": "SynthiETC", + "symbol": "iETC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xd50c1746d835d2770dda3703b69187bffeb14126.png" + }, + { + "address": "0x4AdF728E2Df4945082cDD6053869f51278fae196", + "chainId": 1, + "name": "SynthiXMR", + "symbol": "iXMR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4adf728e2df4945082cdd6053869f51278fae196.png" + }, + { + "address": "0xe36E2D3c7c34281FA3bC737950a68571736880A1", + "chainId": 1, + "name": "SynthsADA", + "symbol": "sADA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xe36e2d3c7c34281fa3bc737950a68571736880a1.png" + }, + { + "address": "0xfE33ae95A9f0DA8A845aF33516EDc240DCD711d6", + "chainId": 1, + "name": "SynthsDASH", + "symbol": "sDASH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xfe33ae95a9f0da8a845af33516edc240dcd711d6.png" + }, + { + "address": "0x88C8Cf3A212c0369698D13FE98Fcb76620389841", + "chainId": 1, + "name": "SynthsEOS", + "symbol": "sEOS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x88c8cf3a212c0369698d13fe98fcb76620389841.png" + }, + { + "address": "0x22602469d704BfFb0936c7A7cfcD18f7aA269375", + "chainId": 1, + "name": "SynthsETC", + "symbol": "sETC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x22602469d704bffb0936c7a7cfcd18f7aa269375.png" + }, + { + "address": "0x23348160D7f5aca21195dF2b70f28Fce2B0be9fC", + "chainId": 1, + "name": "SynthsFTSE", + "symbol": "sFTSE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x23348160d7f5aca21195df2b70f28fce2b0be9fc.png" + }, + { + "address": "0x757de3ac6B830a931eF178C6634c5C551773155c", + "chainId": 1, + "name": "SynthsNIKKEI", + "symbol": "sNIKKEI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x757de3ac6b830a931ef178c6634c5c551773155c.png" + }, + { + "address": "0x5299d6F7472DCc137D7f3C4BcfBBB514BaBF341A", + "chainId": 1, + "name": "SynthsXMR", + "symbol": "sXMR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5299d6f7472dcc137d7f3c4bcfbbb514babf341a.png" + }, + { + "address": "0xa2B0fDe6D710e201d0d608e924A484d1A5fEd57c", + "chainId": 1, + "name": "SynthsXRP", + "symbol": "sXRP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa2b0fde6d710e201d0d608e924a484d1a5fed57c.png" + }, + { + "address": "0x0F83287FF768D1c1e17a42F44d644D7F22e8ee1d", + "chainId": 1, + "name": "SynthsCHF", + "symbol": "sCHF", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0f83287ff768d1c1e17a42f44d644d7f22e8ee1d.png" + }, + { + "address": "0xF6b1C627e95BFc3c1b4c9B825a032Ff0fBf3e07d", + "chainId": 1, + "name": "SynthsJPY", + "symbol": "sJPY", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf6b1c627e95bfc3c1b4c9b825a032ff0fbf3e07d.png" + }, + { + "address": "0x6A22e5e94388464181578Aa7A6B869e00fE27846", + "chainId": 1, + "name": "SynthsXAG", + "symbol": "sXAG", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6a22e5e94388464181578aa7a6b869e00fe27846.png" + }, + { + "address": "0xf2E08356588EC5cd9E437552Da87C0076b4970B0", + "chainId": 1, + "name": "SynthsTRX", + "symbol": "sTRX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf2e08356588ec5cd9e437552da87c0076b4970b0.png" + }, + { + "address": "0xC14103C2141E842e228FBaC594579e798616ce7A", + "chainId": 1, + "name": "SynthsLTC", + "symbol": "sLTC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc14103c2141e842e228fbac594579e798616ce7a.png" + }, + { + "address": "0xA9859874e1743A32409f75bB11549892138BBA1E", + "chainId": 1, + "name": "SynthiETH", + "symbol": "iETH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa9859874e1743a32409f75bb11549892138bba1e.png" + }, + { + "address": "0xC5807183a9661A533CB08CbC297594a0B864dc12", + "chainId": 1, + "name": "SynthiTRX", + "symbol": "iTRX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc5807183a9661a533cb08cbc297594a0b864dc12.png" + }, + { + "address": "0x2d7aC061fc3db53c39fe1607fB8cec1B2C162B01", + "chainId": 1, + "name": "SynthiLINK", + "symbol": "iLINK", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x2d7ac061fc3db53c39fe1607fb8cec1b2c162b01.png" + }, + { + "address": "0xe1aFe1Fd76Fd88f78cBf599ea1846231B8bA3B6B", + "chainId": 1, + "name": "SynthsDEFI", + "symbol": "sDEFI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xe1afe1fd76fd88f78cbf599ea1846231b8ba3b6b.png" + }, + { + "address": "0x97fe22E7341a0Cd8Db6F6C021A24Dc8f4DAD855F", + "chainId": 1, + "name": "SynthsGBP", + "symbol": "sGBP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x97fe22e7341a0cd8db6f6c021a24dc8f4dad855f.png" + }, + { + "address": "0x261EfCdD24CeA98652B9700800a13DfBca4103fF", + "chainId": 1, + "name": "SynthsXAU", + "symbol": "sXAU", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x261efcdd24cea98652b9700800a13dfbca4103ff.png" + }, + { + "address": "0x617aeCB6137B5108D1E7D4918e3725C8cEbdB848", + "chainId": 1, + "name": "SynthsBNB", + "symbol": "sBNB", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x617aecb6137b5108d1e7d4918e3725c8cebdb848.png" + }, + { + "address": "0x2e59005c5c0f0a4D77CcA82653d48b46322EE5Cd", + "chainId": 1, + "name": "SynthsXTZ", + "symbol": "sXTZ", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x2e59005c5c0f0a4d77cca82653d48b46322ee5cd.png" + }, + { + "address": "0xbBC455cb4F1B9e4bFC4B73970d360c8f032EfEE6", + "chainId": 1, + "name": "SynthsLINK", + "symbol": "sLINK", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xbbc455cb4f1b9e4bfc4b73970d360c8f032efee6.png" + }, + { + "address": "0xAFD870F32CE54EfdBF677466B612bf8ad164454B", + "chainId": 1, + "name": "SynthiBNB", + "symbol": "iBNB", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xafd870f32ce54efdbf677466b612bf8ad164454b.png" + }, + { + "address": "0x8deef89058090ac5655A99EEB451a4f9183D1678", + "chainId": 1, + "name": "SynthiXTZ", + "symbol": "iXTZ", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x8deef89058090ac5655a99eeb451a4f9183d1678.png" + }, + { + "address": "0x79da1431150C9b82D2E5dfc1C68B33216846851e", + "chainId": 1, + "name": "SynthiLTC", + "symbol": "iLTC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x79da1431150c9b82d2e5dfc1c68b33216846851e.png" + }, + { + "address": "0xF4EebDD0704021eF2a6Bbe993fdf93030Cd784b4", + "chainId": 1, + "name": "SynthiEOS", + "symbol": "iEOS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf4eebdd0704021ef2a6bbe993fdf93030cd784b4.png" + }, + { + "address": "0x14d10003807AC60d07BB0ba82cAeaC8d2087c157", + "chainId": 1, + "name": "SynthiDEFI", + "symbol": "iDEFI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x14d10003807ac60d07bb0ba82caeac8d2087c157.png" + }, + { + "address": "0xeb269732ab75A6fD61Ea60b06fE994cD32a83549", + "chainId": 1, + "name": "dForce", + "symbol": "USDx", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xeb269732ab75a6fd61ea60b06fe994cd32a83549.png" + }, + { + "address": "0x0000000000085d4780B73119b644AE5ecd22b376", + "chainId": 1, + "name": "TrueUSD", + "symbol": "TUSD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0000000000085d4780b73119b644ae5ecd22b376.png" + }, + { + "address": "0x679131F591B4f369acB8cd8c51E68596806c3916", + "chainId": 1, + "name": "TrustlinesNetworkToken", + "symbol": "TLN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x679131f591b4f369acb8cd8c51e68596806c3916.png" + }, + { + "address": "0x3a3A65aAb0dd2A17E3F1947bA16138cd37d08c04", + "chainId": 1, + "name": "AaveInterestbearingETH", + "symbol": "aETHv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3a3a65aab0dd2a17e3f1947ba16138cd37d08c04.png" + }, + { + "address": "0xE1BA0FB44CCb0D11b80F92f4f8Ed94CA3fF51D00", + "chainId": 1, + "name": "AaveInterestbearingBAT", + "symbol": "aBATv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xe1ba0fb44ccb0d11b80f92f4f8ed94ca3ff51d00.png" + }, + { + "address": "0x9D91BE44C06d373a8a226E1f3b146956083803eB", + "chainId": 1, + "name": "AaveInterestbearingKNC", + "symbol": "aKNCv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x9d91be44c06d373a8a226e1f3b146956083803eb.png" + }, + { + "address": "0x7D2D3688Df45Ce7C552E19c27e007673da9204B8", + "chainId": 1, + "name": "AaveInterestbearingLEND", + "symbol": "aLENDv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x7d2d3688df45ce7c552e19c27e007673da9204b8.png" + }, + { + "address": "0x6FCE4A401B6B80ACe52baAefE4421Bd188e76F6f", + "chainId": 1, + "name": "AaveInterestbearingMANA", + "symbol": "aMANAv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6fce4a401b6b80ace52baaefe4421bd188e76f6f.png" + }, + { + "address": "0x7deB5e830be29F91E298ba5FF1356BB7f8146998", + "chainId": 1, + "name": "AaveInterestbearingMKR", + "symbol": "aMKRv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x7deb5e830be29f91e298ba5ff1356bb7f8146998.png" + }, + { + "address": "0x71010A9D003445aC60C4e6A7017c1E89A477B438", + "chainId": 1, + "name": "AaveInterestbearingREP", + "symbol": "aREPv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x71010a9d003445ac60c4e6a7017c1e89a477b438.png" + }, + { + "address": "0x328C4c80BC7aCa0834Db37e6600A6c49E12Da4DE", + "chainId": 1, + "name": "AaveInterestbearingSNX", + "symbol": "aSNXv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x328c4c80bc7aca0834db37e6600a6c49e12da4de.png" + }, + { + "address": "0xFC4B8ED459e00e5400be803A9BB3954234FD50e3", + "chainId": 1, + "name": "AaveInterestbearingWBTC", + "symbol": "aWBTCv1", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0xfc4b8ed459e00e5400be803a9bb3954234fd50e3.png" + }, + { + "address": "0x6Fb0855c404E09c47C3fBCA25f08d4E41f9F062f", + "chainId": 1, + "name": "AaveInterestbearingZRX", + "symbol": "aZRXv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6fb0855c404e09c47c3fbca25f08d4e41f9f062f.png" + }, + { + "address": "0x66fD97a78d8854fEc445cd1C80a07896B0b4851f", + "chainId": 1, + "name": "LunchMoney", + "symbol": "LMY", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x66fd97a78d8854fec445cd1c80a07896b0b4851f.png" + }, + { + "address": "0x16de59092dAE5CcF4A1E6439D611fd0653f0Bd01", + "chainId": 1, + "name": "iearnDAIv2", + "symbol": "yDAIv2", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x16de59092dae5ccf4a1e6439d611fd0653f0bd01.png" + }, + { + "address": "0xC2cB1040220768554cf699b0d863A3cd4324ce32", + "chainId": 1, + "name": "iearnDAIv3", + "symbol": "yDAIv3", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc2cb1040220768554cf699b0d863a3cd4324ce32.png" + }, + { + "address": "0x04bC0Ab673d88aE9dbC9DA2380cB6B79C4BCa9aE", + "chainId": 1, + "name": "iearnBUSD", + "symbol": "yBUSD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x04bc0ab673d88ae9dbc9da2380cb6b79c4bca9ae.png" + }, + { + "address": "0x04Aa51bbcB46541455cCF1B8bef2ebc5d3787EC9", + "chainId": 1, + "name": "iearnWBTC", + "symbol": "yBTC", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x04aa51bbcb46541455ccf1b8bef2ebc5d3787ec9.png" + }, + { + "address": "0x73a052500105205d34Daf004eAb301916DA8190f", + "chainId": 1, + "name": "iearnTUSD", + "symbol": "yTUSD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x73a052500105205d34daf004eab301916da8190f.png" + }, + { + "address": "0x83f798e925BcD4017Eb265844FDDAbb448f1707D", + "chainId": 1, + "name": "iearnUSDTv2", + "symbol": "yUSDTv2", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0x83f798e925bcd4017eb265844fddabb448f1707d.png" + }, + { + "address": "0xE6354ed5bC4b393a5Aad09f21c46E101e692d447", + "chainId": 1, + "name": "iearnUSDTv3", + "symbol": "yUSDTv3", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0xe6354ed5bc4b393a5aad09f21c46e101e692d447.png" + }, + { + "address": "0xd6aD7a6750A7593E092a9B218d66C0A814a3436e", + "chainId": 1, + "name": "iearnUSDCv2", + "symbol": "yUSDCv2", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0xd6ad7a6750a7593e092a9b218d66c0a814a3436e.png" + }, + { + "address": "0x26EA744E5B887E5205727f55dFBE8685e3b21951", + "chainId": 1, + "name": "iearnUSDCv3", + "symbol": "yUSDCv3", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0x26ea744e5b887e5205727f55dfbe8685e3b21951.png" + }, + { + "address": "0xF61718057901F84C4eEC4339EF8f0D86D2B45600", + "chainId": 1, + "name": "iearnSUSD", + "symbol": "ySUSD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf61718057901f84c4eec4339ef8f0d86d2b45600.png" + }, + { + "address": "0xAcfa209Fb73bF3Dd5bBfb1101B9Bc999C49062a5", + "chainId": 1, + "name": "BlockchainCertifiedDataToken", + "symbol": "BCDT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xacfa209fb73bf3dd5bbfb1101b9bc999c49062a5.png" + }, + { + "address": "0x4de2573e27E648607B50e1Cfff921A33E4A34405", + "chainId": 1, + "name": "LendroidSupportToken", + "symbol": "LST", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4de2573e27e648607b50e1cfff921a33e4a34405.png" + }, + { + "address": "0x630d98424eFe0Ea27fB1b3Ab7741907DFFEaAd78", + "chainId": 1, + "name": "PEAKDEFI", + "symbol": "PEAK", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x630d98424efe0ea27fb1b3ab7741907dffeaad78.png" + }, + { + "address": "0xD56daC73A4d6766464b38ec6D91eB45Ce7457c44", + "chainId": 1, + "name": "Panvalapan", + "symbol": "PAN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xd56dac73a4d6766464b38ec6d91eb45ce7457c44.png" + }, + { + "address": "0x056Fd409E1d7A124BD7017459dFEa2F387b6d5Cd", + "chainId": 1, + "name": "Geminidollar", + "symbol": "GUSD", + "decimals": 2, + "logoURI": "https://tokens.1inch.exchange/0x056fd409e1d7a124bd7017459dfea2f387b6d5cd.png" + }, + { + "address": "0x6Ee0f7BB50a54AB5253dA0667B0Dc2ee526C30a8", + "chainId": 1, + "name": "AaveInterestbearingBinanceUSD", + "symbol": "aBUSDv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6ee0f7bb50a54ab5253da0667b0dc2ee526c30a8.png" + }, + { + "address": "0xD7EFB00d12C2c13131FD319336Fdf952525dA2af", + "chainId": 1, + "name": "Proton", + "symbol": "XPR", + "decimals": 4, + "logoURI": "https://tokens.1inch.exchange/0xd7efb00d12c2c13131fd319336fdf952525da2af.png" + }, + { + "address": "0x85Eee30c52B0b379b046Fb0F85F4f3Dc3009aFEC", + "chainId": 1, + "name": "KEEPToken", + "symbol": "KEEP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x85eee30c52b0b379b046fb0f85f4f3dc3009afec.png" + }, + { + "address": "0x1C5db575E2Ff833E46a2E9864C22F4B22E0B37C2", + "chainId": 1, + "name": "renZEC", + "symbol": "renZEC", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x1c5db575e2ff833e46a2e9864c22f4b22e0b37c2.png" + }, + { + "address": "0x459086F2376525BdCebA5bDDA135e4E9d3FeF5bf", + "chainId": 1, + "name": "renBCH", + "symbol": "renBCH", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x459086f2376525bdceba5bdda135e4e9d3fef5bf.png" + }, + { + "address": "0x8dAEBADE922dF735c38C80C7eBD708Af50815fAa", + "chainId": 1, + "name": "tBTC", + "symbol": "tBTC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x8daebade922df735c38c80c7ebd708af50815faa.png" + }, + { + "address": "0x0316EB71485b0Ab14103307bf65a021042c6d380", + "chainId": 1, + "name": "HuobiBTC", + "symbol": "HBTC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0316eb71485b0ab14103307bf65a021042c6d380.png" + }, + { + "address": "0x3A9FfF453d50D4Ac52A6890647b823379ba36B9E", + "chainId": 1, + "name": "Shuffle.MonsterV3", + "symbol": "SHUF", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3a9fff453d50d4ac52a6890647b823379ba36b9e.png" + }, + { + "address": "0xC0F9bD5Fa5698B6505F643900FFA515Ea5dF54A9", + "chainId": 1, + "name": "DONUT", + "symbol": "DONUT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc0f9bd5fa5698b6505f643900ffa515ea5df54a9.png" + }, + { + "address": "0x0000000000004946c0e9F43F4Dee607b0eF1fA1c", + "chainId": 1, + "name": "ChiGastokenby1inch", + "symbol": "CHI", + "decimals": 0, + "logoURI": "https://tokens.1inch.exchange/0x0000000000004946c0e9f43f4dee607b0ef1fa1c.png" + }, + { + "address": "0xD6a55C63865AffD67E2FB9f284F87b7a9E5FF3bD", + "chainId": 1, + "name": "Switch", + "symbol": "ESH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xd6a55c63865affd67e2fb9f284f87b7a9e5ff3bd.png" + }, + { + "address": "0x1Fc31488f28ac846588FFA201cDe0669168471bD", + "chainId": 1, + "name": "UAX", + "symbol": "UAX", + "decimals": 2, + "logoURI": "https://tokens.1inch.exchange/0x1fc31488f28ac846588ffa201cde0669168471bd.png" + }, + { + "address": "0x45804880De22913dAFE09f4980848ECE6EcbAf78", + "chainId": 1, + "name": "PaxosGold", + "symbol": "PAXG", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x45804880de22913dafe09f4980848ece6ecbaf78.png" + }, + { + "address": "0x06301057D77D54B6e14c7FafFB11Ffc7Cab4eaa7", + "chainId": 1, + "name": "DMMDAI", + "symbol": "mDAI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x06301057d77d54b6e14c7faffb11ffc7cab4eaa7.png" + }, + { + "address": "0xdF9307DFf0a1B57660F60f9457D32027a55ca0B2", + "chainId": 1, + "name": "DMMETH", + "symbol": "mETH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xdf9307dff0a1b57660f60f9457d32027a55ca0b2.png" + }, + { + "address": "0x3564ad35b9E95340E5Ace2D6251dbfC76098669B", + "chainId": 1, + "name": "DMMUSDC", + "symbol": "mUSDC", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0x3564ad35b9e95340e5ace2d6251dbfc76098669b.png" + }, + { + "address": "0x035dF12E0F3ac6671126525f1015E47D79dFEDDF", + "chainId": 1, + "name": "0xMonero", + "symbol": "0xMR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x035df12e0f3ac6671126525f1015e47d79dfeddf.png" + }, + { + "address": "0x9A48BD0EC040ea4f1D3147C025cd4076A2e71e3e", + "chainId": 1, + "name": "PieDAOUSD++Pool", + "symbol": "USD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x9a48bd0ec040ea4f1d3147c025cd4076a2e71e3e.png" + }, + { + "address": "0xB64ef51C888972c908CFacf59B47C1AfBC0Ab8aC", + "chainId": 1, + "name": "Storj", + "symbol": "STORJ", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0xb64ef51c888972c908cfacf59b47c1afbc0ab8ac.png" + }, + { + "address": "0x1c79ab32C66aCAa1e9E81952B8AAa581B43e54E7", + "chainId": 1, + "name": "TEAM", + "symbol": "TEAM", + "decimals": 4, + "logoURI": "https://tokens.1inch.exchange/0x1c79ab32c66acaa1e9e81952b8aaa581b43e54e7.png" + }, + { + "address": "0x4156D3342D5c385a87D264F90653733592000581", + "chainId": 1, + "name": "Salt", + "symbol": "SALT", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x4156d3342d5c385a87d264f90653733592000581.png" + }, + { + "address": "0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8", + "chainId": 1, + "name": "Curve.fiiearnpooltoken", + "symbol": "yCurve", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xdf5e0e81dff6faf3a7e52ba697820c5e32d806a8.png" + }, + { + "address": "0xFca59Cd816aB1eaD66534D82bc21E7515cE441CF", + "chainId": 1, + "name": "Rarible", + "symbol": "RARI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xfca59cd816ab1ead66534d82bc21e7515ce441cf.png" + }, + { + "address": "0xea5f88E54d982Cbb0c441cde4E79bC305e5b43Bc", + "chainId": 1, + "name": "ParetoNetworkToken", + "symbol": "PARETO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xea5f88e54d982cbb0c441cde4e79bc305e5b43bc.png" + }, + { + "address": "0x9fBFed658919A896B5Dc7b00456Ce22D780f9B65", + "chainId": 1, + "name": "PlutusDeFi", + "symbol": "PLT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x9fbfed658919a896b5dc7b00456ce22d780f9b65.png" + }, + { + "address": "0x5228a22e72ccC52d415EcFd199F99D0665E7733b", + "chainId": 1, + "name": "pTokensBTC", + "symbol": "pBTC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5228a22e72ccc52d415ecfd199f99d0665e7733b.png" + }, + { + "address": "0x476c5E26a75bd202a9683ffD34359C0CC15be0fF", + "chainId": 1, + "name": "Serum", + "symbol": "SRM", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0x476c5e26a75bd202a9683ffd34359c0cc15be0ff.png" + }, + { + "address": "0xc813EA5e3b48BEbeedb796ab42A30C5599b01740", + "chainId": 1, + "name": "Autonio", + "symbol": "NIOX", + "decimals": 4, + "logoURI": "https://tokens.1inch.exchange/0xc813ea5e3b48bebeedb796ab42a30c5599b01740.png" + }, + { + "address": "0xa7DE087329BFcda5639247F96140f9DAbe3DeED1", + "chainId": 1, + "name": "Statera", + "symbol": "STA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa7de087329bfcda5639247f96140f9dabe3deed1.png" + }, + { + "address": "0xDc5864eDe28BD4405aa04d93E05A0531797D9D59", + "chainId": 1, + "name": "Falcon", + "symbol": "FNT", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0xdc5864ede28bd4405aa04d93e05a0531797d9d59.png" + }, + { + "address": "0x0AaCfbeC6a24756c20D41914F2caba817C0d8521", + "chainId": 1, + "name": "YAM", + "symbol": "YAM", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0aacfbec6a24756c20d41914f2caba817c0d8521.png" + }, + { + "address": "0xADE00C28244d5CE17D72E40330B1c318cD12B7c3", + "chainId": 1, + "name": "AdExNetwork", + "symbol": "ADX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xade00c28244d5ce17d72e40330b1c318cd12b7c3.png" + }, + { + "address": "0xD533a949740bb3306d119CC777fa900bA034cd52", + "chainId": 1, + "name": "CurveDAOToken", + "symbol": "CRV", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xd533a949740bb3306d119cc777fa900ba034cd52.png" + }, + { + "address": "0x9469D013805bFfB7D3DEBe5E7839237e535ec483", + "chainId": 1, + "name": "DarwiniaNetworkNativeToken", + "symbol": "RING", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x9469d013805bffb7d3debe5e7839237e535ec483.png" + }, + { + "address": "0x2baEcDf43734F22FD5c152DB08E3C27233F0c7d2", + "chainId": 1, + "name": "OMToken", + "symbol": "OMv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x2baecdf43734f22fd5c152db08e3c27233f0c7d2.png" + }, + { + "address": "0x491604c0FDF08347Dd1fa4Ee062a822A5DD06B5D", + "chainId": 1, + "name": "CartesiToken", + "symbol": "CTSI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x491604c0fdf08347dd1fa4ee062a822a5dd06b5d.png" + }, + { + "address": "0x0fF6ffcFDa92c53F615a4A75D982f399C989366b", + "chainId": 1, + "name": "Unilayer", + "symbol": "LAYER", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0ff6ffcfda92c53f615a4a75d982f399c989366b.png" + }, + { + "address": "0xD5525D397898e5502075Ea5E830d8914f6F0affe", + "chainId": 1, + "name": "MEME", + "symbol": "MEME", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0xd5525d397898e5502075ea5e830d8914f6f0affe.png" + }, + { + "address": "0x68A118Ef45063051Eac49c7e647CE5Ace48a68a5", + "chainId": 1, + "name": "BASED", + "symbol": "BASED", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x68a118ef45063051eac49c7e647ce5ace48a68a5.png" + }, + { + "address": "0xaA7a9CA87d3694B5755f213B5D04094b8d0F0A6F", + "chainId": 1, + "name": "Trace", + "symbol": "TRAC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xaa7a9ca87d3694b5755f213b5d04094b8d0f0a6f.png" + }, + { + "address": "0x4Dfd148B532e934a2a26eA65689cf6268753e130", + "chainId": 1, + "name": "GovernancetokenMonolithosDAO", + "symbol": "MDT2", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4dfd148b532e934a2a26ea65689cf6268753e130.png" + }, + { + "address": "0xAba8cAc6866B83Ae4eec97DD07ED254282f6aD8A", + "chainId": 1, + "name": "YAMv2", + "symbol": "YAMv2", + "decimals": 24, + "logoURI": "https://tokens.1inch.exchange/0xaba8cac6866b83ae4eec97dd07ed254282f6ad8a.png" + }, + { + "address": "0x8A9C67fee641579dEbA04928c4BC45F66e26343A", + "chainId": 1, + "name": "JarvisRewardToken", + "symbol": "JRT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x8a9c67fee641579deba04928c4bc45f66e26343a.png" + }, + { + "address": "0x45f24BaEef268BB6d63AEe5129015d69702BCDfa", + "chainId": 1, + "name": "YFValue", + "symbol": "YFV", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x45f24baeef268bb6d63aee5129015d69702bcdfa.png" + }, + { + "address": "0x674C6Ad92Fd080e4004b2312b45f796a192D27a0", + "chainId": 1, + "name": "Neutrino", + "symbol": "USDN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x674c6ad92fd080e4004b2312b45f796a192d27a0.png" + }, + { + "address": "0x362bc847A3a9637d3af6624EeC853618a43ed7D2", + "chainId": 1, + "name": "ParsiqToken", + "symbol": "PRQ", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x362bc847a3a9637d3af6624eec853618a43ed7d2.png" + }, + { + "address": "0x0E29e5AbbB5FD88e28b2d355774e73BD47dE3bcd", + "chainId": 1, + "name": "HakkaFinance", + "symbol": "HAKKA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0e29e5abbb5fd88e28b2d355774e73bd47de3bcd.png" + }, + { + "address": "0x08AD83D779BDf2BBE1ad9cc0f78aa0D24AB97802", + "chainId": 1, + "name": "RobonomicsWebServicesV1", + "symbol": "RWS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x08ad83d779bdf2bbe1ad9cc0f78aa0d24ab97802.png" + }, + { + "address": "0x09e64c2B61a5f1690Ee6fbeD9baf5D6990F8dFd0", + "chainId": 1, + "name": "Growth", + "symbol": "GRO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x09e64c2b61a5f1690ee6fbed9baf5d6990f8dfd0.png" + }, + { + "address": "0x38e4adB44ef08F22F5B5b76A8f0c2d0dCbE7DcA1", + "chainId": 1, + "name": "ConcentratedVotingPower", + "symbol": "CVP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x38e4adb44ef08f22f5b5b76a8f0c2d0dcbe7dca1.png" + }, + { + "address": "0x4FE5851C9af07df9e5AD8217aFAE1ea72737Ebda", + "chainId": 1, + "name": "OpenPredictToken", + "symbol": "OPT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4fe5851c9af07df9e5ad8217afae1ea72737ebda.png" + }, + { + "address": "0x6B3595068778DD592e39A122f4f5a5cF09C90fE2", + "chainId": 1, + "name": "SushiToken", + "symbol": "SUSHI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6b3595068778dd592e39a122f4f5a5cf09c90fe2.png" + }, + { + "address": "0x3aFfCCa64c2A6f4e3B6Bd9c64CD2C969EFd1ECBe", + "chainId": 1, + "name": "DSLA", + "symbol": "DSLA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3affcca64c2a6f4e3b6bd9c64cd2c969efd1ecbe.png" + }, + { + "address": "0xBa21Ef4c9f433Ede00badEFcC2754B8E74bd538A", + "chainId": 1, + "name": "Swapfolio", + "symbol": "SWFL", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xba21ef4c9f433ede00badefcc2754b8e74bd538a.png" + }, + { + "address": "0xfffffffFf15AbF397dA76f1dcc1A1604F45126DB", + "chainId": 1, + "name": "FalconSwapToken", + "symbol": "FSW", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xfffffffff15abf397da76f1dcc1a1604f45126db.png" + }, + { + "address": "0x94d863173EE77439E4292284fF13fAD54b3BA182", + "chainId": 1, + "name": "AkropolisDelphi", + "symbol": "ADEL", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x94d863173ee77439e4292284ff13fad54b3ba182.png" + }, + { + "address": "0xB8BAa0e4287890a5F79863aB62b7F175ceCbD433", + "chainId": 1, + "name": "SwerveDAOToken", + "symbol": "SWRV", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb8baa0e4287890a5f79863ab62b7f175cecbd433.png" + }, + { + "address": "0xf8aD7dFe656188A23e89da09506Adf7ad9290D5d", + "chainId": 1, + "name": "BloceryToken", + "symbol": "BLY", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf8ad7dfe656188a23e89da09506adf7ad9290d5d.png" + }, + { + "address": "0x8a6f3BF52A26a21531514E23016eEAe8Ba7e7018", + "chainId": 1, + "name": "Multiplier", + "symbol": "MXX", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x8a6f3bf52a26a21531514e23016eeae8ba7e7018.png" + }, + { + "address": "0x103c3A209da59d3E7C4A89307e66521e081CFDF0", + "chainId": 1, + "name": "GenesisVision", + "symbol": "GVT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x103c3a209da59d3e7c4a89307e66521e081cfdf0.png" + }, + { + "address": "0x892B14321a4FCba80669aE30Bd0cd99a7ECF6aC0", + "chainId": 1, + "name": "CreamCream", + "symbol": "crCream", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x892b14321a4fcba80669ae30bd0cd99a7ecf6ac0.png" + }, + { + "address": "0xe1237aA7f535b0CC33Fd973D66cBf830354D16c7", + "chainId": 1, + "name": "yearnWrappedEther", + "symbol": "yWETH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xe1237aa7f535b0cc33fd973d66cbf830354d16c7.png" + }, + { + "address": "0x5dbcF33D8c2E976c6b560249878e6F1491Bca25c", + "chainId": 1, + "name": "yearnCurve.fiyDAIyUSDCyUSDTyTUSD", + "symbol": "yyCurve", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5dbcf33d8c2e976c6b560249878e6f1491bca25c.png" + }, + { + "address": "0x50026ad58b338Cf3eccC2b422dEB8Faa725F377F", + "chainId": 1, + "name": "1Step.finance", + "symbol": "STEP", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x50026ad58b338cf3eccc2b422deb8faa725f377f.png" + }, + { + "address": "0x1Aa61c196E76805fcBe394eA00e4fFCEd24FC469", + "chainId": 1, + "name": "yieldfarming.insure", + "symbol": "SAFE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1aa61c196e76805fcbe394ea00e4ffced24fc469.png" + }, + { + "address": "0x556148562d5DdeB72545D7EC4B3eC8edc8F55Ba7", + "chainId": 1, + "name": "PredixNetwork", + "symbol": "PRDX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x556148562d5ddeb72545d7ec4b3ec8edc8f55ba7.png" + }, + { + "address": "0x1494CA1F11D487c2bBe4543E90080AeBa4BA3C2b", + "chainId": 1, + "name": "DefiPulseIndex", + "symbol": "DPI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1494ca1f11d487c2bbe4543e90080aeba4ba3c2b.png" + }, + { + "address": "0x3F382DbD960E3a9bbCeaE22651E88158d2791550", + "chainId": 1, + "name": "AavegotchiGHSTToken", + "symbol": "GHST", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3f382dbd960e3a9bbceae22651e88158d2791550.png" + }, + { + "address": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", + "chainId": 1, + "name": "Uniswap", + "symbol": "UNI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984.png" + }, + { + "address": "0x2e93FE8d550a7B7E7b2e561cd45ceBccbAa79358", + "chainId": 1, + "name": "GXChainCoreAsset", + "symbol": "GXC", + "decimals": 5, + "logoURI": "https://tokens.1inch.exchange/0x2e93fe8d550a7b7e7b2e561cd45cebccbaa79358.png" + }, + { + "address": "0x429881672B9AE42b8EbA0E26cD9C73711b891Ca5", + "chainId": 1, + "name": "PickleToken", + "symbol": "PICKLE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x429881672b9ae42b8eba0e26cd9c73711b891ca5.png" + }, + { + "address": "0xf8C3527CC04340b208C854E985240c02F7B7793f", + "chainId": 1, + "name": "FrontierToken", + "symbol": "FRONT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf8c3527cc04340b208c854e985240c02f7b7793f.png" + }, + { + "address": "0xca1207647Ff814039530D7d35df0e1Dd2e91Fa84", + "chainId": 1, + "name": "dHedgeDAOToken", + "symbol": "DHT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xca1207647ff814039530d7d35df0e1dd2e91fa84.png" + }, + { + "address": "0xa0246c9032bC3A600820415aE600c6388619A14D", + "chainId": 1, + "name": "FARMRewardToken", + "symbol": "FARM", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa0246c9032bc3a600820415ae600c6388619a14d.png" + }, + { + "address": "0x488E0369f9BC5C40C002eA7c1fe4fd01A198801c", + "chainId": 1, + "name": "Golff.finance", + "symbol": "GOF", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x488e0369f9bc5c40c002ea7c1fe4fd01a198801c.png" + }, + { + "address": "0xECbF566944250ddE88322581024E611419715f7A", + "chainId": 1, + "name": "xBTC", + "symbol": "xBTC", + "decimals": 9, + "logoURI": "https://tokens.1inch.exchange/0xecbf566944250dde88322581024e611419715f7a.png" + }, + { + "address": "0x2A8e1E676Ec238d8A992307B495b45B3fEAa5e86", + "chainId": 1, + "name": "OriginDollar", + "symbol": "OUSD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x2a8e1e676ec238d8a992307b495b45b3feaa5e86.png" + }, + { + "address": "0x1D09144F3479bb805CB7c92346987420BcbDC10C", + "chainId": 1, + "name": "CreamYUSD", + "symbol": "cyUSD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1d09144f3479bb805cb7c92346987420bcbdc10c.png" + }, + { + "address": "0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", + "chainId": 1, + "name": "AaveToken", + "symbol": "AAVE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9.png" + }, + { + "address": "0x43Dfc4159D86F3A37A5A4B3D4580b888ad7d4DDd", + "chainId": 1, + "name": "DODObird", + "symbol": "DODO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x43dfc4159d86f3a37a5a4b3d4580b888ad7d4ddd.png" + }, + { + "address": "0x250a3500f48666561386832f1F1f1019b89a2699", + "chainId": 1, + "name": "SAFE2", + "symbol": "SAFE2", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x250a3500f48666561386832f1f1f1019b89a2699.png" + }, + { + "address": "0x6006FC2a849fEdABa8330ce36F5133DE01F96189", + "chainId": 1, + "name": "SHAKEtokenbySpaceSwapv2", + "symbol": "SHAKE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6006fc2a849fedaba8330ce36f5133de01f96189.png" + }, + { + "address": "0x80c8C3dCfB854f9542567c8Dac3f44D709eBc1de", + "chainId": 1, + "name": "MilkyWayTokenbySpaceSwapv2", + "symbol": "MILK2", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x80c8c3dcfb854f9542567c8dac3f44d709ebc1de.png" + }, + { + "address": "0x62359Ed7505Efc61FF1D56fEF82158CcaffA23D7", + "chainId": 1, + "name": "cVault.finance", + "symbol": "CORE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x62359ed7505efc61ff1d56fef82158ccaffa23d7.png" + }, + { + "address": "0xbC396689893D065F41bc2C6EcbeE5e0085233447", + "chainId": 1, + "name": "Perpetual", + "symbol": "PERP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xbc396689893d065f41bc2c6ecbee5e0085233447.png" + }, + { + "address": "0x49E833337ECe7aFE375e44F4E3e8481029218E5c", + "chainId": 1, + "name": "ValueLiquidity", + "symbol": "VALUE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x49e833337ece7afe375e44f4e3e8481029218e5c.png" + }, + { + "address": "0x4b7aD3a56810032782Afce12d7d27122bDb96efF", + "chainId": 1, + "name": "Sparkle", + "symbol": "SPRKL", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x4b7ad3a56810032782afce12d7d27122bdb96eff.png" + }, + { + "address": "0x1c48f86ae57291F7686349F12601910BD8D470bb", + "chainId": 1, + "name": "USDK", + "symbol": "USDK", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1c48f86ae57291f7686349f12601910bd8d470bb.png" + }, + { + "address": "0x87eDfFDe3E14c7a66c9b9724747a1C5696b742e6", + "chainId": 1, + "name": "SwagToken", + "symbol": "SWAG", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x87edffde3e14c7a66c9b9724747a1c5696b742e6.png" + }, + { + "address": "0xaD6A626aE2B43DCb1B39430Ce496d2FA0365BA9C", + "chainId": 1, + "name": "PieDAODEFISmallCap", + "symbol": "DEFIS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xad6a626ae2b43dcb1b39430ce496d2fa0365ba9c.png" + }, + { + "address": "0xad32A8e6220741182940c5aBF610bDE99E737b2D", + "chainId": 1, + "name": "PieDAODOUGHv2", + "symbol": "DOUGH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xad32a8e6220741182940c5abf610bde99e737b2d.png" + }, + { + "address": "0x3F09400313e83d53366147e3ea0e4e2279D80850", + "chainId": 1, + "name": "KUSH.FINANCE", + "symbol": "kSEED", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3f09400313e83d53366147e3ea0e4e2279d80850.png" + }, + { + "address": "0x70e36f6BF80a52b3B46b3aF8e106CC0ed743E8e4", + "chainId": 1, + "name": "CompoundCollateral", + "symbol": "cCOMP", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x70e36f6bf80a52b3b46b3af8e106cc0ed743e8e4.png" + }, + { + "address": "0x35A18000230DA775CAc24873d00Ff85BccdeD550", + "chainId": 1, + "name": "CompoundUniswap", + "symbol": "cUNI", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x35a18000230da775cac24873d00ff85bccded550.png" + }, + { + "address": "0x70da48f4B7e83c386ef983D4CEF4e58c2c09D8Ac", + "chainId": 1, + "name": "QurasToken", + "symbol": "XQC", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x70da48f4b7e83c386ef983d4cef4e58c2c09d8ac.png" + }, + { + "address": "0xe2f2a5C287993345a840Db3B0845fbC70f5935a5", + "chainId": 1, + "name": "mStableUSD", + "symbol": "mUSD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xe2f2a5c287993345a840db3b0845fbc70f5935a5.png" + }, + { + "address": "0x2eDf094dB69d6Dcd487f1B3dB9febE2eeC0dd4c5", + "chainId": 1, + "name": "ZeroSwapToken", + "symbol": "ZEE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x2edf094db69d6dcd487f1b3db9febe2eec0dd4c5.png" + }, + { + "address": "0x584bC13c7D411c00c01A62e8019472dE68768430", + "chainId": 1, + "name": "Hegic", + "symbol": "HEGIC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x584bc13c7d411c00c01a62e8019472de68768430.png" + }, + { + "address": "0x054f76beED60AB6dBEb23502178C52d6C5dEbE40", + "chainId": 1, + "name": "DeFiner", + "symbol": "FIN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x054f76beed60ab6dbeb23502178c52d6c5debe40.png" + }, + { + "address": "0xcbd55D4fFc43467142761A764763652b48b969ff", + "chainId": 1, + "name": "AstroTools.io", + "symbol": "ASTRO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xcbd55d4ffc43467142761a764763652b48b969ff.png" + }, + { + "address": "0xfF20817765cB7f73d4bde2e66e067E58D11095C2", + "chainId": 1, + "name": "Amp", + "symbol": "AMP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xff20817765cb7f73d4bde2e66e067e58d11095c2.png" + }, + { + "address": "0x0391D2021f89DC339F60Fff84546EA23E337750f", + "chainId": 1, + "name": "BarnBridgeGovernanceToken", + "symbol": "BOND", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0391d2021f89dc339f60fff84546ea23e337750f.png" + }, + { + "address": "0xa117000000f279D81A1D3cc75430fAA017FA5A2e", + "chainId": 1, + "name": "AragonNetworkToken", + "symbol": "ANT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa117000000f279d81a1d3cc75430faa017fa5a2e.png" + }, + { + "address": "0x970B9bB2C0444F5E81e9d0eFb84C8ccdcdcAf84d", + "chainId": 1, + "name": "FuseToken", + "symbol": "FUSE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x970b9bb2c0444f5e81e9d0efb84c8ccdcdcaf84d.png" + }, + { + "address": "0x36F3FD68E7325a35EB768F1AedaAe9EA0689d723", + "chainId": 1, + "name": "EmptySetDollar", + "symbol": "ESD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x36f3fd68e7325a35eb768f1aedaae9ea0689d723.png" + }, + { + "address": "0xa9AF25a2d43Eb04723a6Ec0749913519cf347842", + "chainId": 1, + "name": "TealCoin", + "symbol": "TEAC", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0xa9af25a2d43eb04723a6ec0749913519cf347842.png" + }, + { + "address": "0x1cEB5cB57C4D4E2b2433641b95Dd330A33185A44", + "chainId": 1, + "name": "Keep3rV1", + "symbol": "KP3R", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1ceb5cb57c4d4e2b2433641b95dd330a33185a44.png" + }, + { + "address": "0x5BC25f649fc4e26069dDF4cF4010F9f706c23831", + "chainId": 1, + "name": "DefiDollar", + "symbol": "DUSD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5bc25f649fc4e26069ddf4cf4010f9f706c23831.png" + }, + { + "address": "0xB705268213D593B8FD88d3FDEFF93AFF5CbDcfAE", + "chainId": 1, + "name": "IDEXToken", + "symbol": "IDEX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb705268213d593b8fd88d3fdeff93aff5cbdcfae.png" + }, + { + "address": "0x2e2364966267B5D7D2cE6CD9A9B5bD19d9C7C6A9", + "chainId": 1, + "name": "NIXBridgeToken", + "symbol": "NBT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x2e2364966267b5d7d2ce6cd9a9b5bd19d9c7c6a9.png" + }, + { + "address": "0xEEF9f339514298C6A857EfCfC1A762aF84438dEE", + "chainId": 1, + "name": "HermezNetworkToken", + "symbol": "HEZ", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xeef9f339514298c6a857efcfc1a762af84438dee.png" + }, + { + "address": "0xEa319e87Cf06203DAe107Dd8E5672175e3Ee976c", + "chainId": 1, + "name": "SURF.Finance", + "symbol": "SURF", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xea319e87cf06203dae107dd8e5672175e3ee976c.png" + }, + { + "address": "0x3383c5a8969Dc413bfdDc9656Eb80A1408E4bA20", + "chainId": 1, + "name": "WrappedANATHA", + "symbol": "wANATHA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3383c5a8969dc413bfddc9656eb80a1408e4ba20.png" + }, + { + "address": "0x18aAA7115705e8be94bfFEBDE57Af9BFc265B998", + "chainId": 1, + "name": "Audius", + "symbol": "AUDIO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x18aaa7115705e8be94bffebde57af9bfc265b998.png" + }, + { + "address": "0xa665FED1b0C9dA00e91ca582f77dF36E325048c5", + "chainId": 1, + "name": "yfarm.finance", + "symbol": "YFM", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa665fed1b0c9da00e91ca582f77df36e325048c5.png" + }, + { + "address": "0xdacD69347dE42baBfAEcD09dC88958378780FB62", + "chainId": 1, + "name": "AtariToken", + "symbol": "ATRI", + "decimals": 0, + "logoURI": "https://tokens.1inch.exchange/0xdacd69347de42babfaecd09dc88958378780fb62.png" + }, + { + "address": "0x0954906da0Bf32d5479e25f46056d22f08464cab", + "chainId": 1, + "name": "Index", + "symbol": "INDEX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0954906da0bf32d5479e25f46056d22f08464cab.png" + }, + { + "address": "0xC57d533c50bC22247d49a368880fb49a1caA39F7", + "chainId": 1, + "name": "PowerTradeFuelToken", + "symbol": "PTF", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc57d533c50bc22247d49a368880fb49a1caa39f7.png" + }, + { + "address": "0x20c36f062a31865bED8a5B1e512D9a1A20AA333A", + "chainId": 1, + "name": "DefiDollarDAO", + "symbol": "DFD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x20c36f062a31865bed8a5b1e512d9a1a20aa333a.png" + }, + { + "address": "0x95a4492F028aa1fd432Ea71146b433E7B4446611", + "chainId": 1, + "name": "APYGovernanceToken", + "symbol": "APY", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x95a4492f028aa1fd432ea71146b433e7b4446611.png" + }, + { + "address": "0xbEa98c05eEAe2f3bC8c3565Db7551Eb738c8CCAb", + "chainId": 1, + "name": "Geyser", + "symbol": "GYSR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xbea98c05eeae2f3bc8c3565db7551eb738c8ccab.png" + }, + { + "address": "0xA89ac6e529aCf391CfbBD377F3aC9D93eae9664e", + "chainId": 1, + "name": "Keep4r", + "symbol": "KP4R", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa89ac6e529acf391cfbbd377f3ac9d93eae9664e.png" + }, + { + "address": "0xF5D669627376EBd411E34b98F19C868c8ABA5ADA", + "chainId": 1, + "name": "AxieInfinityShard", + "symbol": "AXS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf5d669627376ebd411e34b98f19c868c8aba5ada.png" + }, + { + "address": "0x297E4e5e59Ad72B1B0A2fd446929e76117be0E0a", + "chainId": 1, + "name": "ValorToken", + "symbol": "VALOR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x297e4e5e59ad72b1b0a2fd446929e76117be0e0a.png" + }, + { + "address": "0x00a8b738E453fFd858a7edf03bcCfe20412f0Eb0", + "chainId": 1, + "name": "AllianceBlockToken", + "symbol": "ALBT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x00a8b738e453ffd858a7edf03bccfe20412f0eb0.png" + }, + { + "address": "0x5bEaBAEBB3146685Dd74176f68a0721F91297D37", + "chainId": 1, + "name": "BounceToken", + "symbol": "BOT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5beabaebb3146685dd74176f68a0721f91297d37.png" + }, + { + "address": "0x05D3606d5c81EB9b7B18530995eC9B29da05FaBa", + "chainId": 1, + "name": "TomoChain", + "symbol": "TOMOE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x05d3606d5c81eb9b7b18530995ec9b29da05faba.png" + }, + { + "address": "0xB1f66997A5760428D3a87D68b90BfE0aE64121cC", + "chainId": 1, + "name": "LuaToken", + "symbol": "LUA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb1f66997a5760428d3a87d68b90bfe0ae64121cc.png" + }, + { + "address": "0x39eAE99E685906fF1C11A962a743440d0a1A6e09", + "chainId": 1, + "name": "Holyheld", + "symbol": "HOLY", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x39eae99e685906ff1c11a962a743440d0a1a6e09.png" + }, + { + "address": "0x9d942bD31169eD25a1ca78c776DAB92dE104e50E", + "chainId": 1, + "name": "DeFISocks2020", + "symbol": "DEFISOCKS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x9d942bd31169ed25a1ca78c776dab92de104e50e.png" + }, + { + "address": "0xf4CD3d3Fda8d7Fd6C5a500203e38640A70Bf9577", + "chainId": 1, + "name": "YfDAI.finance", + "symbol": "YfDAI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xf4cd3d3fda8d7fd6c5a500203e38640a70bf9577.png" + }, + { + "address": "0x83e6f1E41cdd28eAcEB20Cb649155049Fac3D5Aa", + "chainId": 1, + "name": "PolkastarterToken", + "symbol": "POLS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x83e6f1e41cdd28eaceb20cb649155049fac3d5aa.png" + }, + { + "address": "0xaf9f549774ecEDbD0966C52f250aCc548D3F36E5", + "chainId": 1, + "name": "RioFuelToken", + "symbol": "RFuel", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xaf9f549774ecedbd0966c52f250acc548d3f36e5.png" + }, + { + "address": "0x0202Be363B8a4820f3F4DE7FaF5224fF05943AB1", + "chainId": 1, + "name": "UniLendFinanceToken", + "symbol": "UFT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0202be363b8a4820f3f4de7faf5224ff05943ab1.png" + }, + { + "address": "0xaE697F994Fc5eBC000F8e22EbFfeE04612f98A0d", + "chainId": 1, + "name": "LGCYNetwork", + "symbol": "LGCY", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xae697f994fc5ebc000f8e22ebffee04612f98a0d.png" + }, + { + "address": "0x9D47894f8BECB68B9cF3428d256311Affe8B068B", + "chainId": 1, + "name": "ROPE", + "symbol": "ROPE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x9d47894f8becb68b9cf3428d256311affe8b068b.png" + }, + { + "address": "0x72F020f8f3E8fd9382705723Cd26380f8D0c66Bb", + "chainId": 1, + "name": "PLOT", + "symbol": "PLOT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x72f020f8f3e8fd9382705723cd26380f8d0c66bb.png" + }, + { + "address": "0x6A7Ef4998eB9d0f706238756949F311a59E05745", + "chainId": 1, + "name": "KenysiansNetwork", + "symbol": "KEN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6a7ef4998eb9d0f706238756949f311a59e05745.png" + }, + { + "address": "0x20945cA1df56D237fD40036d47E866C7DcCD2114", + "chainId": 1, + "name": "NsureNetworkToken", + "symbol": "Nsure", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x20945ca1df56d237fd40036d47e866c7dccd2114.png" + }, + { + "address": "0x485d17A6f1B8780392d53D64751824253011A260", + "chainId": 1, + "name": "ChronoTechToken", + "symbol": "TIME", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x485d17a6f1b8780392d53d64751824253011a260.png" + }, + { + "address": "0x12e51E77DAAA58aA0E9247db7510Ea4B46F9bEAd", + "chainId": 1, + "name": "AaveInterestbearingYFI", + "symbol": "aYFIv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x12e51e77daaa58aa0e9247db7510ea4b46f9bead.png" + }, + { + "address": "0xba3D9687Cf50fE253cd2e1cFeEdE1d6787344Ed5", + "chainId": 1, + "name": "AaveInterestbearingAaveToken", + "symbol": "aAAVEv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xba3d9687cf50fe253cd2e1cfeede1d6787344ed5.png" + }, + { + "address": "0xB124541127A0A657f056D9Dd06188c4F1b0e5aab", + "chainId": 1, + "name": "AaveInterestbearingUniswap", + "symbol": "aUNIv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb124541127a0a657f056d9dd06188c4f1b0e5aab.png" + }, + { + "address": "0x712DB54daA836B53Ef1EcBb9c6ba3b9Efb073F40", + "chainId": 1, + "name": "AaveInterestbearingENJ", + "symbol": "aENJv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x712db54daa836b53ef1ecbb9c6ba3b9efb073f40.png" + }, + { + "address": "0xb753428af26E81097e7fD17f40c88aaA3E04902c", + "chainId": 1, + "name": "Spice", + "symbol": "SFI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb753428af26e81097e7fd17f40c88aaa3e04902c.png" + }, + { + "address": "0x8888801aF4d980682e47f1A9036e589479e835C5", + "chainId": 1, + "name": "88mph.app", + "symbol": "MPH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x8888801af4d980682e47f1a9036e589479e835c5.png" + }, + { + "address": "0x5D8d9F5b96f4438195BE9b99eee6118Ed4304286", + "chainId": 1, + "name": "CoverProtocol", + "symbol": "COVERv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5d8d9f5b96f4438195be9b99eee6118ed4304286.png" + }, + { + "address": "0xc3Eb2622190c57429aac3901808994443b64B466", + "chainId": 1, + "name": "OROToken", + "symbol": "ORO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc3eb2622190c57429aac3901808994443b64b466.png" + }, + { + "address": "0x6468e79A80C0eaB0F9A2B574c8d5bC374Af59414", + "chainId": 1, + "name": "E-RADIX", + "symbol": "eXRD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6468e79a80c0eab0f9a2b574c8d5bc374af59414.png" + }, + { + "address": "0x3e780920601D61cEdb860fe9c4a90c9EA6A35E78", + "chainId": 1, + "name": "BoostedFinance", + "symbol": "BOOST", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3e780920601d61cedb860fe9c4a90c9ea6a35e78.png" + }, + { + "address": "0x431ad2ff6a9C365805eBaD47Ee021148d6f7DBe0", + "chainId": 1, + "name": "dForce", + "symbol": "DF", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x431ad2ff6a9c365805ebad47ee021148d6f7dbe0.png" + }, + { + "address": "0x1695936d6a953df699C38CA21c2140d497C08BD9", + "chainId": 1, + "name": "SynLev", + "symbol": "SYN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1695936d6a953df699c38ca21c2140d497c08bd9.png" + }, + { + "address": "0x3DB6Ba6ab6F95efed1a6E794caD492fAAabF294D", + "chainId": 1, + "name": "LTONetworkToken", + "symbol": "LTO", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x3db6ba6ab6f95efed1a6e794cad492faaabf294d.png" + }, + { + "address": "0x6d16cF3EC5F763d4d99cB0B0b110eefD93B11B56", + "chainId": 1, + "name": "SynthsOIL", + "symbol": "sOIL", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6d16cf3ec5f763d4d99cb0b0b110eefd93b11b56.png" + }, + { + "address": "0xA5a5DF41883Cdc00c4cCC6E8097130535399d9a3", + "chainId": 1, + "name": "SynthiOIL", + "symbol": "iOIL", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa5a5df41883cdc00c4ccc6e8097130535399d9a3.png" + }, + { + "address": "0xF5238462E7235c7B62811567E63Dd17d12C2EAA0", + "chainId": 1, + "name": "CACHEGold", + "symbol": "CGT", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0xf5238462e7235c7b62811567e63dd17d12c2eaa0.png" + }, + { + "address": "0x4fE83213D56308330EC302a8BD641f1d0113A4Cc", + "chainId": 1, + "name": "NuCypher", + "symbol": "NU", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4fe83213d56308330ec302a8bd641f1d0113a4cc.png" + }, + { + "address": "0x9e70240d2A8a30a592d3F076441C4F303b26dE12", + "chainId": 1, + "name": "WrappedOCT", + "symbol": "OCT", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x9e70240d2a8a30a592d3f076441c4f303b26de12.png" + }, + { + "address": "0x6e0daDE58D2d89eBBe7aFc384e3E4f15b70b14D8", + "chainId": 1, + "name": "QuiverX", + "symbol": "QRX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6e0dade58d2d89ebbe7afc384e3e4f15b70b14d8.png" + }, + { + "address": "0x05079687D35b93538cbd59fe5596380cae9054A9", + "chainId": 1, + "name": "BitSong", + "symbol": "BTSG", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x05079687d35b93538cbd59fe5596380cae9054a9.png" + }, + { + "address": "0x355C665e101B9DA58704A8fDDb5FeeF210eF20c0", + "chainId": 1, + "name": "dForceGOLDx", + "symbol": "GOLDx", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x355c665e101b9da58704a8fddb5feef210ef20c0.png" + }, + { + "address": "0x69948cC03f478B95283F7dbf1CE764d0fc7EC54C", + "chainId": 1, + "name": "AaveInterestbearingREN", + "symbol": "aRENv1", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x69948cc03f478b95283f7dbf1ce764d0fc7ec54c.png" + }, + { + "address": "0xe88f8313e61A97cEc1871EE37fBbe2a8bf3ed1E4", + "chainId": 1, + "name": "SoraValidatorToken", + "symbol": "VAL", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xe88f8313e61a97cec1871ee37fbbe2a8bf3ed1e4.png" + }, + { + "address": "0xbaA70614C7AAfB568a93E62a98D55696bcc85DFE", + "chainId": 1, + "name": "UniCap.finance", + "symbol": "UCAP", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xbaa70614c7aafb568a93e62a98d55696bcc85dfe.png" + }, + { + "address": "0x0b38210ea11411557c13457D4dA7dC6ea731B88a", + "chainId": 1, + "name": "API3", + "symbol": "API3", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x0b38210ea11411557c13457d4da7dc6ea731b88a.png" + }, + { + "address": "0x3449FC1Cd036255BA1EB19d65fF4BA2b8903A69a", + "chainId": 1, + "name": "BAC", + "symbol": "BAC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3449fc1cd036255ba1eb19d65ff4ba2b8903a69a.png" + }, + { + "address": "0xa7ED29B253D8B4E3109ce07c80fc570f81B63696", + "chainId": 1, + "name": "BAS", + "symbol": "BAS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa7ed29b253d8b4e3109ce07c80fc570f81b63696.png" + }, + { + "address": "0x26607aC599266b21d13c7aCF7942c7701a8b699c", + "chainId": 1, + "name": "PowerIndexPoolToken", + "symbol": "PIPT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x26607ac599266b21d13c7acf7942c7701a8b699c.png" + }, + { + "address": "0x3218A02F8F8B5c3894ce30EB255F10Bcba13E654", + "chainId": 1, + "name": "MegaCryptoPolisMEGATokenMEGA", + "symbol": "MEGA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3218a02f8f8b5c3894ce30eb255f10bcba13e654.png" + }, + { + "address": "0x07150e919B4De5fD6a63DE1F9384828396f25fDC", + "chainId": 1, + "name": "BaseProtocol", + "symbol": "BASE", + "decimals": 9, + "logoURI": "https://tokens.1inch.exchange/0x07150e919b4de5fd6a63de1f9384828396f25fdc.png" + }, + { + "address": "0xD2dDa223b2617cB616c1580db421e4cFAe6a8a85", + "chainId": 1, + "name": "BondlyToken", + "symbol": "BONDLY", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xd2dda223b2617cb616c1580db421e4cfae6a8a85.png" + }, + { + "address": "0x9D79d5B61De59D882ce90125b18F74af650acB93", + "chainId": 1, + "name": "NeutrinoSystemBaseToken", + "symbol": "NSBT", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0x9d79d5b61de59d882ce90125b18f74af650acb93.png" + }, + { + "address": "0xB62132e35a6c13ee1EE0f84dC5d40bad8d815206", + "chainId": 1, + "name": "Nexo", + "symbol": "NEXO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb62132e35a6c13ee1ee0f84dc5d40bad8d815206.png" + }, + { + "address": "0xFFC97d72E13E01096502Cb8Eb52dEe56f74DAD7B", + "chainId": 1, + "name": "AaveinterestbearingAAVE", + "symbol": "aAAVE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xffc97d72e13e01096502cb8eb52dee56f74dad7b.png" + }, + { + "address": "0x05Ec93c0365baAeAbF7AefFb0972ea7ECdD39CF1", + "chainId": 1, + "name": "AaveinterestbearingBAT", + "symbol": "aBAT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x05ec93c0365baaeabf7aeffb0972ea7ecdd39cf1.png" + }, + { + "address": "0xA361718326c15715591c299427c62086F69923D9", + "chainId": 1, + "name": "AaveinterestbearingBUSD", + "symbol": "aBUSD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa361718326c15715591c299427c62086f69923d9.png" + }, + { + "address": "0x028171bCA77440897B824Ca71D1c56caC55b68A3", + "chainId": 1, + "name": "AaveinterestbearingDAI", + "symbol": "aDAI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x028171bca77440897b824ca71d1c56cac55b68a3.png" + }, + { + "address": "0xaC6Df26a590F08dcC95D5a4705ae8abbc88509Ef", + "chainId": 1, + "name": "AaveinterestbearingENJ", + "symbol": "aENJ", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xac6df26a590f08dcc95d5a4705ae8abbc88509ef.png" + }, + { + "address": "0x39C6b3e42d6A679d7D776778Fe880BC9487C2EDA", + "chainId": 1, + "name": "AaveinterestbearingKNC", + "symbol": "aKNC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x39c6b3e42d6a679d7d776778fe880bc9487c2eda.png" + }, + { + "address": "0xa06bC25B5805d5F8d82847D191Cb4Af5A3e873E0", + "chainId": 1, + "name": "AaveinterestbearingLINK", + "symbol": "aLINK", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa06bc25b5805d5f8d82847d191cb4af5a3e873e0.png" + }, + { + "address": "0xa685a61171bb30d4072B338c80Cb7b2c865c873E", + "chainId": 1, + "name": "AaveinterestbearingMANA", + "symbol": "aMANA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa685a61171bb30d4072b338c80cb7b2c865c873e.png" + }, + { + "address": "0xc713e5E149D5D0715DcD1c156a020976e7E56B88", + "chainId": 1, + "name": "AaveinterestbearingMKR", + "symbol": "aMKR", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc713e5e149d5d0715dcd1c156a020976e7e56b88.png" + }, + { + "address": "0xCC12AbE4ff81c9378D670De1b57F8e0Dd228D77a", + "chainId": 1, + "name": "AaveInterestbearingREN", + "symbol": "aREN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xcc12abe4ff81c9378d670de1b57f8e0dd228d77a.png" + }, + { + "address": "0x35f6B052C598d933D69A4EEC4D04c73A191fE6c2", + "chainId": 1, + "name": "AaveinterestbearingSNX", + "symbol": "aSNX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x35f6b052c598d933d69a4eec4d04c73a191fe6c2.png" + }, + { + "address": "0x6C5024Cd4F8A59110119C56f8933403A539555EB", + "chainId": 1, + "name": "AaveinterestbearingSUSD", + "symbol": "aSUSD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x6c5024cd4f8a59110119c56f8933403a539555eb.png" + }, + { + "address": "0x101cc05f4A51C0319f570d5E146a8C625198e636", + "chainId": 1, + "name": "AaveinterestbearingTUSD", + "symbol": "aTUSD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x101cc05f4a51c0319f570d5e146a8c625198e636.png" + }, + { + "address": "0xB9D7CB55f463405CDfBe4E90a6D2Df01C2B92BF1", + "chainId": 1, + "name": "AaveinterestbearingUNI", + "symbol": "aUNI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb9d7cb55f463405cdfbe4e90a6d2df01c2b92bf1.png" + }, + { + "address": "0xBcca60bB61934080951369a648Fb03DF4F96263C", + "chainId": 1, + "name": "AaveinterestbearingUSDC", + "symbol": "aUSDC", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0xbcca60bb61934080951369a648fb03df4f96263c.png" + }, + { + "address": "0x3Ed3B47Dd13EC9a98b44e6204A523E766B225811", + "chainId": 1, + "name": "AaveinterestbearingUSDT", + "symbol": "aUSDT", + "decimals": 6, + "logoURI": "https://tokens.1inch.exchange/0x3ed3b47dd13ec9a98b44e6204a523e766b225811.png" + }, + { + "address": "0x9ff58f4fFB29fA2266Ab25e75e2A8b3503311656", + "chainId": 1, + "name": "AaveinterestbearingWBTC", + "symbol": "aWBTC", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x9ff58f4ffb29fa2266ab25e75e2a8b3503311656.png" + }, + { + "address": "0x030bA81f1c18d280636F32af80b9AAd02Cf0854e", + "chainId": 1, + "name": "AaveinterestbearingWETH", + "symbol": "aWETH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x030ba81f1c18d280636f32af80b9aad02cf0854e.png" + }, + { + "address": "0x5165d24277cD063F5ac44Efd447B27025e888f37", + "chainId": 1, + "name": "AaveinterestbearingYFI", + "symbol": "aYFI", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5165d24277cd063f5ac44efd447b27025e888f37.png" + }, + { + "address": "0xDf7FF54aAcAcbFf42dfe29DD6144A69b629f8C9e", + "chainId": 1, + "name": "AaveinterestbearingZRX", + "symbol": "aZRX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xdf7ff54aacacbff42dfe29dd6144a69b629f8c9e.png" + }, + { + "address": "0xf644d4477cd8Db7791ceA3013CB053b3Fec4bEB3", + "chainId": 1, + "name": "CryptoenterLIONtoken", + "symbol": "LION", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0xf644d4477cd8db7791cea3013cb053b3fec4beb3.png" + }, + { + "address": "0xA8e7AD77C60eE6f30BaC54E2E7c0617Bd7B5A03E", + "chainId": 1, + "name": "zLOT", + "symbol": "zLOT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xa8e7ad77c60ee6f30bac54e2e7c0617bd7b5a03e.png" + }, + { + "address": "0x191557728e4d8CAa4Ac94f86af842148c0FA8F7E", + "chainId": 1, + "name": "ECOTOKEN", + "symbol": "ECO", + "decimals": 8, + "logoURI": "https://tokens.1inch.exchange/0x191557728e4d8caa4ac94f86af842148c0fa8f7e.png" + }, + { + "address": "0xdc9Ac3C20D1ed0B540dF9b1feDC10039Df13F99c", + "chainId": 1, + "name": "UtrustToken", + "symbol": "UTK", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xdc9ac3c20d1ed0b540df9b1fedc10039df13f99c.png" + }, + { + "address": "0x3472A5A71965499acd81997a54BBA8D852C6E53d", + "chainId": 1, + "name": "Badger", + "symbol": "BADGER", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3472a5a71965499acd81997a54bba8d852c6e53d.png" + }, + { + "address": "0xc944E90C64B2c07662A292be6244BDf05Cda44a7", + "chainId": 1, + "name": "GraphToken", + "symbol": "GRT", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc944e90c64b2c07662a292be6244bdf05cda44a7.png" + }, + { + "address": "0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32", + "chainId": 1, + "name": "LidoDAOToken", + "symbol": "LDO", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x5a98fcbea516cf06857215779fd812ca3bef1b32.png" + }, + { + "address": "0x77777FeDdddFfC19Ff86DB637967013e6C6A116C", + "chainId": 1, + "name": "TornadoCash", + "symbol": "TORN", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x77777feddddffc19ff86db637967013e6c6a116c.png" + }, + { + "address": "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", + "chainId": 1, + "name": "stETH", + "symbol": "stETH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xae7ab96520de3a18e5e111b5eaab095312d7fe84.png" + }, + { + "address": "0xB4d930279552397bbA2ee473229f89Ec245bc365", + "chainId": 1, + "name": "MahaDAO", + "symbol": "MAHA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xb4d930279552397bba2ee473229f89ec245bc365.png" + }, + { + "address": "0x57B946008913B82E4dF85f501cbAeD910e58D26C", + "chainId": 1, + "name": "MarlinPOND", + "symbol": "POND", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x57b946008913b82e4df85f501cbaed910e58d26c.png" + }, + { + "address": "0x3593D125a4f7849a1B059E64F4517A86Dd60c95d", + "chainId": 1, + "name": "MANTRADAO", + "symbol": "OMv2", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3593d125a4f7849a1b059e64f4517a86dd60c95d.png" + }, + { + "address": "0x3432B6A60D23Ca0dFCa7761B7ab56459D9C964D0", + "chainId": 1, + "name": "FraxShare", + "symbol": "FXS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x3432b6a60d23ca0dfca7761b7ab56459d9c964d0.png" + }, + { + "address": "0x1fDaB294EDA5112B7d066ED8F2E4E562D5bCc664", + "chainId": 1, + "name": "Spice", + "symbol": "SPICE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x1fdab294eda5112b7d066ed8f2e4e562d5bcc664.png" + }, + { + "address": "0x111111111117dC0aa78b770fA6A738034120C302", + "chainId": 1, + "name": "1INCHToken", + "symbol": "1INCH", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x111111111117dc0aa78b770fa6a738034120c302.png" + }, + { + "address": "0x054D64b73d3D8A21Af3D764eFd76bCaA774f3Bb2", + "chainId": 1, + "name": "Plasma", + "symbol": "PPAY", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x054d64b73d3d8a21af3d764efd76bcaa774f3bb2.png" + }, + { + "address": "0x368B3a58B5f49392e5C9E4C998cb0bB966752E51", + "chainId": 1, + "name": "MIC", + "symbol": "MIC", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x368b3a58b5f49392e5c9e4c998cb0bb966752e51.png" + }, + { + "address": "0x4b4D2e899658FB59b1D518b68fe836B100ee8958", + "chainId": 1, + "name": "MIS", + "symbol": "MIS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4b4d2e899658fb59b1d518b68fe836b100ee8958.png" + }, + { + "address": "0x03066dA434e5264ef0B32f787923f974A5726fDc", + "chainId": 1, + "name": "BCS", + "symbol": "BCS", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x03066da434e5264ef0b32f787923f974a5726fdc.png" + }, + { + "address": "0xee573a945B01B788B9287CE062A0CFC15bE9fd86", + "chainId": 1, + "name": "Exeedme", + "symbol": "XED", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xee573a945b01b788b9287ce062a0cfc15be9fd86.png" + }, + { + "address": "0x34950Ff2b487d9E5282c5aB342d08A2f712eb79F", + "chainId": 1, + "name": "EFFORCEIEO", + "symbol": "WOZX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x34950ff2b487d9e5282c5ab342d08a2f712eb79f.png" + }, + { + "address": "0xBD2F0Cd039E0BFcf88901C98c0bFAc5ab27566e3", + "chainId": 1, + "name": "DynamicSetDollar", + "symbol": "DSD", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xbd2f0cd039e0bfcf88901c98c0bfac5ab27566e3.png" + }, + { + "address": "0xc770EEfAd204B5180dF6a14Ee197D99d808ee52d", + "chainId": 1, + "name": "FOX", + "symbol": "FOX", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0xc770eefad204b5180df6a14ee197d99d808ee52d.png" + }, + { + "address": "0x4688a8b1F292FDaB17E9a90c8Bc379dC1DBd8713", + "chainId": 1, + "name": "CoverProtocolGovernanceToken", + "symbol": "COVER", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x4688a8b1f292fdab17e9a90c8bc379dc1dbd8713.png" + }, + { + "address": "0x66a0f676479Cee1d7373f3DC2e2952778BfF5bd6", + "chainId": 1, + "name": "WiseToken", + "symbol": "WISE", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x66a0f676479cee1d7373f3dc2e2952778bff5bd6.png" + }, + { + "address": "0x539F3615C1dBAfa0D008d87504667458acBd16Fa", + "chainId": 1, + "name": "FERA", + "symbol": "FERA", + "decimals": 18, + "logoURI": "https://tokens.1inch.exchange/0x539f3615c1dbafa0d008d87504667458acbd16fa.png" + } + ], + "logoURI": "https://1inch.exchange/assets/images/logo.png" +} diff --git a/test/postman/v2/Gateway.postman_collection.json b/test/postman/v2/Gateway.postman_collection.json new file mode 100644 index 0000000..bf2071c --- /dev/null +++ b/test/postman/v2/Gateway.postman_collection.json @@ -0,0 +1,996 @@ +{ + "info": { + "_postman_id": "e39af94e-6095-479e-8ba0-66930b12e364", + "name": "Gateway", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "v2", + "item": [ + { + "name": "ethereum", + "item": [ + { + "name": "eth", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [], + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:{{port}}/eth", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth" + ] + } + }, + "response": [] + }, + { + "name": "eth/balances", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "tokenList", + "value": "[\"BAT\",\"USDC\",\"DAI\",\"WETH\",\"ZRX\"]", + "type": "text" + }, + { + "key": "privateKey", + "value": "{{privateKey}}", + "type": "text" + } + ] + }, + "url": { + "raw": "https://localhost:{{port}}/eth/balances", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth", + "balances" + ] + } + }, + "response": [] + }, + { + "name": "eth/allowances", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "tokenList", + "value": "[\"BAT\",\"USDC\",\"DAI\",\"WETH\",\"ZRX\"]", + "type": "text" + }, + { + "key": "connector", + "value": "balancer", + "type": "text" + }, + { + "key": "privateKey", + "value": "{{privateKey}}", + "type": "text" + } + ], + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:{{port}}/eth/allowances", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth", + "allowances" + ] + } + }, + "response": [] + }, + { + "name": "eth/approve", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "token", + "value": "ZRX", + "type": "text" + }, + { + "key": "privateKey", + "value": "{{privateKey}}", + "type": "text" + }, + { + "key": "gasPrice", + "value": "23", + "type": "text" + }, + { + "key": "connector", + "value": "balancer", + "type": "text" + }, + { + "key": "amount", + "value": "999", + "type": "text", + "disabled": true + } + ] + }, + "url": { + "raw": "https://localhost:{{port}}/eth/approve", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth", + "approve" + ] + } + }, + "response": [] + }, + { + "name": "eth/get-weth", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "gasPrice", + "value": "31", + "type": "text" + }, + { + "key": "amount", + "value": "0.03", + "type": "text" + }, + { + "key": "privateKey", + "value": "{{privateKey}}", + "type": "text" + }, + { + "key": "tokenAddress", + "value": "{{WETH}}", + "type": "text" + } + ] + }, + "url": { + "raw": "https://localhost:{{port}}/eth/get-weth", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth", + "get-weth" + ] + } + }, + "response": [] + }, + { + "name": "eth/poll", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "txHash", + "value": "{{txHash}}", + "type": "text" + } + ], + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:{{port}}/eth/poll", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth", + "poll" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "balancer", + "item": [ + { + "name": "eth/balancer", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [], + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:{{port}}/eth/balancer", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth", + "balancer" + ] + } + }, + "response": [] + }, + { + "name": "eth/balancer/gas-limit", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "maxSwaps", + "value": "3", + "type": "text" + } + ], + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:{{port}}/eth/balancer/gas-limit", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth", + "balancer", + "gas-limit" + ] + } + }, + "response": [] + }, + { + "name": "eth/balancer/start", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "base", + "value": "BAT", + "type": "text" + }, + { + "key": "quote", + "value": "usdc", + "type": "text" + }, + { + "key": "secret", + "value": "{{privateKey}}", + "type": "text" + }, + { + "key": "approvalAmount", + "value": "1", + "type": "text", + "disabled": true + }, + { + "key": "gasPrice", + "value": "50", + "type": "text" + } + ] + }, + "url": { + "raw": "https://localhost:{{port}}/eth/balancer/start", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth", + "balancer", + "start" + ] + } + }, + "response": [] + }, + { + "name": "eth/balancer/price", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "base", + "value": "BAT", + "type": "text" + }, + { + "key": "quote", + "value": "USDC", + "type": "text" + }, + { + "key": "amount", + "value": "1", + "type": "text" + }, + { + "key": "side", + "value": "sell", + "type": "text" + } + ] + }, + "url": { + "raw": "https://localhost:{{port}}/eth/balancer/price", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth", + "balancer", + "price" + ] + } + }, + "response": [] + }, + { + "name": "eth/balancer/trade", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "base", + "value": "BAT", + "type": "text" + }, + { + "key": "quote", + "value": "USDC", + "type": "text" + }, + { + "key": "amount", + "value": "1", + "type": "text" + }, + { + "key": "limitPrice", + "value": "0.19767217120251", + "type": "text" + }, + { + "key": "gasPrice", + "value": "37", + "type": "text" + }, + { + "key": "privateKey", + "value": "{{privateKey}}", + "type": "text" + }, + { + "key": "side", + "value": "sell", + "type": "text" + } + ] + }, + "url": { + "raw": "https://localhost:{{port}}/eth/balancer/trade", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth", + "balancer", + "trade" + ] + } + }, + "response": [] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ] + }, + { + "name": "uniswap", + "item": [ + { + "name": "eth/uniswap", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [], + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:{{port}}/eth/uniswap", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth", + "uniswap" + ] + } + }, + "response": [] + }, + { + "name": "eth/uniswap/gas-limit", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [], + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:{{port}}/eth/uniswap/gas-limit", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth", + "uniswap", + "gas-limit" + ] + } + }, + "response": [] + }, + { + "name": "eth/uniswap/start", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "base", + "value": "WETH", + "type": "text" + }, + { + "key": "quote", + "value": "DAI", + "type": "text" + }, + { + "key": "secret", + "value": "{{privateKey}}", + "type": "text" + }, + { + "key": "approvalAmount", + "value": "1", + "type": "text", + "disabled": true + }, + { + "key": "gasPrice", + "value": "50", + "type": "text" + } + ] + }, + "url": { + "raw": "https://localhost:{{port}}/eth/uniswap/start", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth", + "uniswap", + "start" + ] + } + }, + "response": [] + }, + { + "name": "eth/uniswap/price", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "base", + "value": "WETH", + "type": "text" + }, + { + "key": "quote", + "value": "DAI", + "type": "text" + }, + { + "key": "amount", + "value": "1", + "type": "text" + }, + { + "key": "side", + "value": "buy", + "type": "text" + } + ] + }, + "url": { + "raw": "https://localhost:{{port}}/eth/uniswap/price", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth", + "uniswap", + "price" + ] + } + }, + "response": [] + }, + { + "name": "eth/uniswap/trade", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "base", + "value": "BAT", + "type": "text" + }, + { + "key": "quote", + "value": "DAI", + "type": "text" + }, + { + "key": "amount", + "value": "1", + "type": "text" + }, + { + "key": "limitPrice", + "value": "0.19767217120251", + "type": "text" + }, + { + "key": "gasPrice", + "value": "37", + "type": "text" + }, + { + "key": "privateKey", + "value": "{{privateKey}}", + "type": "text" + }, + { + "key": "side", + "value": "sell", + "type": "text" + } + ] + }, + "url": { + "raw": "https://localhost:{{port}}/eth/uniswap/trade", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "eth", + "uniswap", + "trade" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "terra", + "item": [ + { + "name": "terra", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "address", + "value": "{{address}}", + "type": "text" + } + ], + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:{{port}}/terra", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "terra" + ] + } + }, + "response": [] + }, + { + "name": "terra/balances", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "address", + "value": "{{terraWalletAddress}}", + "type": "text" + } + ], + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:{{port}}/terra/balances", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "terra", + "balances" + ] + } + }, + "response": [] + }, + { + "name": "terra/start", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "base", + "value": "LUNA", + "type": "text" + }, + { + "key": "quote", + "value": "UST", + "type": "text" + } + ] + }, + "url": { + "raw": "https://localhost:{{port}}/terra/start", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "terra", + "start" + ] + } + }, + "response": [] + }, + { + "name": "terra/price", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "base", + "value": "UST", + "type": "text" + }, + { + "key": "quote", + "value": "KRT", + "type": "text" + }, + { + "key": "side", + "value": "buy", + "type": "text" + }, + { + "key": "amount", + "value": "1", + "type": "text" + } + ] + }, + "url": { + "raw": "https://localhost:{{port}}/terra/price", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "terra", + "price" + ] + } + }, + "response": [] + }, + { + "name": "terra/trade", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [ + { + "key": "base", + "value": "UST", + "type": "text" + }, + { + "key": "quote", + "value": "KRT", + "type": "text" + }, + { + "key": "side", + "value": "buy", + "type": "text" + }, + { + "key": "amount", + "value": "10", + "type": "text" + }, + { + "key": "privateKey", + "value": "{{terraSeeds}}", + "type": "text" + } + ] + }, + "url": { + "raw": "https://localhost:{{port}}/terra/trade", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "terra", + "trade" + ] + } + }, + "response": [] + } + ] + } + ] + }, + { + "name": "/api", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [], + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:{{port}}/api", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "api" + ] + } + }, + "response": [] + }, + { + "name": "/", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [], + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:{{port}}/", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "{{port}}", + "path": [ + "" + ] + } + }, + "response": [] + } + ] +} \ No newline at end of file diff --git a/test/postman/v2/Gateway.postman_environment.json b/test/postman/v2/Gateway.postman_environment.json new file mode 100644 index 0000000..834026f --- /dev/null +++ b/test/postman/v2/Gateway.postman_environment.json @@ -0,0 +1,34 @@ +{ + "id": "4436d04a-e8eb-451b-b7ef-851b171508e8", + "name": "Gateway", + "values": [ + { + "key": "port", + "value": "5000", + "enabled": true + }, + { + "key": "privateKey", + "value": "myprivatekey", + "enabled": true + }, + { + "key": "txHash", + "value": "transactionhash", + "enabled": true + }, + { + "key": "terraWalletAddress", + "value": "terrawalletaddress", + "enabled": true + }, + { + "key": "terraSeeds", + "value": "terraseeds", + "enabled": true + } + ], + "_postman_variable_scope": "environment", + "_postman_exported_at": "2021-01-30T13:04:21.323Z", + "_postman_exported_using": "Postman/8.0.3" +} \ No newline at end of file From 94b10fa644b0674902e1116506789672e88d7b67 Mon Sep 17 00:00:00 2001 From: sdgoh Date: Mon, 1 Feb 2021 18:23:24 +0800 Subject: [PATCH 02/28] (fix) incorrect key param name. add request logging to console --- src/routes/balancer.route.js | 2 +- src/routes/uniswap.route.js | 2 +- src/services/access.js | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/routes/balancer.route.js b/src/routes/balancer.route.js index fe1b3f4..521b86f 100644 --- a/src/routes/balancer.route.js +++ b/src/routes/balancer.route.js @@ -80,7 +80,7 @@ router.post('/start', async (req, res) => { const paramData = getParamData(req.body) const baseTokenSymbol = paramData.base.toUpperCase() const quoteTokenSymbol = paramData.quote.toUpperCase() - const privateKey = paramData.secret + const privateKey = paramData.privateKey const gasPrice = paramData.gasPrice // get token contract address and decimal diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index 9530a8a..2ed3a98 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -89,7 +89,7 @@ router.post('/start', async (req, res) => { const baseTokenSymbol = paramData.base.toUpperCase() const quoteTokenSymbol = paramData.quote.toUpperCase() const orderType = paramData.side - const privateKey = paramData.secret + const privateKey = paramData.privateKey const gasPrice = paramData.gasPrice // get token contract address and decimal diff --git a/src/services/access.js b/src/services/access.js index bb2a75d..708f3aa 100644 --- a/src/services/access.js +++ b/src/services/access.js @@ -4,10 +4,16 @@ import { logger } from './logger'; import { statusMessages } from './utils'; +const debug = require('debug')('router') export const validateAccess = (req, res, next) => { const cert = req.connection.getPeerCertificate() if (req.client.authorized) { + const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress + const method = req.method + const url = req.url + const requestInfo = 'Request from IP: ' + ip + ' ' + method + ' ' + url + console.log(requestInfo) next() } else if (cert.subject) { logger.error(statusMessages.ssl_cert_invalid) From 5c22b1a432da8c573c7d8e7a465a8ffbdf718c5a Mon Sep 17 00:00:00 2001 From: sdgoh Date: Mon, 1 Feb 2021 19:13:29 +0800 Subject: [PATCH 03/28] (fix) Uniswap return json key name as info --- src/routes/balancer.route.js | 7 +++++-- src/routes/uniswap.route.js | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/routes/balancer.route.js b/src/routes/balancer.route.js index 521b86f..b36ba4c 100644 --- a/src/routes/balancer.route.js +++ b/src/routes/balancer.route.js @@ -154,7 +154,7 @@ router.post('/start', async (req, res) => { quote: quoteTokenContractInfo, pools: balancer.cachedPools.pools.length, } - console.log(balancer.cachedPools) + console.log('caching swap pools', balancer.cachedPools.length) res.status(200).json(result) }) @@ -181,6 +181,8 @@ router.post('/price', async (req, res) => { const maxSwaps = balancer.maxSwaps const side = paramData.side + console.log('balancer.cachedPools', balancer.cachedPools.length) + try { // fetch the optimal pool mix from balancer-sor const { swaps, expectedAmount } = side === 'buy' @@ -199,6 +201,7 @@ router.post('/price', async (req, res) => { if (swaps != null && expectedAmount != null) { const gasLimit = estimateGasLimit(swaps.length) + res.status(200).json({ network: balancer.network, timestamp: initTime, @@ -214,7 +217,7 @@ router.post('/price', async (req, res) => { }) } else { // no pool available res.status(200).json({ - error: statusMessages.no_pool_available, + info: statusMessages.no_pool_available, message: '' }) } diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index 2ed3a98..116d80c 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -343,7 +343,7 @@ router.post('/price', async (req, res) => { }) } else { // no pool available res.status(200).json({ - error: statusMessages.no_pool_available, + info: statusMessages.no_pool_available, message: '' }) } From 895a6b834b5d3505d465ea6ae00faebc3c219c6a Mon Sep 17 00:00:00 2001 From: sdgoh Date: Mon, 1 Feb 2021 19:33:06 +0800 Subject: [PATCH 04/28] (fix) Incorrect request param key name for wallet --- .../v2/Gateway.postman_collection.json | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/test/postman/v2/Gateway.postman_collection.json b/test/postman/v2/Gateway.postman_collection.json index bf2071c..949efe0 100644 --- a/test/postman/v2/Gateway.postman_collection.json +++ b/test/postman/v2/Gateway.postman_collection.json @@ -41,6 +41,17 @@ }, { "name": "eth/balances", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], "request": { "method": "POST", "header": [], @@ -291,13 +302,7 @@ "header": [], "body": { "mode": "urlencoded", - "urlencoded": [ - { - "key": "maxSwaps", - "value": "3", - "type": "text" - } - ], + "urlencoded": [], "options": { "raw": { "language": "json" @@ -335,11 +340,11 @@ }, { "key": "quote", - "value": "usdc", + "value": "dai", "type": "text" }, { - "key": "secret", + "key": "privateKey", "value": "{{privateKey}}", "type": "text" }, @@ -387,17 +392,17 @@ }, { "key": "quote", - "value": "USDC", + "value": "dai", "type": "text" }, { "key": "amount", - "value": "1", + "value": "10", "type": "text" }, { "key": "side", - "value": "sell", + "value": "buy", "type": "text" } ] @@ -578,11 +583,11 @@ }, { "key": "quote", - "value": "DAI", + "value": "USDC", "type": "text" }, { - "key": "secret", + "key": "privateKey", "value": "{{privateKey}}", "type": "text" }, From 61cc2bcdfbf7372b23e47016e46b1068977fff1f Mon Sep 17 00:00:00 2001 From: sdgoh Date: Tue, 2 Feb 2021 22:31:52 +0800 Subject: [PATCH 05/28] (feat) Add cache pool refresh timer. Fix Uniswap update token pools --- src/routes/balancer.route.js | 4 +--- src/routes/eth.route.js | 2 +- src/routes/uniswap.route.js | 2 +- src/services/balancer.js | 3 +-- src/services/eth.js | 2 +- 5 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/routes/balancer.route.js b/src/routes/balancer.route.js index b36ba4c..79c341e 100644 --- a/src/routes/balancer.route.js +++ b/src/routes/balancer.route.js @@ -154,7 +154,7 @@ router.post('/start', async (req, res) => { quote: quoteTokenContractInfo, pools: balancer.cachedPools.pools.length, } - console.log('caching swap pools', balancer.cachedPools.length) + console.log('caching swap pools (total)', balancer.cachedPools.pools.length) res.status(200).json(result) }) @@ -181,8 +181,6 @@ router.post('/price', async (req, res) => { const maxSwaps = balancer.maxSwaps const side = paramData.side - console.log('balancer.cachedPools', balancer.cachedPools.length) - try { // fetch the optimal pool mix from balancer-sor const { swaps, expectedAmount } = side === 'buy' diff --git a/src/routes/eth.route.js b/src/routes/eth.route.js index 822005b..38b98b6 100644 --- a/src/routes/eth.route.js +++ b/src/routes/eth.route.js @@ -355,7 +355,7 @@ router.post('/get-weth', async (req, res) => { return } const amount = ethers.utils.parseEther(paramData.amount) - const tokenAddress = eth.erc20KovanTokens['WETH'] + const tokenAddress = eth.getERC20TokenAddresses('WETH').address let gasPrice if (paramData.gasPrice) { gasPrice = parseFloat(paramData.gasPrice) diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index 116d80c..8a28de1 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -155,7 +155,7 @@ router.post('/start', async (req, res) => { const tokenList = orderType === 'buy' ? { in: baseTokenContractInfo.address, out: quoteTokenContractInfo.address } : { in: quoteTokenContractInfo.address, out: baseTokenContractInfo.address } - await uniswap.fetch_route(tokenList.in, tokenList.out) + await this.update_tokens([tokenList.in, tokenList.out]) const result = { network: eth.network, diff --git a/src/services/balancer.js b/src/services/balancer.js index 39323bd..4aa80f3 100644 --- a/src/services/balancer.js +++ b/src/services/balancer.js @@ -41,8 +41,6 @@ export default class Balancer { } async fetchPool (tokenIn, tokenOut) { - // console.log('fetchPool', tokenIn, tokenOut) - const pools = await sor.getPoolsWithTokens(tokenIn, tokenOut) this.cachedPools = pools @@ -51,6 +49,7 @@ export default class Balancer { return {}; } logger.debug('>>> Pools Retrieved.', { message: this.network }) + setTimeout(this.fetchPool.bind(this), 15000); // update every x seconds } async priceSwapIn (tokenIn, tokenOut, tokenInAmount, maxSwaps = this.maxSwaps) { diff --git a/src/services/eth.js b/src/services/eth.js index 9a067fb..2bec7a9 100644 --- a/src/services/eth.js +++ b/src/services/eth.js @@ -159,7 +159,7 @@ export default class Ethereum { throw Error(`Invalid network ${this.network}`) } const tokenContractAddress = tokenList.filter(obj => { - return obj.symbol === tokenSymbol + return obj.symbol === tokenSymbol.toUpperCase() }) return tokenContractAddress[0] } From 9b1816ae517ebfc397746b8bf7c42f51d2254a1b Mon Sep 17 00:00:00 2001 From: sdgoh Date: Thu, 4 Feb 2021 08:58:40 +0800 Subject: [PATCH 06/28] Default max swap to 4 if not configured. Comment out `get-weth` test code --- src/routes/eth.route.js | 110 ++++++++++++++++++------------------ src/routes/uniswap.route.js | 2 +- src/services/balancer.js | 3 +- 3 files changed, 58 insertions(+), 57 deletions(-) diff --git a/src/routes/eth.route.js b/src/routes/eth.route.js index 38b98b6..9c0e722 100644 --- a/src/routes/eth.route.js +++ b/src/routes/eth.route.js @@ -328,61 +328,6 @@ router.post('/approve', async (req, res) => { } }) -// Faucet to get test tokens -router.post('/get-weth', async (req, res) => { - /* - POST: /get-weth - x-www-form-urlencoded: { - gasPrice:{gasPrice} - amount:{{amount}} - privateKey:{{privateKey}} - } - */ - const initTime = Date.now() - const paramData = getParamData(req.body) - const privateKey = paramData.privateKey - let wallet - try { - wallet = new ethers.Wallet(privateKey, eth.provider) - } catch (err) { - logger.error(req.originalUrl, { message: err }) - let reason - err.reason ? reason = err.reason : reason = 'Error getting wallet' - res.status(500).json({ - error: reason, - message: err - }) - return - } - const amount = ethers.utils.parseEther(paramData.amount) - const tokenAddress = eth.getERC20TokenAddresses('WETH').address - let gasPrice - if (paramData.gasPrice) { - gasPrice = parseFloat(paramData.gasPrice) - } - - try { - // call deposit function - const response = await eth.deposit(wallet, tokenAddress, amount, gasPrice) - - // submit response - res.status(200).json({ - network: eth.network, - timestamp: initTime, - amount: parseFloat(amount), - result: response - }) - } catch (err) { - logger.error(req.originalUrl, { message: err }) - let reason - err.reason ? reason = err.reason : reason = statusMessages.operation_error - res.status(500).json({ - error: reason, - message: err - }) - } -}) - router.post('/poll', async (req, res) => { const initTime = Date.now() const paramData = getParamData(req.body) @@ -408,4 +353,59 @@ router.post('/poll', async (req, res) => { return txReceipt }) +// Kovan faucet to get test tokens (wip) & weth conversion +// router.post('/get-weth', async (req, res) => { +// /* +// POST: /get-weth +// x-www-form-urlencoded: { +// gasPrice:{gasPrice} +// amount:{{amount}} +// privateKey:{{privateKey}} +// } +// */ +// const initTime = Date.now() +// const paramData = getParamData(req.body) +// const privateKey = paramData.privateKey +// let wallet +// try { +// wallet = new ethers.Wallet(privateKey, eth.provider) +// } catch (err) { +// logger.error(req.originalUrl, { message: err }) +// let reason +// err.reason ? reason = err.reason : reason = 'Error getting wallet' +// res.status(500).json({ +// error: reason, +// message: err +// }) +// return +// } +// const amount = ethers.utils.parseEther(paramData.amount) +// const tokenAddress = eth.getERC20TokenAddresses('WETH').address +// let gasPrice +// if (paramData.gasPrice) { +// gasPrice = parseFloat(paramData.gasPrice) +// } + +// try { +// // call deposit function +// const response = await eth.deposit(wallet, tokenAddress, amount, gasPrice) + +// // submit response +// res.status(200).json({ +// network: eth.network, +// timestamp: initTime, +// amount: parseFloat(amount), +// result: response +// }) +// } catch (err) { +// logger.error(req.originalUrl, { message: err }) +// let reason +// err.reason ? reason = err.reason : reason = statusMessages.operation_error +// res.status(500).json({ +// error: reason, +// message: err +// }) +// } +// }) + module.exports = router; diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index 8a28de1..88aac5a 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -251,7 +251,7 @@ router.post('/trade', async (req, res) => { } else { // sell const price = trade.executionPrice.toSignificant(8) - logger.debug(`Price: ${price.toString()}`) + logger.info(`Price: ${price.toString()}`) if (!limitPrice || price >= limitPrice) { // pass swaps to exchange-proxy to complete trade const tx = await uniswap.swapExactIn( diff --git a/src/services/balancer.js b/src/services/balancer.js index 4aa80f3..44c0b38 100644 --- a/src/services/balancer.js +++ b/src/services/balancer.js @@ -22,7 +22,7 @@ export default class Balancer { this.subgraphUrl = process.env.REACT_APP_SUBGRAPH_URL this.gasBase = GAS_BASE this.gasPerSwap = GAS_PER_SWAP - this.maxSwaps = process.env.BALANCER_MAX_SWAPS + this.maxSwaps = process.env.BALANCER_MAX_SWAPS || 4 switch (network) { case 'mainnet': @@ -41,6 +41,7 @@ export default class Balancer { } async fetchPool (tokenIn, tokenOut) { + const pools = await sor.getPoolsWithTokens(tokenIn, tokenOut) this.cachedPools = pools From 9c572ff3487ce5de896c9142bbefba349ce4fdea Mon Sep 17 00:00:00 2001 From: sdgoh Date: Tue, 9 Feb 2021 13:02:51 +0800 Subject: [PATCH 07/28] (feat) Add fee retrieval from ethgastation base-on .env interval --- package.json | 2 +- src/routes/balancer.route.js | 26 ++++++++++++++++++------ src/routes/uniswap.route.js | 39 +++++++++++++++++++++++++++--------- src/services/eth.js | 29 +++++++++++++++------------ src/services/fees.js | 15 +++++++------- src/services/utils.js | 5 +++++ 6 files changed, 78 insertions(+), 38 deletions(-) diff --git a/package.json b/package.json index 225d34e..aaf46f3 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "nodemon": "^2.0.4" }, "engines": { - "node" : "10.x" + "node": "10.x" }, "type": "module" } diff --git a/src/routes/balancer.route.js b/src/routes/balancer.route.js index 79c341e..564d9a1 100644 --- a/src/routes/balancer.route.js +++ b/src/routes/balancer.route.js @@ -6,13 +6,13 @@ import { getParamData, latency, reportConnectionError, statusMessages } from '.. import Ethereum from '../services/eth'; import Balancer from '../services/balancer'; -// import Fees from '../services/fees'; +import Fees from '../services/fees'; import { logger } from '../services/logger'; const router = express.Router() const eth = new Ethereum(process.env.ETHEREUM_CHAIN) const balancer = new Balancer(process.env.ETHEREUM_CHAIN) -// const fees = new Fees() +const fees = new Fees() const swapMoreThanMaxPriceError = 'Price too high' const swapLessThanMaxPriceError = 'Price too low' @@ -81,7 +81,12 @@ router.post('/start', async (req, res) => { const baseTokenSymbol = paramData.base.toUpperCase() const quoteTokenSymbol = paramData.quote.toUpperCase() const privateKey = paramData.privateKey - const gasPrice = paramData.gasPrice + let gasPrice + if (paramData.gasPrice) { + gasPrice = parseFloat(paramData.gasPrice) + } else { + gasPrice = fees.ethGasPrice + } // get token contract address and decimal const baseTokenContractInfo = eth.getERC20TokenAddresses(baseTokenSymbol) @@ -112,9 +117,7 @@ router.post('/start', async (req, res) => { let approvalAmount try { - // await fees.getETHGasStationFee().then(fee => { - // ethGasStationFee['fast'] = fee - // }) + await fees.getETHGasStationFee() Promise.all( Object.keys(tokenAddressList).map(async (key, index) => @@ -152,6 +155,7 @@ router.post('/start', async (req, res) => { success: true, base: baseTokenContractInfo, quote: quoteTokenContractInfo, + gasPrice: fees.ethGasPrice, pools: balancer.cachedPools.pools.length, } console.log('caching swap pools (total)', balancer.cachedPools.pools.length) @@ -180,6 +184,12 @@ router.post('/price', async (req, res) => { const amount = new BigNumber(parseInt(paramData.amount * baseDenomMultiplier)) const maxSwaps = balancer.maxSwaps const side = paramData.side + let gasPrice + if (paramData.gasPrice) { + gasPrice = parseFloat(paramData.gasPrice) + } else { + gasPrice = fees.ethGasPrice + } try { // fetch the optimal pool mix from balancer-sor @@ -211,6 +221,7 @@ router.post('/price', async (req, res) => { expectedAmount: parseInt(expectedAmount) / quoteDenomMultiplier, price: expectedAmount / amount * baseDenomMultiplier / quoteDenomMultiplier, gasLimit: gasLimit, + gasPrice: gasPrice, swaps: swaps, }) } else { // no pool available @@ -266,6 +277,8 @@ router.post('/trade', async (req, res) => { let gasPrice if (paramData.gasPrice) { gasPrice = parseFloat(paramData.gasPrice) + } else { + gasPrice = fees.ethGasPrice } try { @@ -307,6 +320,7 @@ router.post('/trade', async (req, res) => { amount: parseFloat(paramData.amount), expectedIn: expectedAmount / quoteDenomMultiplier, price: price, + gasPrice: gasPrice, txHash: tx.hash, }) } else { diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index 88aac5a..1394e74 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -5,6 +5,7 @@ import { getParamData, latency, statusMessages } from '../services/utils'; import { logger } from '../services/logger'; import Ethereum from '../services/eth'; import Uniswap from '../services/uniswap'; +import Fees from '../services/fees'; require('dotenv').config() @@ -13,6 +14,7 @@ const eth = new Ethereum(process.env.ETHEREUM_CHAIN) const uniswap = new Uniswap(process.env.ETHEREUM_CHAIN) uniswap.generate_tokens() setTimeout(uniswap.update_pairs.bind(uniswap), 2000) +const fees = new Fees() const swapMoreThanMaxPriceError = 'Price too high' const swapLessThanMaxPriceError = 'Price too low' @@ -90,7 +92,12 @@ router.post('/start', async (req, res) => { const quoteTokenSymbol = paramData.quote.toUpperCase() const orderType = paramData.side const privateKey = paramData.privateKey - const gasPrice = paramData.gasPrice + let gasPrice + if (paramData.gasPrice) { + gasPrice = parseFloat(paramData.gasPrice) + } else { + gasPrice = fees.ethGasPrice + } // get token contract address and decimal const baseTokenContractInfo = eth.getERC20TokenAddresses(baseTokenSymbol) @@ -121,9 +128,7 @@ router.post('/start', async (req, res) => { let approvalAmount try { - // await fees.getETHGasStationFee().then(fee => { - // ethGasStationFee['fast'] = fee - // }) + await fees.getETHGasStationFee() Promise.all( Object.keys(tokenAddressList).map(async (key, index) => @@ -155,7 +160,7 @@ router.post('/start', async (req, res) => { const tokenList = orderType === 'buy' ? { in: baseTokenContractInfo.address, out: quoteTokenContractInfo.address } : { in: quoteTokenContractInfo.address, out: baseTokenContractInfo.address } - await this.update_tokens([tokenList.in, tokenList.out]) + await uniswap.update_tokens([tokenList.in, tokenList.out]) const result = { network: eth.network, @@ -164,6 +169,7 @@ router.post('/start', async (req, res) => { success: true, base: baseTokenContractInfo, quote: quoteTokenContractInfo, + gasPrice: fees.ethGasPrice, pools: uniswap.cachedRoutes.length, } res.status(200).json(result) @@ -202,6 +208,8 @@ router.post('/trade', async (req, res) => { let gasPrice if (paramData.gasPrice) { gasPrice = parseFloat(paramData.gasPrice) + } else { + gasPrice = fees.ethGasPrice } try { @@ -239,6 +247,7 @@ router.post('/trade', async (req, res) => { amount: amount, expectedIn: expectedAmount.toSignificant(8), price: price, + gasPrice: gasPrice, txHash: tx.hash, }) } else { @@ -267,9 +276,10 @@ router.post('/trade', async (req, res) => { latency: latency(initTime, Date.now()), base: baseTokenAddress, quote: quoteTokenAddress, - amount: amount, + amount: parseFloat(paramData.amount), expectedOut: expectedAmount.toSignificant(8), - price: price, + price: parseFloat(price), + gasPrice: gasPrice, txHash: tx.hash, }) } else { @@ -310,6 +320,13 @@ router.post('/price', async (req, res) => { const baseTokenAddress = baseTokenContractInfo.address const quoteTokenAddress = quoteTokenContractInfo.address const side = paramData.side + const gasLimit = estimateGasLimit() + let gasPrice + if (paramData.gasPrice) { + gasPrice = parseFloat(paramData.gasPrice) + } else { + gasPrice = fees.ethGasPrice + } try { // fetch the optimal pool mix from uniswap @@ -336,9 +353,11 @@ router.post('/price', async (req, res) => { latency: latency(initTime, Date.now()), base: baseTokenAddress, quote: quoteTokenAddress, - amount: amount, - expectedAmount: expectedAmount.toSignificant(8), - price: price, + amount: parseFloat(paramData.amount), + expectedAmount: parseFloat(expectedAmount.toSignificant(8)), + price: parseFloat(price), + gasLimit: gasLimit, + gasPrice: gasPrice, trade: trade, }) } else { // no pool available diff --git a/src/services/eth.js b/src/services/eth.js index 2bec7a9..ded26ab 100644 --- a/src/services/eth.js +++ b/src/services/eth.js @@ -13,6 +13,7 @@ export default class Ethereum { // network defaults to kovan const providerUrl = process.env.ETHEREUM_RPC_URL this.provider = new ethers.providers.JsonRpcProvider(providerUrl) + this.erc20TokenListURL = process.env.ETHEREUM_TOKEN_LIST_URL this.network = network this.spenders = { balancer: process.env.EXCHANGE_PROXY, @@ -23,6 +24,7 @@ export default class Ethereum { // for kovan testing only this.erc20KovanTokens = JSON.parse(fs.readFileSync('src/static/erc20_tokens_kovan.json')) } else if (network === 'mainnet') { + // this.erc20MainnetTokens = this.getERC20TokenList() this.erc20MainnetTokens = JSON.parse(fs.readFileSync('src/static/erc20_tokens_mainnet.json')) } else { throw Error(`Invalid network ${network}`) @@ -128,29 +130,30 @@ export default class Ethereum { } } - // get remote token list - async getTokenList (tokenListUrl) { + // get ERC20 Token List + async getERC20TokenList () { + console.log(this.erc20MainnetTokens, 'tokenListRequested', this.tokenListRequested) try { - axios.get(tokenListUrl) - .then(function (response) { - // handle success - const tokenList = response.data - return tokenList - }) - .catch(function (error) { - // handle error - console.log(error); - }) + if (this.erc20MainnetTokens === undefined || this.erc20MainnetTokens === null || this.erc20MainnetTokens === {}) { + console.log('getERC20TokenList... ', this.erc20TokenListURL) + const response = await axios.get(this.erc20TokenListURL) + if (response.status === 200 && response.data) { + console.log(response.data.tokens[1].symbol) + this.erc20MainnetTokens = response.data.tokens + } + } } catch (err) { + console.log(err); logger.error(err) let reason - err.reason ? reason = err.reason : reason = 'error remote token list retrieval' + err.reason ? reason = err.reason : reason = 'error ERC 20 Token List' return reason } } getERC20TokenAddresses (tokenSymbol) { let tokenList + if (this.network === 'kovan') { tokenList = this.erc20KovanTokens.tokens } else if (this.network === 'mainnet') { diff --git a/src/services/fees.js b/src/services/fees.js index 22b497a..aae6b81 100644 --- a/src/services/fees.js +++ b/src/services/fees.js @@ -8,23 +8,21 @@ const ethGasStationHost = 'https://ethgasstation.info' // const ethGasStation = process.env.ETH_GAS_STATION const ethGasStationApiKey = process.env.ETH_GAS_STATION_API_KEY const ethGasStationURL = ethGasStationHost + '/api/ethgasAPI.json?api-key=' + ethGasStationApiKey +const defaultRefreshInterval = 60 export default class Fees { constructor () { this.ethGasStationGasLevel = process.env.ETH_GAS_STATION_GAS_LEVEL - this.ethGasStationRefreshTime = process.env.ETH_GAS_STATION_REFRESH_TIME + this.ethGasStationRefreshTime = (process.env.ETH_GAS_STATION_REFRESH_TIME || defaultRefreshInterval) * 1000 } // get ETH Gas Station async getETHGasStationFee (gasLevel = this.ethGasStationGasLevel) { try { - axios.get(ethGasStationURL) - .then(function (response) { - // handle success - const gasFee = response.data[gasLevel] - // console.log(`getETHGasStationFee(${gasLevel})`, gasFee) - return gasFee - }) + const response = await axios.get(ethGasStationURL) + // divite by 10 to convert it to Gwei) + this.ethGasPrice = response.data[gasLevel] / 10 + console.log(`get ETHGasStation gas price (${gasLevel}): ${this.ethGasPrice} / interval: ${this.ethGasStationRefreshTime / 1000} sec`) } catch (err) { console.log(err); logger.error(err) @@ -32,5 +30,6 @@ export default class Fees { err.reason ? reason = err.reason : reason = 'error ETH gas fee lookup' return reason } + setTimeout(this.getETHGasStationFee.bind(this), this.ethGasStationRefreshTime); // update every x seconds } } diff --git a/src/services/utils.js b/src/services/utils.js index 8c69244..9c9cfe1 100644 --- a/src/services/utils.js +++ b/src/services/utils.js @@ -86,7 +86,12 @@ export const loadConfig = () => { ethereum_rpc_url: process.env.ETHEREUM_RPC_URL, ethereum_chain: process.env.ETHEREUM_CHAIN, exchange_proxy: process.env.EXCHANGE_PROXY, + ethereum_token_list_url: process.env.ETHEREUM_TOKEN_LIST_URL, + enable_eth_gas_station: process.env.ENABLE_ETH_GAS_STATION, + eth_gas_station_gas_level: process.env.ETH_GAS_STATION_GAS_LEVEL, + eth_gas_station_refresh_time: process.env.ETH_GAS_STATION_REFRESH_TIME, react_app_subgraph_url: process.env.REACT_APP_SUBGRAPH_URL, + balancer_max_swaps: process.env.BALANCER_MAX_SWAPS, uniswap_router: process.env.UNISWAP_ROUTER, terra_lcd_url: process.env.TERRA_LCD_URL, terra_chain: process.env.TERRA_CHAIN From c0fca11a8c16812708d0eb975cd08912e02a6b91 Mon Sep 17 00:00:00 2001 From: sdgoh Date: Tue, 9 Feb 2021 15:39:21 +0800 Subject: [PATCH 08/28] Add eth gas station param to .env.example --- .env.example | 1 + 1 file changed, 1 insertion(+) diff --git a/.env.example b/.env.example index c06d6a6..cf777c9 100644 --- a/.env.example +++ b/.env.example @@ -62,6 +62,7 @@ GMT_OFFSET=+0800 # Gas level you want to use for Ethereum transactions (fast, fastest, safeLow, average) ETH_GAS_STATION_API_KEY={apikey} ETH_GAS_STATION_GAS_LEVEL=fast +ETH_GAS_STATION_REFRESH_TIME=60 # Balancer Config BALANCER_MAX_SWAPS=4 From 76ba9807b804d088bd01a080284fa31d89dc992f Mon Sep 17 00:00:00 2001 From: sdgoh Date: Wed, 10 Feb 2021 23:12:42 +0800 Subject: [PATCH 09/28] (feat) Retrieve ERC20 token list from external source specific in .env --- src/services/eth.js | 43 +++++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/src/services/eth.js b/src/services/eth.js index ded26ab..fd3880e 100644 --- a/src/services/eth.js +++ b/src/services/eth.js @@ -19,16 +19,9 @@ export default class Ethereum { balancer: process.env.EXCHANGE_PROXY, uniswap: process.env.UNISWAP_ROUTER } + // update token list this.tokenListUrl = process.env.ETHEREUM_TOKEN_LIST_URL - if (network === 'kovan') { - // for kovan testing only - this.erc20KovanTokens = JSON.parse(fs.readFileSync('src/static/erc20_tokens_kovan.json')) - } else if (network === 'mainnet') { - // this.erc20MainnetTokens = this.getERC20TokenList() - this.erc20MainnetTokens = JSON.parse(fs.readFileSync('src/static/erc20_tokens_mainnet.json')) - } else { - throw Error(`Invalid network ${network}`) - } + this.getERC20TokenList() } // get ETH balance @@ -132,16 +125,23 @@ export default class Ethereum { // get ERC20 Token List async getERC20TokenList () { - console.log(this.erc20MainnetTokens, 'tokenListRequested', this.tokenListRequested) + let tokenListSource try { - if (this.erc20MainnetTokens === undefined || this.erc20MainnetTokens === null || this.erc20MainnetTokens === {}) { - console.log('getERC20TokenList... ', this.erc20TokenListURL) - const response = await axios.get(this.erc20TokenListURL) - if (response.status === 200 && response.data) { - console.log(response.data.tokens[1].symbol) - this.erc20MainnetTokens = response.data.tokens + if (this.network === 'kovan') { + tokenListSource = 'src/static/erc20_tokens_kovan.json' + this.erc20TokenList = JSON.parse(fs.readFileSync(tokenListSource)) + } else if (this.network === 'mainnet') { + tokenListSource = this.erc20TokenListURL + if (this.erc20TokenList === undefined || this.erc20TokenList === null || this.erc20TokenList === {}) { + const response = await axios.get(tokenListSource) + if (response.status === 200 && response.data) { + this.erc20TokenList = response.data + } } + } else { + throw Error(`Invalid network ${this.network}`) } + // console.log('get ERC20 Token List', this.network, 'source', tokenListSource) } catch (err) { console.log(err); logger.error(err) @@ -152,16 +152,7 @@ export default class Ethereum { } getERC20TokenAddresses (tokenSymbol) { - let tokenList - - if (this.network === 'kovan') { - tokenList = this.erc20KovanTokens.tokens - } else if (this.network === 'mainnet') { - tokenList = this.erc20MainnetTokens.tokens - } else { - throw Error(`Invalid network ${this.network}`) - } - const tokenContractAddress = tokenList.filter(obj => { + const tokenContractAddress = this.erc20TokenList.tokens.filter(obj => { return obj.symbol === tokenSymbol.toUpperCase() }) return tokenContractAddress[0] From e938c533196027d789aa0c101ce1c20ccb70428e Mon Sep 17 00:00:00 2001 From: sdgoh Date: Wed, 10 Feb 2021 23:15:10 +0800 Subject: [PATCH 10/28] Remove static mainnet erc20 token list file --- src/static/erc20_tokens_mainnet.json | 4377 -------------------------- 1 file changed, 4377 deletions(-) delete mode 100644 src/static/erc20_tokens_mainnet.json diff --git a/src/static/erc20_tokens_mainnet.json b/src/static/erc20_tokens_mainnet.json deleted file mode 100644 index b6c36f6..0000000 --- a/src/static/erc20_tokens_mainnet.json +++ /dev/null @@ -1,4377 +0,0 @@ -{ - "name": "1inch", - "timestamp": "2021-01-12T10:50:04+00:00", - "version": { "major": 37, "minor": 0, "patch": 0 }, - "keywords": ["1inch", "default", "list"], - "tokens": [ - { - "address": "0x006BeA43Baa3f7A6f765F14f10A1a1b08334EF45", - "chainId": 1, - "name": "Stox", - "symbol": "STX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x006bea43baa3f7a6f765f14f10a1a1b08334ef45.png" - }, - { - "address": "0x0327112423F3A68efdF1fcF402F6c5CB9f7C33fd", - "chainId": 1, - "name": "PieDAOBTC++", - "symbol": "BTC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0327112423f3a68efdf1fcf402f6c5cb9f7c33fd.png" - }, - { - "address": "0x0417912b3a7AF768051765040A55BB0925D4DDcF", - "chainId": 1, - "name": "LiquidityDividendsProtocol", - "symbol": "LID", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0417912b3a7af768051765040a55bb0925d4ddcf.png" - }, - { - "address": "0x04Fa0d235C4abf4BcF4787aF4CF447DE572eF828", - "chainId": 1, - "name": "UMAVotingTokenv1", - "symbol": "UMA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x04fa0d235c4abf4bcf4787af4cf447de572ef828.png" - }, - { - "address": "0x07597255910a51509CA469568B048F2597E72504", - "chainId": 1, - "name": "Uptrennd", - "symbol": "1UP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x07597255910a51509ca469568b048f2597e72504.png" - }, - { - "address": "0x08d967bb0134F2d07f7cfb6E246680c53927DD30", - "chainId": 1, - "name": "MATHToken", - "symbol": "MATH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x08d967bb0134f2d07f7cfb6e246680c53927dd30.png" - }, - { - "address": "0x0A913beaD80F321E7Ac35285Ee10d9d922659cB7", - "chainId": 1, - "name": "DOSNetworkToken", - "symbol": "DOS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0a913bead80f321e7ac35285ee10d9d922659cb7.png" - }, - { - "address": "0x0Ae055097C6d159879521C384F1D2123D1f195e6", - "chainId": 1, - "name": "STAKE", - "symbol": "STAKE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0ae055097c6d159879521c384f1d2123d1f195e6.png" - }, - { - "address": "0x0Ba45A8b5d5575935B8158a88C631E9F9C95a2e5", - "chainId": 1, - "name": "TellorTributes", - "symbol": "TRB", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0ba45a8b5d5575935b8158a88c631e9f9c95a2e5.png" - }, - { - "address": "0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e", - "chainId": 1, - "name": "yearn.finance", - "symbol": "YFI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e.png" - }, - { - "address": "0x0Cf0Ee63788A0849fE5297F3407f701E122cC023", - "chainId": 1, - "name": "Streamr", - "symbol": "DATA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0cf0ee63788a0849fe5297f3407f701e122cc023.png" - }, - { - "address": "0x0d438F3b5175Bebc262bF23753C1E53d03432bDE", - "chainId": 1, - "name": "WrappedNXM", - "symbol": "wNXM", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0d438f3b5175bebc262bf23753c1e53d03432bde.png" - }, - { - "address": "0x0D8775F648430679A709E98d2b0Cb6250d2887EF", - "chainId": 1, - "name": "BasicAttentionToken", - "symbol": "BAT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0d8775f648430679a709e98d2b0cb6250d2887ef.png" - }, - { - "address": "0x0E22734e078d6e399BCeE40a549DB591C4EA46cB", - "chainId": 1, - "name": "Streamity", - "symbol": "STM", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0e22734e078d6e399bcee40a549db591c4ea46cb.png" - }, - { - "address": "0x0E8d6b471e332F140e7d9dbB99E5E3822F728DA6", - "chainId": 1, - "name": "Abyss", - "symbol": "ABYSS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0e8d6b471e332f140e7d9dbb99e5e3822f728da6.png" - }, - { - "address": "0x0F5D2fB29fb7d3CFeE444a200298f468908cC942", - "chainId": 1, - "name": "Mana", - "symbol": "MANA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0f5d2fb29fb7d3cfee444a200298f468908cc942.png" - }, - { - "address": "0x0f7F961648aE6Db43C75663aC7E5414Eb79b5704", - "chainId": 1, - "name": "XIONetwork", - "symbol": "XIO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0f7f961648ae6db43c75663ac7e5414eb79b5704.png" - }, - { - "address": "0x1234567461d3f8Db7496581774Bd869C83D51c93", - "chainId": 1, - "name": "BitClave", - "symbol": "CAT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1234567461d3f8db7496581774bd869c83d51c93.png" - }, - { - "address": "0x12B19D3e2ccc14Da04FAe33e63652ce469b3F2FD", - "chainId": 1, - "name": "GRID", - "symbol": "GRID", - "decimals": 12, - "logoURI": "https://tokens.1inch.exchange/0x12b19d3e2ccc14da04fae33e63652ce469b3f2fd.png" - }, - { - "address": "0x12f649A9E821F90BB143089a6e56846945892ffB", - "chainId": 1, - "name": "uDOO", - "symbol": "uDOO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x12f649a9e821f90bb143089a6e56846945892ffb.png" - }, - { - "address": "0x13339fD07934CD674269726EdF3B5ccEE9DD93de", - "chainId": 1, - "name": "CurToken", - "symbol": "CUR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x13339fd07934cd674269726edf3b5ccee9dd93de.png" - }, - { - "address": "0x1453Dbb8A29551ADe11D89825CA812e05317EAEB", - "chainId": 1, - "name": "TendiesToken", - "symbol": "TEND", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1453dbb8a29551ade11d89825ca812e05317eaeb.png" - }, - { - "address": "0x1776e1F26f98b1A5dF9cD347953a26dd3Cb46671", - "chainId": 1, - "name": "Numeraire", - "symbol": "NMR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1776e1f26f98b1a5df9cd347953a26dd3cb46671.png" - }, - { - "address": "0x178c820f862B14f316509ec36b13123DA19A6054", - "chainId": 1, - "name": "EnergyWebTokenBridged", - "symbol": "EWTB", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x178c820f862b14f316509ec36b13123da19a6054.png" - }, - { - "address": "0x1985365e9f78359a9B6AD760e32412f4a445E862", - "chainId": 1, - "name": "Augur", - "symbol": "REP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1985365e9f78359a9b6ad760e32412f4a445e862.png" - }, - { - "address": "0x1A5F9352Af8aF974bFC03399e3767DF6370d82e4", - "chainId": 1, - "name": "OWLToken", - "symbol": "OWL", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1a5f9352af8af974bfc03399e3767df6370d82e4.png" - }, - { - "address": "0x1BeEF31946fbbb40B877a72E4ae04a8D1A5Cee06", - "chainId": 1, - "name": "Parachute", - "symbol": "PAR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1beef31946fbbb40b877a72e4ae04a8d1a5cee06.png" - }, - { - "address": "0x196f4727526eA7FB1e17b2071B3d8eAA38486988", - "chainId": 1, - "name": "Reserve", - "symbol": "RSV", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x196f4727526ea7fb1e17b2071b3d8eaa38486988.png" - }, - { - "address": "0x1dEa979ae76f26071870F824088dA78979eb91C8", - "chainId": 1, - "name": "Spindle", - "symbol": "SPD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1dea979ae76f26071870f824088da78979eb91c8.png" - }, - { - "address": "0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C", - "chainId": 1, - "name": "Bancor", - "symbol": "BNT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c.png" - }, - { - "address": "0x20F7A3DdF244dc9299975b4Da1C39F8D5D75f05A", - "chainId": 1, - "name": "SapienNetwork", - "symbol": "SPN", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0x20f7a3ddf244dc9299975b4da1c39f8d5d75f05a.png" - }, - { - "address": "0x221657776846890989a759BA2973e427DfF5C9bB", - "chainId": 1, - "name": "ReputationV2", - "symbol": "REPv2", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x221657776846890989a759ba2973e427dff5c9bb.png" - }, - { - "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", - "chainId": 1, - "name": "WrappedBTC", - "symbol": "WBTC", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x2260fac5e5542a773aa44fbcfedf7c193bc2c599.png" - }, - { - "address": "0x255Aa6DF07540Cb5d3d297f0D0D4D84cb52bc8e6", - "chainId": 1, - "name": "RaidenNetworkToken", - "symbol": "RDN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x255aa6df07540cb5d3d297f0d0d4d84cb52bc8e6.png" - }, - { - "address": "0x26B3038a7Fc10b36c426846a9086Ef87328dA702", - "chainId": 1, - "name": "YieldFarmingToken", - "symbol": "YFT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x26b3038a7fc10b36c426846a9086ef87328da702.png" - }, - { - "address": "0x26CE25148832C04f3d7F26F32478a9fe55197166", - "chainId": 1, - "name": "DEXTools", - "symbol": "DEXT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x26ce25148832c04f3d7f26f32478a9fe55197166.png" - }, - { - "address": "0x27054b13b1B798B345b591a4d22e6562d47eA75a", - "chainId": 1, - "name": "AirSwap", - "symbol": "AST", - "decimals": 4, - "logoURI": "https://tokens.1inch.exchange/0x27054b13b1b798b345b591a4d22e6562d47ea75a.png" - }, - { - "address": "0x28cb7e841ee97947a86B06fA4090C8451f64c0be", - "chainId": 1, - "name": "YFLink", - "symbol": "YFL", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x28cb7e841ee97947a86b06fa4090c8451f64c0be.png" - }, - { - "address": "0x28dee01D53FED0Edf5f6E310BF8Ef9311513Ae40", - "chainId": 1, - "name": "BlitzPredict", - "symbol": "XBP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x28dee01d53fed0edf5f6e310bf8ef9311513ae40.png" - }, - { - "address": "0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39", - "chainId": 1, - "name": "HEX", - "symbol": "HEX", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x2b591e99afe9f32eaa6214f7b7629768c40eeb39.png" - }, - { - "address": "0x2ba592F78dB6436527729929AAf6c908497cB200", - "chainId": 1, - "name": "Cream", - "symbol": "CREAM", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x2ba592f78db6436527729929aaf6c908497cb200.png" - }, - { - "address": "0x2C4e8f2D746113d0696cE89B35F0d8bF88E0AEcA", - "chainId": 1, - "name": "OpenSimpleToken", - "symbol": "OST", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x2c4e8f2d746113d0696ce89b35f0d8bf88e0aeca.png" - }, - { - "address": "0x2C537E5624e4af88A7ae4060C022609376C8D0EB", - "chainId": 1, - "name": "BiLira", - "symbol": "TRYB", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0x2c537e5624e4af88a7ae4060c022609376c8d0eb.png" - }, - { - "address": "0x2C974B2d0BA1716E644c1FC59982a89DDD2fF724", - "chainId": 1, - "name": "Viberate", - "symbol": "VIB", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x2c974b2d0ba1716e644c1fc59982a89ddd2ff724.png" - }, - { - "address": "0x2dAEE1AA61D60A252DC80564499A69802853583A", - "chainId": 1, - "name": "Authorship", - "symbol": "ATS", - "decimals": 4, - "logoURI": "https://tokens.1inch.exchange/0x2daee1aa61d60a252dc80564499a69802853583a.png" - }, - { - "address": "0x301C755bA0fcA00B1923768Fffb3Df7f4E63aF31", - "chainId": 1, - "name": "GlobalDigitalContent", - "symbol": "GDC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x301c755ba0fca00b1923768fffb3df7f4e63af31.png" - }, - { - "address": "0x309627af60F0926daa6041B8279484312f2bf060", - "chainId": 1, - "name": "USDB", - "symbol": "USDB", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x309627af60f0926daa6041b8279484312f2bf060.png" - }, - { - "address": "0x30f271C9E86D2B7d00a6376Cd96A1cFBD5F0b9b3", - "chainId": 1, - "name": "Decentr", - "symbol": "DEC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x30f271c9e86d2b7d00a6376cd96a1cfbd5f0b9b3.png" - }, - { - "address": "0x3166C570935a7D8554c8f4eA792ff965D2EFe1f2", - "chainId": 1, - "name": "QDAO", - "symbol": "QDAO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3166c570935a7d8554c8f4ea792ff965d2efe1f2.png" - }, - { - "address": "0x340D2bdE5Eb28c1eed91B2f790723E3B160613B7", - "chainId": 1, - "name": "BLOCKv", - "symbol": "VEE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x340d2bde5eb28c1eed91b2f790723e3b160613b7.png" - }, - { - "address": "0x37E8789bB9996CaC9156cD5F5Fd32599E6b91289", - "chainId": 1, - "name": "AidCoin", - "symbol": "AID", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x37e8789bb9996cac9156cd5f5fd32599e6b91289.png" - }, - { - "address": "0x3A92bD396aEf82af98EbC0Aa9030D25a23B11C6b", - "chainId": 1, - "name": "Tokenbox", - "symbol": "TBX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3a92bd396aef82af98ebc0aa9030d25a23b11c6b.png" - }, - { - "address": "0x3C6ff50c9Ec362efa359317009428d52115fe643", - "chainId": 1, - "name": "PeerExNetwork", - "symbol": "PERX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3c6ff50c9ec362efa359317009428d52115fe643.png" - }, - { - "address": "0x3d1BA9be9f66B8ee101911bC36D3fB562eaC2244", - "chainId": 1, - "name": "Rivetz", - "symbol": "RVT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3d1ba9be9f66b8ee101911bc36d3fb562eac2244.png" - }, - { - "address": "0x408e41876cCCDC0F92210600ef50372656052a38", - "chainId": 1, - "name": "Republic", - "symbol": "REN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x408e41876cccdc0f92210600ef50372656052a38.png" - }, - { - "address": "0x40FD72257597aA14C7231A7B1aaa29Fce868F677", - "chainId": 1, - "name": "SoraToken", - "symbol": "XOR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x40fd72257597aa14c7231a7b1aaa29fce868f677.png" - }, - { - "address": "0x419D0d8BdD9aF5e606Ae2232ed285Aff190E711b", - "chainId": 1, - "name": "FunFair", - "symbol": "FUN", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x419d0d8bdd9af5e606ae2232ed285aff190e711b.png" - }, - { - "address": "0x41AB1b6fcbB2fA9DCEd81aCbdeC13Ea6315F2Bf2", - "chainId": 1, - "name": "XinFin", - "symbol": "XDCE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x41ab1b6fcbb2fa9dced81acbdec13ea6315f2bf2.png" - }, - { - "address": "0x41e5560054824eA6B0732E656E3Ad64E20e94E45", - "chainId": 1, - "name": "Civic", - "symbol": "CVC", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x41e5560054824ea6b0732e656e3ad64e20e94e45.png" - }, - { - "address": "0x42d6622deCe394b54999Fbd73D108123806f6a18", - "chainId": 1, - "name": "SPANK", - "symbol": "SPANK", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x42d6622dece394b54999fbd73d108123806f6a18.png" - }, - { - "address": "0x43044f861ec040DB59A7e324c40507adDb673142", - "chainId": 1, - "name": "Cap", - "symbol": "CAP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x43044f861ec040db59a7e324c40507addb673142.png" - }, - { - "address": "0xfeF4185594457050cC9c23980d301908FE057Bb1", - "chainId": 1, - "name": "VIDTDatalink", - "symbol": "VIDT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xfef4185594457050cc9c23980d301908fe057bb1.png" - }, - { - "address": "0x4470BB87d77b963A013DB939BE332f927f2b992e", - "chainId": 1, - "name": "AdExNetworkV1", - "symbol": "ADXv1", - "decimals": 4, - "logoURI": "https://tokens.1inch.exchange/0x4470bb87d77b963a013db939be332f927f2b992e.png" - }, - { - "address": "0x456AE45c0CE901E2e7c99c0718031cEc0A7A59Ff", - "chainId": 1, - "name": "VisionNetwork", - "symbol": "VSN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x456ae45c0ce901e2e7c99c0718031cec0a7a59ff.png" - }, - { - "address": "0x49184E6dAe8C8ecD89d8Bdc1B950c597b8167c90", - "chainId": 1, - "name": "LIBERTAS", - "symbol": "LIBERTAS", - "decimals": 2, - "logoURI": "https://tokens.1inch.exchange/0x49184e6dae8c8ecd89d8bdc1b950c597b8167c90.png" - }, - { - "address": "0x4946Fcea7C692606e8908002e55A582af44AC121", - "chainId": 1, - "name": "FOAMToken", - "symbol": "FOAM", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4946fcea7c692606e8908002e55a582af44ac121.png" - }, - { - "address": "0x4954Db6391F4feB5468b6B943D4935353596aEC9", - "chainId": 1, - "name": "USDQ", - "symbol": "USDQ", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4954db6391f4feb5468b6b943d4935353596aec9.png" - }, - { - "address": "0x4a220E6096B25EADb88358cb44068A3248254675", - "chainId": 1, - "name": "Quant", - "symbol": "QNT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4a220e6096b25eadb88358cb44068a3248254675.png" - }, - { - "address": "0x4a57E687b9126435a9B19E4A802113e266AdeBde", - "chainId": 1, - "name": "Flexacoin", - "symbol": "FXC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4a57e687b9126435a9b19e4a802113e266adebde.png" - }, - { - "address": "0x4AaC461C86aBfA71e9d00d9a2cde8d74E4E1aeEa", - "chainId": 1, - "name": "ZINC", - "symbol": "ZINC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4aac461c86abfa71e9d00d9a2cde8d74e4e1aeea.png" - }, - { - "address": "0x4B3a0c6d668B43F3f07904E124328659b90Bb4Ca", - "chainId": 1, - "name": "AceD", - "symbol": "AceD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4b3a0c6d668b43f3f07904e124328659b90bb4ca.png" - }, - { - "address": "0x4c327471C44B2dacD6E90525f9D629bd2e4f662C", - "chainId": 1, - "name": "GHOST", - "symbol": "GHOST", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4c327471c44b2dacd6e90525f9d629bd2e4f662c.png" - }, - { - "address": "0x4CC19356f2D37338b9802aa8E8fc58B0373296E7", - "chainId": 1, - "name": "SelfKey", - "symbol": "KEY", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4cc19356f2d37338b9802aa8e8fc58b0373296e7.png" - }, - { - "address": "0x4D953cf077c0C95Ba090226E59A18FcF97db44EC", - "chainId": 1, - "name": "MINISWAP", - "symbol": "MINI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4d953cf077c0c95ba090226e59a18fcf97db44ec.png" - }, - { - "address": "0x4DA9b813057D04BAef4e5800E36083717b4a0341", - "chainId": 1, - "name": "AaveInterestbearingTUSD", - "symbol": "aTUSDv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4da9b813057d04baef4e5800e36083717b4a0341.png" - }, - { - "address": "0x4e352cF164E64ADCBad318C3a1e222E9EBa4Ce42", - "chainId": 1, - "name": "MCDEXToken", - "symbol": "MCB", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4e352cf164e64adcbad318c3a1e222e9eba4ce42.png" - }, - { - "address": "0x4f3AfEC4E5a3F2A6a1A411DEF7D7dFe50eE057bF", - "chainId": 1, - "name": "DigixGoldToken", - "symbol": "DGX", - "decimals": 9, - "logoURI": "https://tokens.1inch.exchange/0x4f3afec4e5a3f2a6a1a411def7d7dfe50ee057bf.png" - }, - { - "address": "0x4Fabb145d64652a948d72533023f6E7A623C7C53", - "chainId": 1, - "name": "BinanceUSD", - "symbol": "BUSD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4fabb145d64652a948d72533023f6e7a623c7c53.png" - }, - { - "address": "0x5102791cA02FC3595398400BFE0e33d7B6C82267", - "chainId": 1, - "name": "LeadCoin", - "symbol": "LDC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5102791ca02fc3595398400bfe0e33d7b6c82267.png" - }, - { - "address": "0x514910771AF9Ca656af840dff83E8264EcF986CA", - "chainId": 1, - "name": "ChainLink", - "symbol": "LINK", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x514910771af9ca656af840dff83e8264ecf986ca.png" - }, - { - "address": "0x543Ff227F64Aa17eA132Bf9886cAb5DB55DCAddf", - "chainId": 1, - "name": "DAOStack", - "symbol": "GEN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x543ff227f64aa17ea132bf9886cab5db55dcaddf.png" - }, - { - "address": "0x56d811088235F11C8920698a204A5010a788f4b3", - "chainId": 1, - "name": "bZxProtocolToken", - "symbol": "BZRX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x56d811088235f11c8920698a204a5010a788f4b3.png" - }, - { - "address": "0x5732046A883704404F284Ce41FfADd5b007FD668", - "chainId": 1, - "name": "Bluzelle", - "symbol": "BLZ", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5732046a883704404f284ce41ffadd5b007fd668.png" - }, - { - "address": "0x57700244B20f84799a31c6C96DadFF373ca9D6c5", - "chainId": 1, - "name": "TRUSTDAO", - "symbol": "TRUST", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x57700244b20f84799a31c6c96dadff373ca9d6c5.png" - }, - { - "address": "0x58b6A8A3302369DAEc383334672404Ee733aB239", - "chainId": 1, - "name": "LivepeerToken", - "symbol": "LPT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x58b6a8a3302369daec383334672404ee733ab239.png" - }, - { - "address": "0x595832F8FC6BF59c85C527fEC3740A1b7a361269", - "chainId": 1, - "name": "PowerLedger", - "symbol": "POWR", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0x595832f8fc6bf59c85c527fec3740a1b7a361269.png" - }, - { - "address": "0x5adc961D6AC3f7062D2eA45FEFB8D8167d44b190", - "chainId": 1, - "name": "Dether", - "symbol": "DTH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5adc961d6ac3f7062d2ea45fefb8d8167d44b190.png" - }, - { - "address": "0x5C406D99E04B8494dc253FCc52943Ef82bcA7D75", - "chainId": 1, - "name": "CUSD", - "symbol": "CUSD", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0x5c406d99e04b8494dc253fcc52943ef82bca7d75.png" - }, - { - "address": "0x5c872500c00565505F3624AB435c222E558E9ff8", - "chainId": 1, - "name": "CoTrader", - "symbol": "COT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5c872500c00565505f3624ab435c222e558e9ff8.png" - }, - { - "address": "0x5cAf454Ba92e6F2c929DF14667Ee360eD9fD5b26", - "chainId": 1, - "name": "Dev", - "symbol": "DEV", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5caf454ba92e6f2c929df14667ee360ed9fd5b26.png" - }, - { - "address": "0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643", - "chainId": 1, - "name": "CompoundDai", - "symbol": "cDAI", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x5d3a536e4d6dbd6114cc1ead35777bab948e3643.png" - }, - { - "address": "0x5d60d8d7eF6d37E16EBABc324de3bE57f135e0BC", - "chainId": 1, - "name": "MyBit", - "symbol": "MYB", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5d60d8d7ef6d37e16ebabc324de3be57f135e0bc.png" - }, - { - "address": "0x5e3346444010135322268a4630d2ED5F8D09446c", - "chainId": 1, - "name": "LockTrip", - "symbol": "LOC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5e3346444010135322268a4630d2ed5f8d09446c.png" - }, - { - "address": "0x5e74C9036fb86BD7eCdcb084a0673EFc32eA31cb", - "chainId": 1, - "name": "SynthsETH", - "symbol": "sETH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5e74c9036fb86bd7ecdcb084a0673efc32ea31cb.png" - }, - { - "address": "0x607C794cDa77efB21F8848B7910ecf27451Ae842", - "chainId": 1, - "name": "DeFiPIEToken", - "symbol": "PIE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x607c794cda77efb21f8848b7910ecf27451ae842.png" - }, - { - "address": "0x607F4C5BB672230e8672085532f7e901544a7375", - "chainId": 1, - "name": "iExecRLC", - "symbol": "RLC", - "decimals": 9, - "logoURI": "https://tokens.1inch.exchange/0x607f4c5bb672230e8672085532f7e901544a7375.png" - }, - { - "address": "0x6226caA1857AFBc6DFB6ca66071Eb241228031A1", - "chainId": 1, - "name": "Linkart", - "symbol": "LAR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6226caa1857afbc6dfb6ca66071eb241228031a1.png" - }, - { - "address": "0x6251E725CD45Fb1AF99354035a414A2C0890B929", - "chainId": 1, - "name": "MixTrust", - "symbol": "MXT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6251e725cd45fb1af99354035a414a2c0890b929.png" - }, - { - "address": "0x625aE63000f46200499120B906716420bd059240", - "chainId": 1, - "name": "AaveInterestbearingSUSD", - "symbol": "aSUSDv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x625ae63000f46200499120b906716420bd059240.png" - }, - { - "address": "0x667088b212ce3d06a1b553a7221E1fD19000d9aF", - "chainId": 1, - "name": "Wings", - "symbol": "WINGS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x667088b212ce3d06a1b553a7221e1fd19000d9af.png" - }, - { - "address": "0x6710c63432A2De02954fc0f851db07146a6c0312", - "chainId": 1, - "name": "SyncFab", - "symbol": "MFG", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6710c63432a2de02954fc0f851db07146a6c0312.png" - }, - { - "address": "0x6758B7d441a9739b98552B373703d8d3d14f9e62", - "chainId": 1, - "name": "POA", - "symbol": "POA20", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6758b7d441a9739b98552b373703d8d3d14f9e62.png" - }, - { - "address": "0x6810e776880C02933D47DB1b9fc05908e5386b96", - "chainId": 1, - "name": "Gnosis", - "symbol": "GNO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6810e776880c02933d47db1b9fc05908e5386b96.png" - }, - { - "address": "0x68d57c9a1C35f63E2c83eE8e49A64e9d70528D25", - "chainId": 1, - "name": "SirinLabs", - "symbol": "SRN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x68d57c9a1c35f63e2c83ee8e49a64e9d70528d25.png" - }, - { - "address": "0x6b785a0322126826d8226d77e173d75DAfb84d11", - "chainId": 1, - "name": "BankrollVault", - "symbol": "VLT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6b785a0322126826d8226d77e173d75dafb84d11.png" - }, - { - "address": "0x6B9f031D718dDed0d681c20cB754F97b3BB81b78", - "chainId": 1, - "name": "Geeq", - "symbol": "GEEQ", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6b9f031d718dded0d681c20cb754f97b3bb81b78.png" - }, - { - "address": "0x6Ba460AB75Cd2c56343b3517ffeBA60748654D26", - "chainId": 1, - "name": "UpToken", - "symbol": "UP", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x6ba460ab75cd2c56343b3517ffeba60748654d26.png" - }, - { - "address": "0x6c6EE5e31d828De241282B9606C8e98Ea48526E2", - "chainId": 1, - "name": "HoloToken", - "symbol": "HOT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6c6ee5e31d828de241282b9606c8e98ea48526e2.png" - }, - { - "address": "0x6F87D756DAf0503d08Eb8993686c7Fc01Dc44fB1", - "chainId": 1, - "name": "UniTrade", - "symbol": "TRADE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6f87d756daf0503d08eb8993686c7fc01dc44fb1.png" - }, - { - "address": "0x6fe56C0bcdD471359019FcBC48863d6c3e9d4F41", - "chainId": 1, - "name": "PropsToken", - "symbol": "PROPS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6fe56c0bcdd471359019fcbc48863d6c3e9d4f41.png" - }, - { - "address": "0x71fc860F7D3A592A4a98740e39dB31d25db65ae8", - "chainId": 1, - "name": "AaveInterestbearingUSDT", - "symbol": "aUSDTv1", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0x71fc860f7d3a592a4a98740e39db31d25db65ae8.png" - }, - { - "address": "0x737F98AC8cA59f2C68aD658E3C3d8C8963E40a4c", - "chainId": 1, - "name": "Amon", - "symbol": "AMN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x737f98ac8ca59f2c68ad658e3c3d8c8963e40a4c.png" - }, - { - "address": "0x744d70FDBE2Ba4CF95131626614a1763DF805B9E", - "chainId": 1, - "name": "Status", - "symbol": "SNT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x744d70fdbe2ba4cf95131626614a1763df805b9e.png" - }, - { - "address": "0x763186eB8d4856D536eD4478302971214FEbc6A9", - "chainId": 1, - "name": "BetterBetting", - "symbol": "BETR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x763186eb8d4856d536ed4478302971214febc6a9.png" - }, - { - "address": "0x780116D91E5592E58a3b3c76A351571b39abCEc6", - "chainId": 1, - "name": "Blockparty", - "symbol": "BOXX", - "decimals": 15, - "logoURI": "https://tokens.1inch.exchange/0x780116d91e5592e58a3b3c76a351571b39abcec6.png" - }, - { - "address": "0x7B0C06043468469967DBA22d1AF33d77d44056c8", - "chainId": 1, - "name": "MorpheusNetwork", - "symbol": "MRPH", - "decimals": 4, - "logoURI": "https://tokens.1inch.exchange/0x7b0c06043468469967dba22d1af33d77d44056c8.png" - }, - { - "address": "0x7b123f53421b1bF8533339BFBdc7C98aA94163db", - "chainId": 1, - "name": "dfohub", - "symbol": "buidl", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x7b123f53421b1bf8533339bfbdc7c98aa94163db.png" - }, - { - "address": "0x7C5A0CE9267ED19B22F8cae653F198e3E8daf098", - "chainId": 1, - "name": "Santiment", - "symbol": "SAN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x7c5a0ce9267ed19b22f8cae653f198e3e8daf098.png" - }, - { - "address": "0x7dE91B204C1C737bcEe6F000AAA6569Cf7061cb7", - "chainId": 1, - "name": "Robonomics", - "symbol": "XRT", - "decimals": 9, - "logoURI": "https://tokens.1inch.exchange/0x7de91b204c1c737bcee6f000aaa6569cf7061cb7.png" - }, - { - "address": "0x80fB784B7eD66730e8b1DBd9820aFD29931aab03", - "chainId": 1, - "name": "EthLend", - "symbol": "LEND", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x80fb784b7ed66730e8b1dbd9820afd29931aab03.png" - }, - { - "address": "0x814e0908b12A99FeCf5BC101bB5d0b8B5cDf7d26", - "chainId": 1, - "name": "MeasurableDataToken", - "symbol": "MDT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x814e0908b12a99fecf5bc101bb5d0b8b5cdf7d26.png" - }, - { - "address": "0x8207c1FfC5B6804F6024322CcF34F29c3541Ae26", - "chainId": 1, - "name": "OriginProtocol", - "symbol": "OGN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x8207c1ffc5b6804f6024322ccf34f29c3541ae26.png" - }, - { - "address": "0x821144518dfE9e7b44fCF4d0824e15e8390d4637", - "chainId": 1, - "name": "ATISToken", - "symbol": "ATIS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x821144518dfe9e7b44fcf4d0824e15e8390d4637.png" - }, - { - "address": "0x83984d6142934bb535793A82ADB0a46EF0F66B6d", - "chainId": 1, - "name": "Remme", - "symbol": "REM", - "decimals": 4, - "logoURI": "https://tokens.1inch.exchange/0x83984d6142934bb535793a82adb0a46ef0f66b6d.png" - }, - { - "address": "0x83cee9e086A77e492eE0bB93C2B0437aD6fdECCc", - "chainId": 1, - "name": "Goldmint", - "symbol": "MNTP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x83cee9e086a77e492ee0bb93c2b0437ad6fdeccc.png" - }, - { - "address": "0x8400D94A5cb0fa0D041a3788e395285d61c9ee5e", - "chainId": 1, - "name": "UniBright", - "symbol": "UBT", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x8400d94a5cb0fa0d041a3788e395285d61c9ee5e.png" - }, - { - "address": "0x84cA8bc7997272c7CfB4D0Cd3D55cd942B3c9419", - "chainId": 1, - "name": "DIAToken", - "symbol": "DIA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x84ca8bc7997272c7cfb4d0cd3d55cd942b3c9419.png" - }, - { - "address": "0x8762db106B2c2A0bccB3A80d1Ed41273552616E8", - "chainId": 1, - "name": "ReserveRights", - "symbol": "RSR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x8762db106b2c2a0bccb3a80d1ed41273552616e8.png" - }, - { - "address": "0x89Ab32156e46F46D02ade3FEcbe5Fc4243B9AAeD", - "chainId": 1, - "name": "pNetworkToken", - "symbol": "PNT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x89ab32156e46f46d02ade3fecbe5fc4243b9aaed.png" - }, - { - "address": "0x8Ab7404063Ec4DBcfd4598215992DC3F8EC853d7", - "chainId": 1, - "name": "Akropolis", - "symbol": "AKRO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x8ab7404063ec4dbcfd4598215992dc3f8ec853d7.png" - }, - { - "address": "0x7b6F71c8B123b38aa8099e0098bEC7fbc35B8a13", - "chainId": 1, - "name": "NerveNetwork", - "symbol": "NVT", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x7b6f71c8b123b38aa8099e0098bec7fbc35b8a13.png" - }, - { - "address": "0x8CE9137d39326AD0cD6491fb5CC0CbA0e089b6A9", - "chainId": 1, - "name": "Swipe", - "symbol": "SXP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x8ce9137d39326ad0cd6491fb5cc0cba0e089b6a9.png" - }, - { - "address": "0x8E870D67F660D95d5be530380D0eC0bd388289E1", - "chainId": 1, - "name": "PaxosStandard", - "symbol": "PAX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x8e870d67f660d95d5be530380d0ec0bd388289e1.png" - }, - { - "address": "0x8eB24319393716668D768dCEC29356ae9CfFe285", - "chainId": 1, - "name": "SingularityNETToken", - "symbol": "AGI", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x8eb24319393716668d768dcec29356ae9cffe285.png" - }, - { - "address": "0x8f8221aFbB33998d8584A2B05749bA73c37a938a", - "chainId": 1, - "name": "Request", - "symbol": "REQ", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x8f8221afbb33998d8584a2b05749ba73c37a938a.png" - }, - { - "address": "0x0258F474786DdFd37ABCE6df6BBb1Dd5dfC4434a", - "chainId": 1, - "name": "OrionProtocol", - "symbol": "ORN", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x0258f474786ddfd37abce6df6bbb1dd5dfc4434a.png" - }, - { - "address": "0x910Dfc18D6EA3D6a7124A6F8B5458F281060fa4c", - "chainId": 1, - "name": "x8currency", - "symbol": "X8X", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x910dfc18d6ea3d6a7124a6f8b5458f281060fa4c.png" - }, - { - "address": "0x9214eC02CB71CbA0ADA6896b8dA260736a67ab10", - "chainId": 1, - "name": "REAL", - "symbol": "REAL", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x9214ec02cb71cba0ada6896b8da260736a67ab10.png" - }, - { - "address": "0x93ED3FBe21207Ec2E8f2d3c3de6e058Cb73Bc04d", - "chainId": 1, - "name": "Kleros", - "symbol": "PNK", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x93ed3fbe21207ec2e8f2d3c3de6e058cb73bc04d.png" - }, - { - "address": "0x95172ccBe8344fecD73D0a30F54123652981BD6F", - "chainId": 1, - "name": "MeridianNetwork", - "symbol": "LOCK", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x95172ccbe8344fecd73d0a30f54123652981bd6f.png" - }, - { - "address": "0x960b236A07cf122663c4303350609A66A7B288C0", - "chainId": 1, - "name": "AragonNetworkToken", - "symbol": "ANTv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x960b236a07cf122663c4303350609a66a7b288c0.png" - }, - { - "address": "0x97af10D3fc7C70F67711Bf715d8397C6Da79C1Ab", - "chainId": 1, - "name": "DipperNetwork", - "symbol": "DIP", - "decimals": 12, - "logoURI": "https://tokens.1inch.exchange/0x97af10d3fc7c70f67711bf715d8397c6da79c1ab.png" - }, - { - "address": "0x967da4048cD07aB37855c090aAF366e4ce1b9F48", - "chainId": 1, - "name": "OceanToken", - "symbol": "OCEAN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x967da4048cd07ab37855c090aaf366e4ce1b9f48.png" - }, - { - "address": "0x990f341946A3fdB507aE7e52d17851B87168017c", - "chainId": 1, - "name": "Strong", - "symbol": "STRONG", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x990f341946a3fdb507ae7e52d17851b87168017c.png" - }, - { - "address": "0x9992eC3cF6A55b00978cdDF2b27BC6882d88D1eC", - "chainId": 1, - "name": "Polymath", - "symbol": "POLY", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x9992ec3cf6a55b00978cddf2b27bc6882d88d1ec.png" - }, - { - "address": "0x9bA00D6856a4eDF4665BcA2C2309936572473B7E", - "chainId": 1, - "name": "AaveInterestbearingUSDC", - "symbol": "aUSDCv1", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0x9ba00d6856a4edf4665bca2c2309936572473b7e.png" - }, - { - "address": "0x9Cb2f26A23b8d89973F08c957C4d7cdf75CD341c", - "chainId": 1, - "name": "DigitalRand", - "symbol": "DZAR", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0x9cb2f26a23b8d89973f08c957c4d7cdf75cd341c.png" - }, - { - "address": "0x9f49ed43C90A540d1cF12f6170aCE8d0B88a14E6", - "chainId": 1, - "name": "ETHRSI6040YieldII", - "symbol": "ETHRSIAPY", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x9f49ed43c90a540d1cf12f6170ace8d0b88a14e6.png" - }, - { - "address": "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2", - "chainId": 1, - "name": "Maker", - "symbol": "MKR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2.png" - }, - { - "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "chainId": 1, - "name": "USDCoin", - "symbol": "USDC", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48.png" - }, - { - "address": "0xA15C7Ebe1f07CaF6bFF097D8a589fb8AC49Ae5B3", - "chainId": 1, - "name": "PundiX", - "symbol": "NPXS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa15c7ebe1f07caf6bff097d8a589fb8ac49ae5b3.png" - }, - { - "address": "0xa1d0E215a23d7030842FC67cE582a6aFa3CCaB83", - "chainId": 1, - "name": "YFII.finance", - "symbol": "YFII", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa1d0e215a23d7030842fc67ce582a6afa3ccab83.png" - }, - { - "address": "0xa1d65E8fB6e87b60FECCBc582F7f97804B725521", - "chainId": 1, - "name": "DXdao", - "symbol": "DXD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa1d65e8fb6e87b60feccbc582f7f97804b725521.png" - }, - { - "address": "0xa3BeD4E1c75D00fa6f4E5E6922DB7261B5E9AcD2", - "chainId": 1, - "name": "Meta", - "symbol": "MTA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa3bed4e1c75d00fa6f4e5e6922db7261b5e9acd2.png" - }, - { - "address": "0xa3d58c4E56fedCae3a7c43A725aeE9A71F0ece4e", - "chainId": 1, - "name": "Metronome", - "symbol": "MET", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa3d58c4e56fedcae3a7c43a725aee9a71f0ece4e.png" - }, - { - "address": "0xa462d0E6Bb788c7807B1B1C96992CE1f7069E195", - "chainId": 1, - "name": "EQUUSMiningToken", - "symbol": "EQMT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa462d0e6bb788c7807b1b1c96992ce1f7069e195.png" - }, - { - "address": "0xA4Bdb11dc0a2bEC88d24A3aa1E6Bb17201112eBe", - "chainId": 1, - "name": "StableUSD", - "symbol": "USDS", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0xa4bdb11dc0a2bec88d24a3aa1e6bb17201112ebe.png" - }, - { - "address": "0xA4e8C3Ec456107eA67d3075bF9e3DF3A75823DB0", - "chainId": 1, - "name": "LoomNetwork", - "symbol": "LOOM", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa4e8c3ec456107ea67d3075bf9e3df3a75823db0.png" - }, - { - "address": "0xA64BD6C70Cb9051F6A9ba1F163Fdc07E0DfB5F84", - "chainId": 1, - "name": "AaveInterestbearingLINK", - "symbol": "aLINKv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa64bd6c70cb9051f6a9ba1f163fdc07e0dfb5f84.png" - }, - { - "address": "0xa704fCe7b309Ec09DF16e2F5Ab8cAf6Fe8A4BAA9", - "chainId": 1, - "name": "AgriChain", - "symbol": "AGRI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa704fce7b309ec09df16e2f5ab8caf6fe8a4baa9.png" - }, - { - "address": "0xaaAEBE6Fe48E54f431b0C390CfaF0b017d09D42d", - "chainId": 1, - "name": "Celsius", - "symbol": "CEL", - "decimals": 4, - "logoURI": "https://tokens.1inch.exchange/0xaaaebe6fe48e54f431b0c390cfaf0b017d09d42d.png" - }, - { - "address": "0xaAAf91D9b90dF800Df4F55c205fd6989c977E73a", - "chainId": 1, - "name": "Monolith", - "symbol": "TKN", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0xaaaf91d9b90df800df4f55c205fd6989c977e73a.png" - }, - { - "address": "0xb0280743b44bF7db4B6bE482b2Ba7b75E5dA096C", - "chainId": 1, - "name": "Transcodium", - "symbol": "TNS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb0280743b44bf7db4b6be482b2ba7b75e5da096c.png" - }, - { - "address": "0xb056c38f6b7Dc4064367403E26424CD2c60655e1", - "chainId": 1, - "name": "CEEKVR", - "symbol": "CEEK", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb056c38f6b7dc4064367403e26424cd2c60655e1.png" - }, - { - "address": "0xB3319f5D18Bc0D84dD1b4825Dcde5d5f7266d407", - "chainId": 1, - "name": "Compound0x", - "symbol": "cZRX", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0xb3319f5d18bc0d84dd1b4825dcde5d5f7266d407.png" - }, - { - "address": "0xB4272071eCAdd69d933AdcD19cA99fe80664fc08", - "chainId": 1, - "name": "CryptoFranc", - "symbol": "XCHF", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb4272071ecadd69d933adcd19ca99fe80664fc08.png" - }, - { - "address": "0xB4EFd85c19999D84251304bDA99E90B92300Bd93", - "chainId": 1, - "name": "RocketPool", - "symbol": "RPL", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb4efd85c19999d84251304bda99e90b92300bd93.png" - }, - { - "address": "0xeca82185adCE47f39c684352B0439f030f860318", - "chainId": 1, - "name": "Perlin", - "symbol": "PERL", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xeca82185adce47f39c684352b0439f030f860318.png" - }, - { - "address": "0xb4058411967D5046f3510943103805be61f0600E", - "chainId": 1, - "name": "STONK", - "symbol": "STONK", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb4058411967d5046f3510943103805be61f0600e.png" - }, - { - "address": "0xb683D83a532e2Cb7DFa5275eED3698436371cc9f", - "chainId": 1, - "name": "BTUProtocol", - "symbol": "BTU", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb683d83a532e2cb7dfa5275eed3698436371cc9f.png" - }, - { - "address": "0xb6c4267C4877BB0D6b1685Cfd85b0FBe82F105ec", - "chainId": 1, - "name": "Relevant", - "symbol": "REL", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb6c4267c4877bb0d6b1685cfd85b0fbe82f105ec.png" - }, - { - "address": "0xB97048628DB6B661D4C2aA833e95Dbe1A905B280", - "chainId": 1, - "name": "TenX", - "symbol": "PAY", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb97048628db6b661d4c2aa833e95dbe1a905b280.png" - }, - { - "address": "0xba100000625a3754423978a60c9317c58a424e3D", - "chainId": 1, - "name": "Balancer", - "symbol": "BAL", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xba100000625a3754423978a60c9317c58a424e3d.png" - }, - { - "address": "0xBA11D00c5f74255f56a5E366F4F77f5A186d7f55", - "chainId": 1, - "name": "BandProtocol", - "symbol": "BAND", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xba11d00c5f74255f56a5e366f4f77f5a186d7f55.png" - }, - { - "address": "0xBB1fA4FdEB3459733bF67EbC6f893003fA976a82", - "chainId": 1, - "name": "Bitnation", - "symbol": "XPAT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xbb1fa4fdeb3459733bf67ebc6f893003fa976a82.png" - }, - { - "address": "0xBBbbCA6A901c926F240b89EacB641d8Aec7AEafD", - "chainId": 1, - "name": "Loopring", - "symbol": "LRC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xbbbbca6a901c926f240b89eacb641d8aec7aeafd.png" - }, - { - "address": "0xBC86727E770de68B1060C91f6BB6945c73e10388", - "chainId": 1, - "name": "InkProtocol", - "symbol": "XNK", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xbc86727e770de68b1060c91f6bb6945c73e10388.png" - }, - { - "address": "0xBd2949F67DcdC549c6Ebe98696449Fa79D988A9F", - "chainId": 1, - "name": "MeterGovernancemappedbyMeter.io", - "symbol": "eMTRG", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xbd2949f67dcdc549c6ebe98696449fa79d988a9f.png" - }, - { - "address": "0xD9Ec3ff1f8be459Bb9369b4E79e9Ebcf7141C093", - "chainId": 1, - "name": "KardiaChainToken", - "symbol": "KAI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xd9ec3ff1f8be459bb9369b4e79e9ebcf7141c093.png" - }, - { - "address": "0xbE9375C6a420D2eEB258962efB95551A5b722803", - "chainId": 1, - "name": "KyberStormXToken", - "symbol": "STMX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xbe9375c6a420d2eeb258962efb95551a5b722803.png" - }, - { - "address": "0xbf2179859fc6D5BEE9Bf9158632Dc51678a4100e", - "chainId": 1, - "name": "Aelf", - "symbol": "ELF", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xbf2179859fc6d5bee9bf9158632dc51678a4100e.png" - }, - { - "address": "0xc00e94Cb662C3520282E6f5717214004A7f26888", - "chainId": 1, - "name": "Compound", - "symbol": "COMP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc00e94cb662c3520282e6f5717214004a7f26888.png" - }, - { - "address": "0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F", - "chainId": 1, - "name": "SynthetixNetworkToken", - "symbol": "SNX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f.png" - }, - { - "address": "0x27702a26126e0B3702af63Ee09aC4d1A084EF628", - "chainId": 1, - "name": "aleph.imv2", - "symbol": "ALEPH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x27702a26126e0b3702af63ee09ac4d1a084ef628.png" - }, - { - "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "chainId": 1, - "name": "WrappedEther", - "symbol": "WETH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2.png" - }, - { - "address": "0xC11b1268C1A384e55C48c2391d8d480264A3A7F4", - "chainId": 1, - "name": "CompoundWrappedBTC", - "symbol": "cWBTC", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0xc11b1268c1a384e55c48c2391d8d480264a3a7f4.png" - }, - { - "address": "0xc12d099be31567add4e4e4d0D45691C3F58f5663", - "chainId": 1, - "name": "Auctus", - "symbol": "AUC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc12d099be31567add4e4e4d0d45691c3f58f5663.png" - }, - { - "address": "0xc27A2F05fa577a83BA0fDb4c38443c0718356501", - "chainId": 1, - "name": "LamdenTau", - "symbol": "TAU", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc27a2f05fa577a83ba0fdb4c38443c0718356501.png" - }, - { - "address": "0xC28e931814725BbEB9e670676FaBBCb694Fe7DF2", - "chainId": 1, - "name": "QuadrantProtocol", - "symbol": "EQUAD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc28e931814725bbeb9e670676fabbcb694fe7df2.png" - }, - { - "address": "0xc3dD23A0a854b4f9aE80670f528094E9Eb607CCb", - "chainId": 1, - "name": "Trendering", - "symbol": "TRND", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc3dd23a0a854b4f9ae80670f528094e9eb607ccb.png" - }, - { - "address": "0xC5bBaE50781Be1669306b9e001EFF57a2957b09d", - "chainId": 1, - "name": "Gifto", - "symbol": "GTO", - "decimals": 5, - "logoURI": "https://tokens.1inch.exchange/0xc5bbae50781be1669306b9e001eff57a2957b09d.png" - }, - { - "address": "0xc75F15AdA581219c95485c578E124df3985e4CE0", - "chainId": 1, - "name": "zzz.finance", - "symbol": "ZZZ", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc75f15ada581219c95485c578e124df3985e4ce0.png" - }, - { - "address": "0xC76FB75950536d98FA62ea968E1D6B45ffea2A55", - "chainId": 1, - "name": "COL", - "symbol": "COL", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc76fb75950536d98fa62ea968e1d6b45ffea2a55.png" - }, - { - "address": "0xCC4304A31d09258b0029eA7FE63d032f52e44EFe", - "chainId": 1, - "name": "TrustSwapToken", - "symbol": "SWAP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xcc4304a31d09258b0029ea7fe63d032f52e44efe.png" - }, - { - "address": "0xCc80C051057B774cD75067Dc48f8987C4Eb97A5e", - "chainId": 1, - "name": "EthfinexNectarToken", - "symbol": "NEC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xcc80c051057b774cd75067dc48f8987c4eb97a5e.png" - }, - { - "address": "0xcD62b1C403fa761BAadFC74C525ce2B51780b184", - "chainId": 1, - "name": "AragonNetworkJuror", - "symbol": "ANJ", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xcd62b1c403fa761baadfc74c525ce2b51780b184.png" - }, - { - "address": "0xCee1d3c3A02267e37E6B373060F79d5d7b9e1669", - "chainId": 1, - "name": "yffi.finance", - "symbol": "YFFI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xcee1d3c3a02267e37e6b373060f79d5d7b9e1669.png" - }, - { - "address": "0xCf8f9555D55CE45a3A33a81D6eF99a2a2E71Dee2", - "chainId": 1, - "name": "CBIIndex7", - "symbol": "CBIX7", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xcf8f9555d55ce45a3a33a81d6ef99a2a2e71dee2.png" - }, - { - "address": "0xd15eCDCF5Ea68e3995b2D0527A0aE0a3258302F8", - "chainId": 1, - "name": "MachiXToken", - "symbol": "MCX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xd15ecdcf5ea68e3995b2d0527a0ae0a3258302f8.png" - }, - { - "address": "0xd26114cd6EE289AccF82350c8d8487fedB8A0C07", - "chainId": 1, - "name": "OmiseGO", - "symbol": "OMG", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xd26114cd6ee289accf82350c8d8487fedb8a0c07.png" - }, - { - "address": "0xd341d1680Eeee3255b8C4c75bCCE7EB57f144dAe", - "chainId": 1, - "name": "onG.social", - "symbol": "ONG", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xd341d1680eeee3255b8c4c75bcce7eb57f144dae.png" - }, - { - "address": "0xD46bA6D942050d489DBd938a2C909A5d5039A161", - "chainId": 1, - "name": "Ampleforth", - "symbol": "AMPL", - "decimals": 9, - "logoURI": "https://tokens.1inch.exchange/0xd46ba6d942050d489dbd938a2c909a5d5039a161.png" - }, - { - "address": "0xd4c435F5B09F855C3317c8524Cb1F586E42795fa", - "chainId": 1, - "name": "Cindicator", - "symbol": "CND", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xd4c435f5b09f855c3317c8524cb1f586e42795fa.png" - }, - { - "address": "0xd559f20296FF4895da39b5bd9ADd54b442596a61", - "chainId": 1, - "name": "FintruX", - "symbol": "FTX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xd559f20296ff4895da39b5bd9add54b442596a61.png" - }, - { - "address": "0xD6F0Bb2A45110f819e908a915237D652Ac7c5AA8", - "chainId": 1, - "name": "DFOHub", - "symbol": "BUIDL", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xd6f0bb2a45110f819e908a915237d652ac7c5aa8.png" - }, - { - "address": "0xd7631787B4dCc87b1254cfd1e5cE48e96823dEe8", - "chainId": 1, - "name": "Sociall", - "symbol": "SCL", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0xd7631787b4dcc87b1254cfd1e5ce48e96823dee8.png" - }, - { - "address": "0xD8912C10681D8B21Fd3742244f44658dBA12264E", - "chainId": 1, - "name": "Pluton", - "symbol": "PLU", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xd8912c10681d8b21fd3742244f44658dba12264e.png" - }, - { - "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7", - "chainId": 1, - "name": "TetherUSD", - "symbol": "USDT", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0xdac17f958d2ee523a2206206994597c13d831ec7.png" - }, - { - "address": "0xdB25f211AB05b1c97D595516F45794528a807ad8", - "chainId": 1, - "name": "STASISEURS", - "symbol": "EURS", - "decimals": 2, - "logoURI": "https://tokens.1inch.exchange/0xdb25f211ab05b1c97d595516f45794528a807ad8.png" - }, - { - "address": "0xdd974D5C2e2928deA5F71b9825b8b646686BD200", - "chainId": 1, - "name": "KyberNetwork", - "symbol": "KNC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xdd974d5c2e2928dea5f71b9825b8b646686bd200.png" - }, - { - "address": "0xDF2C7238198Ad8B389666574f2d8bc411A4b7428", - "chainId": 1, - "name": "Mainframe", - "symbol": "MFT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xdf2c7238198ad8b389666574f2d8bc411a4b7428.png" - }, - { - "address": "0xdF574c24545E5FfEcb9a659c229253D4111d87e1", - "chainId": 1, - "name": "HUSD", - "symbol": "HUSD", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0xdf574c24545e5ffecb9a659c229253d4111d87e1.png" - }, - { - "address": "0xdfe691F37b6264a90Ff507EB359C45d55037951C", - "chainId": 1, - "name": "Karma", - "symbol": "KARMA", - "decimals": 4, - "logoURI": "https://tokens.1inch.exchange/0xdfe691f37b6264a90ff507eb359c45d55037951c.png" - }, - { - "address": "0xE17f017475a709De58E976081eB916081ff4c9d5", - "chainId": 1, - "name": "RMPL", - "symbol": "RMPL", - "decimals": 9, - "logoURI": "https://tokens.1inch.exchange/0xe17f017475a709de58e976081eb916081ff4c9d5.png" - }, - { - "address": "0xe25b0BBA01Dc5630312B6A21927E578061A13f55", - "chainId": 1, - "name": "ShipChainSHIP", - "symbol": "SHIP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xe25b0bba01dc5630312b6a21927e578061a13f55.png" - }, - { - "address": "0xe3818504c1B32bF1557b16C238B2E01Fd3149C17", - "chainId": 1, - "name": "Pillar", - "symbol": "PLR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xe3818504c1b32bf1557b16c238b2e01fd3149c17.png" - }, - { - "address": "0xE41d2489571d322189246DaFA5ebDe1F4699F498", - "chainId": 1, - "name": "0xProtocol", - "symbol": "ZRX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xe41d2489571d322189246dafa5ebde1f4699f498.png" - }, - { - "address": "0xE48972fCd82a274411c01834e2f031D4377Fa2c0", - "chainId": 1, - "name": "2key.network", - "symbol": "2KEY", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xe48972fcd82a274411c01834e2f031d4377fa2c0.png" - }, - { - "address": "0xE5a3229CCb22b6484594973A03a3851dCd948756", - "chainId": 1, - "name": "ReceiveAccessEcosystem", - "symbol": "RAE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xe5a3229ccb22b6484594973a03a3851dcd948756.png" - }, - { - "address": "0xEA26c4aC16D4a5A106820BC8AEE85fd0b7b2b664", - "chainId": 1, - "name": "QuarkChain", - "symbol": "QKC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xea26c4ac16d4a5a106820bc8aee85fd0b7b2b664.png" - }, - { - "address": "0xEB4C2781e4ebA804CE9a9803C67d0893436bB27D", - "chainId": 1, - "name": "renBTC", - "symbol": "renBTC", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0xeb4c2781e4eba804ce9a9803c67d0893436bb27d.png" - }, - { - "address": "0xec67005c4E498Ec7f55E092bd1d35cbC47C91892", - "chainId": 1, - "name": "MelonToken", - "symbol": "MLN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xec67005c4e498ec7f55e092bd1d35cbc47c91892.png" - }, - { - "address": "0xEd91879919B71bB6905f23af0A68d231EcF87b14", - "chainId": 1, - "name": "DMMGovernance", - "symbol": "DMG", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xed91879919b71bb6905f23af0a68d231ecf87b14.png" - }, - { - "address": "0xEDD7c94FD7B4971b916d15067Bc454b9E1bAD980", - "chainId": 1, - "name": "Zippie", - "symbol": "ZIPT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xedd7c94fd7b4971b916d15067bc454b9e1bad980.png" - }, - { - "address": "0xeEEE2a622330E6d2036691e983DEe87330588603", - "chainId": 1, - "name": "AskobarNetwork", - "symbol": "ASKO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xeeee2a622330e6d2036691e983dee87330588603.png" - }, - { - "address": "0xEeEeeeeEe2aF8D0e1940679860398308e0eF24d6", - "chainId": 1, - "name": "EthverseToken", - "symbol": "ETHV", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xeeeeeeeee2af8d0e1940679860398308e0ef24d6.png" - }, - { - "address": "0xeF9Cd7882c067686691B6fF49e650b43AFBBCC6B", - "chainId": 1, - "name": "FinNexus", - "symbol": "FNX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xef9cd7882c067686691b6ff49e650b43afbbcc6b.png" - }, - { - "address": "0xefBd6D7deF37ffae990503EcdB1291B2f7E38788", - "chainId": 1, - "name": "Evolution", - "symbol": "EVO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xefbd6d7def37ffae990503ecdb1291b2f7e38788.png" - }, - { - "address": "0xf04a8ac553FceDB5BA99A64799155826C136b0Be", - "chainId": 1, - "name": "Flixxo", - "symbol": "FLIXX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf04a8ac553fcedb5ba99a64799155826c136b0be.png" - }, - { - "address": "0xF0FAC7104aAC544e4a7CE1A55ADF2B5a25c65bD1", - "chainId": 1, - "name": "PampNetwork", - "symbol": "PAMP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf0fac7104aac544e4a7ce1a55adf2b5a25c65bd1.png" - }, - { - "address": "0xF1290473E210b2108A85237fbCd7b6eb42Cc654F", - "chainId": 1, - "name": "HedgeTrade", - "symbol": "HEDG", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf1290473e210b2108a85237fbcd7b6eb42cc654f.png" - }, - { - "address": "0xF29992D7b589A0A6bD2de7Be29a97A6EB73EaF85", - "chainId": 1, - "name": "DMScript", - "symbol": "DMST", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf29992d7b589a0a6bd2de7be29a97a6eb73eaf85.png" - }, - { - "address": "0xf29e46887FFAE92f1ff87DfE39713875Da541373", - "chainId": 1, - "name": "UniCrypt", - "symbol": "UNC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf29e46887ffae92f1ff87dfe39713875da541373.png" - }, - { - "address": "0xF2f9A7e93f845b3ce154EfbeB64fB9346FCCE509", - "chainId": 1, - "name": "UniPower", - "symbol": "POWER", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf2f9a7e93f845b3ce154efbeb64fb9346fcce509.png" - }, - { - "address": "0xF433089366899D83a9f26A773D59ec7eCF30355e", - "chainId": 1, - "name": "Metal", - "symbol": "MTL", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0xf433089366899d83a9f26a773d59ec7ecf30355e.png" - }, - { - "address": "0xF629cBd94d3791C9250152BD8dfBDF380E2a3B9c", - "chainId": 1, - "name": "EnjinCoin", - "symbol": "ENJ", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf629cbd94d3791c9250152bd8dfbdf380e2a3b9c.png" - }, - { - "address": "0xf650C3d88D12dB855b8bf7D11Be6C55A4e07dCC9", - "chainId": 1, - "name": "CompoundUSDT", - "symbol": "cUSDT", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0xf650c3d88d12db855b8bf7d11be6c55a4e07dcc9.png" - }, - { - "address": "0xf8e386EDa857484f5a12e4B5DAa9984E06E73705", - "chainId": 1, - "name": "Indorse", - "symbol": "IND", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf8e386eda857484f5a12e4b5daa9984e06e73705.png" - }, - { - "address": "0xf911a7ec46a2c6fa49193212fe4a2a9B95851c27", - "chainId": 1, - "name": "Antiample", - "symbol": "XAMP", - "decimals": 9, - "logoURI": "https://tokens.1inch.exchange/0xf911a7ec46a2c6fa49193212fe4a2a9b95851c27.png" - }, - { - "address": "0xF970b8E36e23F7fC3FD752EeA86f8Be8D83375A6", - "chainId": 1, - "name": "Ripio", - "symbol": "RCN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf970b8e36e23f7fc3fd752eea86f8be8d83375a6.png" - }, - { - "address": "0xfC1E690f61EFd961294b3e1Ce3313fBD8aa4f85d", - "chainId": 1, - "name": "AaveInterestbearingDAI", - "symbol": "aDAIv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xfc1e690f61efd961294b3e1ce3313fbd8aa4f85d.png" - }, - { - "address": "0x00006100F7090010005F1bd7aE6122c3C2CF0090", - "chainId": 1, - "name": "TrueAUD", - "symbol": "TAUD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x00006100f7090010005f1bd7ae6122c3c2cf0090.png" - }, - { - "address": "0x00000000441378008EA67F4284A57932B1c000a5", - "chainId": 1, - "name": "TrueGBP", - "symbol": "TGBP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x00000000441378008ea67f4284a57932b1c000a5.png" - }, - { - "address": "0x00000100F2A2bd000715001920eB70D229700085", - "chainId": 1, - "name": "TrueCAD", - "symbol": "TCAD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x00000100f2a2bd000715001920eb70d229700085.png" - }, - { - "address": "0x0000852600CEB001E08e00bC008be620d60031F2", - "chainId": 1, - "name": "TrueHKD", - "symbol": "THKD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0000852600ceb001e08e00bc008be620d60031f2.png" - }, - { - "address": "0x0000000000b3F879cb30FE243b4Dfee438691c04", - "chainId": 1, - "name": "Gastoken.io2", - "symbol": "GST2", - "decimals": 2, - "logoURI": "https://tokens.1inch.exchange/0x0000000000b3f879cb30fe243b4dfee438691c04.png" - }, - { - "address": "0x06AF07097C9Eeb7fD685c692751D5C66dB49c215", - "chainId": 1, - "name": "ChaiToken", - "symbol": "CHAI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x06af07097c9eeb7fd685c692751d5c66db49c215.png" - }, - { - "address": "0x6C8c6b02E7b2BE14d4fA6022Dfd6d75921D90E4E", - "chainId": 1, - "name": "CompoundBasicAttentionToken", - "symbol": "cBAT", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x6c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e.png" - }, - { - "address": "0xF5DCe57282A584D2746FaF1593d3121Fcac444dC", - "chainId": 1, - "name": "CompoundSai", - "symbol": "cSAI", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0xf5dce57282a584d2746faf1593d3121fcac444dc.png" - }, - { - "address": "0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5", - "chainId": 1, - "name": "CompoundETH", - "symbol": "cETH", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5.png" - }, - { - "address": "0x39AA39c021dfbaE8faC545936693aC917d5E7563", - "chainId": 1, - "name": "CompoundUSDCoin", - "symbol": "cUSDC", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x39aa39c021dfbae8fac545936693ac917d5e7563.png" - }, - { - "address": "0x158079Ee67Fce2f58472A96584A73C7Ab9AC95c1", - "chainId": 1, - "name": "CompoundAugur", - "symbol": "cREP", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x158079ee67fce2f58472a96584a73c7ab9ac95c1.png" - }, - { - "address": "0x493C57C4763932315A328269E1ADaD09653B9081", - "chainId": 1, - "name": "bZxDAIiToken", - "symbol": "fiDAI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x493c57c4763932315a328269e1adad09653b9081.png" - }, - { - "address": "0x77f973FCaF871459aa58cd81881Ce453759281bC", - "chainId": 1, - "name": "bZxETHiToken", - "symbol": "fiETH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x77f973fcaf871459aa58cd81881ce453759281bc.png" - }, - { - "address": "0x8A8079c7149B8A1611e5C5d978DCA3bE16545F83", - "chainId": 1, - "name": "SynthiADA", - "symbol": "iADA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x8a8079c7149b8a1611e5c5d978dca3be16545f83.png" - }, - { - "address": "0x2AF5D2aD76741191D15Dfe7bF6aC92d4Bd912Ca3", - "chainId": 1, - "name": "BitfinexLEOToken", - "symbol": "LEO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x2af5d2ad76741191d15dfe7bf6ac92d4bd912ca3.png" - }, - { - "address": "0x6f259637dcD74C767781E37Bc6133cd6A68aa161", - "chainId": 1, - "name": "HuobiToken", - "symbol": "HT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6f259637dcd74c767781e37bc6133cd6a68aa161.png" - }, - { - "address": "0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0", - "chainId": 1, - "name": "MaticToken", - "symbol": "MATIC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0.png" - }, - { - "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", - "chainId": 1, - "name": "DaiStablecoin", - "symbol": "DAI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6b175474e89094c44da98b954eedeac495271d0f.png" - }, - { - "address": "0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359", - "chainId": 1, - "name": "SaiStablecoin", - "symbol": "SAI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359.png" - }, - { - "address": "0x57Ab1ec28D129707052df4dF418D58a2D46d5f51", - "chainId": 1, - "name": "SynthsUSD", - "symbol": "sUSD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x57ab1ec28d129707052df4df418d58a2d46d5f51.png" - }, - { - "address": "0xD71eCFF9342A5Ced620049e616c5035F1dB98620", - "chainId": 1, - "name": "SynthsEUR", - "symbol": "sEUR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xd71ecff9342a5ced620049e616c5035f1db98620.png" - }, - { - "address": "0xD6014EA05BDe904448B743833dDF07c3C7837481", - "chainId": 1, - "name": "SynthiBTC", - "symbol": "iBTC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xd6014ea05bde904448b743833ddf07c3c7837481.png" - }, - { - "address": "0xfE18be6b3Bd88A2D2A7f928d00292E7a9963CfC6", - "chainId": 1, - "name": "SynthsBTC", - "symbol": "sBTC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xfe18be6b3bd88a2d2a7f928d00292e7a9963cfc6.png" - }, - { - "address": "0xF48e200EAF9906362BB1442fca31e0835773b8B4", - "chainId": 1, - "name": "SynthsAUD", - "symbol": "sAUD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf48e200eaf9906362bb1442fca31e0835773b8b4.png" - }, - { - "address": "0xeABACD844A196D7Faf3CE596edeBF9900341B420", - "chainId": 1, - "name": "SynthsCEX", - "symbol": "sCEX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xeabacd844a196d7faf3ce596edebf9900341b420.png" - }, - { - "address": "0x27269b3e45A4D3E79A3D6BFeE0C8fB13d0D711A6", - "chainId": 1, - "name": "SynthiXRP", - "symbol": "iXRP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x27269b3e45a4d3e79a3d6bfee0c8fb13d0d711a6.png" - }, - { - "address": "0x336213e1DDFC69f4701Fc3F86F4ef4A160c1159d", - "chainId": 1, - "name": "SynthiCEX", - "symbol": "iCEX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x336213e1ddfc69f4701fc3f86f4ef4a160c1159d.png" - }, - { - "address": "0xCB98f42221b2C251A4E74A1609722eE09f0cc08E", - "chainId": 1, - "name": "SynthiDASH", - "symbol": "iDASH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xcb98f42221b2c251a4e74a1609722ee09f0cc08e.png" - }, - { - "address": "0xd50c1746D835d2770dDA3703B69187bFfeB14126", - "chainId": 1, - "name": "SynthiETC", - "symbol": "iETC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xd50c1746d835d2770dda3703b69187bffeb14126.png" - }, - { - "address": "0x4AdF728E2Df4945082cDD6053869f51278fae196", - "chainId": 1, - "name": "SynthiXMR", - "symbol": "iXMR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4adf728e2df4945082cdd6053869f51278fae196.png" - }, - { - "address": "0xe36E2D3c7c34281FA3bC737950a68571736880A1", - "chainId": 1, - "name": "SynthsADA", - "symbol": "sADA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xe36e2d3c7c34281fa3bc737950a68571736880a1.png" - }, - { - "address": "0xfE33ae95A9f0DA8A845aF33516EDc240DCD711d6", - "chainId": 1, - "name": "SynthsDASH", - "symbol": "sDASH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xfe33ae95a9f0da8a845af33516edc240dcd711d6.png" - }, - { - "address": "0x88C8Cf3A212c0369698D13FE98Fcb76620389841", - "chainId": 1, - "name": "SynthsEOS", - "symbol": "sEOS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x88c8cf3a212c0369698d13fe98fcb76620389841.png" - }, - { - "address": "0x22602469d704BfFb0936c7A7cfcD18f7aA269375", - "chainId": 1, - "name": "SynthsETC", - "symbol": "sETC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x22602469d704bffb0936c7a7cfcd18f7aa269375.png" - }, - { - "address": "0x23348160D7f5aca21195dF2b70f28Fce2B0be9fC", - "chainId": 1, - "name": "SynthsFTSE", - "symbol": "sFTSE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x23348160d7f5aca21195df2b70f28fce2b0be9fc.png" - }, - { - "address": "0x757de3ac6B830a931eF178C6634c5C551773155c", - "chainId": 1, - "name": "SynthsNIKKEI", - "symbol": "sNIKKEI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x757de3ac6b830a931ef178c6634c5c551773155c.png" - }, - { - "address": "0x5299d6F7472DCc137D7f3C4BcfBBB514BaBF341A", - "chainId": 1, - "name": "SynthsXMR", - "symbol": "sXMR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5299d6f7472dcc137d7f3c4bcfbbb514babf341a.png" - }, - { - "address": "0xa2B0fDe6D710e201d0d608e924A484d1A5fEd57c", - "chainId": 1, - "name": "SynthsXRP", - "symbol": "sXRP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa2b0fde6d710e201d0d608e924a484d1a5fed57c.png" - }, - { - "address": "0x0F83287FF768D1c1e17a42F44d644D7F22e8ee1d", - "chainId": 1, - "name": "SynthsCHF", - "symbol": "sCHF", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0f83287ff768d1c1e17a42f44d644d7f22e8ee1d.png" - }, - { - "address": "0xF6b1C627e95BFc3c1b4c9B825a032Ff0fBf3e07d", - "chainId": 1, - "name": "SynthsJPY", - "symbol": "sJPY", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf6b1c627e95bfc3c1b4c9b825a032ff0fbf3e07d.png" - }, - { - "address": "0x6A22e5e94388464181578Aa7A6B869e00fE27846", - "chainId": 1, - "name": "SynthsXAG", - "symbol": "sXAG", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6a22e5e94388464181578aa7a6b869e00fe27846.png" - }, - { - "address": "0xf2E08356588EC5cd9E437552Da87C0076b4970B0", - "chainId": 1, - "name": "SynthsTRX", - "symbol": "sTRX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf2e08356588ec5cd9e437552da87c0076b4970b0.png" - }, - { - "address": "0xC14103C2141E842e228FBaC594579e798616ce7A", - "chainId": 1, - "name": "SynthsLTC", - "symbol": "sLTC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc14103c2141e842e228fbac594579e798616ce7a.png" - }, - { - "address": "0xA9859874e1743A32409f75bB11549892138BBA1E", - "chainId": 1, - "name": "SynthiETH", - "symbol": "iETH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa9859874e1743a32409f75bb11549892138bba1e.png" - }, - { - "address": "0xC5807183a9661A533CB08CbC297594a0B864dc12", - "chainId": 1, - "name": "SynthiTRX", - "symbol": "iTRX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc5807183a9661a533cb08cbc297594a0b864dc12.png" - }, - { - "address": "0x2d7aC061fc3db53c39fe1607fB8cec1B2C162B01", - "chainId": 1, - "name": "SynthiLINK", - "symbol": "iLINK", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x2d7ac061fc3db53c39fe1607fb8cec1b2c162b01.png" - }, - { - "address": "0xe1aFe1Fd76Fd88f78cBf599ea1846231B8bA3B6B", - "chainId": 1, - "name": "SynthsDEFI", - "symbol": "sDEFI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xe1afe1fd76fd88f78cbf599ea1846231b8ba3b6b.png" - }, - { - "address": "0x97fe22E7341a0Cd8Db6F6C021A24Dc8f4DAD855F", - "chainId": 1, - "name": "SynthsGBP", - "symbol": "sGBP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x97fe22e7341a0cd8db6f6c021a24dc8f4dad855f.png" - }, - { - "address": "0x261EfCdD24CeA98652B9700800a13DfBca4103fF", - "chainId": 1, - "name": "SynthsXAU", - "symbol": "sXAU", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x261efcdd24cea98652b9700800a13dfbca4103ff.png" - }, - { - "address": "0x617aeCB6137B5108D1E7D4918e3725C8cEbdB848", - "chainId": 1, - "name": "SynthsBNB", - "symbol": "sBNB", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x617aecb6137b5108d1e7d4918e3725c8cebdb848.png" - }, - { - "address": "0x2e59005c5c0f0a4D77CcA82653d48b46322EE5Cd", - "chainId": 1, - "name": "SynthsXTZ", - "symbol": "sXTZ", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x2e59005c5c0f0a4d77cca82653d48b46322ee5cd.png" - }, - { - "address": "0xbBC455cb4F1B9e4bFC4B73970d360c8f032EfEE6", - "chainId": 1, - "name": "SynthsLINK", - "symbol": "sLINK", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xbbc455cb4f1b9e4bfc4b73970d360c8f032efee6.png" - }, - { - "address": "0xAFD870F32CE54EfdBF677466B612bf8ad164454B", - "chainId": 1, - "name": "SynthiBNB", - "symbol": "iBNB", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xafd870f32ce54efdbf677466b612bf8ad164454b.png" - }, - { - "address": "0x8deef89058090ac5655A99EEB451a4f9183D1678", - "chainId": 1, - "name": "SynthiXTZ", - "symbol": "iXTZ", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x8deef89058090ac5655a99eeb451a4f9183d1678.png" - }, - { - "address": "0x79da1431150C9b82D2E5dfc1C68B33216846851e", - "chainId": 1, - "name": "SynthiLTC", - "symbol": "iLTC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x79da1431150c9b82d2e5dfc1c68b33216846851e.png" - }, - { - "address": "0xF4EebDD0704021eF2a6Bbe993fdf93030Cd784b4", - "chainId": 1, - "name": "SynthiEOS", - "symbol": "iEOS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf4eebdd0704021ef2a6bbe993fdf93030cd784b4.png" - }, - { - "address": "0x14d10003807AC60d07BB0ba82cAeaC8d2087c157", - "chainId": 1, - "name": "SynthiDEFI", - "symbol": "iDEFI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x14d10003807ac60d07bb0ba82caeac8d2087c157.png" - }, - { - "address": "0xeb269732ab75A6fD61Ea60b06fE994cD32a83549", - "chainId": 1, - "name": "dForce", - "symbol": "USDx", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xeb269732ab75a6fd61ea60b06fe994cd32a83549.png" - }, - { - "address": "0x0000000000085d4780B73119b644AE5ecd22b376", - "chainId": 1, - "name": "TrueUSD", - "symbol": "TUSD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0000000000085d4780b73119b644ae5ecd22b376.png" - }, - { - "address": "0x679131F591B4f369acB8cd8c51E68596806c3916", - "chainId": 1, - "name": "TrustlinesNetworkToken", - "symbol": "TLN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x679131f591b4f369acb8cd8c51e68596806c3916.png" - }, - { - "address": "0x3a3A65aAb0dd2A17E3F1947bA16138cd37d08c04", - "chainId": 1, - "name": "AaveInterestbearingETH", - "symbol": "aETHv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3a3a65aab0dd2a17e3f1947ba16138cd37d08c04.png" - }, - { - "address": "0xE1BA0FB44CCb0D11b80F92f4f8Ed94CA3fF51D00", - "chainId": 1, - "name": "AaveInterestbearingBAT", - "symbol": "aBATv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xe1ba0fb44ccb0d11b80f92f4f8ed94ca3ff51d00.png" - }, - { - "address": "0x9D91BE44C06d373a8a226E1f3b146956083803eB", - "chainId": 1, - "name": "AaveInterestbearingKNC", - "symbol": "aKNCv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x9d91be44c06d373a8a226e1f3b146956083803eb.png" - }, - { - "address": "0x7D2D3688Df45Ce7C552E19c27e007673da9204B8", - "chainId": 1, - "name": "AaveInterestbearingLEND", - "symbol": "aLENDv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x7d2d3688df45ce7c552e19c27e007673da9204b8.png" - }, - { - "address": "0x6FCE4A401B6B80ACe52baAefE4421Bd188e76F6f", - "chainId": 1, - "name": "AaveInterestbearingMANA", - "symbol": "aMANAv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6fce4a401b6b80ace52baaefe4421bd188e76f6f.png" - }, - { - "address": "0x7deB5e830be29F91E298ba5FF1356BB7f8146998", - "chainId": 1, - "name": "AaveInterestbearingMKR", - "symbol": "aMKRv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x7deb5e830be29f91e298ba5ff1356bb7f8146998.png" - }, - { - "address": "0x71010A9D003445aC60C4e6A7017c1E89A477B438", - "chainId": 1, - "name": "AaveInterestbearingREP", - "symbol": "aREPv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x71010a9d003445ac60c4e6a7017c1e89a477b438.png" - }, - { - "address": "0x328C4c80BC7aCa0834Db37e6600A6c49E12Da4DE", - "chainId": 1, - "name": "AaveInterestbearingSNX", - "symbol": "aSNXv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x328c4c80bc7aca0834db37e6600a6c49e12da4de.png" - }, - { - "address": "0xFC4B8ED459e00e5400be803A9BB3954234FD50e3", - "chainId": 1, - "name": "AaveInterestbearingWBTC", - "symbol": "aWBTCv1", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0xfc4b8ed459e00e5400be803a9bb3954234fd50e3.png" - }, - { - "address": "0x6Fb0855c404E09c47C3fBCA25f08d4E41f9F062f", - "chainId": 1, - "name": "AaveInterestbearingZRX", - "symbol": "aZRXv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6fb0855c404e09c47c3fbca25f08d4e41f9f062f.png" - }, - { - "address": "0x66fD97a78d8854fEc445cd1C80a07896B0b4851f", - "chainId": 1, - "name": "LunchMoney", - "symbol": "LMY", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x66fd97a78d8854fec445cd1c80a07896b0b4851f.png" - }, - { - "address": "0x16de59092dAE5CcF4A1E6439D611fd0653f0Bd01", - "chainId": 1, - "name": "iearnDAIv2", - "symbol": "yDAIv2", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x16de59092dae5ccf4a1e6439d611fd0653f0bd01.png" - }, - { - "address": "0xC2cB1040220768554cf699b0d863A3cd4324ce32", - "chainId": 1, - "name": "iearnDAIv3", - "symbol": "yDAIv3", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc2cb1040220768554cf699b0d863a3cd4324ce32.png" - }, - { - "address": "0x04bC0Ab673d88aE9dbC9DA2380cB6B79C4BCa9aE", - "chainId": 1, - "name": "iearnBUSD", - "symbol": "yBUSD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x04bc0ab673d88ae9dbc9da2380cb6b79c4bca9ae.png" - }, - { - "address": "0x04Aa51bbcB46541455cCF1B8bef2ebc5d3787EC9", - "chainId": 1, - "name": "iearnWBTC", - "symbol": "yBTC", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x04aa51bbcb46541455ccf1b8bef2ebc5d3787ec9.png" - }, - { - "address": "0x73a052500105205d34Daf004eAb301916DA8190f", - "chainId": 1, - "name": "iearnTUSD", - "symbol": "yTUSD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x73a052500105205d34daf004eab301916da8190f.png" - }, - { - "address": "0x83f798e925BcD4017Eb265844FDDAbb448f1707D", - "chainId": 1, - "name": "iearnUSDTv2", - "symbol": "yUSDTv2", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0x83f798e925bcd4017eb265844fddabb448f1707d.png" - }, - { - "address": "0xE6354ed5bC4b393a5Aad09f21c46E101e692d447", - "chainId": 1, - "name": "iearnUSDTv3", - "symbol": "yUSDTv3", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0xe6354ed5bc4b393a5aad09f21c46e101e692d447.png" - }, - { - "address": "0xd6aD7a6750A7593E092a9B218d66C0A814a3436e", - "chainId": 1, - "name": "iearnUSDCv2", - "symbol": "yUSDCv2", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0xd6ad7a6750a7593e092a9b218d66c0a814a3436e.png" - }, - { - "address": "0x26EA744E5B887E5205727f55dFBE8685e3b21951", - "chainId": 1, - "name": "iearnUSDCv3", - "symbol": "yUSDCv3", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0x26ea744e5b887e5205727f55dfbe8685e3b21951.png" - }, - { - "address": "0xF61718057901F84C4eEC4339EF8f0D86D2B45600", - "chainId": 1, - "name": "iearnSUSD", - "symbol": "ySUSD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf61718057901f84c4eec4339ef8f0d86d2b45600.png" - }, - { - "address": "0xAcfa209Fb73bF3Dd5bBfb1101B9Bc999C49062a5", - "chainId": 1, - "name": "BlockchainCertifiedDataToken", - "symbol": "BCDT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xacfa209fb73bf3dd5bbfb1101b9bc999c49062a5.png" - }, - { - "address": "0x4de2573e27E648607B50e1Cfff921A33E4A34405", - "chainId": 1, - "name": "LendroidSupportToken", - "symbol": "LST", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4de2573e27e648607b50e1cfff921a33e4a34405.png" - }, - { - "address": "0x630d98424eFe0Ea27fB1b3Ab7741907DFFEaAd78", - "chainId": 1, - "name": "PEAKDEFI", - "symbol": "PEAK", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x630d98424efe0ea27fb1b3ab7741907dffeaad78.png" - }, - { - "address": "0xD56daC73A4d6766464b38ec6D91eB45Ce7457c44", - "chainId": 1, - "name": "Panvalapan", - "symbol": "PAN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xd56dac73a4d6766464b38ec6d91eb45ce7457c44.png" - }, - { - "address": "0x056Fd409E1d7A124BD7017459dFEa2F387b6d5Cd", - "chainId": 1, - "name": "Geminidollar", - "symbol": "GUSD", - "decimals": 2, - "logoURI": "https://tokens.1inch.exchange/0x056fd409e1d7a124bd7017459dfea2f387b6d5cd.png" - }, - { - "address": "0x6Ee0f7BB50a54AB5253dA0667B0Dc2ee526C30a8", - "chainId": 1, - "name": "AaveInterestbearingBinanceUSD", - "symbol": "aBUSDv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6ee0f7bb50a54ab5253da0667b0dc2ee526c30a8.png" - }, - { - "address": "0xD7EFB00d12C2c13131FD319336Fdf952525dA2af", - "chainId": 1, - "name": "Proton", - "symbol": "XPR", - "decimals": 4, - "logoURI": "https://tokens.1inch.exchange/0xd7efb00d12c2c13131fd319336fdf952525da2af.png" - }, - { - "address": "0x85Eee30c52B0b379b046Fb0F85F4f3Dc3009aFEC", - "chainId": 1, - "name": "KEEPToken", - "symbol": "KEEP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x85eee30c52b0b379b046fb0f85f4f3dc3009afec.png" - }, - { - "address": "0x1C5db575E2Ff833E46a2E9864C22F4B22E0B37C2", - "chainId": 1, - "name": "renZEC", - "symbol": "renZEC", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x1c5db575e2ff833e46a2e9864c22f4b22e0b37c2.png" - }, - { - "address": "0x459086F2376525BdCebA5bDDA135e4E9d3FeF5bf", - "chainId": 1, - "name": "renBCH", - "symbol": "renBCH", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x459086f2376525bdceba5bdda135e4e9d3fef5bf.png" - }, - { - "address": "0x8dAEBADE922dF735c38C80C7eBD708Af50815fAa", - "chainId": 1, - "name": "tBTC", - "symbol": "tBTC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x8daebade922df735c38c80c7ebd708af50815faa.png" - }, - { - "address": "0x0316EB71485b0Ab14103307bf65a021042c6d380", - "chainId": 1, - "name": "HuobiBTC", - "symbol": "HBTC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0316eb71485b0ab14103307bf65a021042c6d380.png" - }, - { - "address": "0x3A9FfF453d50D4Ac52A6890647b823379ba36B9E", - "chainId": 1, - "name": "Shuffle.MonsterV3", - "symbol": "SHUF", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3a9fff453d50d4ac52a6890647b823379ba36b9e.png" - }, - { - "address": "0xC0F9bD5Fa5698B6505F643900FFA515Ea5dF54A9", - "chainId": 1, - "name": "DONUT", - "symbol": "DONUT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc0f9bd5fa5698b6505f643900ffa515ea5df54a9.png" - }, - { - "address": "0x0000000000004946c0e9F43F4Dee607b0eF1fA1c", - "chainId": 1, - "name": "ChiGastokenby1inch", - "symbol": "CHI", - "decimals": 0, - "logoURI": "https://tokens.1inch.exchange/0x0000000000004946c0e9f43f4dee607b0ef1fa1c.png" - }, - { - "address": "0xD6a55C63865AffD67E2FB9f284F87b7a9E5FF3bD", - "chainId": 1, - "name": "Switch", - "symbol": "ESH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xd6a55c63865affd67e2fb9f284f87b7a9e5ff3bd.png" - }, - { - "address": "0x1Fc31488f28ac846588FFA201cDe0669168471bD", - "chainId": 1, - "name": "UAX", - "symbol": "UAX", - "decimals": 2, - "logoURI": "https://tokens.1inch.exchange/0x1fc31488f28ac846588ffa201cde0669168471bd.png" - }, - { - "address": "0x45804880De22913dAFE09f4980848ECE6EcbAf78", - "chainId": 1, - "name": "PaxosGold", - "symbol": "PAXG", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x45804880de22913dafe09f4980848ece6ecbaf78.png" - }, - { - "address": "0x06301057D77D54B6e14c7FafFB11Ffc7Cab4eaa7", - "chainId": 1, - "name": "DMMDAI", - "symbol": "mDAI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x06301057d77d54b6e14c7faffb11ffc7cab4eaa7.png" - }, - { - "address": "0xdF9307DFf0a1B57660F60f9457D32027a55ca0B2", - "chainId": 1, - "name": "DMMETH", - "symbol": "mETH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xdf9307dff0a1b57660f60f9457d32027a55ca0b2.png" - }, - { - "address": "0x3564ad35b9E95340E5Ace2D6251dbfC76098669B", - "chainId": 1, - "name": "DMMUSDC", - "symbol": "mUSDC", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0x3564ad35b9e95340e5ace2d6251dbfc76098669b.png" - }, - { - "address": "0x035dF12E0F3ac6671126525f1015E47D79dFEDDF", - "chainId": 1, - "name": "0xMonero", - "symbol": "0xMR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x035df12e0f3ac6671126525f1015e47d79dfeddf.png" - }, - { - "address": "0x9A48BD0EC040ea4f1D3147C025cd4076A2e71e3e", - "chainId": 1, - "name": "PieDAOUSD++Pool", - "symbol": "USD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x9a48bd0ec040ea4f1d3147c025cd4076a2e71e3e.png" - }, - { - "address": "0xB64ef51C888972c908CFacf59B47C1AfBC0Ab8aC", - "chainId": 1, - "name": "Storj", - "symbol": "STORJ", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0xb64ef51c888972c908cfacf59b47c1afbc0ab8ac.png" - }, - { - "address": "0x1c79ab32C66aCAa1e9E81952B8AAa581B43e54E7", - "chainId": 1, - "name": "TEAM", - "symbol": "TEAM", - "decimals": 4, - "logoURI": "https://tokens.1inch.exchange/0x1c79ab32c66acaa1e9e81952b8aaa581b43e54e7.png" - }, - { - "address": "0x4156D3342D5c385a87D264F90653733592000581", - "chainId": 1, - "name": "Salt", - "symbol": "SALT", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x4156d3342d5c385a87d264f90653733592000581.png" - }, - { - "address": "0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8", - "chainId": 1, - "name": "Curve.fiiearnpooltoken", - "symbol": "yCurve", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xdf5e0e81dff6faf3a7e52ba697820c5e32d806a8.png" - }, - { - "address": "0xFca59Cd816aB1eaD66534D82bc21E7515cE441CF", - "chainId": 1, - "name": "Rarible", - "symbol": "RARI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xfca59cd816ab1ead66534d82bc21e7515ce441cf.png" - }, - { - "address": "0xea5f88E54d982Cbb0c441cde4E79bC305e5b43Bc", - "chainId": 1, - "name": "ParetoNetworkToken", - "symbol": "PARETO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xea5f88e54d982cbb0c441cde4e79bc305e5b43bc.png" - }, - { - "address": "0x9fBFed658919A896B5Dc7b00456Ce22D780f9B65", - "chainId": 1, - "name": "PlutusDeFi", - "symbol": "PLT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x9fbfed658919a896b5dc7b00456ce22d780f9b65.png" - }, - { - "address": "0x5228a22e72ccC52d415EcFd199F99D0665E7733b", - "chainId": 1, - "name": "pTokensBTC", - "symbol": "pBTC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5228a22e72ccc52d415ecfd199f99d0665e7733b.png" - }, - { - "address": "0x476c5E26a75bd202a9683ffD34359C0CC15be0fF", - "chainId": 1, - "name": "Serum", - "symbol": "SRM", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0x476c5e26a75bd202a9683ffd34359c0cc15be0ff.png" - }, - { - "address": "0xc813EA5e3b48BEbeedb796ab42A30C5599b01740", - "chainId": 1, - "name": "Autonio", - "symbol": "NIOX", - "decimals": 4, - "logoURI": "https://tokens.1inch.exchange/0xc813ea5e3b48bebeedb796ab42a30c5599b01740.png" - }, - { - "address": "0xa7DE087329BFcda5639247F96140f9DAbe3DeED1", - "chainId": 1, - "name": "Statera", - "symbol": "STA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa7de087329bfcda5639247f96140f9dabe3deed1.png" - }, - { - "address": "0xDc5864eDe28BD4405aa04d93E05A0531797D9D59", - "chainId": 1, - "name": "Falcon", - "symbol": "FNT", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0xdc5864ede28bd4405aa04d93e05a0531797d9d59.png" - }, - { - "address": "0x0AaCfbeC6a24756c20D41914F2caba817C0d8521", - "chainId": 1, - "name": "YAM", - "symbol": "YAM", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0aacfbec6a24756c20d41914f2caba817c0d8521.png" - }, - { - "address": "0xADE00C28244d5CE17D72E40330B1c318cD12B7c3", - "chainId": 1, - "name": "AdExNetwork", - "symbol": "ADX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xade00c28244d5ce17d72e40330b1c318cd12b7c3.png" - }, - { - "address": "0xD533a949740bb3306d119CC777fa900bA034cd52", - "chainId": 1, - "name": "CurveDAOToken", - "symbol": "CRV", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xd533a949740bb3306d119cc777fa900ba034cd52.png" - }, - { - "address": "0x9469D013805bFfB7D3DEBe5E7839237e535ec483", - "chainId": 1, - "name": "DarwiniaNetworkNativeToken", - "symbol": "RING", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x9469d013805bffb7d3debe5e7839237e535ec483.png" - }, - { - "address": "0x2baEcDf43734F22FD5c152DB08E3C27233F0c7d2", - "chainId": 1, - "name": "OMToken", - "symbol": "OMv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x2baecdf43734f22fd5c152db08e3c27233f0c7d2.png" - }, - { - "address": "0x491604c0FDF08347Dd1fa4Ee062a822A5DD06B5D", - "chainId": 1, - "name": "CartesiToken", - "symbol": "CTSI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x491604c0fdf08347dd1fa4ee062a822a5dd06b5d.png" - }, - { - "address": "0x0fF6ffcFDa92c53F615a4A75D982f399C989366b", - "chainId": 1, - "name": "Unilayer", - "symbol": "LAYER", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0ff6ffcfda92c53f615a4a75d982f399c989366b.png" - }, - { - "address": "0xD5525D397898e5502075Ea5E830d8914f6F0affe", - "chainId": 1, - "name": "MEME", - "symbol": "MEME", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0xd5525d397898e5502075ea5e830d8914f6f0affe.png" - }, - { - "address": "0x68A118Ef45063051Eac49c7e647CE5Ace48a68a5", - "chainId": 1, - "name": "BASED", - "symbol": "BASED", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x68a118ef45063051eac49c7e647ce5ace48a68a5.png" - }, - { - "address": "0xaA7a9CA87d3694B5755f213B5D04094b8d0F0A6F", - "chainId": 1, - "name": "Trace", - "symbol": "TRAC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xaa7a9ca87d3694b5755f213b5d04094b8d0f0a6f.png" - }, - { - "address": "0x4Dfd148B532e934a2a26eA65689cf6268753e130", - "chainId": 1, - "name": "GovernancetokenMonolithosDAO", - "symbol": "MDT2", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4dfd148b532e934a2a26ea65689cf6268753e130.png" - }, - { - "address": "0xAba8cAc6866B83Ae4eec97DD07ED254282f6aD8A", - "chainId": 1, - "name": "YAMv2", - "symbol": "YAMv2", - "decimals": 24, - "logoURI": "https://tokens.1inch.exchange/0xaba8cac6866b83ae4eec97dd07ed254282f6ad8a.png" - }, - { - "address": "0x8A9C67fee641579dEbA04928c4BC45F66e26343A", - "chainId": 1, - "name": "JarvisRewardToken", - "symbol": "JRT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x8a9c67fee641579deba04928c4bc45f66e26343a.png" - }, - { - "address": "0x45f24BaEef268BB6d63AEe5129015d69702BCDfa", - "chainId": 1, - "name": "YFValue", - "symbol": "YFV", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x45f24baeef268bb6d63aee5129015d69702bcdfa.png" - }, - { - "address": "0x674C6Ad92Fd080e4004b2312b45f796a192D27a0", - "chainId": 1, - "name": "Neutrino", - "symbol": "USDN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x674c6ad92fd080e4004b2312b45f796a192d27a0.png" - }, - { - "address": "0x362bc847A3a9637d3af6624EeC853618a43ed7D2", - "chainId": 1, - "name": "ParsiqToken", - "symbol": "PRQ", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x362bc847a3a9637d3af6624eec853618a43ed7d2.png" - }, - { - "address": "0x0E29e5AbbB5FD88e28b2d355774e73BD47dE3bcd", - "chainId": 1, - "name": "HakkaFinance", - "symbol": "HAKKA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0e29e5abbb5fd88e28b2d355774e73bd47de3bcd.png" - }, - { - "address": "0x08AD83D779BDf2BBE1ad9cc0f78aa0D24AB97802", - "chainId": 1, - "name": "RobonomicsWebServicesV1", - "symbol": "RWS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x08ad83d779bdf2bbe1ad9cc0f78aa0d24ab97802.png" - }, - { - "address": "0x09e64c2B61a5f1690Ee6fbeD9baf5D6990F8dFd0", - "chainId": 1, - "name": "Growth", - "symbol": "GRO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x09e64c2b61a5f1690ee6fbed9baf5d6990f8dfd0.png" - }, - { - "address": "0x38e4adB44ef08F22F5B5b76A8f0c2d0dCbE7DcA1", - "chainId": 1, - "name": "ConcentratedVotingPower", - "symbol": "CVP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x38e4adb44ef08f22f5b5b76a8f0c2d0dcbe7dca1.png" - }, - { - "address": "0x4FE5851C9af07df9e5AD8217aFAE1ea72737Ebda", - "chainId": 1, - "name": "OpenPredictToken", - "symbol": "OPT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4fe5851c9af07df9e5ad8217afae1ea72737ebda.png" - }, - { - "address": "0x6B3595068778DD592e39A122f4f5a5cF09C90fE2", - "chainId": 1, - "name": "SushiToken", - "symbol": "SUSHI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6b3595068778dd592e39a122f4f5a5cf09c90fe2.png" - }, - { - "address": "0x3aFfCCa64c2A6f4e3B6Bd9c64CD2C969EFd1ECBe", - "chainId": 1, - "name": "DSLA", - "symbol": "DSLA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3affcca64c2a6f4e3b6bd9c64cd2c969efd1ecbe.png" - }, - { - "address": "0xBa21Ef4c9f433Ede00badEFcC2754B8E74bd538A", - "chainId": 1, - "name": "Swapfolio", - "symbol": "SWFL", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xba21ef4c9f433ede00badefcc2754b8e74bd538a.png" - }, - { - "address": "0xfffffffFf15AbF397dA76f1dcc1A1604F45126DB", - "chainId": 1, - "name": "FalconSwapToken", - "symbol": "FSW", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xfffffffff15abf397da76f1dcc1a1604f45126db.png" - }, - { - "address": "0x94d863173EE77439E4292284fF13fAD54b3BA182", - "chainId": 1, - "name": "AkropolisDelphi", - "symbol": "ADEL", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x94d863173ee77439e4292284ff13fad54b3ba182.png" - }, - { - "address": "0xB8BAa0e4287890a5F79863aB62b7F175ceCbD433", - "chainId": 1, - "name": "SwerveDAOToken", - "symbol": "SWRV", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb8baa0e4287890a5f79863ab62b7f175cecbd433.png" - }, - { - "address": "0xf8aD7dFe656188A23e89da09506Adf7ad9290D5d", - "chainId": 1, - "name": "BloceryToken", - "symbol": "BLY", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf8ad7dfe656188a23e89da09506adf7ad9290d5d.png" - }, - { - "address": "0x8a6f3BF52A26a21531514E23016eEAe8Ba7e7018", - "chainId": 1, - "name": "Multiplier", - "symbol": "MXX", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x8a6f3bf52a26a21531514e23016eeae8ba7e7018.png" - }, - { - "address": "0x103c3A209da59d3E7C4A89307e66521e081CFDF0", - "chainId": 1, - "name": "GenesisVision", - "symbol": "GVT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x103c3a209da59d3e7c4a89307e66521e081cfdf0.png" - }, - { - "address": "0x892B14321a4FCba80669aE30Bd0cd99a7ECF6aC0", - "chainId": 1, - "name": "CreamCream", - "symbol": "crCream", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x892b14321a4fcba80669ae30bd0cd99a7ecf6ac0.png" - }, - { - "address": "0xe1237aA7f535b0CC33Fd973D66cBf830354D16c7", - "chainId": 1, - "name": "yearnWrappedEther", - "symbol": "yWETH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xe1237aa7f535b0cc33fd973d66cbf830354d16c7.png" - }, - { - "address": "0x5dbcF33D8c2E976c6b560249878e6F1491Bca25c", - "chainId": 1, - "name": "yearnCurve.fiyDAIyUSDCyUSDTyTUSD", - "symbol": "yyCurve", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5dbcf33d8c2e976c6b560249878e6f1491bca25c.png" - }, - { - "address": "0x50026ad58b338Cf3eccC2b422dEB8Faa725F377F", - "chainId": 1, - "name": "1Step.finance", - "symbol": "STEP", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x50026ad58b338cf3eccc2b422deb8faa725f377f.png" - }, - { - "address": "0x1Aa61c196E76805fcBe394eA00e4fFCEd24FC469", - "chainId": 1, - "name": "yieldfarming.insure", - "symbol": "SAFE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1aa61c196e76805fcbe394ea00e4ffced24fc469.png" - }, - { - "address": "0x556148562d5DdeB72545D7EC4B3eC8edc8F55Ba7", - "chainId": 1, - "name": "PredixNetwork", - "symbol": "PRDX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x556148562d5ddeb72545d7ec4b3ec8edc8f55ba7.png" - }, - { - "address": "0x1494CA1F11D487c2bBe4543E90080AeBa4BA3C2b", - "chainId": 1, - "name": "DefiPulseIndex", - "symbol": "DPI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1494ca1f11d487c2bbe4543e90080aeba4ba3c2b.png" - }, - { - "address": "0x3F382DbD960E3a9bbCeaE22651E88158d2791550", - "chainId": 1, - "name": "AavegotchiGHSTToken", - "symbol": "GHST", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3f382dbd960e3a9bbceae22651e88158d2791550.png" - }, - { - "address": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", - "chainId": 1, - "name": "Uniswap", - "symbol": "UNI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984.png" - }, - { - "address": "0x2e93FE8d550a7B7E7b2e561cd45ceBccbAa79358", - "chainId": 1, - "name": "GXChainCoreAsset", - "symbol": "GXC", - "decimals": 5, - "logoURI": "https://tokens.1inch.exchange/0x2e93fe8d550a7b7e7b2e561cd45cebccbaa79358.png" - }, - { - "address": "0x429881672B9AE42b8EbA0E26cD9C73711b891Ca5", - "chainId": 1, - "name": "PickleToken", - "symbol": "PICKLE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x429881672b9ae42b8eba0e26cd9c73711b891ca5.png" - }, - { - "address": "0xf8C3527CC04340b208C854E985240c02F7B7793f", - "chainId": 1, - "name": "FrontierToken", - "symbol": "FRONT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf8c3527cc04340b208c854e985240c02f7b7793f.png" - }, - { - "address": "0xca1207647Ff814039530D7d35df0e1Dd2e91Fa84", - "chainId": 1, - "name": "dHedgeDAOToken", - "symbol": "DHT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xca1207647ff814039530d7d35df0e1dd2e91fa84.png" - }, - { - "address": "0xa0246c9032bC3A600820415aE600c6388619A14D", - "chainId": 1, - "name": "FARMRewardToken", - "symbol": "FARM", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa0246c9032bc3a600820415ae600c6388619a14d.png" - }, - { - "address": "0x488E0369f9BC5C40C002eA7c1fe4fd01A198801c", - "chainId": 1, - "name": "Golff.finance", - "symbol": "GOF", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x488e0369f9bc5c40c002ea7c1fe4fd01a198801c.png" - }, - { - "address": "0xECbF566944250ddE88322581024E611419715f7A", - "chainId": 1, - "name": "xBTC", - "symbol": "xBTC", - "decimals": 9, - "logoURI": "https://tokens.1inch.exchange/0xecbf566944250dde88322581024e611419715f7a.png" - }, - { - "address": "0x2A8e1E676Ec238d8A992307B495b45B3fEAa5e86", - "chainId": 1, - "name": "OriginDollar", - "symbol": "OUSD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x2a8e1e676ec238d8a992307b495b45b3feaa5e86.png" - }, - { - "address": "0x1D09144F3479bb805CB7c92346987420BcbDC10C", - "chainId": 1, - "name": "CreamYUSD", - "symbol": "cyUSD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1d09144f3479bb805cb7c92346987420bcbdc10c.png" - }, - { - "address": "0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", - "chainId": 1, - "name": "AaveToken", - "symbol": "AAVE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9.png" - }, - { - "address": "0x43Dfc4159D86F3A37A5A4B3D4580b888ad7d4DDd", - "chainId": 1, - "name": "DODObird", - "symbol": "DODO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x43dfc4159d86f3a37a5a4b3d4580b888ad7d4ddd.png" - }, - { - "address": "0x250a3500f48666561386832f1F1f1019b89a2699", - "chainId": 1, - "name": "SAFE2", - "symbol": "SAFE2", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x250a3500f48666561386832f1f1f1019b89a2699.png" - }, - { - "address": "0x6006FC2a849fEdABa8330ce36F5133DE01F96189", - "chainId": 1, - "name": "SHAKEtokenbySpaceSwapv2", - "symbol": "SHAKE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6006fc2a849fedaba8330ce36f5133de01f96189.png" - }, - { - "address": "0x80c8C3dCfB854f9542567c8Dac3f44D709eBc1de", - "chainId": 1, - "name": "MilkyWayTokenbySpaceSwapv2", - "symbol": "MILK2", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x80c8c3dcfb854f9542567c8dac3f44d709ebc1de.png" - }, - { - "address": "0x62359Ed7505Efc61FF1D56fEF82158CcaffA23D7", - "chainId": 1, - "name": "cVault.finance", - "symbol": "CORE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x62359ed7505efc61ff1d56fef82158ccaffa23d7.png" - }, - { - "address": "0xbC396689893D065F41bc2C6EcbeE5e0085233447", - "chainId": 1, - "name": "Perpetual", - "symbol": "PERP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xbc396689893d065f41bc2c6ecbee5e0085233447.png" - }, - { - "address": "0x49E833337ECe7aFE375e44F4E3e8481029218E5c", - "chainId": 1, - "name": "ValueLiquidity", - "symbol": "VALUE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x49e833337ece7afe375e44f4e3e8481029218e5c.png" - }, - { - "address": "0x4b7aD3a56810032782Afce12d7d27122bDb96efF", - "chainId": 1, - "name": "Sparkle", - "symbol": "SPRKL", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x4b7ad3a56810032782afce12d7d27122bdb96eff.png" - }, - { - "address": "0x1c48f86ae57291F7686349F12601910BD8D470bb", - "chainId": 1, - "name": "USDK", - "symbol": "USDK", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1c48f86ae57291f7686349f12601910bd8d470bb.png" - }, - { - "address": "0x87eDfFDe3E14c7a66c9b9724747a1C5696b742e6", - "chainId": 1, - "name": "SwagToken", - "symbol": "SWAG", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x87edffde3e14c7a66c9b9724747a1c5696b742e6.png" - }, - { - "address": "0xaD6A626aE2B43DCb1B39430Ce496d2FA0365BA9C", - "chainId": 1, - "name": "PieDAODEFISmallCap", - "symbol": "DEFIS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xad6a626ae2b43dcb1b39430ce496d2fa0365ba9c.png" - }, - { - "address": "0xad32A8e6220741182940c5aBF610bDE99E737b2D", - "chainId": 1, - "name": "PieDAODOUGHv2", - "symbol": "DOUGH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xad32a8e6220741182940c5abf610bde99e737b2d.png" - }, - { - "address": "0x3F09400313e83d53366147e3ea0e4e2279D80850", - "chainId": 1, - "name": "KUSH.FINANCE", - "symbol": "kSEED", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3f09400313e83d53366147e3ea0e4e2279d80850.png" - }, - { - "address": "0x70e36f6BF80a52b3B46b3aF8e106CC0ed743E8e4", - "chainId": 1, - "name": "CompoundCollateral", - "symbol": "cCOMP", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x70e36f6bf80a52b3b46b3af8e106cc0ed743e8e4.png" - }, - { - "address": "0x35A18000230DA775CAc24873d00Ff85BccdeD550", - "chainId": 1, - "name": "CompoundUniswap", - "symbol": "cUNI", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x35a18000230da775cac24873d00ff85bccded550.png" - }, - { - "address": "0x70da48f4B7e83c386ef983D4CEF4e58c2c09D8Ac", - "chainId": 1, - "name": "QurasToken", - "symbol": "XQC", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x70da48f4b7e83c386ef983d4cef4e58c2c09d8ac.png" - }, - { - "address": "0xe2f2a5C287993345a840Db3B0845fbC70f5935a5", - "chainId": 1, - "name": "mStableUSD", - "symbol": "mUSD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xe2f2a5c287993345a840db3b0845fbc70f5935a5.png" - }, - { - "address": "0x2eDf094dB69d6Dcd487f1B3dB9febE2eeC0dd4c5", - "chainId": 1, - "name": "ZeroSwapToken", - "symbol": "ZEE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x2edf094db69d6dcd487f1b3db9febe2eec0dd4c5.png" - }, - { - "address": "0x584bC13c7D411c00c01A62e8019472dE68768430", - "chainId": 1, - "name": "Hegic", - "symbol": "HEGIC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x584bc13c7d411c00c01a62e8019472de68768430.png" - }, - { - "address": "0x054f76beED60AB6dBEb23502178C52d6C5dEbE40", - "chainId": 1, - "name": "DeFiner", - "symbol": "FIN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x054f76beed60ab6dbeb23502178c52d6c5debe40.png" - }, - { - "address": "0xcbd55D4fFc43467142761A764763652b48b969ff", - "chainId": 1, - "name": "AstroTools.io", - "symbol": "ASTRO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xcbd55d4ffc43467142761a764763652b48b969ff.png" - }, - { - "address": "0xfF20817765cB7f73d4bde2e66e067E58D11095C2", - "chainId": 1, - "name": "Amp", - "symbol": "AMP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xff20817765cb7f73d4bde2e66e067e58d11095c2.png" - }, - { - "address": "0x0391D2021f89DC339F60Fff84546EA23E337750f", - "chainId": 1, - "name": "BarnBridgeGovernanceToken", - "symbol": "BOND", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0391d2021f89dc339f60fff84546ea23e337750f.png" - }, - { - "address": "0xa117000000f279D81A1D3cc75430fAA017FA5A2e", - "chainId": 1, - "name": "AragonNetworkToken", - "symbol": "ANT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa117000000f279d81a1d3cc75430faa017fa5a2e.png" - }, - { - "address": "0x970B9bB2C0444F5E81e9d0eFb84C8ccdcdcAf84d", - "chainId": 1, - "name": "FuseToken", - "symbol": "FUSE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x970b9bb2c0444f5e81e9d0efb84c8ccdcdcaf84d.png" - }, - { - "address": "0x36F3FD68E7325a35EB768F1AedaAe9EA0689d723", - "chainId": 1, - "name": "EmptySetDollar", - "symbol": "ESD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x36f3fd68e7325a35eb768f1aedaae9ea0689d723.png" - }, - { - "address": "0xa9AF25a2d43Eb04723a6Ec0749913519cf347842", - "chainId": 1, - "name": "TealCoin", - "symbol": "TEAC", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0xa9af25a2d43eb04723a6ec0749913519cf347842.png" - }, - { - "address": "0x1cEB5cB57C4D4E2b2433641b95Dd330A33185A44", - "chainId": 1, - "name": "Keep3rV1", - "symbol": "KP3R", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1ceb5cb57c4d4e2b2433641b95dd330a33185a44.png" - }, - { - "address": "0x5BC25f649fc4e26069dDF4cF4010F9f706c23831", - "chainId": 1, - "name": "DefiDollar", - "symbol": "DUSD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5bc25f649fc4e26069ddf4cf4010f9f706c23831.png" - }, - { - "address": "0xB705268213D593B8FD88d3FDEFF93AFF5CbDcfAE", - "chainId": 1, - "name": "IDEXToken", - "symbol": "IDEX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb705268213d593b8fd88d3fdeff93aff5cbdcfae.png" - }, - { - "address": "0x2e2364966267B5D7D2cE6CD9A9B5bD19d9C7C6A9", - "chainId": 1, - "name": "NIXBridgeToken", - "symbol": "NBT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x2e2364966267b5d7d2ce6cd9a9b5bd19d9c7c6a9.png" - }, - { - "address": "0xEEF9f339514298C6A857EfCfC1A762aF84438dEE", - "chainId": 1, - "name": "HermezNetworkToken", - "symbol": "HEZ", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xeef9f339514298c6a857efcfc1a762af84438dee.png" - }, - { - "address": "0xEa319e87Cf06203DAe107Dd8E5672175e3Ee976c", - "chainId": 1, - "name": "SURF.Finance", - "symbol": "SURF", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xea319e87cf06203dae107dd8e5672175e3ee976c.png" - }, - { - "address": "0x3383c5a8969Dc413bfdDc9656Eb80A1408E4bA20", - "chainId": 1, - "name": "WrappedANATHA", - "symbol": "wANATHA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3383c5a8969dc413bfddc9656eb80a1408e4ba20.png" - }, - { - "address": "0x18aAA7115705e8be94bfFEBDE57Af9BFc265B998", - "chainId": 1, - "name": "Audius", - "symbol": "AUDIO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x18aaa7115705e8be94bffebde57af9bfc265b998.png" - }, - { - "address": "0xa665FED1b0C9dA00e91ca582f77dF36E325048c5", - "chainId": 1, - "name": "yfarm.finance", - "symbol": "YFM", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa665fed1b0c9da00e91ca582f77df36e325048c5.png" - }, - { - "address": "0xdacD69347dE42baBfAEcD09dC88958378780FB62", - "chainId": 1, - "name": "AtariToken", - "symbol": "ATRI", - "decimals": 0, - "logoURI": "https://tokens.1inch.exchange/0xdacd69347de42babfaecd09dc88958378780fb62.png" - }, - { - "address": "0x0954906da0Bf32d5479e25f46056d22f08464cab", - "chainId": 1, - "name": "Index", - "symbol": "INDEX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0954906da0bf32d5479e25f46056d22f08464cab.png" - }, - { - "address": "0xC57d533c50bC22247d49a368880fb49a1caA39F7", - "chainId": 1, - "name": "PowerTradeFuelToken", - "symbol": "PTF", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc57d533c50bc22247d49a368880fb49a1caa39f7.png" - }, - { - "address": "0x20c36f062a31865bED8a5B1e512D9a1A20AA333A", - "chainId": 1, - "name": "DefiDollarDAO", - "symbol": "DFD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x20c36f062a31865bed8a5b1e512d9a1a20aa333a.png" - }, - { - "address": "0x95a4492F028aa1fd432Ea71146b433E7B4446611", - "chainId": 1, - "name": "APYGovernanceToken", - "symbol": "APY", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x95a4492f028aa1fd432ea71146b433e7b4446611.png" - }, - { - "address": "0xbEa98c05eEAe2f3bC8c3565Db7551Eb738c8CCAb", - "chainId": 1, - "name": "Geyser", - "symbol": "GYSR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xbea98c05eeae2f3bc8c3565db7551eb738c8ccab.png" - }, - { - "address": "0xA89ac6e529aCf391CfbBD377F3aC9D93eae9664e", - "chainId": 1, - "name": "Keep4r", - "symbol": "KP4R", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa89ac6e529acf391cfbbd377f3ac9d93eae9664e.png" - }, - { - "address": "0xF5D669627376EBd411E34b98F19C868c8ABA5ADA", - "chainId": 1, - "name": "AxieInfinityShard", - "symbol": "AXS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf5d669627376ebd411e34b98f19c868c8aba5ada.png" - }, - { - "address": "0x297E4e5e59Ad72B1B0A2fd446929e76117be0E0a", - "chainId": 1, - "name": "ValorToken", - "symbol": "VALOR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x297e4e5e59ad72b1b0a2fd446929e76117be0e0a.png" - }, - { - "address": "0x00a8b738E453fFd858a7edf03bcCfe20412f0Eb0", - "chainId": 1, - "name": "AllianceBlockToken", - "symbol": "ALBT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x00a8b738e453ffd858a7edf03bccfe20412f0eb0.png" - }, - { - "address": "0x5bEaBAEBB3146685Dd74176f68a0721F91297D37", - "chainId": 1, - "name": "BounceToken", - "symbol": "BOT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5beabaebb3146685dd74176f68a0721f91297d37.png" - }, - { - "address": "0x05D3606d5c81EB9b7B18530995eC9B29da05FaBa", - "chainId": 1, - "name": "TomoChain", - "symbol": "TOMOE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x05d3606d5c81eb9b7b18530995ec9b29da05faba.png" - }, - { - "address": "0xB1f66997A5760428D3a87D68b90BfE0aE64121cC", - "chainId": 1, - "name": "LuaToken", - "symbol": "LUA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb1f66997a5760428d3a87d68b90bfe0ae64121cc.png" - }, - { - "address": "0x39eAE99E685906fF1C11A962a743440d0a1A6e09", - "chainId": 1, - "name": "Holyheld", - "symbol": "HOLY", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x39eae99e685906ff1c11a962a743440d0a1a6e09.png" - }, - { - "address": "0x9d942bD31169eD25a1ca78c776DAB92dE104e50E", - "chainId": 1, - "name": "DeFISocks2020", - "symbol": "DEFISOCKS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x9d942bd31169ed25a1ca78c776dab92de104e50e.png" - }, - { - "address": "0xf4CD3d3Fda8d7Fd6C5a500203e38640A70Bf9577", - "chainId": 1, - "name": "YfDAI.finance", - "symbol": "YfDAI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xf4cd3d3fda8d7fd6c5a500203e38640a70bf9577.png" - }, - { - "address": "0x83e6f1E41cdd28eAcEB20Cb649155049Fac3D5Aa", - "chainId": 1, - "name": "PolkastarterToken", - "symbol": "POLS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x83e6f1e41cdd28eaceb20cb649155049fac3d5aa.png" - }, - { - "address": "0xaf9f549774ecEDbD0966C52f250aCc548D3F36E5", - "chainId": 1, - "name": "RioFuelToken", - "symbol": "RFuel", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xaf9f549774ecedbd0966c52f250acc548d3f36e5.png" - }, - { - "address": "0x0202Be363B8a4820f3F4DE7FaF5224fF05943AB1", - "chainId": 1, - "name": "UniLendFinanceToken", - "symbol": "UFT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0202be363b8a4820f3f4de7faf5224ff05943ab1.png" - }, - { - "address": "0xaE697F994Fc5eBC000F8e22EbFfeE04612f98A0d", - "chainId": 1, - "name": "LGCYNetwork", - "symbol": "LGCY", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xae697f994fc5ebc000f8e22ebffee04612f98a0d.png" - }, - { - "address": "0x9D47894f8BECB68B9cF3428d256311Affe8B068B", - "chainId": 1, - "name": "ROPE", - "symbol": "ROPE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x9d47894f8becb68b9cf3428d256311affe8b068b.png" - }, - { - "address": "0x72F020f8f3E8fd9382705723Cd26380f8D0c66Bb", - "chainId": 1, - "name": "PLOT", - "symbol": "PLOT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x72f020f8f3e8fd9382705723cd26380f8d0c66bb.png" - }, - { - "address": "0x6A7Ef4998eB9d0f706238756949F311a59E05745", - "chainId": 1, - "name": "KenysiansNetwork", - "symbol": "KEN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6a7ef4998eb9d0f706238756949f311a59e05745.png" - }, - { - "address": "0x20945cA1df56D237fD40036d47E866C7DcCD2114", - "chainId": 1, - "name": "NsureNetworkToken", - "symbol": "Nsure", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x20945ca1df56d237fd40036d47e866c7dccd2114.png" - }, - { - "address": "0x485d17A6f1B8780392d53D64751824253011A260", - "chainId": 1, - "name": "ChronoTechToken", - "symbol": "TIME", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x485d17a6f1b8780392d53d64751824253011a260.png" - }, - { - "address": "0x12e51E77DAAA58aA0E9247db7510Ea4B46F9bEAd", - "chainId": 1, - "name": "AaveInterestbearingYFI", - "symbol": "aYFIv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x12e51e77daaa58aa0e9247db7510ea4b46f9bead.png" - }, - { - "address": "0xba3D9687Cf50fE253cd2e1cFeEdE1d6787344Ed5", - "chainId": 1, - "name": "AaveInterestbearingAaveToken", - "symbol": "aAAVEv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xba3d9687cf50fe253cd2e1cfeede1d6787344ed5.png" - }, - { - "address": "0xB124541127A0A657f056D9Dd06188c4F1b0e5aab", - "chainId": 1, - "name": "AaveInterestbearingUniswap", - "symbol": "aUNIv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb124541127a0a657f056d9dd06188c4f1b0e5aab.png" - }, - { - "address": "0x712DB54daA836B53Ef1EcBb9c6ba3b9Efb073F40", - "chainId": 1, - "name": "AaveInterestbearingENJ", - "symbol": "aENJv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x712db54daa836b53ef1ecbb9c6ba3b9efb073f40.png" - }, - { - "address": "0xb753428af26E81097e7fD17f40c88aaA3E04902c", - "chainId": 1, - "name": "Spice", - "symbol": "SFI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb753428af26e81097e7fd17f40c88aaa3e04902c.png" - }, - { - "address": "0x8888801aF4d980682e47f1A9036e589479e835C5", - "chainId": 1, - "name": "88mph.app", - "symbol": "MPH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x8888801af4d980682e47f1a9036e589479e835c5.png" - }, - { - "address": "0x5D8d9F5b96f4438195BE9b99eee6118Ed4304286", - "chainId": 1, - "name": "CoverProtocol", - "symbol": "COVERv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5d8d9f5b96f4438195be9b99eee6118ed4304286.png" - }, - { - "address": "0xc3Eb2622190c57429aac3901808994443b64B466", - "chainId": 1, - "name": "OROToken", - "symbol": "ORO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc3eb2622190c57429aac3901808994443b64b466.png" - }, - { - "address": "0x6468e79A80C0eaB0F9A2B574c8d5bC374Af59414", - "chainId": 1, - "name": "E-RADIX", - "symbol": "eXRD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6468e79a80c0eab0f9a2b574c8d5bc374af59414.png" - }, - { - "address": "0x3e780920601D61cEdb860fe9c4a90c9EA6A35E78", - "chainId": 1, - "name": "BoostedFinance", - "symbol": "BOOST", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3e780920601d61cedb860fe9c4a90c9ea6a35e78.png" - }, - { - "address": "0x431ad2ff6a9C365805eBaD47Ee021148d6f7DBe0", - "chainId": 1, - "name": "dForce", - "symbol": "DF", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x431ad2ff6a9c365805ebad47ee021148d6f7dbe0.png" - }, - { - "address": "0x1695936d6a953df699C38CA21c2140d497C08BD9", - "chainId": 1, - "name": "SynLev", - "symbol": "SYN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1695936d6a953df699c38ca21c2140d497c08bd9.png" - }, - { - "address": "0x3DB6Ba6ab6F95efed1a6E794caD492fAAabF294D", - "chainId": 1, - "name": "LTONetworkToken", - "symbol": "LTO", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x3db6ba6ab6f95efed1a6e794cad492faaabf294d.png" - }, - { - "address": "0x6d16cF3EC5F763d4d99cB0B0b110eefD93B11B56", - "chainId": 1, - "name": "SynthsOIL", - "symbol": "sOIL", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6d16cf3ec5f763d4d99cb0b0b110eefd93b11b56.png" - }, - { - "address": "0xA5a5DF41883Cdc00c4cCC6E8097130535399d9a3", - "chainId": 1, - "name": "SynthiOIL", - "symbol": "iOIL", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa5a5df41883cdc00c4ccc6e8097130535399d9a3.png" - }, - { - "address": "0xF5238462E7235c7B62811567E63Dd17d12C2EAA0", - "chainId": 1, - "name": "CACHEGold", - "symbol": "CGT", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0xf5238462e7235c7b62811567e63dd17d12c2eaa0.png" - }, - { - "address": "0x4fE83213D56308330EC302a8BD641f1d0113A4Cc", - "chainId": 1, - "name": "NuCypher", - "symbol": "NU", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4fe83213d56308330ec302a8bd641f1d0113a4cc.png" - }, - { - "address": "0x9e70240d2A8a30a592d3F076441C4F303b26dE12", - "chainId": 1, - "name": "WrappedOCT", - "symbol": "OCT", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x9e70240d2a8a30a592d3f076441c4f303b26de12.png" - }, - { - "address": "0x6e0daDE58D2d89eBBe7aFc384e3E4f15b70b14D8", - "chainId": 1, - "name": "QuiverX", - "symbol": "QRX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6e0dade58d2d89ebbe7afc384e3e4f15b70b14d8.png" - }, - { - "address": "0x05079687D35b93538cbd59fe5596380cae9054A9", - "chainId": 1, - "name": "BitSong", - "symbol": "BTSG", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x05079687d35b93538cbd59fe5596380cae9054a9.png" - }, - { - "address": "0x355C665e101B9DA58704A8fDDb5FeeF210eF20c0", - "chainId": 1, - "name": "dForceGOLDx", - "symbol": "GOLDx", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x355c665e101b9da58704a8fddb5feef210ef20c0.png" - }, - { - "address": "0x69948cC03f478B95283F7dbf1CE764d0fc7EC54C", - "chainId": 1, - "name": "AaveInterestbearingREN", - "symbol": "aRENv1", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x69948cc03f478b95283f7dbf1ce764d0fc7ec54c.png" - }, - { - "address": "0xe88f8313e61A97cEc1871EE37fBbe2a8bf3ed1E4", - "chainId": 1, - "name": "SoraValidatorToken", - "symbol": "VAL", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xe88f8313e61a97cec1871ee37fbbe2a8bf3ed1e4.png" - }, - { - "address": "0xbaA70614C7AAfB568a93E62a98D55696bcc85DFE", - "chainId": 1, - "name": "UniCap.finance", - "symbol": "UCAP", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xbaa70614c7aafb568a93e62a98d55696bcc85dfe.png" - }, - { - "address": "0x0b38210ea11411557c13457D4dA7dC6ea731B88a", - "chainId": 1, - "name": "API3", - "symbol": "API3", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x0b38210ea11411557c13457d4da7dc6ea731b88a.png" - }, - { - "address": "0x3449FC1Cd036255BA1EB19d65fF4BA2b8903A69a", - "chainId": 1, - "name": "BAC", - "symbol": "BAC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3449fc1cd036255ba1eb19d65ff4ba2b8903a69a.png" - }, - { - "address": "0xa7ED29B253D8B4E3109ce07c80fc570f81B63696", - "chainId": 1, - "name": "BAS", - "symbol": "BAS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa7ed29b253d8b4e3109ce07c80fc570f81b63696.png" - }, - { - "address": "0x26607aC599266b21d13c7aCF7942c7701a8b699c", - "chainId": 1, - "name": "PowerIndexPoolToken", - "symbol": "PIPT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x26607ac599266b21d13c7acf7942c7701a8b699c.png" - }, - { - "address": "0x3218A02F8F8B5c3894ce30EB255F10Bcba13E654", - "chainId": 1, - "name": "MegaCryptoPolisMEGATokenMEGA", - "symbol": "MEGA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3218a02f8f8b5c3894ce30eb255f10bcba13e654.png" - }, - { - "address": "0x07150e919B4De5fD6a63DE1F9384828396f25fDC", - "chainId": 1, - "name": "BaseProtocol", - "symbol": "BASE", - "decimals": 9, - "logoURI": "https://tokens.1inch.exchange/0x07150e919b4de5fd6a63de1f9384828396f25fdc.png" - }, - { - "address": "0xD2dDa223b2617cB616c1580db421e4cFAe6a8a85", - "chainId": 1, - "name": "BondlyToken", - "symbol": "BONDLY", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xd2dda223b2617cb616c1580db421e4cfae6a8a85.png" - }, - { - "address": "0x9D79d5B61De59D882ce90125b18F74af650acB93", - "chainId": 1, - "name": "NeutrinoSystemBaseToken", - "symbol": "NSBT", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0x9d79d5b61de59d882ce90125b18f74af650acb93.png" - }, - { - "address": "0xB62132e35a6c13ee1EE0f84dC5d40bad8d815206", - "chainId": 1, - "name": "Nexo", - "symbol": "NEXO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb62132e35a6c13ee1ee0f84dc5d40bad8d815206.png" - }, - { - "address": "0xFFC97d72E13E01096502Cb8Eb52dEe56f74DAD7B", - "chainId": 1, - "name": "AaveinterestbearingAAVE", - "symbol": "aAAVE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xffc97d72e13e01096502cb8eb52dee56f74dad7b.png" - }, - { - "address": "0x05Ec93c0365baAeAbF7AefFb0972ea7ECdD39CF1", - "chainId": 1, - "name": "AaveinterestbearingBAT", - "symbol": "aBAT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x05ec93c0365baaeabf7aeffb0972ea7ecdd39cf1.png" - }, - { - "address": "0xA361718326c15715591c299427c62086F69923D9", - "chainId": 1, - "name": "AaveinterestbearingBUSD", - "symbol": "aBUSD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa361718326c15715591c299427c62086f69923d9.png" - }, - { - "address": "0x028171bCA77440897B824Ca71D1c56caC55b68A3", - "chainId": 1, - "name": "AaveinterestbearingDAI", - "symbol": "aDAI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x028171bca77440897b824ca71d1c56cac55b68a3.png" - }, - { - "address": "0xaC6Df26a590F08dcC95D5a4705ae8abbc88509Ef", - "chainId": 1, - "name": "AaveinterestbearingENJ", - "symbol": "aENJ", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xac6df26a590f08dcc95d5a4705ae8abbc88509ef.png" - }, - { - "address": "0x39C6b3e42d6A679d7D776778Fe880BC9487C2EDA", - "chainId": 1, - "name": "AaveinterestbearingKNC", - "symbol": "aKNC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x39c6b3e42d6a679d7d776778fe880bc9487c2eda.png" - }, - { - "address": "0xa06bC25B5805d5F8d82847D191Cb4Af5A3e873E0", - "chainId": 1, - "name": "AaveinterestbearingLINK", - "symbol": "aLINK", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa06bc25b5805d5f8d82847d191cb4af5a3e873e0.png" - }, - { - "address": "0xa685a61171bb30d4072B338c80Cb7b2c865c873E", - "chainId": 1, - "name": "AaveinterestbearingMANA", - "symbol": "aMANA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa685a61171bb30d4072b338c80cb7b2c865c873e.png" - }, - { - "address": "0xc713e5E149D5D0715DcD1c156a020976e7E56B88", - "chainId": 1, - "name": "AaveinterestbearingMKR", - "symbol": "aMKR", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc713e5e149d5d0715dcd1c156a020976e7e56b88.png" - }, - { - "address": "0xCC12AbE4ff81c9378D670De1b57F8e0Dd228D77a", - "chainId": 1, - "name": "AaveInterestbearingREN", - "symbol": "aREN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xcc12abe4ff81c9378d670de1b57f8e0dd228d77a.png" - }, - { - "address": "0x35f6B052C598d933D69A4EEC4D04c73A191fE6c2", - "chainId": 1, - "name": "AaveinterestbearingSNX", - "symbol": "aSNX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x35f6b052c598d933d69a4eec4d04c73a191fe6c2.png" - }, - { - "address": "0x6C5024Cd4F8A59110119C56f8933403A539555EB", - "chainId": 1, - "name": "AaveinterestbearingSUSD", - "symbol": "aSUSD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x6c5024cd4f8a59110119c56f8933403a539555eb.png" - }, - { - "address": "0x101cc05f4A51C0319f570d5E146a8C625198e636", - "chainId": 1, - "name": "AaveinterestbearingTUSD", - "symbol": "aTUSD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x101cc05f4a51c0319f570d5e146a8c625198e636.png" - }, - { - "address": "0xB9D7CB55f463405CDfBe4E90a6D2Df01C2B92BF1", - "chainId": 1, - "name": "AaveinterestbearingUNI", - "symbol": "aUNI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb9d7cb55f463405cdfbe4e90a6d2df01c2b92bf1.png" - }, - { - "address": "0xBcca60bB61934080951369a648Fb03DF4F96263C", - "chainId": 1, - "name": "AaveinterestbearingUSDC", - "symbol": "aUSDC", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0xbcca60bb61934080951369a648fb03df4f96263c.png" - }, - { - "address": "0x3Ed3B47Dd13EC9a98b44e6204A523E766B225811", - "chainId": 1, - "name": "AaveinterestbearingUSDT", - "symbol": "aUSDT", - "decimals": 6, - "logoURI": "https://tokens.1inch.exchange/0x3ed3b47dd13ec9a98b44e6204a523e766b225811.png" - }, - { - "address": "0x9ff58f4fFB29fA2266Ab25e75e2A8b3503311656", - "chainId": 1, - "name": "AaveinterestbearingWBTC", - "symbol": "aWBTC", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x9ff58f4ffb29fa2266ab25e75e2a8b3503311656.png" - }, - { - "address": "0x030bA81f1c18d280636F32af80b9AAd02Cf0854e", - "chainId": 1, - "name": "AaveinterestbearingWETH", - "symbol": "aWETH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x030ba81f1c18d280636f32af80b9aad02cf0854e.png" - }, - { - "address": "0x5165d24277cD063F5ac44Efd447B27025e888f37", - "chainId": 1, - "name": "AaveinterestbearingYFI", - "symbol": "aYFI", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5165d24277cd063f5ac44efd447b27025e888f37.png" - }, - { - "address": "0xDf7FF54aAcAcbFf42dfe29DD6144A69b629f8C9e", - "chainId": 1, - "name": "AaveinterestbearingZRX", - "symbol": "aZRX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xdf7ff54aacacbff42dfe29dd6144a69b629f8c9e.png" - }, - { - "address": "0xf644d4477cd8Db7791ceA3013CB053b3Fec4bEB3", - "chainId": 1, - "name": "CryptoenterLIONtoken", - "symbol": "LION", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0xf644d4477cd8db7791cea3013cb053b3fec4beb3.png" - }, - { - "address": "0xA8e7AD77C60eE6f30BaC54E2E7c0617Bd7B5A03E", - "chainId": 1, - "name": "zLOT", - "symbol": "zLOT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xa8e7ad77c60ee6f30bac54e2e7c0617bd7b5a03e.png" - }, - { - "address": "0x191557728e4d8CAa4Ac94f86af842148c0FA8F7E", - "chainId": 1, - "name": "ECOTOKEN", - "symbol": "ECO", - "decimals": 8, - "logoURI": "https://tokens.1inch.exchange/0x191557728e4d8caa4ac94f86af842148c0fa8f7e.png" - }, - { - "address": "0xdc9Ac3C20D1ed0B540dF9b1feDC10039Df13F99c", - "chainId": 1, - "name": "UtrustToken", - "symbol": "UTK", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xdc9ac3c20d1ed0b540df9b1fedc10039df13f99c.png" - }, - { - "address": "0x3472A5A71965499acd81997a54BBA8D852C6E53d", - "chainId": 1, - "name": "Badger", - "symbol": "BADGER", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3472a5a71965499acd81997a54bba8d852c6e53d.png" - }, - { - "address": "0xc944E90C64B2c07662A292be6244BDf05Cda44a7", - "chainId": 1, - "name": "GraphToken", - "symbol": "GRT", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc944e90c64b2c07662a292be6244bdf05cda44a7.png" - }, - { - "address": "0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32", - "chainId": 1, - "name": "LidoDAOToken", - "symbol": "LDO", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x5a98fcbea516cf06857215779fd812ca3bef1b32.png" - }, - { - "address": "0x77777FeDdddFfC19Ff86DB637967013e6C6A116C", - "chainId": 1, - "name": "TornadoCash", - "symbol": "TORN", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x77777feddddffc19ff86db637967013e6c6a116c.png" - }, - { - "address": "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", - "chainId": 1, - "name": "stETH", - "symbol": "stETH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xae7ab96520de3a18e5e111b5eaab095312d7fe84.png" - }, - { - "address": "0xB4d930279552397bbA2ee473229f89Ec245bc365", - "chainId": 1, - "name": "MahaDAO", - "symbol": "MAHA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xb4d930279552397bba2ee473229f89ec245bc365.png" - }, - { - "address": "0x57B946008913B82E4dF85f501cbAeD910e58D26C", - "chainId": 1, - "name": "MarlinPOND", - "symbol": "POND", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x57b946008913b82e4df85f501cbaed910e58d26c.png" - }, - { - "address": "0x3593D125a4f7849a1B059E64F4517A86Dd60c95d", - "chainId": 1, - "name": "MANTRADAO", - "symbol": "OMv2", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3593d125a4f7849a1b059e64f4517a86dd60c95d.png" - }, - { - "address": "0x3432B6A60D23Ca0dFCa7761B7ab56459D9C964D0", - "chainId": 1, - "name": "FraxShare", - "symbol": "FXS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x3432b6a60d23ca0dfca7761b7ab56459d9c964d0.png" - }, - { - "address": "0x1fDaB294EDA5112B7d066ED8F2E4E562D5bCc664", - "chainId": 1, - "name": "Spice", - "symbol": "SPICE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x1fdab294eda5112b7d066ed8f2e4e562d5bcc664.png" - }, - { - "address": "0x111111111117dC0aa78b770fA6A738034120C302", - "chainId": 1, - "name": "1INCHToken", - "symbol": "1INCH", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x111111111117dc0aa78b770fa6a738034120c302.png" - }, - { - "address": "0x054D64b73d3D8A21Af3D764eFd76bCaA774f3Bb2", - "chainId": 1, - "name": "Plasma", - "symbol": "PPAY", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x054d64b73d3d8a21af3d764efd76bcaa774f3bb2.png" - }, - { - "address": "0x368B3a58B5f49392e5C9E4C998cb0bB966752E51", - "chainId": 1, - "name": "MIC", - "symbol": "MIC", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x368b3a58b5f49392e5c9e4c998cb0bb966752e51.png" - }, - { - "address": "0x4b4D2e899658FB59b1D518b68fe836B100ee8958", - "chainId": 1, - "name": "MIS", - "symbol": "MIS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4b4d2e899658fb59b1d518b68fe836b100ee8958.png" - }, - { - "address": "0x03066dA434e5264ef0B32f787923f974A5726fDc", - "chainId": 1, - "name": "BCS", - "symbol": "BCS", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x03066da434e5264ef0b32f787923f974a5726fdc.png" - }, - { - "address": "0xee573a945B01B788B9287CE062A0CFC15bE9fd86", - "chainId": 1, - "name": "Exeedme", - "symbol": "XED", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xee573a945b01b788b9287ce062a0cfc15be9fd86.png" - }, - { - "address": "0x34950Ff2b487d9E5282c5aB342d08A2f712eb79F", - "chainId": 1, - "name": "EFFORCEIEO", - "symbol": "WOZX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x34950ff2b487d9e5282c5ab342d08a2f712eb79f.png" - }, - { - "address": "0xBD2F0Cd039E0BFcf88901C98c0bFAc5ab27566e3", - "chainId": 1, - "name": "DynamicSetDollar", - "symbol": "DSD", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xbd2f0cd039e0bfcf88901c98c0bfac5ab27566e3.png" - }, - { - "address": "0xc770EEfAd204B5180dF6a14Ee197D99d808ee52d", - "chainId": 1, - "name": "FOX", - "symbol": "FOX", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0xc770eefad204b5180df6a14ee197d99d808ee52d.png" - }, - { - "address": "0x4688a8b1F292FDaB17E9a90c8Bc379dC1DBd8713", - "chainId": 1, - "name": "CoverProtocolGovernanceToken", - "symbol": "COVER", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x4688a8b1f292fdab17e9a90c8bc379dc1dbd8713.png" - }, - { - "address": "0x66a0f676479Cee1d7373f3DC2e2952778BfF5bd6", - "chainId": 1, - "name": "WiseToken", - "symbol": "WISE", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x66a0f676479cee1d7373f3dc2e2952778bff5bd6.png" - }, - { - "address": "0x539F3615C1dBAfa0D008d87504667458acBd16Fa", - "chainId": 1, - "name": "FERA", - "symbol": "FERA", - "decimals": 18, - "logoURI": "https://tokens.1inch.exchange/0x539f3615c1dbafa0d008d87504667458acbd16fa.png" - } - ], - "logoURI": "https://1inch.exchange/assets/images/logo.png" -} From 26dbeb85c00e684a59e0a616994da7514980b25d Mon Sep 17 00:00:00 2001 From: sdgoh Date: Wed, 17 Feb 2021 08:25:27 +0800 Subject: [PATCH 11/28] (fix) Remove Winston rejection transport & use handleRejections config --- src/services/logger.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/services/logger.js b/src/services/logger.js index d1c9bdf..f3fd0d5 100644 --- a/src/services/logger.js +++ b/src/services/logger.js @@ -30,36 +30,33 @@ const config = { filename: `${getLogPath()}/logs_gateway_app.log.%DATE%`, datePattern: 'YYYY-MM-DD', handleExceptions: true, + handleRejections: true }, error: { level: 'error', filename: `${getLogPath()}/logs_gateway_error.log.%DATE%`, datePattern: 'YYYY-MM-DD', handleExceptions: false, - }, - rejection: { - level: 'error', - filename: `${getLogPath()}/logs_gateway_rejection.log.%DATE%`, - datePattern: 'YYYY-MM-DD', - handleExceptions: true, + handleRejections: true }, debug: { level: 'debug', filename: `${getLogPath()}/logs_gateway_debug.log.%DATE%`, datePattern: 'YYYY-MM-DD', handleExceptions: false, + handleRejections: false }, } const allLogsFileTransport = new winston.transports.DailyRotateFile(config.file) const errorLogsFileTransport = new winston.transports.DailyRotateFile(config.error) const debugTransport = new winston.transports.DailyRotateFile(config.debug) -const rejectionTransport = new winston.transports.DailyRotateFile(config.rejection) +// const rejectionTransport = new winston.transports.DailyRotateFile(config.rejection) const options = { format: logFormat, transports: [allLogsFileTransport, errorLogsFileTransport, debugTransport], - rejectionHandlers: [rejectionTransport], + // rejectionHandlers: [rejectionTransport], exitOnError: false, } From 15163379853187273e29c0903dcec824710a1995 Mon Sep 17 00:00:00 2001 From: sdgoh Date: Sun, 21 Feb 2021 00:10:55 +0800 Subject: [PATCH 12/28] Consolidate logging into info * Consolidate log into `info`. Remove debug, error, and rejection. * Enable debug mode logging for development * Check for undefined erc20 token list url source * Fix token list conversion for allowance & approval --- .env.example | 2 ++ src/routes/balancer.route.js | 7 ++++--- src/routes/eth.route.js | 31 +++++++++++++++++++------------ src/routes/terra.route.js | 3 ++- src/routes/uniswap.route.js | 1 + src/services/balancer.js | 17 +++++++++-------- src/services/eth.js | 10 ++++++++-- src/services/fees.js | 1 + src/services/logger.js | 23 ++--------------------- src/services/terra.js | 5 +++-- src/services/uniswap.js | 5 +++-- 11 files changed, 54 insertions(+), 51 deletions(-) diff --git a/.env.example b/.env.example index cf777c9..be76d9f 100644 --- a/.env.example +++ b/.env.example @@ -22,8 +22,10 @@ TERRA_CHAIN={testnet_chain_id} # Ethereum # - chain: mainnet, kovan, etc # - rpc url: infura or other rpc url +# - token list: erc20 token list source (ref: https://tokenlists.org/) ETHEREUM_CHAIN={chain} ETHEREUM_RPC_URL=https://{chain}.infura.io/v3/{api_key} +ETHEREUM_TOKEN_LIST_URL=https://wispy-bird-88a7.uniswap.workers.dev/?url=http://tokens.1inch.eth.link # Balancer # subgraph_chain diff --git a/src/routes/balancer.route.js b/src/routes/balancer.route.js index 564d9a1..5191857 100644 --- a/src/routes/balancer.route.js +++ b/src/routes/balancer.route.js @@ -9,6 +9,7 @@ import Balancer from '../services/balancer'; import Fees from '../services/fees'; import { logger } from '../services/logger'; +const debug = require('debug')('router') const router = express.Router() const eth = new Ethereum(process.env.ETHEREUM_CHAIN) const balancer = new Balancer(process.env.ETHEREUM_CHAIN) @@ -328,12 +329,12 @@ router.post('/trade', async (req, res) => { error: swapMoreThanMaxPriceError, message: `Swap price ${price} exceeds limitPrice ${limitPrice}` }) - logger.debug(`Swap price ${price} exceeds limitPrice ${limitPrice}`) + debug(`Swap price ${price} exceeds limitPrice ${limitPrice}`) } } else { // sell const minAmountOut = limitPrice / amount * baseDenomMultiplier - logger.debug('minAmountOut', minAmountOut) + debug('minAmountOut', minAmountOut) const price = expectedAmount / amount * baseDenomMultiplier / quoteDenomMultiplier logger.info(`Price: ${price.toString()}`) if (!limitPrice || price >= limitPrice) { @@ -364,7 +365,7 @@ router.post('/trade', async (req, res) => { error: swapLessThanMaxPriceError, message: `Swap price ${price} lower than limitPrice ${limitPrice}` }) - logger.debug(`Swap price ${price} lower than limitPrice ${limitPrice}`) + debug(`Swap price ${price} lower than limitPrice ${limitPrice}`) } } } catch (err) { diff --git a/src/routes/eth.route.js b/src/routes/eth.route.js index 9c0e722..fdd81ca 100644 --- a/src/routes/eth.route.js +++ b/src/routes/eth.route.js @@ -5,6 +5,7 @@ import { getParamData, latency, statusMessages } from '../services/utils'; import Ethereum from '../services/eth'; import { logger } from '../services/logger'; +const debug = require('debug')('router') const router = express.Router() const eth = new Ethereum(process.env.ETHEREUM_CHAIN) const spenders = { @@ -29,7 +30,7 @@ router.post('/balances', async (req, res) => { POST: /balances x-www-form-urlencoded: { privateKey:{{privateKey}} - tokenAddressList:{{tokenAddressList}} + tokenList:{{tokenList}} } */ const initTime = Date.now() @@ -50,21 +51,24 @@ router.post('/balances', async (req, res) => { } // populate token contract info using token symbol list - const tokenAddressList = {} + const tokenContractList = [] const tokenList = JSON.parse(paramData.tokenList) tokenList.forEach(symbol => { const tokenContractInfo = eth.getERC20TokenAddresses(symbol) - tokenAddressList[tokenContractInfo.address] = tokenContractInfo.decimals + tokenContractList[symbol] = tokenContractInfo }); const balances = {} balances.ETH = await eth.getETHBalance(wallet, privateKey) try { Promise.all( - Object.keys(tokenAddressList).map(async (key, index) => - balances[key] = await eth.getERC20Balance(wallet, key, tokenAddressList[key]) + Object.keys(tokenContractList).map(async (symbol, index) => { + const address = tokenContractList[symbol].address + const decimals = tokenContractList[symbol].decimals + balances[symbol] = await eth.getERC20Balance(wallet, address, decimals) + } )).then(() => { - logger.info('eth.route - Get Account Balance', { message: JSON.stringify(tokenAddressList) }) + console.log('eth.route - Get Account Balance', { message: JSON.stringify(tokenList) }) res.status(200).json({ network: eth.network, timestamp: initTime, @@ -111,20 +115,23 @@ router.post('/allowances', async (req, res) => { } // populate token contract info using token symbol list - const tokenAddressList = {} + const tokenContractList = [] const tokenList = JSON.parse(paramData.tokenList) tokenList.forEach(symbol => { const tokenContractInfo = eth.getERC20TokenAddresses(symbol) - tokenAddressList[tokenContractInfo.address] = tokenContractInfo.decimals + tokenContractList[symbol] = tokenContractInfo }); const approvals = {} try { Promise.all( - Object.keys(tokenAddressList).map(async (key, index) => - approvals[key] = await eth.getERC20Allowance(wallet, spender, key, tokenAddressList[key]) - )).then(() => { - logger.info('eth.route - Getting allowances', { message: JSON.stringify(tokenAddressList) }) + Object.keys(tokenContractList).map(async (symbol, index) => { + const address = tokenContractList[symbol].address + const decimals = tokenContractList[symbol].decimals + approvals[symbol] = await eth.getERC20Allowance(wallet, spender, address, decimals) + } + )).then(() => { + logger.info('eth.route - Getting allowances', { message: JSON.stringify(tokenList) }) res.status(200).json({ network: eth.network, timestamp: initTime, diff --git a/src/routes/terra.route.js b/src/routes/terra.route.js index 366f3fd..16a19ce 100644 --- a/src/routes/terra.route.js +++ b/src/routes/terra.route.js @@ -6,6 +6,7 @@ import { logger } from '../services/logger'; import Terra from '../services/terra'; +const debug = require('debug')('router') const router = express.Router(); const terra = new Terra() @@ -49,7 +50,7 @@ router.post('/balances', async (req, res) => { balances[symbol] = amount }) }) - logger.info('terra.route - Get Account Balance', { message: address }) + logger.info('terra.route - Get Account Balance') res.status(200).json({ network: network, timestamp: initTime, diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index 1394e74..bd27660 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -9,6 +9,7 @@ import Fees from '../services/fees'; require('dotenv').config() +const debug = require('debug')('router') const router = express.Router() const eth = new Ethereum(process.env.ETHEREUM_CHAIN) const uniswap = new Uniswap(process.env.ETHEREUM_CHAIN) diff --git a/src/services/balancer.js b/src/services/balancer.js index 44c0b38..681a1d4 100644 --- a/src/services/balancer.js +++ b/src/services/balancer.js @@ -1,4 +1,5 @@ import { logger } from '../services/logger'; +const debug = require('debug')('router') require('dotenv').config() // DO NOT REMOVE. needed to configure REACT_APP_SUBGRAPH_URL used by @balancer-labs/sor const sor = require('@balancer-labs/sor') const BigNumber = require('bignumber.js') @@ -46,10 +47,10 @@ export default class Balancer { this.cachedPools = pools if (pools.pools.length === 0) { - logger.debug('>>> No pools contain the tokens provided.', { message: this.network }); + debug('>>> No pools contain the tokens provided.', { message: this.network }); return {}; } - logger.debug('>>> Pools Retrieved.', { message: this.network }) + debug('>>> Pools Retrieved.', { message: this.network }) setTimeout(this.fetchPool.bind(this), 15000); // update every x seconds } @@ -76,7 +77,7 @@ export default class Balancer { const swapsFormatted = sor.formatSwapsExactAmountIn(sorSwaps, MAX_UINT, 0) const expectedAmount = sor.calcTotalOutput(swapsFormatted, poolData) - logger.debug(`Expected Out: ${expectedAmount.toString()} (${tokenOut})`); + debug(`Expected Out: ${expectedAmount.toString()} (${tokenOut})`); // Create correct swap format for new proxy let swaps = []; @@ -122,7 +123,7 @@ export default class Balancer { ) const swapsFormatted = sor.formatSwapsExactAmountOut(sorSwaps, MAX_UINT, MAX_UINT) const expectedAmount = sor.calcTotalInput(swapsFormatted, poolData) - logger.debug(`Expected In: ${expectedAmount.toString()} (${tokenIn})`); + debug(`Expected In: ${expectedAmount.toString()} (${tokenIn})`); // Create correct swap format for new proxy let swaps = []; @@ -147,7 +148,7 @@ export default class Balancer { } async swapExactIn (wallet, swaps, tokenIn, tokenOut, amountIn, minAmountOut, gasPrice) { - logger.debug(`Number of swaps: ${swaps.length}`) + debug(`Number of swaps: ${swaps.length}`) try { const contract = new ethers.Contract(this.exchangeProxy, proxyArtifact.abi, wallet) const tx = await contract.batchSwapExactIn( @@ -161,7 +162,7 @@ export default class Balancer { gasLimit: GAS_BASE + swaps.length * GAS_PER_SWAP, } ) - logger.debug(`Tx Hash: ${tx.hash}`); + debug(`Tx Hash: ${tx.hash}`); return tx } catch (err) { logger.error(err) @@ -172,7 +173,7 @@ export default class Balancer { } async swapExactOut (wallet, swaps, tokenIn, tokenOut, expectedIn, gasPrice) { - logger.debug(`Number of swaps: ${swaps.length}`) + debug(`Number of swaps: ${swaps.length}`) try { const contract = new ethers.Contract(this.exchangeProxy, proxyArtifact.abi, wallet) const tx = await contract.batchSwapExactOut( @@ -185,7 +186,7 @@ export default class Balancer { gasLimit: GAS_BASE + swaps.length * GAS_PER_SWAP, } ) - logger.debug(`Tx Hash: ${tx.hash}`) + debug(`Tx Hash: ${tx.hash}`) return tx } catch (err) { logger.error(err) diff --git a/src/services/eth.js b/src/services/eth.js index fd3880e..bd3eed2 100644 --- a/src/services/eth.js +++ b/src/services/eth.js @@ -1,6 +1,7 @@ import { logger } from './logger'; import axios from 'axios' +const debug = require('debug')('router') require('dotenv').config() const fs = require('fs'); const ethers = require('ethers') @@ -21,7 +22,7 @@ export default class Ethereum { } // update token list this.tokenListUrl = process.env.ETHEREUM_TOKEN_LIST_URL - this.getERC20TokenList() + this.getERC20TokenList() // erc20TokenList } // get ETH balance @@ -132,6 +133,11 @@ export default class Ethereum { this.erc20TokenList = JSON.parse(fs.readFileSync(tokenListSource)) } else if (this.network === 'mainnet') { tokenListSource = this.erc20TokenListURL + if (this.tokenListSource === undefined || this.tokenListSource === null) { + const errMessage = 'Token List source not found' + logger.error('ERC20 Token List Error', { message: errMessage}) + console.log('eth - Error: ', errMessage) + } if (this.erc20TokenList === undefined || this.erc20TokenList === null || this.erc20TokenList === {}) { const response = await axios.get(tokenListSource) if (response.status === 200 && response.data) { @@ -141,7 +147,7 @@ export default class Ethereum { } else { throw Error(`Invalid network ${this.network}`) } - // console.log('get ERC20 Token List', this.network, 'source', tokenListSource) + console.log('get ERC20 Token List', this.network, 'source', tokenListSource) } catch (err) { console.log(err); logger.error(err) diff --git a/src/services/fees.js b/src/services/fees.js index aae6b81..fcf7af8 100644 --- a/src/services/fees.js +++ b/src/services/fees.js @@ -3,6 +3,7 @@ import axios from 'axios' require('dotenv').config() +const debug = require('debug')('router') // constants const ethGasStationHost = 'https://ethgasstation.info' // const ethGasStation = process.env.ETH_GAS_STATION diff --git a/src/services/logger.js b/src/services/logger.js index f3fd0d5..90bf160 100644 --- a/src/services/logger.js +++ b/src/services/logger.js @@ -1,6 +1,5 @@ import { getLocalDate } from './utils' require('dotenv').config() -// const fecha = require('fecha') const appRoot = require('app-root-path') const winston = require('winston') require('winston-daily-rotate-file'); @@ -31,32 +30,14 @@ const config = { datePattern: 'YYYY-MM-DD', handleExceptions: true, handleRejections: true - }, - error: { - level: 'error', - filename: `${getLogPath()}/logs_gateway_error.log.%DATE%`, - datePattern: 'YYYY-MM-DD', - handleExceptions: false, - handleRejections: true - }, - debug: { - level: 'debug', - filename: `${getLogPath()}/logs_gateway_debug.log.%DATE%`, - datePattern: 'YYYY-MM-DD', - handleExceptions: false, - handleRejections: false - }, + } } const allLogsFileTransport = new winston.transports.DailyRotateFile(config.file) -const errorLogsFileTransport = new winston.transports.DailyRotateFile(config.error) -const debugTransport = new winston.transports.DailyRotateFile(config.debug) -// const rejectionTransport = new winston.transports.DailyRotateFile(config.rejection) const options = { format: logFormat, - transports: [allLogsFileTransport, errorLogsFileTransport, debugTransport], - // rejectionHandlers: [rejectionTransport], + transports: [allLogsFileTransport], exitOnError: false, } diff --git a/src/services/terra.js b/src/services/terra.js index 119322b..38dac2e 100644 --- a/src/services/terra.js +++ b/src/services/terra.js @@ -3,6 +3,7 @@ import { LCDClient, Coin, MsgSwap, StdTx, StdFee, Dec, MnemonicKey, isTxError, C import BigNumber from 'bignumber.js' import { getHummingbotMemo } from './utils'; +const debug = require('debug')('router') require('dotenv').config() // constants @@ -134,7 +135,7 @@ export default class Terra { feeList[key] = rates._coins[key].amount * lunaFee }) }) - logger.debug('lunaFee', lunaFee, feeList) + debug('lunaFee', lunaFee, feeList) return feeList } catch (err) { @@ -199,7 +200,7 @@ export default class Terra { swaps.price = exchangeRate swaps.cost = cost swaps.txFee = txFee - logger.debug('swaps', swaps) + debug('swaps', swaps) return swaps } catch (err) { logger.error(err) diff --git a/src/services/uniswap.js b/src/services/uniswap.js index 98eb377..0656f74 100644 --- a/src/services/uniswap.js +++ b/src/services/uniswap.js @@ -1,5 +1,6 @@ import { logger } from './logger'; +const debug = require('debug')('router') const uni = require('@uniswap/sdk') const ethers = require('ethers') const proxyArtifact = require('../static/uniswap_v2_router_abi.json') @@ -162,7 +163,7 @@ export default class Uniswap { } ) - logger.debug(`Tx Hash: ${tx.hash}`); + debug(`Tx Hash: ${tx.hash}`); return tx } @@ -186,7 +187,7 @@ export default class Uniswap { } ) - logger.debug(`Tx Hash: ${tx.hash}`); + debug(`Tx Hash: ${tx.hash}`); return tx } } From 5abfb8721b639e1ba3f56c0448e1a950ff12372d Mon Sep 17 00:00:00 2001 From: sdgoh Date: Thu, 25 Feb 2021 14:37:17 +0800 Subject: [PATCH 13/28] (feat) Move exchange proxy & other parameters into .env * accept balancer exchange proxy in .env * accept balancer gas base, gas per swap overwrite in .env * accept eth approval gas limit, manual gas fee setting in .env when ethgasstation not set to true * accept uniswap router setting in .env * accept uniswap gas limit, ttl, update period overwrite * update .env.example --- .env.example | 2 ++ src/services/balancer.js | 9 +++------ src/services/eth.js | 6 +++--- src/services/fees.js | 17 +++++++++++------ src/services/uniswap.js | 8 ++++---- 5 files changed, 23 insertions(+), 19 deletions(-) diff --git a/.env.example b/.env.example index be76d9f..78f73a4 100644 --- a/.env.example +++ b/.env.example @@ -62,9 +62,11 @@ GMT_OFFSET=+0800 # EthGasStation # API key for defipulse.com gas station API # Gas level you want to use for Ethereum transactions (fast, fastest, safeLow, average) +ENABLE_ETH_GAS_STATION=true ETH_GAS_STATION_API_KEY={apikey} ETH_GAS_STATION_GAS_LEVEL=fast ETH_GAS_STATION_REFRESH_TIME=60 +MANUAL_GAS_PRICE=100 # Balancer Config BALANCER_MAX_SWAPS=4 diff --git a/src/services/balancer.js b/src/services/balancer.js index 681a1d4..de42614 100644 --- a/src/services/balancer.js +++ b/src/services/balancer.js @@ -9,11 +9,9 @@ const proxyArtifact = require('../static/ExchangeProxy.json') // constants const MULTI = '0xeefba1e63905ef1d7acba5a8513c70307c1ce441'; const MULTI_KOVAN = ' 0x2cc8688C5f75E365aaEEb4ea8D6a480405A48D2A'; -const EXCHANGE_PROXY = '0x3E66B66Fd1d0b02fDa6C811Da9E0547970DB2f21'; -const EXCHANGE_PROXY_KOVAN = '0x4e67bf5bD28Dd4b570FBAFe11D0633eCbA2754Ec'; const MAX_UINT = ethers.constants.MaxUint256; -const GAS_BASE = 200688; -const GAS_PER_SWAP = 100000; +const GAS_BASE = process.env.BALANCER_GAS_BASE || 200688; +const GAS_PER_SWAP = process.env.BALANCER_GAS_PER_SWAP || 100000; export default class Balancer { constructor (network = 'kovan') { @@ -24,14 +22,13 @@ export default class Balancer { this.gasBase = GAS_BASE this.gasPerSwap = GAS_PER_SWAP this.maxSwaps = process.env.BALANCER_MAX_SWAPS || 4 + this.exchangeProxy = process.env.EXCHANGE_PROXY; switch (network) { case 'mainnet': - this.exchangeProxy = EXCHANGE_PROXY; this.multiCall = MULTI; break; case 'kovan': - this.exchangeProxy = EXCHANGE_PROXY_KOVAN; this.multiCall = MULTI_KOVAN; break; default: diff --git a/src/services/eth.js b/src/services/eth.js index bd3eed2..61a51cd 100644 --- a/src/services/eth.js +++ b/src/services/eth.js @@ -8,6 +8,7 @@ const ethers = require('ethers') const abi = require('../static/abi') // constants +const APPROVAL_GAS_LIMIT = process.env.ETH_APPROVAL_GAS_LIMIT || 50000; export default class Ethereum { constructor (network = 'mainnet') { @@ -21,7 +22,6 @@ export default class Ethereum { uniswap: process.env.UNISWAP_ROUTER } // update token list - this.tokenListUrl = process.env.ETHEREUM_TOKEN_LIST_URL this.getERC20TokenList() // erc20TokenList } @@ -72,7 +72,7 @@ export default class Ethereum { async approveERC20 (wallet, spender, tokenAddress, amount, gasPrice = this.gasPrice, gasLimit) { try { // fixate gas limit to prevent overwriting - const approvalGasLimit = 50000 + const approvalGasLimit = APPROVAL_GAS_LIMIT // instantiate a contract and pass in wallet, which act on behalf of that signer const contract = new ethers.Contract(tokenAddress, abi.ERC20Abi, wallet) return await contract.approve( @@ -133,7 +133,7 @@ export default class Ethereum { this.erc20TokenList = JSON.parse(fs.readFileSync(tokenListSource)) } else if (this.network === 'mainnet') { tokenListSource = this.erc20TokenListURL - if (this.tokenListSource === undefined || this.tokenListSource === null) { + if (tokenListSource === undefined || tokenListSource === null) { const errMessage = 'Token List source not found' logger.error('ERC20 Token List Error', { message: errMessage}) console.log('eth - Error: ', errMessage) diff --git a/src/services/fees.js b/src/services/fees.js index fcf7af8..e538745 100644 --- a/src/services/fees.js +++ b/src/services/fees.js @@ -6,10 +6,11 @@ require('dotenv').config() const debug = require('debug')('router') // constants const ethGasStationHost = 'https://ethgasstation.info' -// const ethGasStation = process.env.ETH_GAS_STATION +const ethGasStationEnabled = process.env.ENABLE_ETH_GAS_STATION || false const ethGasStationApiKey = process.env.ETH_GAS_STATION_API_KEY +const ethManualGasPrice = parseInt(process.env.MANUAL_GAS_PRICE) const ethGasStationURL = ethGasStationHost + '/api/ethgasAPI.json?api-key=' + ethGasStationApiKey -const defaultRefreshInterval = 60 +const defaultRefreshInterval = 120 export default class Fees { constructor () { @@ -20,10 +21,14 @@ export default class Fees { // get ETH Gas Station async getETHGasStationFee (gasLevel = this.ethGasStationGasLevel) { try { - const response = await axios.get(ethGasStationURL) - // divite by 10 to convert it to Gwei) - this.ethGasPrice = response.data[gasLevel] / 10 - console.log(`get ETHGasStation gas price (${gasLevel}): ${this.ethGasPrice} / interval: ${this.ethGasStationRefreshTime / 1000} sec`) + if (ethGasStationEnabled === true || ethGasStationEnabled.toLowerCase() === 'true') { + const response = await axios.get(ethGasStationURL) + // divite by 10 to convert it to Gwei) + this.ethGasPrice = response.data[gasLevel] / 10 + console.log(`get ETHGasStation gas price (${gasLevel}): ${this.ethGasPrice} / interval: ${this.ethGasStationRefreshTime / 1000} sec`) + } else { + this.ethGasPrice = ethManualGasPrice + } } catch (err) { console.log(err); logger.error(err) diff --git a/src/services/uniswap.js b/src/services/uniswap.js index 0656f74..2624564 100644 --- a/src/services/uniswap.js +++ b/src/services/uniswap.js @@ -7,10 +7,10 @@ const proxyArtifact = require('../static/uniswap_v2_router_abi.json') const routeTokens = require('../static/uniswap_route_tokens.json') // constants -const ROUTER = '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D'; -const GAS_LIMIT = 150688; -const TTL = 60; -const UPDATE_PERIOD = 300000; // stop updating pair after 5 minutes from last request +const ROUTER = process.env.UNISWAP_ROUTER +const GAS_LIMIT = process.env.UNISWAP_GAS_LIMIT || 150688; +const TTL = process.env.UNISWAP_TTL || 60; +const UPDATE_PERIOD = process.env.UNISWAP_UPDATE_PERIOD || 300000; // stop updating pair after 5 minutes from last request export default class Uniswap { constructor (network = 'mainnet') { From 21fdadae814b3312af64d5fb5466325729a5bbdc Mon Sep 17 00:00:00 2001 From: sdgoh Date: Mon, 1 Mar 2021 20:15:08 +0800 Subject: [PATCH 14/28] (fix) Uppercase for buy / sell param * Add initiate one-time gas retrieval --- src/routes/balancer.route.js | 17 +++++++++-------- src/routes/eth.route.js | 4 ++++ src/routes/uniswap.route.js | 14 +++++++------- src/services/fees.js | 8 ++++++-- 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/routes/balancer.route.js b/src/routes/balancer.route.js index 5191857..e574058 100644 --- a/src/routes/balancer.route.js +++ b/src/routes/balancer.route.js @@ -184,7 +184,7 @@ router.post('/price', async (req, res) => { const quoteDenomMultiplier = 10 ** quoteTokenContractInfo.decimals const amount = new BigNumber(parseInt(paramData.amount * baseDenomMultiplier)) const maxSwaps = balancer.maxSwaps - const side = paramData.side + const side = paramData.side.toUpperCase() let gasPrice if (paramData.gasPrice) { gasPrice = parseFloat(paramData.gasPrice) @@ -194,7 +194,7 @@ router.post('/price', async (req, res) => { try { // fetch the optimal pool mix from balancer-sor - const { swaps, expectedAmount } = side === 'buy' + const { swaps, expectedAmount } = side === 'BUY' ? await balancer.priceSwapOut( quoteTokenAddress, // tokenIn is quote asset baseTokenAddress, // tokenOut is base asset @@ -210,8 +210,7 @@ router.post('/price', async (req, res) => { if (swaps != null && expectedAmount != null) { const gasLimit = estimateGasLimit(swaps.length) - - res.status(200).json({ + const result = { network: balancer.network, timestamp: initTime, latency: latency(initTime, Date.now()), @@ -224,7 +223,8 @@ router.post('/price', async (req, res) => { gasLimit: gasLimit, gasPrice: gasPrice, swaps: swaps, - }) + } + res.status(200).json(result) } else { // no pool available res.status(200).json({ info: statusMessages.no_pool_available, @@ -269,7 +269,7 @@ router.post('/trade', async (req, res) => { const amount = new BigNumber(parseInt(paramData.amount * baseDenomMultiplier)) const maxSwaps = balancer.maxSwaps - const side = paramData.side + const side = paramData.side.toUpperCase() let limitPrice if (paramData.limitPrice) { @@ -284,7 +284,7 @@ router.post('/trade', async (req, res) => { try { // fetch the optimal pool mix from balancer-sor - const { swaps, expectedAmount } = side === 'buy' + const { swaps, expectedAmount } = side === 'BUY' ? await balancer.priceSwapOut( quoteTokenAddress, // tokenIn is quote asset baseTokenAddress, // tokenOut is base asset @@ -297,7 +297,7 @@ router.post('/trade', async (req, res) => { amount, maxSwaps, ) - if (side === 'buy') { + if (side === 'BUY') { const price = expectedAmount / amount * baseDenomMultiplier / quoteDenomMultiplier logger.info(`Price: ${price.toString()}`) if (!limitPrice || price <= limitPrice) { @@ -358,6 +358,7 @@ router.post('/trade', async (req, res) => { amount: parseFloat(paramData.amount), expectedOut: expectedAmount / quoteDenomMultiplier, price: price, + gasPrice: gasPrice, txHash: tx.hash, }) } else { diff --git a/src/routes/eth.route.js b/src/routes/eth.route.js index fdd81ca..526f477 100644 --- a/src/routes/eth.route.js +++ b/src/routes/eth.route.js @@ -3,6 +3,7 @@ import express from 'express'; import { getParamData, latency, statusMessages } from '../services/utils'; import Ethereum from '../services/eth'; +import Fees from '../services/fees'; import { logger } from '../services/logger'; const debug = require('debug')('router') @@ -12,6 +13,7 @@ const spenders = { balancer: process.env.EXCHANGE_PROXY, uniswap: process.env.UNISWAP_ROUTER } +const fees = new Fees() router.post('/', async (req, res) => { /* @@ -308,6 +310,8 @@ router.post('/approve', async (req, res) => { let gasPrice if (paramData.gasPrice) { gasPrice = parseFloat(paramData.gasPrice) + } else { + gasPrice = fees.ethGasPrice } try { diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index bd27660..8b1f58c 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -200,7 +200,7 @@ router.post('/trade', async (req, res) => { const quoteTokenContractInfo = eth.getERC20TokenAddresses(paramData.quote) const baseTokenAddress = baseTokenContractInfo.address const quoteTokenAddress = quoteTokenContractInfo.address - const side = paramData.side + const side = paramData.side.toUpperCase() let limitPrice if (paramData.limitPrice) { @@ -215,7 +215,7 @@ router.post('/trade', async (req, res) => { try { // fetch the optimal pool mix from uniswap - const { trade, expectedAmount } = side === 'buy' + const { trade, expectedAmount } = side === 'BUY' ? await uniswap.priceSwapOut( quoteTokenAddress, // tokenIn is quote asset baseTokenAddress, // tokenOut is base asset @@ -227,7 +227,7 @@ router.post('/trade', async (req, res) => { amount ) - if (side === 'buy') { + if (side === 'BUY') { const price = trade.executionPrice.invert().toSignificant(8) logger.info(`uniswap.route - Price: ${price.toString()}`) if (!limitPrice || price <= limitPrice) { @@ -320,7 +320,7 @@ router.post('/price', async (req, res) => { const quoteTokenContractInfo = eth.getERC20TokenAddresses(paramData.quote) const baseTokenAddress = baseTokenContractInfo.address const quoteTokenAddress = quoteTokenContractInfo.address - const side = paramData.side + const side = paramData.side.toUpperCase() const gasLimit = estimateGasLimit() let gasPrice if (paramData.gasPrice) { @@ -331,7 +331,7 @@ router.post('/price', async (req, res) => { try { // fetch the optimal pool mix from uniswap - const { trade, expectedAmount } = side === 'buy' + const { trade, expectedAmount } = side === 'BUY' ? await uniswap.priceSwapOut( quoteTokenAddress, // tokenIn is quote asset baseTokenAddress, // tokenOut is base asset @@ -344,7 +344,7 @@ router.post('/price', async (req, res) => { ) if (trade !== null && expectedAmount !== null) { - const price = side === 'buy' + const price = side === 'BUY' ? trade.executionPrice.invert().toSignificant(8) : trade.executionPrice.toSignificant(8) @@ -373,7 +373,7 @@ router.post('/price', async (req, res) => { let errCode = 500 if (Object.keys(err).includes('isInsufficientReservesError')) { errCode = 200 - reason = statusMessages.insufficient_reserves + ' in ' + side.toUpperCase() + ' at Uniswap' + reason = statusMessages.insufficient_reserves + ' in ' + side + ' at Uniswap' } else if (Object.getOwnPropertyNames(err).includes('message')) { reason = getErrorMessage(err.message) if (reason === statusMessages.no_pool_available) { diff --git a/src/services/fees.js b/src/services/fees.js index e538745..20467d2 100644 --- a/src/services/fees.js +++ b/src/services/fees.js @@ -16,10 +16,11 @@ export default class Fees { constructor () { this.ethGasStationGasLevel = process.env.ETH_GAS_STATION_GAS_LEVEL this.ethGasStationRefreshTime = (process.env.ETH_GAS_STATION_REFRESH_TIME || defaultRefreshInterval) * 1000 + this.getETHGasStationFee(this.ethGasStationGasLevel, 0) } // get ETH Gas Station - async getETHGasStationFee (gasLevel = this.ethGasStationGasLevel) { + async getETHGasStationFee (gasLevel = this.ethGasStationGasLevel, interval = defaultRefreshInterval) { try { if (ethGasStationEnabled === true || ethGasStationEnabled.toLowerCase() === 'true') { const response = await axios.get(ethGasStationURL) @@ -29,6 +30,7 @@ export default class Fees { } else { this.ethGasPrice = ethManualGasPrice } + console.log('>>getETHGasStationFee ', this.ethGasPrice) } catch (err) { console.log(err); logger.error(err) @@ -36,6 +38,8 @@ export default class Fees { err.reason ? reason = err.reason : reason = 'error ETH gas fee lookup' return reason } - setTimeout(this.getETHGasStationFee.bind(this), this.ethGasStationRefreshTime); // update every x seconds + if (interval > 0) { // set to '0' for one-time retrieval + setTimeout(this.getETHGasStationFee.bind(this), this.ethGasStationRefreshTime); // update every x seconds + } } } From 8791030ee6456c90079e8bb406bf227f9e5a1960 Mon Sep 17 00:00:00 2001 From: sdgoh Date: Tue, 2 Mar 2021 22:16:35 +0800 Subject: [PATCH 15/28] (feat) Add gas price, limit, cost info to response json data --- src/routes/balancer.route.js | 20 ++++++++++++++++++-- src/routes/terra.route.js | 4 ++-- src/routes/uniswap.route.js | 23 ++++++++++++++++++----- src/services/fees.js | 10 +++++++++- 4 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/routes/balancer.route.js b/src/routes/balancer.route.js index e574058..5c9e9ab 100644 --- a/src/routes/balancer.route.js +++ b/src/routes/balancer.route.js @@ -146,6 +146,9 @@ router.post('/start', async (req, res) => { return } + const gasLimit = estimateGasLimit(balancer.maxSwaps) + const gasCost = await fees.getGasCost(gasPrice, gasLimit) + // update pool await balancer.fetchPool(baseTokenContractInfo.address, quoteTokenContractInfo.address) @@ -156,7 +159,9 @@ router.post('/start', async (req, res) => { success: true, base: baseTokenContractInfo, quote: quoteTokenContractInfo, - gasPrice: fees.ethGasPrice, + gasPrice: gasPrice, + gasLimit: gasLimit, + gasCost: gasCost, pools: balancer.cachedPools.pools.length, } console.log('caching swap pools (total)', balancer.cachedPools.pools.length) @@ -210,6 +215,8 @@ router.post('/price', async (req, res) => { if (swaps != null && expectedAmount != null) { const gasLimit = estimateGasLimit(swaps.length) + const gasCost = await fees.getGasCost(gasPrice, gasLimit) + const result = { network: balancer.network, timestamp: initTime, @@ -220,8 +227,9 @@ router.post('/price', async (req, res) => { side: side, expectedAmount: parseInt(expectedAmount) / quoteDenomMultiplier, price: expectedAmount / amount * baseDenomMultiplier / quoteDenomMultiplier, - gasLimit: gasLimit, gasPrice: gasPrice, + gasLimit: gasLimit, + gasCost: gasCost, swaps: swaps, } res.status(200).json(result) @@ -297,6 +305,10 @@ router.post('/trade', async (req, res) => { amount, maxSwaps, ) + + const gasLimit = estimateGasLimit(swaps.length) + const gasCost = await fees.getGasCost(gasPrice, gasLimit) + if (side === 'BUY') { const price = expectedAmount / amount * baseDenomMultiplier / quoteDenomMultiplier logger.info(`Price: ${price.toString()}`) @@ -322,6 +334,8 @@ router.post('/trade', async (req, res) => { expectedIn: expectedAmount / quoteDenomMultiplier, price: price, gasPrice: gasPrice, + gasLimit: gasLimit, + gasCost: gasCost, txHash: tx.hash, }) } else { @@ -359,6 +373,8 @@ router.post('/trade', async (req, res) => { expectedOut: expectedAmount / quoteDenomMultiplier, price: price, gasPrice: gasPrice, + gasLimit: gasLimit, + gasCost: gasCost, txHash: tx.hash, }) } else { diff --git a/src/routes/terra.route.js b/src/routes/terra.route.js index 16a19ce..f2c64c3 100644 --- a/src/routes/terra.route.js +++ b/src/routes/terra.route.js @@ -116,7 +116,7 @@ router.post('/price', async (req, res) => { const paramData = getParamData(req.body) const baseToken = paramData.base const quoteToken = paramData.quote - const tradeType = paramData.side + const tradeType = paramData.side.toUpperCase() const amount = parseFloat(paramData.amount) let exchangeRate @@ -177,7 +177,7 @@ router.post('/trade', async (req, res) => { const paramData = getParamData(req.body) const baseToken = paramData.base const quoteToken = paramData.quote - const tradeType = paramData.side + const tradeType = paramData.side.toUpperCase() const amount = parseFloat(paramData.amount) const gasPrice = parseFloat(paramData.gas_price) || terra.lcd.config.gasPrices.uluna const gasAdjustment = paramData.gas_adjustment || terra.lcd.config.gasAdjustment diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index 8b1f58c..f257d78 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -91,7 +91,7 @@ router.post('/start', async (req, res) => { const paramData = getParamData(req.body) const baseTokenSymbol = paramData.base.toUpperCase() const quoteTokenSymbol = paramData.quote.toUpperCase() - const orderType = paramData.side + const orderType = paramData.side.toUpperCase() const privateKey = paramData.privateKey let gasPrice if (paramData.gasPrice) { @@ -157,8 +157,11 @@ router.post('/start', async (req, res) => { return } + const gasLimit = estimateGasLimit() + const gasCost = await fees.getGasCost(gasPrice, gasLimit) + // update pool - const tokenList = orderType === 'buy' + const tokenList = orderType === 'BUY' ? { in: baseTokenContractInfo.address, out: quoteTokenContractInfo.address } : { in: quoteTokenContractInfo.address, out: baseTokenContractInfo.address } await uniswap.update_tokens([tokenList.in, tokenList.out]) @@ -170,7 +173,9 @@ router.post('/start', async (req, res) => { success: true, base: baseTokenContractInfo, quote: quoteTokenContractInfo, - gasPrice: fees.ethGasPrice, + gasPrice: gasPrice, + gasLimit: gasLimit, + gasCost: gasCost, pools: uniswap.cachedRoutes.length, } res.status(200).json(result) @@ -212,6 +217,8 @@ router.post('/trade', async (req, res) => { } else { gasPrice = fees.ethGasPrice } + const gasLimit = estimateGasLimit() + const gasCost = await fees.getGasCost(gasPrice, gasLimit) try { // fetch the optimal pool mix from uniswap @@ -249,6 +256,8 @@ router.post('/trade', async (req, res) => { expectedIn: expectedAmount.toSignificant(8), price: price, gasPrice: gasPrice, + gasLimit, gasLimit, + gasCost, gasCost, txHash: tx.hash, }) } else { @@ -281,6 +290,8 @@ router.post('/trade', async (req, res) => { expectedOut: expectedAmount.toSignificant(8), price: parseFloat(price), gasPrice: gasPrice, + gasLimit, gasLimit, + gasCost: gasCost, txHash: tx.hash, }) } else { @@ -321,13 +332,14 @@ router.post('/price', async (req, res) => { const baseTokenAddress = baseTokenContractInfo.address const quoteTokenAddress = quoteTokenContractInfo.address const side = paramData.side.toUpperCase() - const gasLimit = estimateGasLimit() let gasPrice if (paramData.gasPrice) { gasPrice = parseFloat(paramData.gasPrice) } else { gasPrice = fees.ethGasPrice } + const gasLimit = estimateGasLimit() + const gasCost = await fees.getGasCost(gasPrice, gasLimit) try { // fetch the optimal pool mix from uniswap @@ -357,8 +369,9 @@ router.post('/price', async (req, res) => { amount: parseFloat(paramData.amount), expectedAmount: parseFloat(expectedAmount.toSignificant(8)), price: parseFloat(price), - gasLimit: gasLimit, gasPrice: gasPrice, + gasLimit: gasLimit, + gasCost: gasCost, trade: trade, }) } else { // no pool available diff --git a/src/services/fees.js b/src/services/fees.js index 20467d2..0535897 100644 --- a/src/services/fees.js +++ b/src/services/fees.js @@ -1,5 +1,6 @@ import { logger } from './logger'; import axios from 'axios' +import BigNumber from 'bignumber.js' require('dotenv').config() @@ -11,6 +12,7 @@ const ethGasStationApiKey = process.env.ETH_GAS_STATION_API_KEY const ethManualGasPrice = parseInt(process.env.MANUAL_GAS_PRICE) const ethGasStationURL = ethGasStationHost + '/api/ethgasAPI.json?api-key=' + ethGasStationApiKey const defaultRefreshInterval = 120 +const denom = BigNumber('1e+9') export default class Fees { constructor () { @@ -29,8 +31,8 @@ export default class Fees { console.log(`get ETHGasStation gas price (${gasLevel}): ${this.ethGasPrice} / interval: ${this.ethGasStationRefreshTime / 1000} sec`) } else { this.ethGasPrice = ethManualGasPrice + console.log(`get manual fixed gas price: ${this.ethGasPrice} / interval: ${this.ethGasStationRefreshTime / 1000} sec`) } - console.log('>>getETHGasStationFee ', this.ethGasPrice) } catch (err) { console.log(err); logger.error(err) @@ -42,4 +44,10 @@ export default class Fees { setTimeout(this.getETHGasStationFee.bind(this), this.ethGasStationRefreshTime); // update every x seconds } } + + // get gas cost + async getGasCost (gasPrice, gasLimit, inGwei = false) { + const cost = gasPrice * gasLimit + return inGwei ? cost : cost / denom + } } From aa15575924e254d7db8421ef8dd57550429fdb4a Mon Sep 17 00:00:00 2001 From: sdgoh Date: Wed, 3 Mar 2021 17:09:46 +0800 Subject: [PATCH 16/28] (fix) Uniswap no pool response as error instead of info * Add price check debugging --- src/routes/balancer.route.js | 13 +++++++++---- src/routes/uniswap.route.js | 21 ++++++++++++++++----- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/routes/balancer.route.js b/src/routes/balancer.route.js index 5c9e9ab..972b8d2 100644 --- a/src/routes/balancer.route.js +++ b/src/routes/balancer.route.js @@ -217,26 +217,31 @@ router.post('/price', async (req, res) => { const gasLimit = estimateGasLimit(swaps.length) const gasCost = await fees.getGasCost(gasPrice, gasLimit) + const tradeAmount = parseFloat(amount) + const expectedTradeAmount = parseInt(expectedAmount) / quoteDenomMultiplier + const tradePrice = expectedAmount / amount * baseDenomMultiplier / quoteDenomMultiplier + const result = { network: balancer.network, timestamp: initTime, latency: latency(initTime, Date.now()), base: baseTokenContractInfo, quote: quoteTokenContractInfo, - amount: parseFloat(paramData.amount), + amount: tradeAmount, side: side, - expectedAmount: parseInt(expectedAmount) / quoteDenomMultiplier, - price: expectedAmount / amount * baseDenomMultiplier / quoteDenomMultiplier, + expectedAmount: expectedTradeAmount, + price: tradePrice, gasPrice: gasPrice, gasLimit: gasLimit, gasCost: gasCost, swaps: swaps, } + debug(`Price ${baseTokenContractInfo.symbol}-${quoteTokenContractInfo.symbol} | ${expectedTradeAmount}(@${tradePrice}) - ${gasPrice}/${gasLimit}/${gasCost} ETH`) res.status(200).json(result) } else { // no pool available res.status(200).json({ info: statusMessages.no_pool_available, - message: '' + message: statusMessages.no_pool_available }) } } catch (err) { diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index f257d78..2b6c2b2 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -341,6 +341,7 @@ router.post('/price', async (req, res) => { const gasLimit = estimateGasLimit() const gasCost = await fees.getGasCost(gasPrice, gasLimit) + try { // fetch the optimal pool mix from uniswap const { trade, expectedAmount } = side === 'BUY' @@ -360,20 +361,26 @@ router.post('/price', async (req, res) => { ? trade.executionPrice.invert().toSignificant(8) : trade.executionPrice.toSignificant(8) - res.status(200).json({ + const tradeAmount = parseFloat(amount) + const expectedTradeAmount = parseFloat(expectedAmount.toSignificant(8)) + const tradePrice = parseFloat(price) + + const result = { network: uniswap.network, timestamp: initTime, latency: latency(initTime, Date.now()), base: baseTokenAddress, quote: quoteTokenAddress, - amount: parseFloat(paramData.amount), - expectedAmount: parseFloat(expectedAmount.toSignificant(8)), - price: parseFloat(price), + amount: tradeAmount, + expectedAmount: expectedTradeAmount, + price: tradePrice, gasPrice: gasPrice, gasLimit: gasLimit, gasCost: gasCost, trade: trade, - }) + } + debug(`Price ${baseTokenContractInfo.symbol}-${quoteTokenContractInfo.symbol} | ${expectedTradeAmount} | ${tradePrice} - ${gasPrice}/${gasLimit}/${gasCost} ETH`) + res.status(200).json(result) } else { // no pool available res.status(200).json({ info: statusMessages.no_pool_available, @@ -391,6 +398,10 @@ router.post('/price', async (req, res) => { reason = getErrorMessage(err.message) if (reason === statusMessages.no_pool_available) { errCode = 200 + res.status(errCode).json({ + info: reason, + message: err + }) } } else { err.reason ? reason = err.reason : reason = statusMessages.operation_error From 0a40ecd4f2728101d4330f4b5757468f07169e04 Mon Sep 17 00:00:00 2001 From: sdgoh Date: Sun, 7 Mar 2021 22:38:07 +0800 Subject: [PATCH 17/28] (feat) check for valid token symbols else return error 500 --- src/routes/balancer.route.js | 12 +++++++++++- src/routes/uniswap.route.js | 13 +++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/routes/balancer.route.js b/src/routes/balancer.route.js index 972b8d2..ae49e3f 100644 --- a/src/routes/balancer.route.js +++ b/src/routes/balancer.route.js @@ -93,6 +93,16 @@ router.post('/start', async (req, res) => { const baseTokenContractInfo = eth.getERC20TokenAddresses(baseTokenSymbol) const quoteTokenContractInfo = eth.getERC20TokenAddresses(quoteTokenSymbol) + // check for valid token symbols + if (baseTokenContractInfo === undefined || quoteTokenContractInfo === undefined) { + const undefinedToken = baseTokenContractInfo === undefined ? baseTokenSymbol : quoteTokenSymbol + res.status(500).json({ + error: `Token ${undefinedToken} contract address not found`, + message: `Token contract address not found for ${undefinedToken}. Check token list source`, + }) + return + } + // check allowance const spender = eth.spenders.balancer let wallet @@ -236,7 +246,7 @@ router.post('/price', async (req, res) => { gasCost: gasCost, swaps: swaps, } - debug(`Price ${baseTokenContractInfo.symbol}-${quoteTokenContractInfo.symbol} | ${expectedTradeAmount}(@${tradePrice}) - ${gasPrice}/${gasLimit}/${gasCost} ETH`) + debug(`Price ${side} ${baseTokenContractInfo.symbol}-${quoteTokenContractInfo.symbol} | amount:${amount} (rate:${tradePrice}) - gasPrice:${gasPrice} gasLimit:${gasLimit} estimated fee:${gasCost} ETH`) res.status(200).json(result) } else { // no pool available res.status(200).json({ diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index 2b6c2b2..ffeb5c3 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -91,7 +91,6 @@ router.post('/start', async (req, res) => { const paramData = getParamData(req.body) const baseTokenSymbol = paramData.base.toUpperCase() const quoteTokenSymbol = paramData.quote.toUpperCase() - const orderType = paramData.side.toUpperCase() const privateKey = paramData.privateKey let gasPrice if (paramData.gasPrice) { @@ -103,6 +102,16 @@ router.post('/start', async (req, res) => { // get token contract address and decimal const baseTokenContractInfo = eth.getERC20TokenAddresses(baseTokenSymbol) const quoteTokenContractInfo = eth.getERC20TokenAddresses(quoteTokenSymbol) + + // check for valid token symbols + if (baseTokenContractInfo === undefined || quoteTokenContractInfo === undefined) { + const undefinedToken = baseTokenContractInfo === undefined ? baseTokenSymbol : quoteTokenSymbol + res.status(500).json({ + error: `Token ${undefinedToken} contract address not found`, + message: `Token contract address not found for ${undefinedToken}. Check token list source`, + }) + return + } // check allowance const spender = eth.spenders.balancer @@ -379,7 +388,7 @@ router.post('/price', async (req, res) => { gasCost: gasCost, trade: trade, } - debug(`Price ${baseTokenContractInfo.symbol}-${quoteTokenContractInfo.symbol} | ${expectedTradeAmount} | ${tradePrice} - ${gasPrice}/${gasLimit}/${gasCost} ETH`) + debug(`Price ${side} ${baseTokenContractInfo.symbol}-${quoteTokenContractInfo.symbol} | amount:${amount} (rate:${tradePrice}) - gasPrice:${gasPrice} gasLimit:${gasLimit} estimated fee:${gasCost} ETH`) res.status(200).json(result) } else { // no pool available res.status(200).json({ From a1f72cea3bb52299861e72989eba8b8bc3288b02 Mon Sep 17 00:00:00 2001 From: sdgoh Date: Thu, 11 Mar 2021 03:18:21 +0800 Subject: [PATCH 18/28] (feat) Convert proper value for eth gas station set in .env --- src/services/utils.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/services/utils.js b/src/services/utils.js index 9c9cfe1..23182cc 100644 --- a/src/services/utils.js +++ b/src/services/utils.js @@ -87,11 +87,12 @@ export const loadConfig = () => { ethereum_chain: process.env.ETHEREUM_CHAIN, exchange_proxy: process.env.EXCHANGE_PROXY, ethereum_token_list_url: process.env.ETHEREUM_TOKEN_LIST_URL, - enable_eth_gas_station: process.env.ENABLE_ETH_GAS_STATION, + enable_eth_gas_station: process.env.ENABLE_ETH_GAS_STATION != null ? (process.env.ENABLE_ETH_GAS_STATION.toLowerCase() == 'true') : false, eth_gas_station_gas_level: process.env.ETH_GAS_STATION_GAS_LEVEL, - eth_gas_station_refresh_time: process.env.ETH_GAS_STATION_REFRESH_TIME, + eth_gas_station_refresh_time: process.env.ETH_GAS_STATION_REFRESH_TIME != null ? parseFloat(process.env.ETH_GAS_STATION_REFRESH_TIME) : null, + manual_gas_price: process.env.MANUAL_GAS_PRICE != null ? parseFloat(process.env.MANUAL_GAS_PRICE) : null, react_app_subgraph_url: process.env.REACT_APP_SUBGRAPH_URL, - balancer_max_swaps: process.env.BALANCER_MAX_SWAPS, + balancer_max_swaps: process.env.BALANCER_MAX_SWAPS != null ? parseInt(process.env.BALANCER_MAX_SWAPS) : null, uniswap_router: process.env.UNISWAP_ROUTER, terra_lcd_url: process.env.TERRA_LCD_URL, terra_chain: process.env.TERRA_CHAIN From 36797e0e9c6dff838e559f2100b8a109c76d3e0c Mon Sep 17 00:00:00 2001 From: sdgoh Date: Fri, 12 Mar 2021 12:49:38 +0800 Subject: [PATCH 19/28] Remove unnecessary uniswap pool update in `/start` endpoint --- src/routes/uniswap.route.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index ffeb5c3..fb9a075 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -169,11 +169,6 @@ router.post('/start', async (req, res) => { const gasLimit = estimateGasLimit() const gasCost = await fees.getGasCost(gasPrice, gasLimit) - // update pool - const tokenList = orderType === 'BUY' - ? { in: baseTokenContractInfo.address, out: quoteTokenContractInfo.address } - : { in: quoteTokenContractInfo.address, out: baseTokenContractInfo.address } - await uniswap.update_tokens([tokenList.in, tokenList.out]) const result = { network: eth.network, @@ -185,7 +180,6 @@ router.post('/start', async (req, res) => { gasPrice: gasPrice, gasLimit: gasLimit, gasCost: gasCost, - pools: uniswap.cachedRoutes.length, } res.status(200).json(result) }) From aec0f15c03b038e417a6cb0cd63cde4bd3f9c8d5 Mon Sep 17 00:00:00 2001 From: sdgoh Date: Sat, 13 Mar 2021 15:35:54 +0800 Subject: [PATCH 20/28] (feat) Add Perpetual Finance provider url overwrite --- .env.example | 5 +++++ src/services/perpetual_finance.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 78f73a4..789236e 100644 --- a/.env.example +++ b/.env.example @@ -70,3 +70,8 @@ MANUAL_GAS_PRICE=100 # Balancer Config BALANCER_MAX_SWAPS=4 + + +# Perpetual Finance Provider URL +# default: https://dai.poa.network , https://rpc.xdaichain.com, etc +XDAI_PROVIDER={providerUrl} diff --git a/src/services/perpetual_finance.js b/src/services/perpetual_finance.js index 7707cec..f2d482e 100644 --- a/src/services/perpetual_finance.js +++ b/src/services/perpetual_finance.js @@ -13,7 +13,7 @@ const TetherTokenArtifact = require("@perp/contract/build/contracts/TetherToken. const GAS_LIMIT = 2123456; const DEFAULT_DECIMALS = 18; const CONTRACT_ADDRESSES = 'https://metadata.perp.exchange/'; -const XDAI_PROVIDER = 'https://dai.poa.network'; +const XDAI_PROVIDER = process.env.XDAI_PROVIDER || 'https://dai.poa.network'; const PNL_OPTION_SPOT_PRICE = 0; const UPDATE_PERIOD = 60000; // stop updating prices after 30 secs from last request From 54c33ee2f6d7330eed24976ca0acdd1e02c6bfbe Mon Sep 17 00:00:00 2001 From: sdgoh Date: Sun, 14 Mar 2021 23:44:53 +0800 Subject: [PATCH 21/28] Update balancer on-chain balance on price lookup * get on-chain pool data update to prevent change in pool balance prior to trade execution * remove pool cache loop during strategy initialisation --- src/routes/balancer.route.js | 6 +----- src/routes/eth.route.js | 12 +++++++++--- src/services/balancer.js | 27 +++++++++++++++++++-------- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/routes/balancer.route.js b/src/routes/balancer.route.js index ae49e3f..d9c3217 100644 --- a/src/routes/balancer.route.js +++ b/src/routes/balancer.route.js @@ -159,9 +159,6 @@ router.post('/start', async (req, res) => { const gasLimit = estimateGasLimit(balancer.maxSwaps) const gasCost = await fees.getGasCost(gasPrice, gasLimit) - // update pool - await balancer.fetchPool(baseTokenContractInfo.address, quoteTokenContractInfo.address) - const result = { network: eth.network, timestamp: initTime, @@ -172,9 +169,8 @@ router.post('/start', async (req, res) => { gasPrice: gasPrice, gasLimit: gasLimit, gasCost: gasCost, - pools: balancer.cachedPools.pools.length, } - console.log('caching swap pools (total)', balancer.cachedPools.pools.length) + console.log('Initializing balancer') res.status(200).json(result) }) diff --git a/src/routes/eth.route.js b/src/routes/eth.route.js index 526f477..53dfe79 100644 --- a/src/routes/eth.route.js +++ b/src/routes/eth.route.js @@ -65,9 +65,15 @@ router.post('/balances', async (req, res) => { try { Promise.all( Object.keys(tokenContractList).map(async (symbol, index) => { - const address = tokenContractList[symbol].address - const decimals = tokenContractList[symbol].decimals - balances[symbol] = await eth.getERC20Balance(wallet, address, decimals) + if (tokenContractList[symbol] !== undefined) { + const address = tokenContractList[symbol].address + const decimals = tokenContractList[symbol].decimals + balances[symbol] = await eth.getERC20Balance(wallet, address, decimals) + } else { + const err = `Token contract info for ${symbol} not found` + logger.error('Token info not found', { message: err }) + debug(err) + } } )).then(() => { console.log('eth.route - Get Account Balance', { message: JSON.stringify(tokenList) }) diff --git a/src/services/balancer.js b/src/services/balancer.js index de42614..dc4bb43 100644 --- a/src/services/balancer.js +++ b/src/services/balancer.js @@ -23,6 +23,7 @@ export default class Balancer { this.gasPerSwap = GAS_PER_SWAP this.maxSwaps = process.env.BALANCER_MAX_SWAPS || 4 this.exchangeProxy = process.env.EXCHANGE_PROXY; + this.cachedPools = [] switch (network) { case 'mainnet': @@ -39,28 +40,35 @@ export default class Balancer { } async fetchPool (tokenIn, tokenOut) { - const pools = await sor.getPoolsWithTokens(tokenIn, tokenOut) - this.cachedPools = pools + this.cachedPools[tokenIn + tokenOut] = pools if (pools.pools.length === 0) { debug('>>> No pools contain the tokens provided.', { message: this.network }); return {}; } - debug('>>> Pools Retrieved.', { message: this.network }) - setTimeout(this.fetchPool.bind(this), 15000); // update every x seconds + debug(`>>> ${pools.pools.length} Pools Retrieved.`, { message: this.network }) + } + + async getCachedPools (tokenIn, tokenOut) { + const cachePools = this.cachedPools[tokenIn + tokenOut].pools + debug(`>>> get cached Pools. ${tokenIn + tokenOut}`, { message: `total pools: ${cachePools.length}` }) + return cachePools } async priceSwapIn (tokenIn, tokenOut, tokenInAmount, maxSwaps = this.maxSwaps) { // Fetch all the pools that contain the tokens provided try { // Get current on-chain data about the fetched pools + await this.fetchPool(tokenIn, tokenOut) + let poolData + const cachedPools = await this.getCachedPools(tokenIn, tokenOut) if (this.network === 'mainnet') { - poolData = await sor.parsePoolDataOnChain(this.cachedPools.pools, tokenIn, tokenOut, this.multiCall, this.provider) + poolData = await sor.parsePoolDataOnChain(cachedPools, tokenIn, tokenOut, this.multiCall, this.provider) } else { // Kovan multicall throws an ENS error - poolData = await sor.parsePoolData(this.cachedPools.pools, tokenIn, tokenOut) + poolData = await sor.parsePoolData(cachedPools, tokenIn, tokenOut) } // Parse the pools and pass them to smart order outer to get the swaps needed @@ -102,12 +110,15 @@ export default class Balancer { // Fetch all the pools that contain the tokens provided try { // Get current on-chain data about the fetched pools + await this.fetchPool(tokenIn, tokenOut) + let poolData + const cachedPools = await this.getCachedPools(tokenIn, tokenOut) if (this.network === 'mainnet') { - poolData = await sor.parsePoolDataOnChain(this.cachedPools.pools, tokenIn, tokenOut, this.multiCall, this.provider) + poolData = await sor.parsePoolDataOnChain(cachedPools, tokenIn, tokenOut, this.multiCall, this.provider) } else { // Kovan multicall throws an ENS error - poolData = await sor.parsePoolData(this.cachedPools.pools, tokenIn, tokenOut) + poolData = await sor.parsePoolData(cachedPools, tokenIn, tokenOut) } // Parse the pools and pass them to smart order outer to get the swaps needed From 9ceb1c85119165c57ec4f24454a44592d6251197 Mon Sep 17 00:00:00 2001 From: vic-en <31972210+vic-en@users.noreply.github.com> Date: Tue, 16 Mar 2021 15:27:03 +0100 Subject: [PATCH 22/28] Update spender when Uniswap is being used. --- src/routes/uniswap.route.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index fb9a075..6a7952e 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -114,7 +114,7 @@ router.post('/start', async (req, res) => { } // check allowance - const spender = eth.spenders.balancer + const spender = eth.spenders.uniswap let wallet try { wallet = new ethers.Wallet(privateKey, eth.provider) From 2fb292e093cdbfa727ca2d2e7773a24e77d41e0d Mon Sep 17 00:00:00 2001 From: vic-en Date: Thu, 18 Mar 2021 13:46:15 +0100 Subject: [PATCH 23/28] (refactor) make start endpoint to only initiate pool/path and not handle approval --- src/routes/balancer.route.js | 98 +++++++++--------------------------- src/routes/uniswap.route.js | 98 +++++++++--------------------------- 2 files changed, 47 insertions(+), 149 deletions(-) diff --git a/src/routes/balancer.route.js b/src/routes/balancer.route.js index d9c3217..da70ff5 100644 --- a/src/routes/balancer.route.js +++ b/src/routes/balancer.route.js @@ -67,21 +67,17 @@ router.post('/gas-limit', async (req, res) => { } }) -router.post('/start', async (req, res) => { +router.get('/start', async (req, res) => { /* POST: /eth/balancer/start x-www-form-urlencoded: { - "quote":"BAT" - "base":"USDC" - "amount":0.1 + "pairs":"[ETH-USDT, ...]" "gasPrice":30 } */ const initTime = Date.now() - const paramData = getParamData(req.body) - const baseTokenSymbol = paramData.base.toUpperCase() - const quoteTokenSymbol = paramData.quote.toUpperCase() - const privateKey = paramData.privateKey + const paramData = getParamData(req.query) + const pairs = JSON.parse(paramData.pairs) let gasPrice if (paramData.gasPrice) { gasPrice = parseFloat(paramData.gasPrice) @@ -89,73 +85,28 @@ router.post('/start', async (req, res) => { gasPrice = fees.ethGasPrice } - // get token contract address and decimal - const baseTokenContractInfo = eth.getERC20TokenAddresses(baseTokenSymbol) - const quoteTokenContractInfo = eth.getERC20TokenAddresses(quoteTokenSymbol) - - // check for valid token symbols - if (baseTokenContractInfo === undefined || quoteTokenContractInfo === undefined) { - const undefinedToken = baseTokenContractInfo === undefined ? baseTokenSymbol : quoteTokenSymbol - res.status(500).json({ - error: `Token ${undefinedToken} contract address not found`, - message: `Token contract address not found for ${undefinedToken}. Check token list source`, - }) - return - } - - // check allowance - const spender = eth.spenders.balancer - let wallet - try { - wallet = new ethers.Wallet(privateKey, eth.provider) - } catch (err) { - logger.error(req.originalUrl, { message: err }) - let reason - err.reason ? reason = err.reason : reason = 'Error getting wallet' - res.status(500).json({ - error: reason, - message: err - }) - return - } - - const tokenAddressList = {} - tokenAddressList[baseTokenContractInfo.address] = baseTokenContractInfo.decimals - tokenAddressList[quoteTokenContractInfo.address] = quoteTokenContractInfo.decimals - - const allowance = {} - let decimals - let approvalAmount - - try { - await fees.getETHGasStationFee() - - Promise.all( - Object.keys(tokenAddressList).map(async (key, index) => - allowance[key] = await eth.getERC20Allowance(wallet, spender, key, tokenAddressList[key]) - )).then(() => { - const approvals = {} - Promise.all( - Object.keys(allowance).map(async (address, index) => { - decimals = tokenAddressList[address] - paramData.approvalAmount - ? approvalAmount = ethers.utils.parseUnits(paramData.approvalAmount, decimals) - : approvalAmount = ethers.utils.parseUnits('1000000000', decimals) // approve for 1 billion units if no amount specified - approvals[address] = allowance[address] === 0 ? await eth.approveERC20(wallet, spender, address, approvalAmount, gasPrice) : '' - })).then(() => { + // get token contract address and cache pools + for (let pair of pairs){ + pair = pair.split("-") + const baseTokenSymbol = pair[0] + const quoteTokenSymbol = pair[1] + const baseTokenContractInfo = eth.getERC20TokenAddresses(baseTokenSymbol) + const quoteTokenContractInfo = eth.getERC20TokenAddresses(quoteTokenSymbol) + + // check for valid token symbols + if (baseTokenContractInfo === undefined || quoteTokenContractInfo === undefined) { + const undefinedToken = baseTokenContractInfo === undefined ? baseTokenSymbol : quoteTokenSymbol + res.status(500).json({ + error: `Token ${undefinedToken} contract address not found`, + message: `Token contract address not found for ${undefinedToken}. Check token list source`, }) - }) - } catch (err) { - logger.error(req.originalUrl, { message: err }) - let reason - err.reason ? reason = err.reason : reason = statusMessages.operation_error - res.status(500).json({ - error: reason, - message: err - }) - return + return + } + await Promise.allSettled([balancer.fetchPool(baseTokenContractInfo.address, quoteTokenContractInfo.address), + balancer.fetchPool(quoteTokenContractInfo.address, baseTokenContractInfo.address)]) } + const gasLimit = estimateGasLimit(balancer.maxSwaps) const gasCost = await fees.getGasCost(gasPrice, gasLimit) @@ -164,8 +115,7 @@ router.post('/start', async (req, res) => { timestamp: initTime, latency: latency(initTime, Date.now()), success: true, - base: baseTokenContractInfo, - quote: quoteTokenContractInfo, + pairs: pairs, gasPrice: gasPrice, gasLimit: gasLimit, gasCost: gasCost, diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index 6a7952e..6443170 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -77,21 +77,17 @@ router.post('/gas-limit', async (req, res) => { } }) -router.post('/start', async (req, res) => { +router.get('/start', async (req, res) => { /* POST: /eth/uniswap/start x-www-form-urlencoded: { - "quote":"BAT" - "base":"DAI" - "amount":0.1 + "pairs":"[ETH-USDT, ...]" "gasPrice":30 } */ const initTime = Date.now() - const paramData = getParamData(req.body) - const baseTokenSymbol = paramData.base.toUpperCase() - const quoteTokenSymbol = paramData.quote.toUpperCase() - const privateKey = paramData.privateKey + const paramData = getParamData(req.query) + const pairs = JSON.parse(paramData.pairs) let gasPrice if (paramData.gasPrice) { gasPrice = parseFloat(paramData.gasPrice) @@ -99,71 +95,24 @@ router.post('/start', async (req, res) => { gasPrice = fees.ethGasPrice } - // get token contract address and decimal - const baseTokenContractInfo = eth.getERC20TokenAddresses(baseTokenSymbol) - const quoteTokenContractInfo = eth.getERC20TokenAddresses(quoteTokenSymbol) - - // check for valid token symbols - if (baseTokenContractInfo === undefined || quoteTokenContractInfo === undefined) { - const undefinedToken = baseTokenContractInfo === undefined ? baseTokenSymbol : quoteTokenSymbol - res.status(500).json({ - error: `Token ${undefinedToken} contract address not found`, - message: `Token contract address not found for ${undefinedToken}. Check token list source`, - }) - return - } - - // check allowance - const spender = eth.spenders.uniswap - let wallet - try { - wallet = new ethers.Wallet(privateKey, eth.provider) - } catch (err) { - logger.error(req.originalUrl, { message: err }) - let reason - err.reason ? reason = err.reason : reason = 'Error getting wallet' - res.status(500).json({ - error: reason, - message: err - }) - return - } - - const tokenAddressList = {} - tokenAddressList[baseTokenContractInfo.address] = baseTokenContractInfo.decimals - tokenAddressList[quoteTokenContractInfo.address] = quoteTokenContractInfo.decimals - - const allowance = {} - let decimals - let approvalAmount - - try { - await fees.getETHGasStationFee() + // get token contract address and cache paths + for (let pair of pairs){ + pair = pair.split("-") + const baseTokenSymbol = pair[0] + const quoteTokenSymbol = pair[1] + const baseTokenContractInfo = eth.getERC20TokenAddresses(baseTokenSymbol) + const quoteTokenContractInfo = eth.getERC20TokenAddresses(quoteTokenSymbol) - Promise.all( - Object.keys(tokenAddressList).map(async (key, index) => - allowance[key] = await eth.getERC20Allowance(wallet, spender, key, tokenAddressList[key]) - )).then(() => { - const approvals = {} - Promise.all( - Object.keys(allowance).map(async (address, index) => { - decimals = tokenAddressList[address] - paramData.approvalAmount - ? approvalAmount = ethers.utils.parseUnits(paramData.approvalAmount, decimals) - : approvalAmount = ethers.utils.parseUnits('1000000000', decimals) // approve for 1 billion units if no amount specified - approvals[address] = allowance[address] === 0 ? await eth.approveERC20(wallet, spender, address, approvalAmount, gasPrice) : '' - })).then(() => { + // check for valid token symbols + if (baseTokenContractInfo === undefined || quoteTokenContractInfo === undefined) { + const undefinedToken = baseTokenContractInfo === undefined ? baseTokenSymbol : quoteTokenSymbol + res.status(500).json({ + error: `Token ${undefinedToken} contract address not found`, + message: `Token contract address not found for ${undefinedToken}. Check token list source`, }) - }) - } catch (err) { - logger.error(req.originalUrl, { message: err }) - let reason - err.reason ? reason = err.reason : reason = statusMessages.operation_error - res.status(500).json({ - error: reason, - message: err - }) - return + return + } + await Promise.allSettled([uniswap.update_tokens([baseTokenContractInfo.address, quoteTokenContractInfo.address])]) } const gasLimit = estimateGasLimit() @@ -175,8 +124,7 @@ router.post('/start', async (req, res) => { timestamp: initTime, latency: latency(initTime, Date.now()), success: true, - base: baseTokenContractInfo, - quote: quoteTokenContractInfo, + pairs: pairs, gasPrice: gasPrice, gasLimit: gasLimit, gasCost: gasCost, @@ -344,7 +292,7 @@ router.post('/price', async (req, res) => { const gasLimit = estimateGasLimit() const gasCost = await fees.getGasCost(gasPrice, gasLimit) - + try { // fetch the optimal pool mix from uniswap const { trade, expectedAmount } = side === 'BUY' @@ -367,7 +315,7 @@ router.post('/price', async (req, res) => { const tradeAmount = parseFloat(amount) const expectedTradeAmount = parseFloat(expectedAmount.toSignificant(8)) const tradePrice = parseFloat(price) - + const result = { network: uniswap.network, timestamp: initTime, From 9cbba7d281bfe87be629240717f86d84d62f7ef1 Mon Sep 17 00:00:00 2001 From: sdgoh Date: Wed, 24 Mar 2021 18:03:40 +0800 Subject: [PATCH 24/28] (fix) incorrect token update function name * update start function to use POST to standard request body param (json in particular). --- src/routes/balancer.route.js | 8 ++++---- src/routes/uniswap.route.js | 8 ++++---- src/services/uniswap.js | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/routes/balancer.route.js b/src/routes/balancer.route.js index da70ff5..07b2602 100644 --- a/src/routes/balancer.route.js +++ b/src/routes/balancer.route.js @@ -67,16 +67,16 @@ router.post('/gas-limit', async (req, res) => { } }) -router.get('/start', async (req, res) => { - /* +router.post('/start', async (req, res) => { + /* POST: /eth/balancer/start x-www-form-urlencoded: { - "pairs":"[ETH-USDT, ...]" + "pairs":'["ETH-USDT", ...]' "gasPrice":30 } */ const initTime = Date.now() - const paramData = getParamData(req.query) + const paramData = getParamData(req.body) const pairs = JSON.parse(paramData.pairs) let gasPrice if (paramData.gasPrice) { diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index 6443170..5021c31 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -77,16 +77,16 @@ router.post('/gas-limit', async (req, res) => { } }) -router.get('/start', async (req, res) => { +router.post('/start', async (req, res) => { /* POST: /eth/uniswap/start x-www-form-urlencoded: { - "pairs":"[ETH-USDT, ...]" + "pairs":'["ETH-USDT", ...]' "gasPrice":30 } */ const initTime = Date.now() - const paramData = getParamData(req.query) + const paramData = getParamData(req.body) const pairs = JSON.parse(paramData.pairs) let gasPrice if (paramData.gasPrice) { @@ -112,7 +112,7 @@ router.get('/start', async (req, res) => { }) return } - await Promise.allSettled([uniswap.update_tokens([baseTokenContractInfo.address, quoteTokenContractInfo.address])]) + await Promise.allSettled([uniswap.extend_update_pairs([baseTokenContractInfo.address, quoteTokenContractInfo.address])]) } const gasLimit = estimateGasLimit() diff --git a/src/services/uniswap.js b/src/services/uniswap.js index a1074ee..d89878e 100644 --- a/src/services/uniswap.js +++ b/src/services/uniswap.js @@ -9,7 +9,7 @@ const routeTokens = require('../static/uniswap_route_tokens.json') // constants const ROUTER = process.env.UNISWAP_ROUTER const GAS_LIMIT = process.env.UNISWAP_GAS_LIMIT || 150688; -const TTL = process.env.UNISWAP_TTL || 60; +const TTL = process.env.UNISWAP_TTL || 300; const UPDATE_PERIOD = process.env.UNISWAP_UPDATE_PERIOD || 300000; // stop updating pair after 5 minutes from last request export default class Uniswap { From f3a8c65afa6d7b5498e293465b9831a0c6ad3c59 Mon Sep 17 00:00:00 2001 From: sdgoh Date: Wed, 24 Mar 2021 18:22:00 +0800 Subject: [PATCH 25/28] (fix) revert Uniswap, Balancer start endpoint to GET * reduce redundant params being sent over stand POST api call in client --- src/routes/balancer.route.js | 4 ++-- src/routes/uniswap.route.js | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/routes/balancer.route.js b/src/routes/balancer.route.js index 07b2602..a27fe5d 100644 --- a/src/routes/balancer.route.js +++ b/src/routes/balancer.route.js @@ -67,7 +67,7 @@ router.post('/gas-limit', async (req, res) => { } }) -router.post('/start', async (req, res) => { +router.get('/start', async (req, res) => { /* POST: /eth/balancer/start x-www-form-urlencoded: { @@ -76,7 +76,7 @@ router.post('/start', async (req, res) => { } */ const initTime = Date.now() - const paramData = getParamData(req.body) + const paramData = getParamData(req.query) const pairs = JSON.parse(paramData.pairs) let gasPrice if (paramData.gasPrice) { diff --git a/src/routes/uniswap.route.js b/src/routes/uniswap.route.js index 5021c31..812e0ef 100644 --- a/src/routes/uniswap.route.js +++ b/src/routes/uniswap.route.js @@ -77,16 +77,16 @@ router.post('/gas-limit', async (req, res) => { } }) -router.post('/start', async (req, res) => { +router.get('/start', async (req, res) => { /* POST: /eth/uniswap/start x-www-form-urlencoded: { - "pairs":'["ETH-USDT", ...]' + "pairs":"[ETH-USDT, ...]" "gasPrice":30 } */ const initTime = Date.now() - const paramData = getParamData(req.body) + const paramData = getParamData(req.query) const pairs = JSON.parse(paramData.pairs) let gasPrice if (paramData.gasPrice) { From 95fcfcdb53d524e640574c176d9c88379ba97730 Mon Sep 17 00:00:00 2001 From: vic-en Date: Mon, 29 Mar 2021 21:31:44 +0100 Subject: [PATCH 26/28] (feat) allow decimal values for uniswap slippage --- package.json | 1 + src/services/uniswap.js | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0af6746..87a2e13 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@balancer-labs/sor": "^0.3.3", "@terra-money/terra.js": "^0.5.8", "@uniswap/sdk": "^3.0.3", + "mathsjs": "^1.4.0", "app-root-path": "^3.0.0", "axios": "^0.21.1", "bignumber.js": "^9.0.0", diff --git a/src/services/uniswap.js b/src/services/uniswap.js index d89878e..8fe7bbb 100644 --- a/src/services/uniswap.js +++ b/src/services/uniswap.js @@ -1,6 +1,7 @@ import { logger } from './logger'; const debug = require('debug')('router') +const math = require('mathjs') const uni = require('@uniswap/sdk') const ethers = require('ethers') const proxyArtifact = require('../static/uniswap_v2_router_abi.json') @@ -18,8 +19,8 @@ export default class Uniswap { this.network = process.env.ETHEREUM_CHAIN this.provider = new ethers.providers.JsonRpcProvider(this.providerUrl) this.router = ROUTER; - this.allowedSlippage = new uni.Percent(process.env.UNISWAP_ALLOWED_SLIPPAGE, '100') - console.log(this.allowedSlippage) + this.slippage = math.fraction(process.env.UNISWAP_ALLOWED_SLIPPAGE) + this.allowedSlippage = new uni.Percent(this.slippage.n, (this.slippage.d * 100)) this.pairsCacheTime = process.env.UNISWAP_PAIRS_CACHE_TIME this.gasLimit = GAS_LIMIT this.expireTokenPairUpdate = UPDATE_PERIOD From 2d8feb089db7752750e41af1a3de4ff9ffa70733 Mon Sep 17 00:00:00 2001 From: sdgoh Date: Tue, 30 Mar 2021 18:45:04 +0800 Subject: [PATCH 27/28] (fix) incorrect mathjs module in package.json --- package.json | 8 ++++---- yarn.lock | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 87a2e13..817ee0d 100644 --- a/package.json +++ b/package.json @@ -12,16 +12,16 @@ "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { - "@perp/contract": "^1.0.6", "@balancer-labs/sor": "^0.3.3", + "@perp/contract": "^1.0.6", "@terra-money/terra.js": "^0.5.8", "@uniswap/sdk": "^3.0.3", - "mathsjs": "^1.4.0", "app-root-path": "^3.0.0", "axios": "^0.21.1", "bignumber.js": "^9.0.0", "body-parser": "^1.19.0", "capture-console": "^1.0.1", + "cross-fetch": "^3.0.6", "debug": "^4.2.0", "dotenv": "^8.2.0", "ethers": "^5.0.14", @@ -30,11 +30,11 @@ "helmet": "^4.1.1", "http-status-codes": "^2.1.3", "lodash": "^4.17.20", + "mathjs": "^9.3.0", "moment": "^2.29.1", "util": "^0.12.3", "winston": "^3.3.3", - "winston-daily-rotate-file": "^4.5.0", - "cross-fetch": "^3.0.6" + "winston-daily-rotate-file": "^4.5.0" }, "devDependencies": { "@babel/core": "^7.11.6", diff --git a/yarn.lock b/yarn.lock index b12ecfa..a3a5e0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1779,6 +1779,11 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= +complex.js@^2.0.11: + version "2.0.12" + resolved "https://registry.yarnpkg.com/complex.js/-/complex.js-2.0.12.tgz#fa4df97d8928e5f7b6a86b35bdeecc3a3eda8a22" + integrity sha512-oQX99fwL6LrTVg82gDY1dIWXy6qZRnRL35N+YhIX0N7tSwsa0KFy6IEMHTNuCW4mP7FS7MEqZ/2I/afzYwPldw== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1928,6 +1933,11 @@ decimal.js@^10.2.0: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231" integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw== +decimal.js@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" + integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== + decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" @@ -2129,6 +2139,11 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= +escape-latex@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/escape-latex/-/escape-latex-1.2.0.tgz#07c03818cf7dac250cce517f4fda1b001ef2bca1" + integrity sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -2518,6 +2533,11 @@ forwarded@~0.1.2: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= +fraction.js@^4.0.13: + version "4.0.13" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.0.13.tgz#3c1c315fa16b35c85fffa95725a36fa729c69dfe" + integrity sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA== + fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -2995,6 +3015,11 @@ isomorphic-fetch@^2.2.1: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" +javascript-natural-sort@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" + integrity sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k= + js-sha3@0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" @@ -3180,6 +3205,20 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" +mathjs@^9.3.0: + version "9.3.0" + resolved "https://registry.yarnpkg.com/mathjs/-/mathjs-9.3.0.tgz#59cc43b536b22616197e56da303604b430daa6ac" + integrity sha512-0kYW+TXgB8lCqUj5wHR2hqAO2twSbPRelSFgRJXiwAx4nM6FrIb43Jd6XhW7sVbwYB+9HCNiyg5Kn8VYeB7ilg== + dependencies: + complex.js "^2.0.11" + decimal.js "^10.2.1" + escape-latex "^1.2.0" + fraction.js "^4.0.13" + javascript-natural-sort "^0.7.1" + seedrandom "^3.0.5" + tiny-emitter "^2.1.0" + typed-function "^2.0.0" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -3894,6 +3933,11 @@ secp256k1@^4.0.2: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" +seedrandom@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" + integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== + semver-diff@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" @@ -4171,6 +4215,11 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +tiny-emitter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + tiny-invariant@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" @@ -4261,6 +4310,11 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/typed-function/-/typed-function-2.0.0.tgz#15ab3825845138a8b1113bd89e60cd6a435739e8" + integrity sha512-Hhy1Iwo/e4AtLZNK10ewVVcP2UEs408DS35ubP825w/YgSBK1KVLwALvvIG4yX75QJrxjCpcWkzkVRB0BwwYlA== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" From c54af163658e2d523a48cb7d5fb9e760276e638b Mon Sep 17 00:00:00 2001 From: sdgoh Date: Wed, 31 Mar 2021 14:56:31 +0800 Subject: [PATCH 28/28] Add uniswap slippage example using decimal value --- .env.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 12635af..8b3e860 100644 --- a/.env.example +++ b/.env.example @@ -47,7 +47,7 @@ EXCHANGE_PROXY={exchange_proxy} # It was built from commit 6961711. UNISWAP_ROUTER=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D # allowed slippage for swap transactions -UNISWAP_ALLOWED_SLIPPAGE=1 +UNISWAP_ALLOWED_SLIPPAGE=1.5 # restrict updating pairs that have no reserves or failed for 5 minutes UNISWAP_NO_RESERVE_CHECK_INTERVAL=300000 # cache info about pair for 1 second