mirror of
https://github.com/Instadapp/trustwallet-assets.git
synced 2024-07-29 22:37:31 +00:00
[Internal] Infrastructure for Polygon tokenlist (#14136)
* [Internal] Infrastructure for Polygon tokenlist * Lint fix * Dynamic date parameter * More pairs
This commit is contained in:
parent
4c9ed3dbee
commit
f89a7f6be4
170
blockchains/polygon/tokenlist.json
Normal file
170
blockchains/polygon/tokenlist.json
Normal file
|
@ -0,0 +1,170 @@
|
|||
{
|
||||
"name": "Trust Wallet: Polygon",
|
||||
"logoURI": "https://trustwallet.com/assets/images/favicon.png",
|
||||
"timestamp": "2021-10-06T10:22:28.269Z",
|
||||
"tokens": [
|
||||
{
|
||||
"asset": "c966_t0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619",
|
||||
"type": "POLYGON",
|
||||
"address": "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619",
|
||||
"name": "Wrapped Ether",
|
||||
"symbol": "WETH",
|
||||
"decimals": 0,
|
||||
"logoURI": "https://assets.trustwalletapp.com/blockchains/polygon/assets/0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619/logo.png",
|
||||
"pairs": [
|
||||
{
|
||||
"base": "c966_t0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0x831753DD7087CaC61aB5644b308642cc1c33Dc13"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0xc2132D05D31c914a87C6611C10748AEb04B58e8F"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0xD6DF932A45C0f255f85145f286eA0b292B21C90B"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"asset": "c966_t0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",
|
||||
"type": "POLYGON",
|
||||
"address": "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",
|
||||
"name": "Wrapped Matic",
|
||||
"symbol": "WMATIC",
|
||||
"decimals": 18,
|
||||
"logoURI": "https://assets.trustwalletapp.com/blockchains/polygon/assets/0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270/logo.png",
|
||||
"pairs": [
|
||||
{
|
||||
"base": "c966_t0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0x831753DD7087CaC61aB5644b308642cc1c33Dc13"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0xc2132D05D31c914a87C6611C10748AEb04B58e8F"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"asset": "c966_t0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
|
||||
"type": "POLYGON",
|
||||
"address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
|
||||
"name": "USD Coin (PoS)",
|
||||
"symbol": "USDC",
|
||||
"decimals": 0,
|
||||
"logoURI": "https://assets.trustwalletapp.com/blockchains/polygon/assets/0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174/logo.png",
|
||||
"pairs": [
|
||||
{
|
||||
"base": "c966_t0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0x831753DD7087CaC61aB5644b308642cc1c33Dc13"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0xa3Fa99A148fA48D14Ed51d610c367C61876997F1"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0xc2132D05D31c914a87C6611C10748AEb04B58e8F"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"asset": "c966_t0xc2132D05D31c914a87C6611C10748AEb04B58e8F",
|
||||
"type": "POLYGON",
|
||||
"address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F",
|
||||
"name": "(PoS) Tether USD",
|
||||
"symbol": "USDT",
|
||||
"decimals": 0,
|
||||
"logoURI": "https://assets.trustwalletapp.com/blockchains/polygon/assets/0xc2132D05D31c914a87C6611C10748AEb04B58e8F/logo.png",
|
||||
"pairs": [
|
||||
{
|
||||
"base": "c966_t0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"asset": "c966_t0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063",
|
||||
"type": "POLYGON",
|
||||
"address": "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063",
|
||||
"name": "(PoS) Dai Stablecoin",
|
||||
"symbol": "DAI",
|
||||
"decimals": 0,
|
||||
"logoURI": "https://assets.trustwalletapp.com/blockchains/polygon/assets/0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063/logo.png",
|
||||
"pairs": [
|
||||
{
|
||||
"base": "c966_t0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270"
|
||||
},
|
||||
{
|
||||
"base": "c966_t0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"asset": "c966_t0x53E0bca35eC356BD5ddDFebbD1Fc0fD03FaBad39",
|
||||
"type": "POLYGON",
|
||||
"address": "0x53E0bca35eC356BD5ddDFebbD1Fc0fD03FaBad39",
|
||||
"name": "ChainLink Token",
|
||||
"symbol": "LINK",
|
||||
"decimals": 0,
|
||||
"logoURI": "https://assets.trustwalletapp.com/blockchains/polygon/assets/0x53E0bca35eC356BD5ddDFebbD1Fc0fD03FaBad39/logo.png",
|
||||
"pairs": []
|
||||
},
|
||||
{
|
||||
"asset": "c966_t0x831753DD7087CaC61aB5644b308642cc1c33Dc13",
|
||||
"type": "POLYGON",
|
||||
"address": "0x831753DD7087CaC61aB5644b308642cc1c33Dc13",
|
||||
"name": "QuickSwap",
|
||||
"symbol": "QUICK",
|
||||
"decimals": 0,
|
||||
"logoURI": "https://assets.trustwalletapp.com/blockchains/polygon/assets/0x831753DD7087CaC61aB5644b308642cc1c33Dc13/logo.png",
|
||||
"pairs": []
|
||||
},
|
||||
{
|
||||
"asset": "c966_t0xa3Fa99A148fA48D14Ed51d610c367C61876997F1",
|
||||
"type": "POLYGON",
|
||||
"address": "0xa3Fa99A148fA48D14Ed51d610c367C61876997F1",
|
||||
"name": "miMATIC",
|
||||
"symbol": "miMATIC",
|
||||
"decimals": 18,
|
||||
"logoURI": "https://assets.trustwalletapp.com/blockchains/polygon/assets/0xa3Fa99A148fA48D14Ed51d610c367C61876997F1/logo.png",
|
||||
"pairs": []
|
||||
},
|
||||
{
|
||||
"asset": "c966_t0xD6DF932A45C0f255f85145f286eA0b292B21C90B",
|
||||
"type": "POLYGON",
|
||||
"address": "0xD6DF932A45C0f255f85145f286eA0b292B21C90B",
|
||||
"name": "Aave (PoS)",
|
||||
"symbol": "AAVE",
|
||||
"decimals": 0,
|
||||
"logoURI": "https://assets.trustwalletapp.com/blockchains/polygon/assets/0xD6DF932A45C0f255f85145f286eA0b292B21C90B/logo.png",
|
||||
"pairs": []
|
||||
}
|
||||
],
|
||||
"version": {
|
||||
"major": 3,
|
||||
"minor": 0,
|
||||
"patch": 0
|
||||
}
|
||||
}
|
122
script/blockchain/polygon.ts
Normal file
122
script/blockchain/polygon.ts
Normal file
|
@ -0,0 +1,122 @@
|
|||
import { ActionInterface, CheckStepInterface } from "../generic/interface";
|
||||
import {
|
||||
checkTradingPair,
|
||||
getTradingPairsBitquery,
|
||||
PairInfoBitquery,
|
||||
PairInfo,
|
||||
primaryTokenIndex,
|
||||
TokenInfo,
|
||||
TokenInfoBitquery
|
||||
} from "../generic/subgraph";
|
||||
import { Polygon } from "../generic/blockchains";
|
||||
import {
|
||||
parseForceList,
|
||||
rebuildTokenlist,
|
||||
TokenItem
|
||||
} from "../generic/tokenlists";
|
||||
import { toChecksum } from "../generic/eth-address";
|
||||
import { assetID, logoURI } from "../generic/asset";
|
||||
import * as config from "../config"
|
||||
|
||||
const PrimaryTokens: string[] = ["WMATIC", "MATIC", "WETH", "USDC", "USDT", "DAI"];
|
||||
|
||||
function convertTokenInfo(token: TokenInfoBitquery): TokenInfo {
|
||||
return {
|
||||
id: token.address,
|
||||
symbol: token.symbol,
|
||||
name: token.name,
|
||||
decimals: token.decimals
|
||||
} as TokenInfo;
|
||||
}
|
||||
|
||||
function convertPairInfo(pair: PairInfoBitquery): PairInfo {
|
||||
return {
|
||||
id: '?',
|
||||
reserveUSD: 1,
|
||||
volumeUSD: pair.tradeAmount,
|
||||
txCount: pair.trade,
|
||||
token0: convertTokenInfo(pair.buyCurrency),
|
||||
token1: convertTokenInfo(pair.sellCurrency)
|
||||
} as PairInfo;
|
||||
}
|
||||
|
||||
// Return the date 1,5 days ago in the form 2021-10-06
|
||||
function dateOfYesterday() {
|
||||
const now = new Date();
|
||||
const yesterday = new Date(now.getTime() - 36*3600*1000);
|
||||
return yesterday.toISOString().substr(0, 10);
|
||||
}
|
||||
|
||||
async function retrievePolygonSwapPairs(): Promise<PairInfo[]> {
|
||||
console.log(`Retrieving pairs from Polygon, limit volume ${config.PolygonSwap_MinVol24} txcount ${config.PolygonSwap_MinTxCount24}`);
|
||||
|
||||
console.log(` forceIncludeList: ${config.PolygonSwap_ForceInclude}`);
|
||||
const includeList = parseForceList(config.PolygonSwap_ForceInclude);
|
||||
|
||||
const query = config.PolygonSwap_TradingPairsQuery;
|
||||
const date = dateOfYesterday();
|
||||
const queryReplaced = query.replace("$DATE$", date);
|
||||
console.log(queryReplaced);
|
||||
|
||||
const pairs = await getTradingPairsBitquery(config.PolygonSwap_TradingPairsUrl, queryReplaced);
|
||||
const filtered: PairInfo[] = [];
|
||||
pairs.forEach(x => {
|
||||
try {
|
||||
if (typeof(x) === "object") {
|
||||
const pairInfo = convertPairInfo(x as PairInfoBitquery);
|
||||
if (pairInfo) {
|
||||
if (checkTradingPair(pairInfo, 0, config.PolygonSwap_MinVol24, config.PolygonSwap_MinTxCount24, PrimaryTokens, includeList)) {
|
||||
filtered.push(pairInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.log("Exception:", err);
|
||||
}
|
||||
});
|
||||
|
||||
console.log("Retrieved & filtered", filtered.length, "pairs:");
|
||||
filtered.forEach(p => {
|
||||
console.log(`pair: ${p.token0.symbol} -- ${p.token1.symbol} \t USD ${Math.round(p.reserveUSD)} ${Math.round(p.volumeUSD)} ${p.txCount}`);
|
||||
});
|
||||
|
||||
return filtered;
|
||||
}
|
||||
|
||||
function tokenInfoFromSubgraphToken(token: TokenInfo): TokenItem {
|
||||
const idChecksum = toChecksum(token.id);
|
||||
return new TokenItem(
|
||||
assetID(966, idChecksum),
|
||||
"POLYGON",
|
||||
idChecksum, token.name, token.symbol, parseInt(token.decimals.toString()),
|
||||
logoURI(idChecksum, "polygon", "--"),
|
||||
[]);
|
||||
}
|
||||
|
||||
// Retrieve trading pairs from Polygon
|
||||
async function generateTokenlist(): Promise<void> {
|
||||
// note: if [] is returned here for some reason, all pairs will be *removed*. In case of error (e.g. timeout) it should throw
|
||||
const tradingPairs = await retrievePolygonSwapPairs();
|
||||
// convert
|
||||
const pairs2: [TokenItem, TokenItem][] = [];
|
||||
tradingPairs.forEach(p => {
|
||||
let tokenItem0 = tokenInfoFromSubgraphToken(p.token0);
|
||||
let tokenItem1 = tokenInfoFromSubgraphToken(p.token1);
|
||||
if (primaryTokenIndex(p, PrimaryTokens) == 2) {
|
||||
// reverse
|
||||
const tmp = tokenItem1; tokenItem1 = tokenItem0; tokenItem0 = tmp;
|
||||
}
|
||||
pairs2.push([tokenItem0, tokenItem1]);
|
||||
});
|
||||
await rebuildTokenlist(Polygon, pairs2, "Polygon", config.PolygonSwap_ForceExclude);
|
||||
}
|
||||
|
||||
export class PolygonAction implements ActionInterface {
|
||||
getName(): string { return "Polygon"; }
|
||||
|
||||
getSanityChecks(): CheckStepInterface[] { return []; }
|
||||
|
||||
async updateManual(): Promise<void> {
|
||||
await generateTokenlist();
|
||||
}
|
||||
}
|
|
@ -50,3 +50,22 @@ export const Uniswap_MinLiquidity = 2000000;
|
|||
export const Uniswap_MinVol24 = 1000000;
|
||||
export const Uniswap_MinTxCount24 = 480;
|
||||
|
||||
// Force include & exclude config: list of token symbols, or symbol pairs (e.g. ["Cake", "DAI-WBNB"]).
|
||||
export const PolygonSwap_ForceInclude: string[] = [];
|
||||
export const PolygonSwap_ForceExclude: string[] = [];
|
||||
export const PolygonSwap_TradingPairsUrl = "https://graphql.bitquery.io";
|
||||
export const PolygonSwap_TradingPairsQuery = `
|
||||
{
|
||||
ethereum(network: matic) {
|
||||
dexTrades(date: {is: "$DATE$"}) {
|
||||
sellCurrency {address symbol name decimals}
|
||||
buyCurrency {address symbol name decimals}
|
||||
trade: count
|
||||
tradeAmount(in: USD)
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
//export const PolygonSwap_MinLiquidity = 1000000;
|
||||
export const PolygonSwap_MinVol24 = 500000;
|
||||
export const PolygonSwap_MinTxCount24 = 288;
|
||||
|
|
|
@ -19,6 +19,20 @@ export interface PairInfo {
|
|||
token1: TokenInfo;
|
||||
}
|
||||
|
||||
export interface TokenInfoBitquery {
|
||||
address: string;
|
||||
symbol: string;
|
||||
name: string;
|
||||
decimals: number;
|
||||
}
|
||||
|
||||
export interface PairInfoBitquery {
|
||||
sellCurrency: TokenInfoBitquery;
|
||||
buyCurrency: TokenInfoBitquery;
|
||||
trade: number; // trade count
|
||||
tradeAmount: number; // trade volume usd
|
||||
}
|
||||
|
||||
export async function getTradingPairs(apiUrl: string, subgraphQuery: string): Promise<unknown[]> {
|
||||
// compact the query string
|
||||
const compactQuery = subgraphQuery.replace(/(?:\r\n|\r|\n)/g, ' ').replace(/\s[\s]+/g, ' ');
|
||||
|
@ -39,6 +53,26 @@ export async function getTradingPairs(apiUrl: string, subgraphQuery: string): Pr
|
|||
}
|
||||
}
|
||||
|
||||
export async function getTradingPairsBitquery(apiUrl: string, subgraphQuery: string): Promise<unknown[]> {
|
||||
// compact the query string
|
||||
const compactQuery = subgraphQuery.replace(/(?:\r\n|\r|\n)/g, ' ').replace(/\s[\s]+/g, ' ');
|
||||
const postData = {"query": compactQuery, "variables":{}};
|
||||
|
||||
console.log(`Retrieving trading pair infos from: ${apiUrl}`);
|
||||
try {
|
||||
const result = await axios.post(apiUrl, postData).then(r => r.data);
|
||||
if (!result || !result.data || !result.data.ethereum || !result.data.ethereum.dexTrades) {
|
||||
throw `Unexpected result: ${JSON.stringify(result)}`;
|
||||
}
|
||||
const pairs = result.data.ethereum.dexTrades;
|
||||
console.log(`Retrieved ${pairs.length} trading pair infos`);
|
||||
return pairs;
|
||||
} catch (err) {
|
||||
console.log("Exception from graph api:", err, apiUrl, JSON.stringify(postData));
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
function isTokenPrimary(token: TokenInfo, primaryTokens: string[]): boolean {
|
||||
return (primaryTokens.find(t => (t === token.symbol.toUpperCase())) != undefined);
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ import { TezosAction } from "../blockchain/tezos";
|
|||
import { TronAction } from "../blockchain/tron";
|
||||
import { Validators } from "../generic/validators";
|
||||
import { WavesAction } from "../blockchain/waves";
|
||||
import { PolygonAction } from "../blockchain/polygon";
|
||||
import { ActionInterface, CheckStepInterface } from "../generic/interface";
|
||||
import * as chalk from 'chalk';
|
||||
import * as bluebird from "bluebird";
|
||||
|
@ -30,6 +31,7 @@ const actionList: ActionInterface[] = [
|
|||
new EthereumAction(),
|
||||
new CosmosAction(),
|
||||
new KavaAction(),
|
||||
new PolygonAction(),
|
||||
new TerraAction(),
|
||||
new TezosAction(),
|
||||
new TronAction(),
|
||||
|
|
Loading…
Reference in New Issue
Block a user