diff --git a/.prettierignore b/.prettierignore index c2658d7..0a03045 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1 +1,2 @@ node_modules/ +public/ diff --git a/package.json b/package.json index 79ec326..3155d31 100644 --- a/package.json +++ b/package.json @@ -40,9 +40,9 @@ "@cosmjs/proto-signing": "^0.32.1", "@cosmjs/stargate": "^0.32.1", "@cosmjs/tendermint-rpc": "^0.32.1", - "@dydxprotocol/v4-abacus": "^1.4.2", + "@dydxprotocol/v4-abacus": "^1.4.6", "@dydxprotocol/v4-client-js": "^1.0.20", - "@dydxprotocol/v4-localization": "^1.1.26", + "@dydxprotocol/v4-localization": "^1.1.31", "@ethersproject/providers": "^5.7.2", "@js-joda/core": "^5.5.3", "@radix-ui/react-accordion": "^1.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eac9ab3..19b1af9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,9 +1,5 @@ lockfileVersion: '6.0' -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - overrides: follow-redirects: 1.15.3 @@ -30,14 +26,14 @@ dependencies: specifier: ^0.32.1 version: 0.32.2 '@dydxprotocol/v4-abacus': - specifier: ^1.4.2 - version: 1.4.2 + specifier: ^1.4.6 + version: 1.4.6 '@dydxprotocol/v4-client-js': specifier: ^1.0.20 version: 1.0.20 '@dydxprotocol/v4-localization': - specifier: ^1.1.26 - version: 1.1.26 + specifier: ^1.1.31 + version: 1.1.31 '@ethersproject/providers': specifier: ^5.7.2 version: 5.7.2 @@ -1290,8 +1286,8 @@ packages: resolution: {integrity: sha512-Gg5t+eR7vPJMAmhkFt6CZrzPd0EKpAslWwk5rFVYZpJsM8JG5KT9XQ99hgNM3Ov6ScNoIWbXkpX27F6A9cXR4Q==} dev: false - /@dydxprotocol/v4-abacus@1.4.2: - resolution: {integrity: sha512-+hugk0RulMwMthR2xCMYXohcC3sEYqVW/lmiq0RUuHZ9yrjmgy48xl0aZUmXGUYXyoiHXPS4AULhRKHQ4OOLwg==} + /@dydxprotocol/v4-abacus@1.4.6: + resolution: {integrity: sha512-qYq+4TizcMMxYVXckn0LCucWBe5N9ZNtD1XnowCAuBUUifHSgMGvao5OeZIKMgNM/udSKOXLss4zLy6dH/G2SA==} dev: false /@dydxprotocol/v4-client-js@1.0.20: @@ -1323,8 +1319,8 @@ packages: - utf-8-validate dev: false - /@dydxprotocol/v4-localization@1.1.26: - resolution: {integrity: sha512-u+J1J5Up8McwZOcDaG9GrH/A8p4vD2NU2CT2hPdYyKgEd28XeAYvv7bNAQRKdiBaqTePbbF5uB6TMAQnEGnb1A==} + /@dydxprotocol/v4-localization@1.1.31: + resolution: {integrity: sha512-plJVIgFAKq9/hA/gk5GgKgCQFsH3pNtDWfG/yHLDXyiGX0M0mMEi1bTNVs4podFVoHJu1nSL9YPFlpJ00FteGw==} dev: false /@dydxprotocol/v4-proto@4.0.0-dev.0: @@ -12888,10 +12884,6 @@ packages: engines: {node: '>=10.5.0'} dev: true - /node-fetch-native@1.6.1: - resolution: {integrity: sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==} - dev: false - /node-fetch-native@1.6.2: resolution: {integrity: sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==} dev: false @@ -13049,7 +13041,7 @@ packages: resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} dependencies: destr: 2.0.2 - node-fetch-native: 1.6.1 + node-fetch-native: 1.6.2 ufo: 1.3.2 dev: false @@ -15029,7 +15021,7 @@ packages: consola: 3.2.3 defu: 6.1.3 mime: 3.0.0 - node-fetch-native: 1.6.1 + node-fetch-native: 1.6.2 pathe: 1.1.1 dev: false @@ -15175,7 +15167,7 @@ packages: listhen: 1.5.5 lru-cache: 10.1.0 mri: 1.2.0 - node-fetch-native: 1.6.1 + node-fetch-native: 1.6.2 ofetch: 1.3.3 ufo: 1.3.2 transitivePeerDependencies: @@ -16057,3 +16049,7 @@ packages: /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: true + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false diff --git a/public/configs/cctp.json b/public/configs/cctp.json index df65617..a14cb3c 100644 --- a/public/configs/cctp.json +++ b/public/configs/cctp.json @@ -1,12 +1,22 @@ [ - { - "chainId": "1", - "tokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "name": "Ethereum" - }, - { - "chainId": "5", - "tokenAddress": "0x07865c6E87B9F70255377e024ace6630C1Eaa37F", - "name": "Ethereum Goerli" - } -] \ No newline at end of file + { + "chainId": "1", + "tokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "name": "Ethereum" + }, + { + "chainId": "5", + "tokenAddress": "0x07865c6E87B9F70255377e024ace6630C1Eaa37F", + "name": "Ethereum Goerli" + }, + { + "chainId": "43114", + "tokenAddress": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", + "name": "Avalanche" + }, + { + "chainId": "10", + "tokenAddress": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", + "name": "optimism" + } +] diff --git a/public/configs/env.json b/public/configs/env.json index f7dfe3a..25a8291 100644 --- a/public/configs/env.json +++ b/public/configs/env.json @@ -1344,4 +1344,4 @@ } } } -} +} \ No newline at end of file diff --git a/public/configs/markets.json b/public/configs/markets.json index f896c1d..22d9461 100644 --- a/public/configs/markets.json +++ b/public/configs/markets.json @@ -20,6 +20,13 @@ "whitepaperLink": "https://why.cardano.org/en/introduction/motivation/", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/cardano/" }, + "AGIX-USD": { + "name": "SingularityNET", + "tags": ["AI"], + "websiteLink": "https://public.singularitynet.io/whitepaper.pdf", + "whitepaperLink": "https://public.singularitynet.io/whitepaper.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/singularitynet/" + }, "ALGO-USD": { "name": "Algorand", "tags": ["Layer 1"], @@ -78,11 +85,26 @@ }, "BLUR-USD": { "name": "Blur", - "tags": [], + "tags": ["NFT"], "websiteLink": "https://blur.io/", "whitepaperLink": "https://docs.blur.foundation/", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/blur-token/" }, + "BNB-USD":{ + "name": "BNB", + "tags": ["Layer 1"], + "websiteLink": "https://www.bnbchain.org/en", + "whitepaperLink": "https://www.exodus.com/assets/docs/binance-coin-whitepaper.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/bnb/" + + }, + "CHZ-USD": { + "name": "Chiliz", + "tags": ["Layer 1"], + "websiteLink": "https://www.chiliz.com/", + "whitepaperLink": "https://www.chiliz.com/docs/litepaper-v1.1-20230703.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/chiliz/" + }, "CELO-USD": { "name": "Celo", "tags": [], @@ -125,6 +147,13 @@ "whitepaperLink": "https://polkadot.network/PolkaDotPaper.pdf", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/polkadot-new/" }, + "DYM-USD": { + "name": "Dymension", + "tags": [], + "websiteLink": "https://dymension.xyz/", + "whitepaperLink": "https://docs.dymension.xyz/dymension-litepaper/dymension-litepaper-index", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/dymension/" + }, "ENJ-USD": { "name": "Enjin", "tags": [], @@ -132,6 +161,13 @@ "whitepaperLink": "https://cdn.enjin.io/downloads/whitepapers/enjin-coin/en.pdf/", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/enjin-coin/" }, + "ENS-USD": { + "name": "Ethereum Name Service", + "tags": [], + "websiteLink": "https://coinmarketcap.com/currencies/ethereum-name-service/", + "whitepaperLink": "https://docs.ens.domains/", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/ethereum-name-service/" + }, "EOS-USD": { "name": "EOS", "tags": ["Layer 1"], @@ -155,6 +191,13 @@ "displayStepSize": "0.001", "displayTickSize": "0.1" }, + "FET-USD": { + "name": "Fetch.ai", + "tags": ["AI"], + "websiteLink": "https://fetch.ai/", + "whitepaperLink": "https://www.dropbox.com/s/gxptsecwdl3jjtn/David%20Minarsch%20-%202021-04-26%2010.34.17%20-%20paper_21_finalversion.pdf?e=1&dl=0", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/fetch/" + }, "FIL-USD": { "name": "Filecoin", "tags": ["Layer 1"], @@ -162,6 +205,34 @@ "whitepaperLink": "https://filecoin.io/filecoin.pdf", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/filecoin/" }, + "FTM-USD": { + "name": "Fantom", + "tags": [], + "websiteLink": "https://fantom.foundation/", + "whitepaperLink": "https://fantom.foundation/_next/static/media/wp_fantom_v1.6.39329cdc5d0ee59684cbc6f228516383.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/fantom/" + }, + "GALA-USD": { + "name": "Gala", + "tags": ["Gaming", "Layer 1"], + "websiteLink": "https://gala.com/", + "whitepaperLink": "https://galahackathon.com/v1.0.0/pdf/sdk-documentation.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/gala/" + }, + "GMT-USD": { + "name": "GMT", + "tags": ["Gaming"], + "websiteLink": "https://stepn.com/", + "whitepaperLink/": "https://whitepaper.stepn.com/", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/green-metaverse-token/" + }, + "GRT-USD": { + "name": "The Graph", + "tags": [], + "websiteLink": "https://thegraph.com/", + "whitepaperLink/": "https://github.com/graphprotocol/research/blob/master/papers/whitepaper/the-graph-whitepaper.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/the-graph/" + }, "HNT-USD": { "name": "Helium", "tags": ["Layer 1"], @@ -169,6 +240,13 @@ "whitepaperLink": "http://whitepaper.helium.com", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/helium/" }, + "HBAR-USD": { + "name": "Hedera", + "tags": [], + "websiteLink": "https://hedera.com/", + "whitepaperLink/": "https://files.hedera.com/hh_whitepaper_v2.2-20230918.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/hedera/" + }, "ICP-USD": { "name": "Internet Computer", "tags": ["Layer 1"], @@ -176,6 +254,27 @@ "whitepaperLink": "https://dfinity.org/whitepaper.pdf", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/internet-computer/" }, + "IMX-USD": { + "name": "Immutable X", + "tags": ["Gaming", "Layer 2", "NFT"], + "websiteLink": "https://www.immutable.com/", + "whitepaperLink": "https://assets.website-files.com/646557ee455c3e16e4a9bcb3/6499367de527dd82ab7475a3_Immutable%20Whitepaper%20Update%202023%20(3).pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/immutable-x/" + }, + "INJ-USD": { + "name": "Injective", + "tags": ["Layer 1", "Defi"], + "websiteLink": "https://injective.com/", + "whitepaperLink": "https://docs.injective.network/intro/01_overview.html", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/injective/" + }, + "JTO-USD": { + "name": "Jito", + "tags": ["Defi"], + "websiteLink": "https://www.jito.network/", + "whitepaperLink": "https://github.com/jito-foundation", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/jito/" + }, "JUP-USD": { "name": "Jupiter", "tags": ["Defi"], @@ -183,6 +282,13 @@ "whitepaperLink": "https://station.jup.ag/blog/green-paper", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/jupiter-ag/" }, + "KAVA-USD": { + "name": "Kava", + "tags": ["Layer 1"], + "websiteLink": "https://www.kava.io/", + "whitepaperLink": "https://docsend.com/view/gwbwpc3", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/kava/" + }, "LDO-USD": { "name": "Lido DAO", "tags": ["Defi"], @@ -204,6 +310,20 @@ "whitepaperLink": "https://litecoin.info/index.php/Main_Page", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/litecoin/" }, + "MANA-USD": { + "name": "Decentraland", + "tags": ["AR/VR"], + "websiteLink": "https://decentraland.org/", + "whitepaperLink": "https://decentraland.org/whitepaper.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/decentraland/" + }, + "MASK-USD": { + "name": "Mask Network", + "tags": [], + "websiteLink": "https://mask.io/", + "whitepaperLink": "https://masknetwork.medium.com/introducing-mask-network-maskbook-the-future-of-the-internet-5a973d874edd", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/mask-network/" + }, "MATIC-USD": { "name": "Polygon", "tags": ["Layer 2"], @@ -211,6 +331,13 @@ "whitepaperLink": "https://polygon.technology/lightpaper-polygon.pdf", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/polygon/" }, + "MINA-USD": { + "name": "Mina", + "tags": ["Layer 1"], + "websiteLink": "https://minaprotocol.com/", + "whitepaperLink": "https://docs.minaprotocol.com/assets/economicsWhitepaper.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/mina/" + }, "MKR-USD": { "name": "Maker", "tags": ["Governance"], @@ -225,6 +352,13 @@ "whitepaperLink": "https://near.org/papers/the-official-near-white-paper/", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/near-protocol/" }, + "ORDI-USD": { + "name": "Ordinals", + "tags": ["NFT"], + "websiteLink": "https://ordinals.com/", + "whitepaperLink": "https://rodarmor.com/blog/", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/ordi/" + }, "OP-USD": { "name": "Optimism", "tags": [], @@ -238,6 +372,20 @@ "websiteLink": "https://www.pepe.vip/", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/pepe/" }, + "PYTH-USD": { + "name": "Pyth Network", + "tags": [], + "websiteLink": "https://pyth.network/", + "whitepaperLink": "https://pyth.network/whitepaper_v2.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/pyth-network/" + }, + "RNDR-USD": { + "name": "Render Token", + "tags": ["AI"], + "websiteLink": "https://rendernetwork.com/", + "whitepaperLink": "https://renderfoundation.com/whitepaper", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/render/" + }, "RUNE-USD": { "name": "THORChain", "tags": ["Layer 1"], @@ -245,6 +393,13 @@ "whitepaperLink": "https://whitepaper.io/document/709/thorchain-whitepaper", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/thorchain/" }, + "SAND-USD": { + "name": "The Sandbox", + "tags": ["Gaming"], + "websiteLink": "https://www.sandbox.game/en/", + "whitepaperLink": "https://installers.sandbox.game/The_Sandbox_Whitepaper_2020.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/the-sandbox/" + }, "SEI-USD": { "name": "Sei", "tags": ["Layer 1", "Defi"], @@ -273,6 +428,13 @@ "whitepaperLink": "https://solana.com/solana-whitepaper.pdf", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/solana/" }, + "STX-USD": { + "name": "Stacks", + "tags": ["Layer 2"], + "websiteLink": "https://www.stacks.co/", + "whitepaperLink": "https://gaia.blockstack.org/hub/1AxyPunHHAHiEffXWESKfbvmBpGQv138Fp/stacks.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/stacks/" + }, "SUI-USD": { "name": "Sui", "tags": ["Layer 1"], @@ -322,6 +484,13 @@ "whitepaperLink": "https://whitepaper.worldcoin.org/", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/worldcoin-org/" }, + "WOO-USD": { + "name": "WOO Network", + "tags": ["Defi"], + "websiteLink": "https://woo.org/", + "whitepaperLink": "https://woo.org/Litepaper.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/wootrade/" + }, "XLM-USD": { "name": "Stellar", "tags": ["Layer 1"], @@ -364,6 +533,13 @@ "whitepaperLink": "https://z.cash/technology/", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/zcash/" }, + "ZETA-USD": { + "name": "ZetaChain", + "tags": ["Layer 1"], + "websiteLink": "https://www.zetachain.com/", + "whitepaperLink": "https://www.zetachain.com/whitepaper.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/zetachain/" + }, "ZRX-USD": { "name": "0x", "tags": ["Defi"], diff --git a/public/configs/otherMarketDisclaimer.md b/public/configs/otherMarketDisclaimer.md new file mode 100644 index 0000000..68f8284 --- /dev/null +++ b/public/configs/otherMarketDisclaimer.md @@ -0,0 +1 @@ +This file identifies parameters for the optimal performance of various assets with the dYdX v4 open source software ("dYdX Chain"). For information on which assets are likely to be best compatible with dYdX Chain and how likely software compatibility and optimal parameters are assessed, please review the documentation [here](https://docs.dydx.trade/governance/proposing_a_new_market#example-proposal-json). Users considering using the permissionless markets function of the dYdX Chain are encouraged to consult qualified legal counsel to ensure compliance with the laws of their jurisdiction. The information herein does not constitute and should not be relied on as an endorsement or recommendation for any specific market, or investment, legal, or any other form of professional advice. Use of the v4 software is prohibited in the United States, Canada, and sanctioned jurisdictions as described in the [v4 Terms of Use](https://dydx.exchange/v4-terms). diff --git a/public/configs/otherMarketExchangeConfig.json b/public/configs/otherMarketExchangeConfig.json new file mode 100644 index 0000000..d824230 --- /dev/null +++ b/public/configs/otherMarketExchangeConfig.json @@ -0,0 +1,608 @@ +{ + "1INCH": [ + { "exchangeName": "Binance", "ticker": "1INCHUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "1INCH-USD" }, + { "exchangeName": "Gate", "ticker": "1INCH_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "1INCH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "1INCH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "1INCH_USDT", "adjustByMarket": "USDT-USD" } + ], + "AAVE": [ + { "exchangeName": "Binance", "ticker": "AAVEUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "AAVE-USD" }, + { "exchangeName": "Huobi", "ticker": "aaveusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "AAVEUSD" }, + { "exchangeName": "Kucoin", "ticker": "AAVE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "AAVE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "AAVE_USDT", "adjustByMarket": "USDT-USD" } + ], + "ADA": [ + { "exchangeName": "Binance", "ticker": "ADAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "ADA/USD" }, + { "exchangeName": "Bybit", "ticker": "ADAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ADA-USD" }, + { "exchangeName": "Huobi", "ticker": "adausdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "ADAUSD" }, + { "exchangeName": "Kucoin", "ticker": "ADA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ADA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ADA_USDT", "adjustByMarket": "USDT-USD" } + ], + "AGIX": [ + { "exchangeName": "Binance", "ticker": "AGIXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "AGIXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "AGIX_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "AGIX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "AGIX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "AGIX_USDT", "adjustByMarket": "USDT-USD" } + ], + "ALGO": [ + { "exchangeName": "Binance", "ticker": "ALGOUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ALGO-USD" }, + { "exchangeName": "Kraken", "ticker": "ALGOUSD" }, + { "exchangeName": "Kucoin", "ticker": "ALGO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ALGO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ALGO_USDT", "adjustByMarket": "USDT-USD" } + ], + "APE": [ + { "exchangeName": "Binance", "ticker": "APEUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "APE-USD" }, + { "exchangeName": "Gate", "ticker": "APE_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "APEUSD" }, + { "exchangeName": "Kucoin", "ticker": "APE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "APE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "APE_USDT", "adjustByMarket": "USDT-USD" } + ], + "APT": [ + { "exchangeName": "Binance", "ticker": "APTUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "APTUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "APT-USD" }, + { "exchangeName": "Gate", "ticker": "APT_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Huobi", "ticker": "aptusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "APTUSD" }, + { "exchangeName": "Kucoin", "ticker": "APT-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "APT-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "APT_USDT", "adjustByMarket": "USDT-USD" } + ], + "ARB": [ + { "exchangeName": "Binance", "ticker": "ARBUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "ARBUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ARB-USD" }, + { "exchangeName": "Huobi", "ticker": "arbusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "ARBUSD" }, + { "exchangeName": "Kucoin", "ticker": "ARB-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ARB-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ARB_USDT", "adjustByMarket": "USDT-USD" } + ], + "ATOM": [ + { "exchangeName": "Binance", "ticker": "ATOMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "ATOMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ATOM-USD" }, + { "exchangeName": "Gate", "ticker": "ATOM_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "ATOMUSD" }, + { "exchangeName": "Kucoin", "ticker": "ATOM-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ATOM-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ATOM_USDT", "adjustByMarket": "USDT-USD" } + ], + "AVAX": [ + { "exchangeName": "Binance", "ticker": "AVAXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "AVAX/USD" }, + { "exchangeName": "Bybit", "ticker": "AVAXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "AVAX-USD" }, + { "exchangeName": "Huobi", "ticker": "avaxusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "AVAXUSD" }, + { "exchangeName": "Kucoin", "ticker": "AVAX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "AVAX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "AVAX_USDT", "adjustByMarket": "USDT-USD" } + ], + "BCH": [ + { "exchangeName": "Binance", "ticker": "BCHUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "BCH/USD" }, + { "exchangeName": "Bybit", "ticker": "BCHUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "BCH-USD" }, + { "exchangeName": "Huobi", "ticker": "bchusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "BCHUSD" }, + { "exchangeName": "Kucoin", "ticker": "BCH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "BCH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "BCH_USDT", "adjustByMarket": "USDT-USD" } + ], + "BLUR": [ + { "exchangeName": "Binance", "ticker": "BLURUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "BLURUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "BLUR-USD" }, + { "exchangeName": "Kraken", "ticker": "BLURUSD" }, + { "exchangeName": "Kucoin", "ticker": "BLUR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "BLUR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "BLUR_USDT", "adjustByMarket": "USDT-USD" } + ], + "BNB": [ + { "exchangeName": "Binance", "ticker": "BNBUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "BNBUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "BNB_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "BNB-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "BNB-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "BNB_USDT", "adjustByMarket": "USDT-USD" } + ], + "BONK": [ + { "exchangeName": "Binance", "ticker": "BONKUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "BONKUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "BONK-USD" }, + { "exchangeName": "Kucoin", "ticker": "BONK-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "BONK-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "BONK_USDT", "adjustByMarket": "USDT-USD" } + ], + "BTC": [ + { "exchangeName": "Binance", "ticker": "BTCUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "BTC/USD" }, + { "exchangeName": "Bybit", "ticker": "BTCUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "BTC-USD" }, + { "exchangeName": "Huobi", "ticker": "btcusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "BTCUSD" }, + { "exchangeName": "Kucoin", "ticker": "BTC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "BTC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "BTC_USDT", "adjustByMarket": "USDT-USD" } + ], + "CHZ": [ + { "exchangeName": "Binance", "ticker": "CHZUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "CHZ-USD" }, + { "exchangeName": "Kraken", "ticker": "CHZUSD" }, + { "exchangeName": "Kucoin", "ticker": "CHZ-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "CHZ-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "CHZ_USDT", "adjustByMarket": "USDT-USD" } + ], + "CRV": [ + { "exchangeName": "Binance", "ticker": "CRVUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "CRV-USD" }, + { "exchangeName": "Kraken", "ticker": "CRVUSD" }, + { "exchangeName": "Kucoin", "ticker": "CRV-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "CRV-USDT", "adjustByMarket": "USDT-USD" } + ], + "DOGE": [ + { "exchangeName": "Binance", "ticker": "DOGEUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "DOGEUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "DOGE-USD" }, + { "exchangeName": "Huobi", "ticker": "dogeusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "DOGEUSD" }, + { "exchangeName": "Kucoin", "ticker": "DOGE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "DOGE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "DOGE_USDT", "adjustByMarket": "USDT-USD" } + ], + "DOT": [ + { "exchangeName": "Binance", "ticker": "DOTUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "DOTUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "DOT-USD" }, + { "exchangeName": "Huobi", "ticker": "dotusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "DOTUSD" }, + { "exchangeName": "Kucoin", "ticker": "DOT-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "DOT-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "DOT_USDT", "adjustByMarket": "USDT-USD" } + ], + "DYM": [ + { "exchangeName": "Binance", "ticker": "DYMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "DYMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "DYM_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "DYM-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "DYM_USDT", "adjustByMarket": "USDT-USD" } + ], + "ENS": [ + { "exchangeName": "Binance", "ticker": "ENSUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ENS-USD" }, + { "exchangeName": "Gate", "ticker": "ENS_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "ENS-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ENS-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ENS_USDT", "adjustByMarket": "USDT-USD" } + ], + "EOS": [ + { "exchangeName": "Binance", "ticker": "EOSUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "EOSUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "EOS-USD" }, + { "exchangeName": "Gate", "ticker": "EOS_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "EOSUSD" }, + { "exchangeName": "Kucoin", "ticker": "EOS-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "EOS-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "EOS_USDT", "adjustByMarket": "USDT-USD" } + ], + "ETC": [ + { "exchangeName": "Binance", "ticker": "ETCUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "ETCUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ETC-USD" }, + { "exchangeName": "Huobi", "ticker": "etcusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "ETCUSD" }, + { "exchangeName": "Kucoin", "ticker": "ETC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ETC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ETC_USDT", "adjustByMarket": "USDT-USD" } + ], + "ETH": [ + { "exchangeName": "Binance", "ticker": "ETHUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "ETH/USD" }, + { "exchangeName": "Bybit", "ticker": "ETHUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ETH-USD" }, + { "exchangeName": "Huobi", "ticker": "ethusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "ETHUSD" }, + { "exchangeName": "Kucoin", "ticker": "ETH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ETH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ETH_USDT", "adjustByMarket": "USDT-USD" } + ], + "FET": [ + { "exchangeName": "Binance", "ticker": "FETUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "FET-USD" }, + { "exchangeName": "Kraken", "ticker": "FETUSD" }, + { "exchangeName": "Kucoin", "ticker": "FET-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "FET-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "FET_USDT", "adjustByMarket": "USDT-USD" } + ], + "FIL": [ + { "exchangeName": "Binance", "ticker": "FILUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "FILUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "FIL-USD" }, + { "exchangeName": "Huobi", "ticker": "filusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "FILUSD" }, + { "exchangeName": "Kucoin", "ticker": "FIL-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "FIL-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "FIL_USDT", "adjustByMarket": "USDT-USD" } + ], + "FTM": [ + { "exchangeName": "Binance", "ticker": "FTMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "FTMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "FTMUSD" }, + { "exchangeName": "Kucoin", "ticker": "FTM-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "FTM-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "FTM_USDT", "adjustByMarket": "USDT-USD" } + ], + "GALA": [ + { "exchangeName": "Binance", "ticker": "GALAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "GALAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "GALA_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "GALAUSD" }, + { "exchangeName": "Okx", "ticker": "GALA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "GALA_USDT", "adjustByMarket": "USDT-USD" } + ], + "GMT": [ + { "exchangeName": "Binance", "ticker": "GMTUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "GMTUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "GMT-USD" }, + { "exchangeName": "Gate", "ticker": "GMT_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "GMT-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "GMT-USDT", "adjustByMarket": "USDT-USD" } + ], + "GRT": [ + { "exchangeName": "Binance", "ticker": "GRTUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "GRT-USD" }, + { "exchangeName": "Gate", "ticker": "GRT_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "GRTUSD" }, + { "exchangeName": "Kucoin", "ticker": "GRT-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "GRT-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "GRT_USDT", "adjustByMarket": "USDT-USD" } + ], + "HBAR": [ + { "exchangeName": "Binance", "ticker": "HBARUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "HBARUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "HBAR-USD" }, + { "exchangeName": "Kucoin", "ticker": "HBAR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "HBAR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "HBAR_USDT", "adjustByMarket": "USDT-USD" } + ], + "ICP": [ + { "exchangeName": "Binance", "ticker": "ICPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "ICPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ICP-USD" }, + { "exchangeName": "Kraken", "ticker": "ICPUSD" }, + { "exchangeName": "Kucoin", "ticker": "ICP-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ICP-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ICP_USDT", "adjustByMarket": "USDT-USD" } + ], + "IMX": [ + { "exchangeName": "Binance", "ticker": "IMXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "IMX-USD" }, + { "exchangeName": "Kraken", "ticker": "IMXUSD" }, + { "exchangeName": "Kucoin", "ticker": "IMX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "IMX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "IMX_USDT", "adjustByMarket": "USDT-USD" } + ], + "INJ": [ + { "exchangeName": "Binance", "ticker": "INJUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "INJUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "INJ-USD" }, + { "exchangeName": "Kraken", "ticker": "INJUSD" }, + { "exchangeName": "Kucoin", "ticker": "INJ-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "INJ-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "INJ_USDT", "adjustByMarket": "USDT-USD" } + ], + "JTO": [ + { "exchangeName": "Binance", "ticker": "JTOUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "JTOUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "JTO-USD" }, + { "exchangeName": "Kucoin", "ticker": "JTO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "JTO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "JTO_USDT", "adjustByMarket": "USDT-USD" } + ], + "JUP": [ + { "exchangeName": "Binance", "ticker": "JUPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "JUPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "JUP_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "JUP-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "JUP_USDT", "adjustByMarket": "USDT-USD" } + ], + "KAVA": [ + { "exchangeName": "Binance", "ticker": "KAVAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "KAVAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "KAVA-USD" }, + { "exchangeName": "Gate", "ticker": "KAVA_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "KAVAUSD" }, + { "exchangeName": "Kucoin", "ticker": "KAVA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "KAVA_USDT", "adjustByMarket": "USDT-USD" } + ], + "LDO": [ + { "exchangeName": "Binance", "ticker": "LDOUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "LDOUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "LDO-USD" }, + { "exchangeName": "Kraken", "ticker": "LDOUSD" }, + { "exchangeName": "Kucoin", "ticker": "LDO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "LDO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "LDO_USDT", "adjustByMarket": "USDT-USD" } + ], + "LINK": [ + { "exchangeName": "Binance", "ticker": "LINKUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "LINK/USD" }, + { "exchangeName": "Bybit", "ticker": "LINKUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "LINK-USD" }, + { "exchangeName": "Kraken", "ticker": "LINKUSD" }, + { "exchangeName": "Kucoin", "ticker": "LINK-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "LINK-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "LINK_USDT", "adjustByMarket": "USDT-USD" } + ], + "LTC": [ + { "exchangeName": "Binance", "ticker": "LTCUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "LTC/USD" }, + { "exchangeName": "Bybit", "ticker": "LTCUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "LTC-USD" }, + { "exchangeName": "Huobi", "ticker": "ltcusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "LTCUSD" }, + { "exchangeName": "Kucoin", "ticker": "LTC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "LTC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "LTC_USDT", "adjustByMarket": "USDT-USD" } + ], + "MANA": [ + { "exchangeName": "Binance", "ticker": "MANAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "MANA-USD" }, + { "exchangeName": "Gate", "ticker": "MANA_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "MANAUSD" }, + { "exchangeName": "Kucoin", "ticker": "MANA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "MANA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "MANA_USDT", "adjustByMarket": "USDT-USD" } + ], + "MASK": [ + { "exchangeName": "Binance", "ticker": "MASKUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "MASKUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "MASK-USD" }, + { "exchangeName": "Gate", "ticker": "MASK_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Huobi", "ticker": "maskusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "MASK-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "MASK-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "MASK_USDT", "adjustByMarket": "USDT-USD" } + ], + "MATIC": [ + { "exchangeName": "Binance", "ticker": "MATICUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "MATIC/USD" }, + { "exchangeName": "Bybit", "ticker": "MATICUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "MATIC-USD" }, + { "exchangeName": "Huobi", "ticker": "maticusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "MATICUSD" }, + { "exchangeName": "Kucoin", "ticker": "MATIC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "MATIC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "MATIC_USDT", "adjustByMarket": "USDT-USD" } + ], + "MINA": [ + { "exchangeName": "Binance", "ticker": "MINAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "MINA-USD" }, + { "exchangeName": "Gate", "ticker": "MINA_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "MINAUSD" }, + { "exchangeName": "Okx", "ticker": "MINA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "MINA_USDT", "adjustByMarket": "USDT-USD" } + ], + "MKR": [ + { "exchangeName": "Binance", "ticker": "MKRUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "MKR-USD" }, + { "exchangeName": "Kraken", "ticker": "MKRUSD" }, + { "exchangeName": "Kucoin", "ticker": "MKR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "MKR-USDT", "adjustByMarket": "USDT-USD" } + ], + "NEAR": [ + { "exchangeName": "Binance", "ticker": "NEARUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "NEARUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "NEAR-USD" }, + { "exchangeName": "Huobi", "ticker": "nearusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "NEARUSD" }, + { "exchangeName": "Kucoin", "ticker": "NEAR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "NEAR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "NEAR_USDT", "adjustByMarket": "USDT-USD" } + ], + "OP": [ + { "exchangeName": "Binance", "ticker": "OPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "OPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "OP-USD" }, + { "exchangeName": "Gate", "ticker": "OP_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "OPUSD" }, + { "exchangeName": "Kucoin", "ticker": "OP-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "OP-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "OP_USDT", "adjustByMarket": "USDT-USD" } + ], + "ORDI": [ + { "exchangeName": "Binance", "ticker": "ORDIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "ORDIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "ORDI_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Huobi", "ticker": "ordiusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "ORDI-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ORDI-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ORDI_USDT", "adjustByMarket": "USDT-USD" } + ], + "PEPE": [ + { "exchangeName": "Binance", "ticker": "PEPEUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "PEPEUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "PEPEUSD" }, + { "exchangeName": "Kucoin", "ticker": "PEPE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "PEPE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "PEPE_USDT", "adjustByMarket": "USDT-USD" } + ], + "PYTH": [ + { "exchangeName": "Binance", "ticker": "PYTHUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "PYTHUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "PYTH_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "PYTH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "PYTH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "PYTH_USDT", "adjustByMarket": "USDT-USD" } + ], + "RNDR": [ + { "exchangeName": "Binance", "ticker": "RNDRUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "RNDR-USD" }, + { "exchangeName": "Kraken", "ticker": "RNDRUSD" }, + { "exchangeName": "Kucoin", "ticker": "RNDR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "RNDR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "RNDR_USDT", "adjustByMarket": "USDT-USD" } + ], + "RUNE": [ + { "exchangeName": "Binance", "ticker": "RUNEUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "RUNE_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "RUNEUSD" }, + { "exchangeName": "Kucoin", "ticker": "RUNE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "RUNE_USDT", "adjustByMarket": "USDT-USD" } + ], + "SAND": [ + { "exchangeName": "Binance", "ticker": "SANDUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "SAND-USD" }, + { "exchangeName": "Gate", "ticker": "SAND_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "SAND-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "SAND-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "SAND_USDT", "adjustByMarket": "USDT-USD" } + ], + "SEI": [ + { "exchangeName": "Binance", "ticker": "SEIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "SEIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "SEI-USD" }, + { "exchangeName": "Huobi", "ticker": "seiusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "SEIUSD" }, + { "exchangeName": "Kucoin", "ticker": "SEI-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "SEI_USDT", "adjustByMarket": "USDT-USD" } + ], + "SHIB": [ + { "exchangeName": "Binance", "ticker": "SHIBUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "SHIBUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "SHIB-USD" }, + { "exchangeName": "Huobi", "ticker": "shibusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "SHIBUSD" }, + { "exchangeName": "Kucoin", "ticker": "SHIB-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "SHIB-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "SHIB_USDT", "adjustByMarket": "USDT-USD" } + ], + "SNX": [ + { "exchangeName": "Binance", "ticker": "SNXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "SNXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "SNX-USD" }, + { "exchangeName": "Kraken", "ticker": "SNXUSD" }, + { "exchangeName": "Kucoin", "ticker": "SNX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "SNX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "SNX_USDT", "adjustByMarket": "USDT-USD" } + ], + "SOL": [ + { "exchangeName": "Binance", "ticker": "SOLUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "SOL/USD" }, + { "exchangeName": "Bybit", "ticker": "SOLUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "SOL-USD" }, + { "exchangeName": "Huobi", "ticker": "solusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "SOLUSD" }, + { "exchangeName": "Kucoin", "ticker": "SOL-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "SOL-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "SOL_USDT", "adjustByMarket": "USDT-USD" } + ], + "STX": [ + { "exchangeName": "Binance", "ticker": "STXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "STXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "STX-USD" }, + { "exchangeName": "Gate", "ticker": "STX_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "STXUSD" }, + { "exchangeName": "Kucoin", "ticker": "STX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "STX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "STX_USDT", "adjustByMarket": "USDT-USD" } + ], + "SUI": [ + { "exchangeName": "Binance", "ticker": "SUIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "SUIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "SUI-USD" }, + { "exchangeName": "Huobi", "ticker": "suiusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "SUIUSD" }, + { "exchangeName": "Kucoin", "ticker": "SUI-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "SUI-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "SUI_USDT", "adjustByMarket": "USDT-USD" } + ], + "TIA": [ + { "exchangeName": "Binance", "ticker": "TIAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "TIAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "TIA-USD" }, + { "exchangeName": "Kraken", "ticker": "TIAUSD" }, + { "exchangeName": "Kucoin", "ticker": "TIA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "TIA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "TIA_USDT", "adjustByMarket": "USDT-USD" } + ], + "TRX": [ + { "exchangeName": "Binance", "ticker": "TRXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "TRXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "TRX_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Huobi", "ticker": "trxusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "TRXUSD" }, + { "exchangeName": "Kucoin", "ticker": "TRX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "TRX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "TRX_USDT", "adjustByMarket": "USDT-USD" } + ], + "UNI": [ + { "exchangeName": "Binance", "ticker": "UNIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "UNIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "UNI-USD" }, + { "exchangeName": "Kraken", "ticker": "UNIUSD" }, + { "exchangeName": "Kucoin", "ticker": "UNI-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "UNI-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "UNI_USDT", "adjustByMarket": "USDT-USD" } + ], + "WLD": [ + { "exchangeName": "Binance", "ticker": "WLDUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "WLDUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "WLD_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "WLD-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "WLD-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "WLD_USDT", "adjustByMarket": "USDT-USD" } + ], + "WOO": [ + { "exchangeName": "Binance", "ticker": "WOOUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "WOO_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "WOO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "WOO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "WOO_USDT", "adjustByMarket": "USDT-USD" } + ], + "XLM": [ + { "exchangeName": "Binance", "ticker": "XLMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "XLM/USD" }, + { "exchangeName": "Bybit", "ticker": "XLMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "XLM-USD" }, + { "exchangeName": "Kraken", "ticker": "XLMUSD" }, + { "exchangeName": "Kucoin", "ticker": "XLM-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "XLM-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "XLM_USDT", "adjustByMarket": "USDT-USD" } + ], + "XRP": [ + { "exchangeName": "Binance", "ticker": "XRPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "XRP/USD" }, + { "exchangeName": "Bybit", "ticker": "XRPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "XRP-USD" }, + { "exchangeName": "Huobi", "ticker": "xrpusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "XRPUSD" }, + { "exchangeName": "Kucoin", "ticker": "XRP-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "XRP-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "XRP_USDT", "adjustByMarket": "USDT-USD" } + ], + "ZETA": [ + { "exchangeName": "Bybit", "ticker": "ZETAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ZETA-USD" }, + { "exchangeName": "Gate", "ticker": "ZETA_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "ZETA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ZETA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ZETA_USDT", "adjustByMarket": "USDT-USD" } + ] +} diff --git a/public/configs/potentialMarketParameters.json b/public/configs/otherMarketParameters.json similarity index 69% rename from public/configs/potentialMarketParameters.json rename to public/configs/otherMarketParameters.json index fe58715..e93bd36 100644 --- a/public/configs/potentialMarketParameters.json +++ b/public/configs/otherMarketParameters.json @@ -1,15 +1,32 @@ [ + { + "baseAsset": "1INCH", + "referencePrice": 0.3398645158695157, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "1INCH", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, { "baseAsset": "AAVE", - "referencePrice": "88.41933533", + "referencePrice": 85.34916282287368, "numOracles": 7, "liquidityTier": 2, "assetName": "AAVE", - "p": 1, - "atomicResolution": -7, + "p": 1.0, + "atomicResolution": -7.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -8, + "priceExponent": -8.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -18,15 +35,15 @@ }, { "baseAsset": "ADA", - "referencePrice": "0.4713770925", + "referencePrice": 0.5223295461752288, "numOracles": 9, "liquidityTier": 1, "assetName": "Cardano", - "p": -1, - "atomicResolution": -5, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -10, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -35,15 +52,15 @@ }, { "baseAsset": "AGIX", - "referencePrice": "0.2111443656", + "referencePrice": 0.2445107154373193, "numOracles": 6, "liquidityTier": 2, "assetName": "SingularityNET", - "p": -1, - "atomicResolution": -5, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -10, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -52,15 +69,15 @@ }, { "baseAsset": "ALGO", - "referencePrice": "0.1613430877", + "referencePrice": 0.1681287078892224, "numOracles": 6, "liquidityTier": 2, "assetName": "Algorand", - "p": -1, - "atomicResolution": -5, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -10, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -69,15 +86,15 @@ }, { "baseAsset": "APE", - "referencePrice": "1.121514886", + "referencePrice": 1.1944183891765008, "numOracles": 7, "liquidityTier": 2, "assetName": "ApeCoin", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -9, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -86,15 +103,15 @@ }, { "baseAsset": "APT", - "referencePrice": "7.323447408", - "numOracles": 8, - "liquidityTier": 2, + "referencePrice": 7.866427281197853, + "numOracles": 9, + "liquidityTier": 1, "assetName": "Aptos", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, - "minPriceChangePpm": 4000, - "priceExponent": -9, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -103,15 +120,15 @@ }, { "baseAsset": "ARB", - "referencePrice": "1.701673341", + "referencePrice": 1.8941460935787378, "numOracles": 8, "liquidityTier": 1, "assetName": "Arbitrum", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -9, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -120,15 +137,15 @@ }, { "baseAsset": "ATOM", - "referencePrice": "8.050389759", + "referencePrice": 8.376447043890133, "numOracles": 8, - "liquidityTier": 2, + "liquidityTier": 1, "assetName": "Cosmos", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, - "minPriceChangePpm": 4000, - "priceExponent": -9, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -137,15 +154,15 @@ }, { "baseAsset": "AVAX", - "referencePrice": "30.38272818", + "referencePrice": 35.51220693068919, "numOracles": 9, "liquidityTier": 1, "assetName": "Avalanche", - "p": 1, - "atomicResolution": -7, + "p": 1.0, + "atomicResolution": -7.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -8, + "priceExponent": -8.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -154,15 +171,15 @@ }, { "baseAsset": "BCH", - "referencePrice": "236.328774", + "referencePrice": 242.55658383981574, "numOracles": 9, "liquidityTier": 1, "assetName": "Bitcoin Cash", - "p": 2, - "atomicResolution": -8, + "p": 2.0, + "atomicResolution": -8.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -7, + "priceExponent": -7.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -171,15 +188,15 @@ }, { "baseAsset": "BLUR", - "referencePrice": "0.6050104719", + "referencePrice": 0.6174156210414935, "numOracles": 7, "liquidityTier": 2, "assetName": "Blur", - "p": -1, - "atomicResolution": -5, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -10, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -188,15 +205,15 @@ }, { "baseAsset": "BNB", - "referencePrice": "243.1294766", + "referencePrice": 261.9562938974594, "numOracles": 6, "liquidityTier": 2, "assetName": "Binance Coin", - "p": 2, - "atomicResolution": -8, + "p": 2.0, + "atomicResolution": -8.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -7, + "priceExponent": -7.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -205,15 +222,15 @@ }, { "baseAsset": "BONK", - "referencePrice": "1.09E-05", + "referencePrice": 1.0481380626265717e-5, "numOracles": 6, "liquidityTier": 2, "assetName": "Bonk Token", - "p": -5, - "atomicResolution": -1, + "p": -5.0, + "atomicResolution": -1.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -14, + "priceExponent": -14.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -222,32 +239,15 @@ }, { "baseAsset": "BTC", - "referencePrice": "39909.14585", + "referencePrice": 44848.16769478778, "numOracles": 9, "liquidityTier": 1, "assetName": "Bitcoin", - "p": 4, - "atomicResolution": -10, + "p": 4.0, + "atomicResolution": -10.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -5, - "stepBaseQuantum": 1000000, - "ticksizeExponent": -3, - "subticksPerTick": 1000000, - "minOrderSize": 1000000, - "quantumConversionExponent": -9 - }, - { - "baseAsset": "CFX", - "referencePrice": "0.1454384387", - "numOracles": 5, - "liquidityTier": 2, - "assetName": "Conflux Token", - "p": -1, - "atomicResolution": -5, - "minExchanges": 3, - "minPriceChangePpm": 4000, - "priceExponent": -10, + "priceExponent": -5.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -256,32 +256,15 @@ }, { "baseAsset": "CHZ", - "referencePrice": "0.08712744693", + "referencePrice": 0.10152209594142685, "numOracles": 6, "liquidityTier": 2, "assetName": "Chiliz", - "p": -2, - "atomicResolution": -4, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -11, - "stepBaseQuantum": 1000000, - "ticksizeExponent": -3, - "subticksPerTick": 1000000, - "minOrderSize": 1000000, - "quantumConversionExponent": -9 - }, - { - "baseAsset": "COMP", - "referencePrice": "52.74250938", - "numOracles": 5, - "liquidityTier": 2, - "assetName": "Compound Coin", - "p": 1, - "atomicResolution": -7, - "minExchanges": 3, - "minPriceChangePpm": 4000, - "priceExponent": -8, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -290,15 +273,15 @@ }, { "baseAsset": "CRV", - "referencePrice": "0.4443624604", + "referencePrice": 0.48346754113361784, "numOracles": 6, "liquidityTier": 2, "assetName": "Curve DAO Token", - "p": -1, - "atomicResolution": -5, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -10, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -307,15 +290,15 @@ }, { "baseAsset": "DOGE", - "referencePrice": "0.07793177878", - "numOracles": 9, + "referencePrice": 0.08014457060243645, + "numOracles": 8, "liquidityTier": 1, "assetName": "Dogecoin", - "p": -2, - "atomicResolution": -4, + "p": -2.0, + "atomicResolution": -4.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -11, + "priceExponent": -11.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -324,15 +307,15 @@ }, { "baseAsset": "DOT", - "referencePrice": "6.452414058", + "referencePrice": 6.965370230174219, "numOracles": 8, "liquidityTier": 1, "assetName": "Polkadot", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -9, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -340,16 +323,16 @@ "quantumConversionExponent": -9 }, { - "baseAsset": "EGLD", - "referencePrice": "39.03897897", - "numOracles": 5, + "baseAsset": "DYM", + "referencePrice": 5.544949130771594, + "numOracles": 6, "liquidityTier": 2, - "assetName": "MultiversX", - "p": 1, - "atomicResolution": -7, + "assetName": "Dymension", + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -8, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -358,15 +341,15 @@ }, { "baseAsset": "ENS", - "referencePrice": "14.85690244", + "referencePrice": 17.72913244361432, "numOracles": 6, "liquidityTier": 2, - "assetName": "Ethereum Name Service (ENS)", - "p": 1, - "atomicResolution": -7, + "assetName": "Ethereum Name Service", + "p": 1.0, + "atomicResolution": -7.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -8, + "priceExponent": -8.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -375,15 +358,15 @@ }, { "baseAsset": "EOS", - "referencePrice": "0.5977251446", + "referencePrice": 0.6306070212782233, "numOracles": 8, - "liquidityTier": 2, + "liquidityTier": 1, "assetName": "Eos", - "p": -1, - "atomicResolution": -5, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, - "minPriceChangePpm": 4000, - "priceExponent": -10, + "minPriceChangePpm": 2500, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -392,15 +375,15 @@ }, { "baseAsset": "ETC", - "referencePrice": "22.84861344", + "referencePrice": 25.31458356285971, "numOracles": 8, "liquidityTier": 1, "assetName": "Ethereum Classic", - "p": 1, - "atomicResolution": -7, + "p": 1.0, + "atomicResolution": -7.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -8, + "priceExponent": -8.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -409,15 +392,15 @@ }, { "baseAsset": "ETH", - "referencePrice": "2211.721168", + "referencePrice": 2431.2439928708804, "numOracles": 9, "liquidityTier": 1, "assetName": "Ethereum", - "p": 3, - "atomicResolution": -9, + "p": 3.0, + "atomicResolution": -9.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -6, + "priceExponent": -6.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -426,15 +409,15 @@ }, { "baseAsset": "FET", - "referencePrice": "0.5864541562", + "referencePrice": 0.5560893147613742, "numOracles": 6, "liquidityTier": 2, - "assetName": "Fetch AI", - "p": -1, - "atomicResolution": -5, + "assetName": "Fetch.ai", + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -10, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -443,32 +426,15 @@ }, { "baseAsset": "FIL", - "referencePrice": "4.930296959", + "referencePrice": 5.199120507932321, "numOracles": 8, "liquidityTier": 1, "assetName": "Filecoin", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -9, - "stepBaseQuantum": 1000000, - "ticksizeExponent": -3, - "subticksPerTick": 1000000, - "minOrderSize": 1000000, - "quantumConversionExponent": -9 - }, - { - "baseAsset": "FLOW", - "referencePrice": "0.5828593278", - "numOracles": 5, - "liquidityTier": 2, - "assetName": "Flow - Dapper Labs", - "p": -1, - "atomicResolution": -5, - "minExchanges": 3, - "minPriceChangePpm": 4000, - "priceExponent": -10, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -477,15 +443,15 @@ }, { "baseAsset": "FTM", - "referencePrice": "0.3359983176", + "referencePrice": 0.3711457058956354, "numOracles": 6, "liquidityTier": 2, "assetName": "Fantom", - "p": -1, - "atomicResolution": -5, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -10, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -494,15 +460,15 @@ }, { "baseAsset": "GALA", - "referencePrice": "0.01840015547", + "referencePrice": 0.01898331222229838, "numOracles": 6, "liquidityTier": 2, "assetName": "Gala", - "p": -2, - "atomicResolution": -4, + "p": -2.0, + "atomicResolution": -4.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -11, + "priceExponent": -11.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -511,15 +477,15 @@ }, { "baseAsset": "GMT", - "referencePrice": "0.2045438866", - "numOracles": 5, + "referencePrice": 0.20404992804891367, + "numOracles": 6, "liquidityTier": 2, - "assetName": "STEPN", - "p": -1, - "atomicResolution": -5, + "assetName": "GMT", + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -10, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -528,15 +494,15 @@ }, { "baseAsset": "GRT", - "referencePrice": "0.128018834", + "referencePrice": 0.13921183278937196, "numOracles": 7, "liquidityTier": 2, "assetName": "The Graph", - "p": -1, - "atomicResolution": -5, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -10, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -545,15 +511,15 @@ }, { "baseAsset": "HBAR", - "referencePrice": "0.07127967284", - "numOracles": 7, + "referencePrice": 0.07686278766140874, + "numOracles": 6, "liquidityTier": 2, - "assetName": "Hedera Hashgraph", - "p": -2, - "atomicResolution": -4, + "assetName": "Hedera", + "p": -2.0, + "atomicResolution": -4.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -11, + "priceExponent": -11.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -562,15 +528,32 @@ }, { "baseAsset": "ICP", - "referencePrice": "11.47442186", + "referencePrice": 12.381985084851047, "numOracles": 7, "liquidityTier": 2, "assetName": "Internet Computer", - "p": 1, - "atomicResolution": -7, + "p": 1.0, + "atomicResolution": -7.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -8, + "priceExponent": -8.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "IMX", + "referencePrice": 2.3007875054054425, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Immutable X", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -579,15 +562,15 @@ }, { "baseAsset": "INJ", - "referencePrice": "31.78305093", + "referencePrice": 33.427379051845875, "numOracles": 7, "liquidityTier": 2, - "assetName": "Injective Protocol", - "p": 1, - "atomicResolution": -7, + "assetName": "Injective", + "p": 1.0, + "atomicResolution": -7.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -8, + "priceExponent": -8.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -596,15 +579,15 @@ }, { "baseAsset": "JTO", - "referencePrice": "1.886208515", + "referencePrice": 1.8587604617237268, "numOracles": 6, "liquidityTier": 2, "assetName": "Jito", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -9, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -613,15 +596,15 @@ }, { "baseAsset": "JUP", - "referencePrice": "0.69", + "referencePrice": 0.4339790660244292, "numOracles": 6, "liquidityTier": 2, "assetName": "Jupiter", - "p": -1, - "atomicResolution": -5, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -10, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -630,15 +613,15 @@ }, { "baseAsset": "KAVA", - "referencePrice": "0.5751546332", - "numOracles": 6, + "referencePrice": 0.6150293989811233, + "numOracles": 7, "liquidityTier": 2, "assetName": "Kava", - "p": -1, - "atomicResolution": -5, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -10, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -647,15 +630,15 @@ }, { "baseAsset": "LDO", - "referencePrice": "2.524539255", - "numOracles": 8, + "referencePrice": 2.872990563900012, + "numOracles": 7, "liquidityTier": 2, "assetName": "Lido DAO", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -9, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -664,15 +647,15 @@ }, { "baseAsset": "LINK", - "referencePrice": "13.81655633", + "referencePrice": 18.695585099973265, "numOracles": 8, "liquidityTier": 1, "assetName": "ChainLink", - "p": 1, - "atomicResolution": -7, + "p": 1.0, + "atomicResolution": -7.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -8, + "priceExponent": -8.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -681,15 +664,15 @@ }, { "baseAsset": "LTC", - "referencePrice": "65.43204352", + "referencePrice": 68.82098983684968, "numOracles": 9, "liquidityTier": 1, "assetName": "Litecoin", - "p": 1, - "atomicResolution": -7, + "p": 1.0, + "atomicResolution": -7.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -8, + "priceExponent": -8.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -698,15 +681,15 @@ }, { "baseAsset": "MANA", - "referencePrice": "0.3716510229", + "referencePrice": 0.3835526503137334, "numOracles": 7, "liquidityTier": 2, "assetName": "Decentraland", - "p": -1, - "atomicResolution": -5, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -10, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -715,15 +698,15 @@ }, { "baseAsset": "MASK", - "referencePrice": "2.787727403", - "numOracles": 7, - "liquidityTier": 2, + "referencePrice": 3.0190606294111477, + "numOracles": 8, + "liquidityTier": 1, "assetName": "Mask Network", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, - "minPriceChangePpm": 4000, - "priceExponent": -9, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -732,32 +715,15 @@ }, { "baseAsset": "MATIC", - "referencePrice": "0.7288467315", + "referencePrice": 0.8348216286259986, "numOracles": 9, "liquidityTier": 1, "assetName": "Matic Network", - "p": -1, - "atomicResolution": -5, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -10, - "stepBaseQuantum": 1000000, - "ticksizeExponent": -3, - "subticksPerTick": 1000000, - "minOrderSize": 1000000, - "quantumConversionExponent": -9 - }, - { - "baseAsset": "MEME", - "referencePrice": "0.01801497104", - "numOracles": 5, - "liquidityTier": 2, - "assetName": "Memecoin Price", - "p": -2, - "atomicResolution": -4, - "minExchanges": 3, - "minPriceChangePpm": 4000, - "priceExponent": -11, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -766,15 +732,15 @@ }, { "baseAsset": "MINA", - "referencePrice": "1.008126033", - "numOracles": 5, + "referencePrice": 0.9996552741300538, + "numOracles": 6, "liquidityTier": 2, "assetName": "Mina", - "p": 0, - "atomicResolution": -6, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -9, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -783,15 +749,15 @@ }, { "baseAsset": "MKR", - "referencePrice": "2113.151651", + "referencePrice": 1943.1865605831852, "numOracles": 6, "liquidityTier": 2, "assetName": "Maker", - "p": 3, - "atomicResolution": -9, + "p": 3.0, + "atomicResolution": -9.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -6, + "priceExponent": -6.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -800,15 +766,15 @@ }, { "baseAsset": "NEAR", - "referencePrice": "2.674751578", + "referencePrice": 2.9412830334457607, "numOracles": 8, "liquidityTier": 1, "assetName": "Near", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -9, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -817,15 +783,15 @@ }, { "baseAsset": "OP", - "referencePrice": "2.456951554", - "numOracles": 7, - "liquidityTier": 2, + "referencePrice": 2.959268526582415, + "numOracles": 8, + "liquidityTier": 1, "assetName": "Optimism", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, - "minPriceChangePpm": 4000, - "priceExponent": -9, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -834,32 +800,15 @@ }, { "baseAsset": "ORDI", - "referencePrice": "43.0494516", - "numOracles": 6, + "referencePrice": 51.40287704643513, + "numOracles": 7, "liquidityTier": 2, "assetName": "Ordinals", - "p": 1, - "atomicResolution": -7, + "p": 1.0, + "atomicResolution": -7.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -8, - "stepBaseQuantum": 1000000, - "ticksizeExponent": -3, - "subticksPerTick": 1000000, - "minOrderSize": 1000000, - "quantumConversionExponent": -9 - }, - { - "baseAsset": "PEOPLE", - "referencePrice": "0.02194591464", - "numOracles": 5, - "liquidityTier": 2, - "assetName": "ConstitutionDAO", - "p": -2, - "atomicResolution": -4, - "minExchanges": 3, - "minPriceChangePpm": 4000, - "priceExponent": -11, + "priceExponent": -8.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -868,15 +817,32 @@ }, { "baseAsset": "PEPE", - "referencePrice": "1.02E-06", + "referencePrice": 9.65894964791238e-7, "numOracles": 6, "liquidityTier": 2, "assetName": "Pepe", - "p": -6, - "atomicResolution": 0, + "p": -7.0, + "atomicResolution": 1.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -15, + "priceExponent": -16.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "PYTH", + "referencePrice": 0.4024907744770694, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Pyth Network", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -885,15 +851,32 @@ }, { "baseAsset": "RNDR", - "referencePrice": "3.777241656", + "referencePrice": 4.490794387737395, "numOracles": 6, "liquidityTier": 2, "assetName": "Render Token", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -9, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "RUNE", + "referencePrice": 3.7264809096406806, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Thorchain", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -902,15 +885,15 @@ }, { "baseAsset": "SAND", - "referencePrice": "0.3751083804", - "numOracles": 7, + "referencePrice": 0.37297439115035663, + "numOracles": 6, "liquidityTier": 2, - "assetName": "SAND", - "p": -1, - "atomicResolution": -5, + "assetName": "The Sandbox", + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -10, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -919,15 +902,15 @@ }, { "baseAsset": "SEI", - "referencePrice": "0.6149970988", + "referencePrice": 0.6414470586972892, "numOracles": 7, "liquidityTier": 2, "assetName": "Sei", - "p": -1, - "atomicResolution": -5, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -10, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -936,15 +919,15 @@ }, { "baseAsset": "SHIB", - "referencePrice": "8.84E-06", + "referencePrice": 9.204638050039261e-6, "numOracles": 8, "liquidityTier": 1, "assetName": "Shiba Inu", - "p": -6, - "atomicResolution": 0, + "p": -6.0, + "atomicResolution": 0.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -15, + "priceExponent": -15.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -953,15 +936,15 @@ }, { "baseAsset": "SNX", - "referencePrice": "3.130619706", - "numOracles": 6, + "referencePrice": 3.3742698571364094, + "numOracles": 7, "liquidityTier": 2, "assetName": "Synthetix Network Token", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -9, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -970,15 +953,15 @@ }, { "baseAsset": "SOL", - "referencePrice": "87.46988589", + "referencePrice": 102.57213563905393, "numOracles": 9, "liquidityTier": 1, "assetName": "Solana", - "p": 1, - "atomicResolution": -7, + "p": 2.0, + "atomicResolution": -8.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -8, + "priceExponent": -7.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -987,15 +970,15 @@ }, { "baseAsset": "STX", - "referencePrice": "1.255152213", - "numOracles": 7, - "liquidityTier": 2, + "referencePrice": 1.5144048703611412, + "numOracles": 8, + "liquidityTier": 1, "assetName": "Stacks", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, - "minPriceChangePpm": 4000, - "priceExponent": -9, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -1004,32 +987,15 @@ }, { "baseAsset": "SUI", - "referencePrice": "1.224271493", - "numOracles": 6, - "liquidityTier": 2, + "referencePrice": 1.5452561101842979, + "numOracles": 8, + "liquidityTier": 1, "assetName": "SuiNetwork", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, - "minPriceChangePpm": 4000, - "priceExponent": -9, - "stepBaseQuantum": 1000000, - "ticksizeExponent": -3, - "subticksPerTick": 1000000, - "minOrderSize": 1000000, - "quantumConversionExponent": -9 - }, - { - "baseAsset": "SUSHI", - "referencePrice": "0.8926299706", - "numOracles": 6, - "liquidityTier": 2, - "assetName": "Sushi", - "p": -1, - "atomicResolution": -5, - "minExchanges": 3, - "minPriceChangePpm": 4000, - "priceExponent": -10, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -1038,15 +1004,15 @@ }, { "baseAsset": "TIA", - "referencePrice": "15.55257715", + "referencePrice": 19.71178951640871, "numOracles": 7, "liquidityTier": 2, "assetName": "Celestia", - "p": 1, - "atomicResolution": -7, + "p": 1.0, + "atomicResolution": -7.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -8, + "priceExponent": -8.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -1055,15 +1021,15 @@ }, { "baseAsset": "TRX", - "referencePrice": "0.09702155504", + "referencePrice": 0.10782035164658409, "numOracles": 8, - "liquidityTier": 2, + "liquidityTier": 1, "assetName": "TRON", - "p": -2, - "atomicResolution": -4, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, - "minPriceChangePpm": 4000, - "priceExponent": -11, + "minPriceChangePpm": 2500, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -1072,32 +1038,15 @@ }, { "baseAsset": "UNI", - "referencePrice": "5.760612586", + "referencePrice": 6.374086551681073, "numOracles": 7, "liquidityTier": 2, "assetName": "Uniswap", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -9, - "stepBaseQuantum": 1000000, - "ticksizeExponent": -3, - "subticksPerTick": 1000000, - "minOrderSize": 1000000, - "quantumConversionExponent": -9 - }, - { - "baseAsset": "WAVES", - "referencePrice": "2.145700544", - "numOracles": 5, - "liquidityTier": 2, - "assetName": "Waves", - "p": 0, - "atomicResolution": -6, - "minExchanges": 3, - "minPriceChangePpm": 4000, - "priceExponent": -9, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -1106,15 +1055,32 @@ }, { "baseAsset": "WLD", - "referencePrice": "1.907665645", + "referencePrice": 1.9810696413118303, "numOracles": 6, "liquidityTier": 2, "assetName": "Worldcoin WLD", - "p": 0, - "atomicResolution": -6, + "p": 0.0, + "atomicResolution": -6.0, "minExchanges": 3, "minPriceChangePpm": 4000, - "priceExponent": -9, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "WOO", + "referencePrice": 0.2944897275608197, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "WOO Network", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -1123,15 +1089,15 @@ }, { "baseAsset": "XLM", - "referencePrice": "0.1116437262", + "referencePrice": 0.1093759305057456, "numOracles": 8, "liquidityTier": 1, "assetName": "Stellar", - "p": -1, - "atomicResolution": -5, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -10, + "priceExponent": -10.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, @@ -1140,15 +1106,32 @@ }, { "baseAsset": "XRP", - "referencePrice": "0.5112717386", + "referencePrice": 0.5140463170757591, "numOracles": 9, "liquidityTier": 1, "assetName": "Ripple", - "p": -1, - "atomicResolution": -5, + "p": -1.0, + "atomicResolution": -5.0, "minExchanges": 3, "minPriceChangePpm": 2500, - "priceExponent": -10, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "ZETA", + "referencePrice": 1.0427131536820096, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "ZetaChain", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -9.0, "stepBaseQuantum": 1000000, "ticksizeExponent": -3, "subticksPerTick": 1000000, diff --git a/public/configs/potentialMarketExchangeConfig.json b/public/configs/potentialMarketExchangeConfig.json deleted file mode 100644 index 18d03cb..0000000 --- a/public/configs/potentialMarketExchangeConfig.json +++ /dev/null @@ -1,3782 +0,0 @@ -{ - "AAVE": [ - { - "exchangeName": "Mexc", - "ticker": "AAVE_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "aaveusdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "AAVEUSD" - }, - { - "exchangeName": "Okx", - "ticker": "AAVE-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "AAVE-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "AAVEUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "AAVE-USD" - } - ], - "ADA": [ - { - "exchangeName": "Okx", - "ticker": "ADA-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "ADA-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "adausdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "ADA-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bitstamp", - "ticker": "ADA/USD" - }, - { - "exchangeName": "Mexc", - "ticker": "ADA_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "ADAUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "ADAUSD" - }, - { - "exchangeName": "Binance", - "ticker": "ADAUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "AGIX": [ - { - "exchangeName": "Okx", - "ticker": "AGIX-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "AGIXUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "AGIX-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "AGIX_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "AGIXUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "AGIX_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "ALGO": [ - { - "exchangeName": "Kucoin", - "ticker": "ALGO-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "ALGO_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "ALGO-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "ALGO-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "ALGOUSD" - }, - { - "exchangeName": "Binance", - "ticker": "ALGOUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "APE": [ - { - "exchangeName": "Mexc", - "ticker": "APE_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "APE-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "APE-USD" - }, - { - "exchangeName": "Okx", - "ticker": "APE-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "APEUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "APEUSD" - }, - { - "exchangeName": "Gate", - "ticker": "APE_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "APT": [ - { - "exchangeName": "Binance", - "ticker": "APTUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "APTUSD" - }, - { - "exchangeName": "Bybit", - "ticker": "APTUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "APT-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "APT_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "APT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "APT-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "APT_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "ARB": [ - { - "exchangeName": "Kraken", - "ticker": "ARBUSD" - }, - { - "exchangeName": "Mexc", - "ticker": "ARB_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "ARB-USD" - }, - { - "exchangeName": "Binance", - "ticker": "ARBUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "ARBUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "ARB-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "ARB-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "arbusdt", - "adjustByMarket": "USDT-USD" - } - ], - "ATOM": [ - { - "exchangeName": "Kucoin", - "ticker": "ATOM-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "ATOM-USD" - }, - { - "exchangeName": "Binance", - "ticker": "ATOMUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "ATOMUSD" - }, - { - "exchangeName": "Okx", - "ticker": "ATOM-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "ATOM_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "ATOMUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "ATOM_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "AVAX": [ - { - "exchangeName": "Okx", - "ticker": "AVAX-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "AVAX_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "AVAX-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "AVAXUSD" - }, - { - "exchangeName": "Huobi", - "ticker": "avaxusdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bitstamp", - "ticker": "AVAX/USD" - }, - { - "exchangeName": "Binance", - "ticker": "AVAXUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "AVAXUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "AVAX-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "BCH": [ - { - "exchangeName": "Kraken", - "ticker": "BCHUSD" - }, - { - "exchangeName": "Bitstamp", - "ticker": "BCH/USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "BCH-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "BCH_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "BCHUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "BCHUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "bchusdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "BCH-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "BCH-USD" - } - ], - "BLUR": [ - { - "exchangeName": "Kraken", - "ticker": "BLURUSD" - }, - { - "exchangeName": "Bybit", - "ticker": "BLURUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "BLURUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "BLUR-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "BLUR-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "BLUR-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "BLUR_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "BNB": [ - { - "exchangeName": "Okx", - "ticker": "BNB-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "BNB-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "BNB_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "BNBUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "BNBUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "BNB_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "BONK": [ - { - "exchangeName": "Bybit", - "ticker": "BONKUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "BONK_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "BONKUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "BONK-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "BONK-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "BONK-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "BTC": [ - { - "exchangeName": "Kucoin", - "ticker": "BTC-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "BTC_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "BTCUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "BTC-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bitstamp", - "ticker": "BTC/USD" - }, - { - "exchangeName": "Huobi", - "ticker": "btcusdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "BTC-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "BTCUSD" - }, - { - "exchangeName": "Binance", - "ticker": "BTCUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "CHZ": [ - { - "exchangeName": "Okx", - "ticker": "CHZ-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "CHZ_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "CHZ-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "CHZUSD" - }, - { - "exchangeName": "Binance", - "ticker": "CHZUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "CHZ_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "CRV": [ - { - "exchangeName": "Kraken", - "ticker": "CRVUSD" - }, - { - "exchangeName": "Kucoin", - "ticker": "CRV-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "CRVUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "CRV-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "CRV_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "CRV-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "DOGE": [ - { - "exchangeName": "CoinbasePro", - "ticker": "DOGE-USD" - }, - { - "exchangeName": "Okx", - "ticker": "DOGE-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "DOGE_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "DOGEUSD" - }, - { - "exchangeName": "Bybit", - "ticker": "DOGEUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bitstamp", - "ticker": "DOGE/USD" - }, - { - "exchangeName": "Binance", - "ticker": "DOGEUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "dogeusdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "DOGE-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "DOT": [ - { - "exchangeName": "Kraken", - "ticker": "DOTUSD" - }, - { - "exchangeName": "Okx", - "ticker": "DOT-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "dotusdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "DOT_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "DOTUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "DOT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "DOT-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "DOTUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "ENS": [ - { - "exchangeName": "Mexc", - "ticker": "ENS_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "ENS-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "ENSUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "ENS-USD" - }, - { - "exchangeName": "Okx", - "ticker": "ENS-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "ENS_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "EOS": [ - { - "exchangeName": "Binance", - "ticker": "EOSUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "EOS_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "EOS-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "EOS-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "EOSUSD" - }, - { - "exchangeName": "Okx", - "ticker": "EOS-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "EOSUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "EOS_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "ETC": [ - { - "exchangeName": "Kucoin", - "ticker": "ETC-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "ETCUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "ETCUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "ETCUSD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "ETC-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "etcusdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "ETC-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "ETC_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "ETH": [ - { - "exchangeName": "Bitstamp", - "ticker": "ETH/USD" - }, - { - "exchangeName": "Okx", - "ticker": "ETH-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "ethusdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "ETH-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "ETHUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "ETHUSD" - }, - { - "exchangeName": "Mexc", - "ticker": "ETH_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "ETH-USD" - }, - { - "exchangeName": "Binance", - "ticker": "ETHUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "FET": [ - { - "exchangeName": "Mexc", - "ticker": "FET_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "FETUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "FET-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "FET-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "FETUSD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "FET-USD" - } - ], - "FIL": [ - { - "exchangeName": "Kucoin", - "ticker": "FIL-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "FILUSD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "FIL-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "FILUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "FIL_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "FIL-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "FILUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "filusdt", - "adjustByMarket": "USDT-USD" - } - ], - "FTM": [ - { - "exchangeName": "Bybit", - "ticker": "FTMUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "FTMUSD" - }, - { - "exchangeName": "Kucoin", - "ticker": "FTM-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "FTM_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "FTMUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "FTM-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "GALA": [ - { - "exchangeName": "Okx", - "ticker": "GALA-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "GALA_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "GALAUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "GALAUSD" - }, - { - "exchangeName": "Binance", - "ticker": "GALAUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "GALA_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "GRT": [ - { - "exchangeName": "CoinbasePro", - "ticker": "GRT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "GRT-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "GRT_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "GRTUSD" - }, - { - "exchangeName": "Binance", - "ticker": "GRTUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "GRT-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "GRT_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "HBAR": [ - { - "exchangeName": "Kucoin", - "ticker": "HBAR-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "HBAR_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "HBAR-USD" - }, - { - "exchangeName": "Okx", - "ticker": "HBAR-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "hbarusdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "HBARUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "HBARUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "ICP": [ - { - "exchangeName": "Binance", - "ticker": "ICPUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "ICP-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "ICP_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "ICPUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "ICP-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "ICP-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "ICPUSD" - } - ], - "INJ": [ - { - "exchangeName": "Binance", - "ticker": "INJUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "INJUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "INJ_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "INJUSD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "INJ-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "INJ-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "INJ-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "JTO": [ - { - "exchangeName": "CoinbasePro", - "ticker": "JTO-USD" - }, - { - "exchangeName": "Binance", - "ticker": "JTOUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "JTOUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "JTO_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "JTO-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "JTO-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "KAVA": [ - { - "exchangeName": "CoinbasePro", - "ticker": "KAVA-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "KAVA_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "KAVA-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "KAVAUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "KAVAUSD" - }, - { - "exchangeName": "Gate", - "ticker": "KAVA_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "LDO": [ - { - "exchangeName": "Okx", - "ticker": "LDO-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "LDOUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "LDO-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "LDOUSD" - }, - { - "exchangeName": "Mexc", - "ticker": "LDO_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "LDO-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "LDOUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "LDO_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "LINK": [ - { - "exchangeName": "Kraken", - "ticker": "LINKUSD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "LINK-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "LINK_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "LINKUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "LINK-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bitstamp", - "ticker": "LINK/USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "LINK-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "LINKUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "LTC": [ - { - "exchangeName": "CoinbasePro", - "ticker": "LTC-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "LTC_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "LTC-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "LTC-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "LTCUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bitstamp", - "ticker": "LTC/USD" - }, - { - "exchangeName": "Huobi", - "ticker": "ltcusdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "LTCUSD" - }, - { - "exchangeName": "Binance", - "ticker": "LTCUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "MANA": [ - { - "exchangeName": "Binance", - "ticker": "MANAUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "MANA-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "MANAUSD" - }, - { - "exchangeName": "Mexc", - "ticker": "MANA_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "MANA-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "MANA-USD" - }, - { - "exchangeName": "Gate", - "ticker": "MANA_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "MASK": [ - { - "exchangeName": "Binance", - "ticker": "MASKUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "MASK-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "MASK-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "MASK_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "MASK-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "MASKUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "MASK_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "MATIC": [ - { - "exchangeName": "Okx", - "ticker": "MATIC-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "MATIC-USD" - }, - { - "exchangeName": "Binance", - "ticker": "MATICUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "maticusdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "MATICUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "MATIC_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "MATICUSD" - }, - { - "exchangeName": "Bitstamp", - "ticker": "MATIC/USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "MATIC-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "MKR": [ - { - "exchangeName": "CoinbasePro", - "ticker": "MKR-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "MKR_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "MKRUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "MKRUSD" - }, - { - "exchangeName": "Okx", - "ticker": "MKR-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "MKR-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "NEAR": [ - { - "exchangeName": "Kucoin", - "ticker": "NEAR-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "NEARUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "NEAR-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "NEARUSD" - }, - { - "exchangeName": "Okx", - "ticker": "NEAR-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "NEARUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "NEAR_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "nearusdt", - "adjustByMarket": "USDT-USD" - } - ], - "OP": [ - { - "exchangeName": "Mexc", - "ticker": "OP_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "OP-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "OPUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "OPUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "OP-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "OP-USD" - }, - { - "exchangeName": "Gate", - "ticker": "OP_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "ORDI": [ - { - "exchangeName": "Kucoin", - "ticker": "ORDI-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "ORDIUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "ORDIUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "ORDI-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "ordiusdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "ORDI_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "PEPE": [ - { - "exchangeName": "Binance", - "ticker": "PEPEUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "PEPEUSD" - }, - { - "exchangeName": "Bybit", - "ticker": "PEPEUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "PEPE-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "PEPE_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "PEPE-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "RNDR": [ - { - "exchangeName": "Kucoin", - "ticker": "RNDR-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "RNDRUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "RNDR-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "RNDRUSD" - }, - { - "exchangeName": "Mexc", - "ticker": "RNDR_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "RNDR-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "SAND": [ - { - "exchangeName": "Okx", - "ticker": "SAND-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "SAND-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "SANDUSD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "SAND-USD" - }, - { - "exchangeName": "Binance", - "ticker": "SANDUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "SAND_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "SAND_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "SEI": [ - { - "exchangeName": "Binance", - "ticker": "SEIUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "SEI-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "seiusdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "SEIUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "SEIUSD" - }, - { - "exchangeName": "Kucoin", - "ticker": "SEI-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "SEI_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "SHIB": [ - { - "exchangeName": "Okx", - "ticker": "SHIB-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "SHIBUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "SHIB-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "SHIB-USD" - }, - { - "exchangeName": "Binance", - "ticker": "SHIBUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "SHIBUSD" - }, - { - "exchangeName": "Mexc", - "ticker": "SHIB_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "shibusdt", - "adjustByMarket": "USDT-USD" - } - ], - "SNX": [ - { - "exchangeName": "Mexc", - "ticker": "SNX_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "SNXUSD" - }, - { - "exchangeName": "Okx", - "ticker": "SNX-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "SNXUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "SNXUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "SNX-USD" - } - ], - "SOL": [ - { - "exchangeName": "Kucoin", - "ticker": "SOL-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "SOL-USD" - }, - { - "exchangeName": "Okx", - "ticker": "SOL-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "SOL_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "SOLUSD" - }, - { - "exchangeName": "Binance", - "ticker": "SOLUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bitstamp", - "ticker": "SOL/USD" - }, - { - "exchangeName": "Bybit", - "ticker": "SOLUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "solusdt", - "adjustByMarket": "USDT-USD" - } - ], - "STX": [ - { - "exchangeName": "Okx", - "ticker": "STX-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "STXUSD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "STX-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "STX-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "STXUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "STX_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "STX_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "SUI": [ - { - "exchangeName": "Kucoin", - "ticker": "SUI-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "SUI_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "SUIUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "SUI-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "SUIUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "SUI-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "SUSHI": [ - { - "exchangeName": "Mexc", - "ticker": "SUSHI_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "SUSHIUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "SUSHI-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "SUSHIUSD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "SUSHI-USD" - } - ], - "TIA": [ - { - "exchangeName": "Bybit", - "ticker": "TIAUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "TIAUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "TIA-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "TIAUSD" - }, - { - "exchangeName": "Kucoin", - "ticker": "TIA-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "TIA_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "TIA-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "TRX": [ - { - "exchangeName": "Kraken", - "ticker": "TRXUSD" - }, - { - "exchangeName": "Binance", - "ticker": "TRXUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "trxusdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "TRX-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "TRXUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "TRX-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "TRX_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "TRX_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "UNI": [ - { - "exchangeName": "Mexc", - "ticker": "UNI_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "UNIUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "UNIUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "UNI-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "UNIUSD" - }, - { - "exchangeName": "Okx", - "ticker": "UNI-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "UNI-USD" - } - ], - "WLD": [ - { - "exchangeName": "Okx", - "ticker": "WLD-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "WLD_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "WLDUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "WLDUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "WLD-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "WLD_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "XLM": [ - { - "exchangeName": "Kucoin", - "ticker": "XLM-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "XLM-USD" - }, - { - "exchangeName": "Okx", - "ticker": "XLM-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "XLMUSD" - }, - { - "exchangeName": "Bitstamp", - "ticker": "XLM/USD" - }, - { - "exchangeName": "Mexc", - "ticker": "XLM_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "XLMUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "XLMUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "XRP": [ - { - "exchangeName": "Kraken", - "ticker": "XRPUSD" - }, - { - "exchangeName": "Binance", - "ticker": "XRPUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "XRP-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "XRP-USD" - }, - { - "exchangeName": "Huobi", - "ticker": "xrpusdt", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "XRP-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "XRPUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bitstamp", - "ticker": "XRP/USD" - }, - { - "exchangeName": "Mexc", - "ticker": "XRP_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "CFX": [ - { - "exchangeName": "Mexc", - "ticker": "CFX_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "CFX-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "CFXUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "CFX-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "CFX_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "COMP": [ - { - "exchangeName": "Kraken", - "ticker": "COMPUSD" - }, - { - "exchangeName": "Mexc", - "ticker": "COMP_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "COMP-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "COMP-USD" - }, - { - "exchangeName": "Binance", - "ticker": "COMPUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "EGLD": [ - { - "exchangeName": "Kucoin", - "ticker": "EGLD-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "EGLDUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "EGLD_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "EGLD-USD" - }, - { - "exchangeName": "Gate", - "ticker": "EGLD_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "FLOW": [ - { - "exchangeName": "Kraken", - "ticker": "FLOWUSD" - }, - { - "exchangeName": "Binance", - "ticker": "FLOWUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "FLOW_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "FLOW-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "FLOW_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "GMT": [ - { - "exchangeName": "CoinbasePro", - "ticker": "GMT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "GMTUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "GMT-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "GMT-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "GMT_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "MEME": [ - { - "exchangeName": "Bybit", - "ticker": "MEMEUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "MEMEUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "MEME-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "MEME_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "MEME_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "MINA": [ - { - "exchangeName": "Mexc", - "ticker": "MINA_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "MINA-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "MINAUSD" - }, - { - "exchangeName": "Binance", - "ticker": "MINAUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "MINA-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "PEOPLE": [ - { - "exchangeName": "Okx", - "ticker": "PEOPLE-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "PEOPLE-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "PEOPLE_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "PEOPLEUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "PEOPLE_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "WAVES": [ - { - "exchangeName": "Okx", - "ticker": "WAVES-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "WAVESUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "WAVES_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "WAVES-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "WAVESUSD" - } - ], - "1INCH": [ - { - "exchangeName": "Binance", - "ticker": "1INCHUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "1INCH-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "1INCH_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "1INCH-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "ACE": [ - { - "exchangeName": "Binance", - "ticker": "ACEUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "ACE-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "ACH": [ - { - "exchangeName": "CoinbasePro", - "ticker": "ACH-USD" - }, - { - "exchangeName": "Binance", - "ticker": "ACHUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "ACH_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "AEUR": [ - { - "exchangeName": "Binance", - "ticker": "AEURUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "API3": [ - { - "exchangeName": "Mexc", - "ticker": "API3_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "API3USDT", - "adjustByMarket": "USDT-USD" - } - ], - "AR": [ - { - "exchangeName": "Okx", - "ticker": "AR-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "ARUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "ARKM": [ - { - "exchangeName": "Binance", - "ticker": "ARKMUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "ARKM_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "ARPA": [ - { - "exchangeName": "Binance", - "ticker": "ARPAUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "ASTR": [ - { - "exchangeName": "Mexc", - "ticker": "ASTR_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "ASTRUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "ASTR-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "AUCTION": [ - { - "exchangeName": "Mexc", - "ticker": "AUCTION_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "AUCTIONUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "AUCTION-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "AXS": [ - { - "exchangeName": "Mexc", - "ticker": "AXS_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "AXSUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "AXS-USD" - } - ], - "BAKE": [ - { - "exchangeName": "Binance", - "ticker": "BAKEUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "BAKE_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "BAND": [ - { - "exchangeName": "Binance", - "ticker": "BANDUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "BEAM": [ - { - "exchangeName": "Binance", - "ticker": "BEAMUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "BLZ": [ - { - "exchangeName": "Binance", - "ticker": "BLZUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "BLZ-USD" - } - ], - "BOND": [ - { - "exchangeName": "Binance", - "ticker": "BONDUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "BSW": [ - { - "exchangeName": "Binance", - "ticker": "BSWUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "C98": [ - { - "exchangeName": "Mexc", - "ticker": "C98_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "C98USDT", - "adjustByMarket": "USDT-USD" - } - ], - "CAKE": [ - { - "exchangeName": "Mexc", - "ticker": "CAKE_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "CAKEUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "CELO": [ - { - "exchangeName": "Mexc", - "ticker": "CELO_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "CELO-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "CELOUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "CHR": [ - { - "exchangeName": "Binance", - "ticker": "CHRUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "CTSI": [ - { - "exchangeName": "Binance", - "ticker": "CTSIUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "CYBER": [ - { - "exchangeName": "Binance", - "ticker": "CYBERUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "CYBER_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "DATA": [ - { - "exchangeName": "Binance", - "ticker": "DATAUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "DEGO": [ - { - "exchangeName": "Binance", - "ticker": "DEGOUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "DEGO_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "DIA": [ - { - "exchangeName": "Binance", - "ticker": "DIAUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "DUSK": [ - { - "exchangeName": "Binance", - "ticker": "DUSKUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "EUR": [ - { - "exchangeName": "Binance", - "ticker": "EURUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bitstamp", - "ticker": "EUR/USD" - }, - { - "exchangeName": "Kraken", - "ticker": "EURUSD" - } - ], - "FDUSD": [ - { - "exchangeName": "Binance", - "ticker": "FDUSDUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "FRONT": [ - { - "exchangeName": "Binance", - "ticker": "FRONTUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "FTT": [ - { - "exchangeName": "Binance", - "ticker": "FTTUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "FTT_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "FXS": [ - { - "exchangeName": "Binance", - "ticker": "FXSUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "GAL": [ - { - "exchangeName": "Binance", - "ticker": "GALUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "GAS": [ - { - "exchangeName": "Okx", - "ticker": "GAS-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "GASUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "GLMR": [ - { - "exchangeName": "Binance", - "ticker": "GLMRUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "GLMR_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "GMX": [ - { - "exchangeName": "Binance", - "ticker": "GMXUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "GTC": [ - { - "exchangeName": "Binance", - "ticker": "GTCUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "HFT": [ - { - "exchangeName": "Mexc", - "ticker": "HFT_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "HFT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "HFTUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "HIFI": [ - { - "exchangeName": "Binance", - "ticker": "HIFIUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "HIGH": [ - { - "exchangeName": "Binance", - "ticker": "HIGHUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "HOOK": [ - { - "exchangeName": "Binance", - "ticker": "HOOKUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "HOT": [ - { - "exchangeName": "Binance", - "ticker": "HOTUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "ID": [ - { - "exchangeName": "Binance", - "ticker": "IDUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "ID_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "ILV": [ - { - "exchangeName": "Binance", - "ticker": "ILVUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "ILV_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "IMX": [ - { - "exchangeName": "Binance", - "ticker": "IMXUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "IMX_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "IMX-USD" - }, - { - "exchangeName": "Okx", - "ticker": "IMX-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "IOTA": [ - { - "exchangeName": "Binance", - "ticker": "IOTAUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "IOTA-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "IOTX": [ - { - "exchangeName": "Mexc", - "ticker": "IOTX_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "IOTXUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "JASMY": [ - { - "exchangeName": "CoinbasePro", - "ticker": "JASMY-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "JASMY-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "JASMYUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "JASMY_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "JOE": [ - { - "exchangeName": "Binance", - "ticker": "JOEUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "JOE_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "KDA": [ - { - "exchangeName": "Binance", - "ticker": "KDAUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "KLAY": [ - { - "exchangeName": "Mexc", - "ticker": "KLAY_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "KLAYUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "KP3R": [ - { - "exchangeName": "Binance", - "ticker": "KP3RUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "KSM": [ - { - "exchangeName": "Okx", - "ticker": "KSM-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "KSMUSD" - }, - { - "exchangeName": "Mexc", - "ticker": "KSM_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "KSMUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "LEVER": [ - { - "exchangeName": "Binance", - "ticker": "LEVERUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "LEVER_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "LOOM": [ - { - "exchangeName": "Binance", - "ticker": "LOOMUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "LPT": [ - { - "exchangeName": "Binance", - "ticker": "LPTUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "LQTY": [ - { - "exchangeName": "Mexc", - "ticker": "LQTY_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "LQTYUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "LRC": [ - { - "exchangeName": "CoinbasePro", - "ticker": "LRC-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "LRC_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "LRCUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "LUNA": [ - { - "exchangeName": "Okx", - "ticker": "LUNA-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "LUNA_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "LUNAUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "LUNA-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "LUNA2": [ - { - "exchangeName": "Okx", - "ticker": "LUNA2-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "LUNA2USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "LUNA2-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "LUNA2_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "MAGIC": [ - { - "exchangeName": "Mexc", - "ticker": "MAGIC_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "MAGICUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "MAGIC-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "MAGIC_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "MANTA": [ - { - "exchangeName": "Bybit", - "ticker": "MANTAUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "MANTAUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "MAV": [ - { - "exchangeName": "Mexc", - "ticker": "MAV_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "MAVUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "MOVR": [ - { - "exchangeName": "Binance", - "ticker": "MOVRUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "NEO": [ - { - "exchangeName": "Binance", - "ticker": "NEOUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "NEO_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "NFP": [ - { - "exchangeName": "Binance", - "ticker": "NFPUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "NMR": [ - { - "exchangeName": "Mexc", - "ticker": "NMR_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "NTRN": [ - { - "exchangeName": "Binance", - "ticker": "NTRNUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "NTRN-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "NTRN_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "OGN": [ - { - "exchangeName": "Mexc", - "ticker": "OGN_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "OGNUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "ONE": [ - { - "exchangeName": "Mexc", - "ticker": "ONE_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "ONT": [ - { - "exchangeName": "Binance", - "ticker": "ONTUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "ONT_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "OSMO": [ - { - "exchangeName": "CoinbasePro", - "ticker": "OSMO-USD" - }, - { - "exchangeName": "Binance", - "ticker": "OSMOUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "OXT": [ - { - "exchangeName": "Binance", - "ticker": "OXTUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "PENDLE": [ - { - "exchangeName": "Mexc", - "ticker": "PENDLE_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "PENDLEUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "PERP": [ - { - "exchangeName": "Mexc", - "ticker": "PERP_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "PERPUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "PHB": [ - { - "exchangeName": "Binance", - "ticker": "PHBUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "POLYX": [ - { - "exchangeName": "Binance", - "ticker": "POLYXUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "POWR": [ - { - "exchangeName": "Binance", - "ticker": "POWRUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "PROS": [ - { - "exchangeName": "Binance", - "ticker": "PROSUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "PYR": [ - { - "exchangeName": "Mexc", - "ticker": "PYR_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "PYRUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "QI": [ - { - "exchangeName": "Binance", - "ticker": "QIUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "QNT": [ - { - "exchangeName": "Binance", - "ticker": "QNTUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "QNT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "QNT_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "RAD": [ - { - "exchangeName": "Binance", - "ticker": "RADUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "RAY": [ - { - "exchangeName": "Binance", - "ticker": "RAYUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "RDNT": [ - { - "exchangeName": "Okx", - "ticker": "RDNT-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "RDNTUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "RIF": [ - { - "exchangeName": "Binance", - "ticker": "RIFUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "RLC": [ - { - "exchangeName": "CoinbasePro", - "ticker": "RLC-USD" - }, - { - "exchangeName": "Binance", - "ticker": "RLCUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "ROSE": [ - { - "exchangeName": "CoinbasePro", - "ticker": "ROSE-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "ROSE-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "ROSEUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "ROSE_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "RUNE": [ - { - "exchangeName": "Kucoin", - "ticker": "RUNE-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "RUNEUSD" - }, - { - "exchangeName": "Binance", - "ticker": "RUNEUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "SANTOS": [ - { - "exchangeName": "Binance", - "ticker": "SANTOSUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "SATS": [ - { - "exchangeName": "Binance", - "ticker": "SATSUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "SATS-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "SC": [ - { - "exchangeName": "Binance", - "ticker": "SCUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "SCUSD" - } - ], - "SKL": [ - { - "exchangeName": "CoinbasePro", - "ticker": "SKL-USD" - }, - { - "exchangeName": "Binance", - "ticker": "SKLUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "SLEEPAI": [ - { - "exchangeName": "Binance", - "ticker": "SLEEPAIUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "SLP": [ - { - "exchangeName": "Binance", - "ticker": "SLPUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "SSV": [ - { - "exchangeName": "Binance", - "ticker": "SSVUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "SSV-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "SSV_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "STG": [ - { - "exchangeName": "Binance", - "ticker": "STGUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "STG_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "STORJ": [ - { - "exchangeName": "Okx", - "ticker": "STORJ-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "STORJ_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "STORJUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "STORJ-USD" - } - ], - "STRAX": [ - { - "exchangeName": "Binance", - "ticker": "STRAXUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "SUPER": [ - { - "exchangeName": "CoinbasePro", - "ticker": "SUPER-USD" - }, - { - "exchangeName": "Binance", - "ticker": "SUPERUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "SYN": [ - { - "exchangeName": "Binance", - "ticker": "SYNUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "T": [ - { - "exchangeName": "Binance", - "ticker": "TUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "THETA": [ - { - "exchangeName": "Okx", - "ticker": "THETA-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "THETA-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "THETAUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "TRB": [ - { - "exchangeName": "Binance", - "ticker": "TRBUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "TRB-USD" - }, - { - "exchangeName": "Okx", - "ticker": "TRB-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "TUSD": [ - { - "exchangeName": "Mexc", - "ticker": "TUSD_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "TUSDUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "TWT": [ - { - "exchangeName": "Mexc", - "ticker": "TWT_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "TWTUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "UMA": [ - { - "exchangeName": "Binance", - "ticker": "UMAUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "UNFI": [ - { - "exchangeName": "Binance", - "ticker": "UNFIUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "UNFI_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "USTC": [ - { - "exchangeName": "Binance", - "ticker": "USTCUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "USTC-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "USTC_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "VANRY": [ - { - "exchangeName": "Binance", - "ticker": "VANRYUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "VENUS": [ - { - "exchangeName": "Binance", - "ticker": "VENUSUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "VET": [ - { - "exchangeName": "Kucoin", - "ticker": "VET-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "VETUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "VET-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "VET_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "WBTC": [ - { - "exchangeName": "Binance", - "ticker": "WBTCUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "WING": [ - { - "exchangeName": "Binance", - "ticker": "WINGUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "WING_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "WOO": [ - { - "exchangeName": "Kucoin", - "ticker": "WOO-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "WOOUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "WOO-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "WOO_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "XAI": [ - { - "exchangeName": "Binance", - "ticker": "XAIUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "XAI-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "XAI_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "XMR": [ - { - "exchangeName": "Mexc", - "ticker": "XMR_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "XMR-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "XMRUSD" - }, - { - "exchangeName": "Binance", - "ticker": "XMRUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "XTZ": [ - { - "exchangeName": "Binance", - "ticker": "XTZUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kraken", - "ticker": "XTZUSD" - } - ], - "YFI": [ - { - "exchangeName": "Binance", - "ticker": "YFIUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "CoinbasePro", - "ticker": "YFI-USD" - } - ], - "YGG": [ - { - "exchangeName": "Binance", - "ticker": "YGGUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "YGG-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "YGG_USDT", - "adjustByMarket": "USDT-USD" - } - ], - "ZEC": [ - { - "exchangeName": "Mexc", - "ticker": "ZEC_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "ZECUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "ZEN": [ - { - "exchangeName": "Binance", - "ticker": "ZENUSDT", - "adjustByMarket": "USDT-USD" - } - ], - "ZIL": [ - { - "exchangeName": "Binance", - "ticker": "ZILUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "ZIL_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Kucoin", - "ticker": "ZIL-USDT", - "adjustByMarket": "USDT-USD" - } - ], - "JUP": [ - { - "exchangeName": "Kucoin", - "ticker": "JUP-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Okx", - "ticker": "JUP-USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Binance", - "ticker": "JUPUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Bybit", - "ticker": "JUPUSDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Gate", - "ticker": "JUP_USDT", - "adjustByMarket": "USDT-USD" - }, - { - "exchangeName": "Mexc", - "ticker": "JUP_USDT", - "adjustByMarket": "USDT-USD" - } - ] -} diff --git a/public/configs/v1/env.json b/public/configs/v1/env.json new file mode 100644 index 0000000..924e94a --- /dev/null +++ b/public/configs/v1/env.json @@ -0,0 +1,638 @@ +{ + "apps": { + "ios": { + "scheme": "dydx-t-v4" + } + }, + "tokens": { + "dydxprotocol-testnet": { + "chain": { + "name": "Dv4TNT", + "denom": "adv4tnt", + "decimals": 18, + "image": "/currencies/dydx.png" + }, + "usdc": { + "name": "USDC", + "denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5", + "gasDenom": "uusdc", + "decimals": 6, + "image": "/currencies/usdc.png" + } + }, + "dydx-testnet-4": { + "chain": { + "name": "Dv4TNT", + "denom": "adv4tnt", + "decimals": 18, + "image": "/currencies/dydx.png" + }, + "usdc": { + "name": "USDC", + "denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5", + "gasDenom": "uusdc", + "decimals": 6, + "image": "/currencies/usdc.png" + } + }, + "[mainnet chain id]": { + "comment": "Change according to mainnet release", + "chain": { + "name": "TokenName", + "denom": "tokenDenom", + "decimals": 18, + "image": "/currencies/dydx.png" + }, + "usdc": { + "name": "USDC", + "denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5", + "gasDenom": "uusdc", + "decimals": 6, + "image": "/currencies/usdc.png" + } + } + }, + "links": { + "dydxprotocol-testnet": { + "tos": "https://dydx.exchange/v4-terms", + "privacy": "https://dydx.exchange/privacy", + "statusPage": "https://status.v4testnet.dydx.exchange/", + "mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}", + "blogs": "https://www.dydx.foundation/blog", + "foundation": "https://www.dydx.foundation", + "help": "https://help.dydx.exchange/", + "reduceOnlyLearnMore": "https://help.dydx.exchange/articles/6345793-reduce-only-orders", + "mintscanBase": "https://testnet.mintscan.io/dydx-testnet", + "documentation": "https://docs.dydx.exchange/", + "community": "https://discord.com/invite/dydx", + "governanceLearnMore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", + "stakingLearnMore": "https://help.dydx.exchange", + "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", + "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", + "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" + }, + "dydx-testnet-4": { + "tos": "https://dydx.exchange/v4-terms", + "privacy": "https://dydx.exchange/privacy", + "statusPage": "https://status.v4testnet.dydx.exchange/", + "mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}", + "documentation": "https://docs.dydx.exchange/", + "community": "https://discord.com/invite/dydx", + "feedback": "https://docs.google.com/forms/d/e/1FAIpQLSezLsWCKvAYDEb7L-2O4wOON1T56xxro9A2Azvl6IxXHP_15Q/viewform", + "blogs": "https://www.dydx.foundation/blog", + "foundation": "https://www.dydx.foundation", + "help": "https://help.dydx.exchange/", + "reduceOnlyLearnMore": "https://help.dydx.exchange/articles/6345793-reduce-only-orders", + "mintscanBase": "https://testnet.mintscan.io/dydx-testnet", + "governanceLearnMore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", + "stakingLearnMore": "https://help.dydx.exchange", + "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", + "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", + "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" + }, + "[mainnet chain id]": { + "tos": "[HTTP link to TOS]", + "privacy": "[HTTP link to Privacy Policy]", + "statusPage": "[HTTP link to status page]", + "mintscan": "[HTTP link to Mintscan, with {tx_hash} placeholder]", + "mintscanBase": "[HTTP link to TOS mintscan base url]", + "feedback": "[HTTP link to feedback form, can be null]", + "blogs": "[HTTP link to blogs, can be null]", + "foundation": "[HTTP link to foundation, can be null]", + "reduceOnlyLearnMore": "[HTTP link to reduce-only learn more, can be null]", + "documentation": "[HTTP link to documentation, can be null]", + "community": "[HTTP link to community, can be null]", + "help": "[HTTP link to help page, can be null]", + "governanceLearnMore": "[HTTP link to governance learn more, can be null]", + "newMarketProposalLearnMore": "[HTTP link to new market proposal learn more, can be null]", + "stakingLearnMore": "[HTTP link to staking learn more, can be null]", + "keplrDashboard": "[HTTP link to keplr dashboard, can be null]", + "strideZoneApp": "[HTTP link to stride zone app, can be null]", + "accountExportLearnMore": "[HTTP link to account export learn more, can be null]", + "walletLearnMore": "[HTTP link to wallet learn more, can be null]" + } + }, + "wallets": { + "dydxprotocol-testnet": { + "walletconnect": { + "client": { + "name": "dYdX v4", + "description": "dYdX v4 App", + "iconUrl": "/logos/dydx-x.png" + }, + "v2": { + "projectId": "47559b2ec96c09aed9ff2cb54a31ab0e" + } + }, + "walletSegue": { + "callbackUrl": "/walletsegue" + }, + "images": "/wallets/", + "signTypedDataAction": "dYdX Chain Onboarding", + "signTypedDataDomainName": "dYdX Chain" + }, + "dydx-testnet-4": { + "walletconnect": { + "client": { + "name": "dYdX v4", + "description": "dYdX v4 App", + "iconUrl": "/logos/dydx-x.png" + }, + "v2": { + "projectId": "47559b2ec96c09aed9ff2cb54a31ab0e" + } + }, + "walletSegue": { + "callbackUrl": "/walletsegue" + }, + "images": "/wallets/", + "signTypedDataAction": "dYdX Chain Onboarding", + "signTypedDataDomainName": "dYdX Chain" + }, + "[mainnet chain id]": { + "walletconnect": { + "client": { + "name": "[Name of the app]", + "description": "[Description of the app]", + "iconUrl": "[Relative URL of the icon URL]" + }, + "v2": { + "projectId": "[Project ID]" + } + }, + "walletSegue": { + "callbackUrl": "[Relative callback URL for WalletSegue, should match apple-app-site-association]" + }, + "images": "[Relative URL for wallet images]", + "signTypedDataAction": "dYdX Chain Onboarding", + "signTypedDataDomainName": "dYdX Chain" + } + }, + "governance": { + "dydxprotocol-testnet": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "dydx-testnet-4": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "[mainnet chain id]": { + "newMarketProposal": { + "initialDepositAmount": 0, + "delayBlocks": 0, + "newMarketsMethodology": "[URL to spreadsheet or document that explains methodology]" + } + } + }, + "deployments": { + "MAINNET": { + "environments": [ + "dydxprotocol-mainnet" + ], + "default": "dydxprotocol-mainnet" + }, + "TESTFLIGHT": { + "environments": [ + "dydxprotocol-mainnet", + "dydxprotocol-testnet" + ], + "default": "dydxprotocol-mainnet" + }, + "TESTNET": { + "environments": [ + "dydxprotocol-testnet" + ], + "default": "dydxprotocol-testnet" + }, + "DEV": { + "environments": [ + "dydxprotocol-dev", + "dydxprotocol-dev-2", + "dydxprotocol-dev-4", + "dydxprotocol-dev-5", + "dydxprotocol-staging", + "dydxprotocol-staging-west", + "dydxprotocol-testnet", + "dydxprotocol-testnet-dydx", + "dydxprotocol-testnet-nodefleet", + "dydxprotocol-testnet-kingnodes", + "dydxprotocol-testnet-liquify", + "dydxprotocol-testnet-polkachu", + "dydxprotocol-testnet-bware" + ], + "default": "dydxprotocol-testnet" + } + }, + "environments": { + "dydxprotocol-dev": { + "name": "v4 Dev", + "ethereumChainId": "11155111", + "dydxChainId": "dydxprotocol-testnet", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4dev.dydx.exchange", + "socket": "wss://indexer.v4dev.dydx.exchange" + } + ], + "validators": [ + "https://validator.v4dev.dydx.exchange" + ], + "0xsquid": "https://testnet.api.0xsquid.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4dev.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": true + } + }, + "dydxprotocol-dev-2": { + "name": "v4 Dev 2", + "ethereumChainId": "11155111", + "dydxChainId": "dydxprotocol-testnet", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "http://dev2-indexer-apne1-lb-public-2076363889.ap-northeast-1.elb.amazonaws.com", + "socket": "ws://dev2-indexer-apne1-lb-public-2076363889.ap-northeast-1.elb.amazonaws.com" + } + ], + "validators": [ + "http://54.92.118.111" + ], + "0xsquid": "https://testnet.api.0xsquid.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/" + }, + "featureFlags": { + "reduceOnlySupported": true + } + }, + "dydxprotocol-dev-4": { + "name": "v4 Dev 4", + "ethereumChainId": "11155111", + "dydxChainId": "dydxprotocol-testnet", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4dev4.dydx.exchange", + "socket": "wss://indexer.v4dev4.dydx.exchange" + } + ], + "validators": [ + "https://validator.v4dev4.dydx.exchange" + ], + "0xsquid": "https://testnet.api.0xsquid.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4dev4.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": true + } + }, + "dydxprotocol-dev-5": { + "name": "v4 Dev 5", + "ethereumChainId": "11155111", + "dydxChainId": "dydxprotocol-testnet", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "http://dev5-indexer-apne1-lb-public-1721328151.ap-northeast-1.elb.amazonaws.com", + "socket": "ws://dev5-indexer-apne1-lb-public-1721328151.ap-northeast-1.elb.amazonaws.com" + } + ], + "validators": [ + "http://18.223.78.50" + ], + "0xsquid": "https://testnet.api.0xsquid.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/" + }, + "featureFlags": { + "reduceOnlySupported": true + } + }, + "dydxprotocol-staging": { + "name": "v4 Staging", + "ethereumChainId": "11155111", + "dydxChainId": "dydxprotocol-testnet", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4staging.dydx.exchange", + "socket": "wss://indexer.v4staging.dydx.exchange" + } + ], + "faucet": "https://faucet.v4staging.dydx.exchange", + "validators": [ + "https://validator.v4staging.dydx.exchange" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/" + }, + "featureFlags": { + "reduceOnlySupported": true + } + }, + "dydxprotocol-staging-forced-update": { + "name": "v4 Staging Forced Update", + "ethereumChainId": "11155111", + "dydxChainId": "dydxprotocol-testnet", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4staging.dydx.exchange", + "socket": "wss://indexer.v4staging.dydx.exchange" + } + ], + "faucet": "https://faucet.v4staging.dydx.exchange", + "validators": [ + "https://validator.v4staging.dydx.exchange" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/" + }, + "apps": { + "ios": { + "minimalVersion": "1.0", + "build": 40000, + "url": "https://apps.apple.com/app/dydx/id1564787350" + } + }, + "featureFlags": { + "reduceOnlySupported": true + } + }, + "dydxprotocol-staging-west": { + "name": "v4 Staging West", + "ethereumChainId": "11155111", + "dydxChainId": "dydxprotocol-testnet", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4staging.dydx.exchange", + "socket": "wss://indexer.v4staging.dydx.exchange" + } + ], + "faucet": "https://faucet.v4staging.dydx.exchange", + "validators": [ + "https://validator-uswest1.v4staging.dydx.exchange" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/" + }, + "featureFlags": { + "reduceOnlySupported": true + } + }, + "dydxprotocol-testnet": { + "name": "v4 Public Testnet", + "ethereumChainId": "11155111", + "dydxChainId": "dydx-testnet-4", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4testnet.dydx.exchange", + "socket": "wss://indexer.v4testnet.dydx.exchange" + } + ], + "validators": [ + "https://dydx-testnet-full-rpc.public.blastapi.io/", + "https://dydx-testnet-rpc.polkachu.com/", + "https://dydx-testnet.nodefleet.org", + "https://test-dydx.kingnodes.com", + "https://dydx-rpc.liquify.com/api=8878132/dydx" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4testnet.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": false + } + }, + "dydxprotocol-testnet-dydx": { + "name": "v4 Public Testnet/dYdX", + "ethereumChainId": "11155111", + "dydxChainId": "dydx-testnet-4", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4testnet.dydx.exchange", + "socket": "wss://indexer.v4testnet.dydx.exchange" + } + ], + "validators": [ + "https://validator.v4testnet.dydx.exchange" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4testnet.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": false + } + }, + "dydxprotocol-testnet-nodefleet": { + "name": "v4 Public Testnet/nodefleet", + "ethereumChainId": "11155111", + "dydxChainId": "dydx-testnet-4", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4testnet.dydx.exchange", + "socket": "wss://indexer.v4testnet.dydx.exchange" + } + ], + "validators": [ + "https://dydx-testnet.nodefleet.org" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4testnet.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": false + } + }, + "dydxprotocol-testnet-kingnodes": { + "name": "v4 Public Testnet/KingNodes", + "ethereumChainId": "11155111", + "dydxChainId": "dydx-testnet-4", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4testnet.dydx.exchange", + "socket": "wss://indexer.v4testnet.dydx.exchange" + } + ], + "validators": [ + "https://test-dydx.kingnodes.com" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4testnet.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": false + } + }, + "dydxprotocol-testnet-liquify": { + "name": "v4 Public Testnet/Liquify", + "ethereumChainId": "11155111", + "dydxChainId": "dydx-testnet-4", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4testnet.dydx.exchange", + "socket": "wss://indexer.v4testnet.dydx.exchange" + } + ], + "validators": [ + "https://dydx-rpc.liquify.com/api=8878132/dydx" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4testnet.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": false + } + }, + "dydxprotocol-testnet-polkachu": { + "name": "v4 Public Testnet/Polkahcu", + "ethereumChainId": "11155111", + "dydxChainId": "dydx-testnet-4", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4testnet.dydx.exchange", + "socket": "wss://indexer.v4testnet.dydx.exchange" + } + ], + "validators": [ + "https://dydx-testnet-rpc.polkachu.com/" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4testnet.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": false + } + }, + "dydxprotocol-testnet-bware": { + "name": "v4 Public Testnet/BWare", + "ethereumChainId": "11155111", + "dydxChainId": "dydx-testnet-4", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4testnet.dydx.exchange", + "socket": "wss://indexer.v4testnet.dydx.exchange" + } + ], + "validators": [ + "https://dydx-testnet-full-rpc.public.blastapi.io/" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4testnet.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": false + } + }, + "dydxprotocol-mainnet": { + "name": "v4", + "ethereumChainId": "1", + "dydxChainId": "[mainnet chain id]", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "[mainnet squid integrator id]", + "isMainNet": true, + "endpoints": { + "indexers": [ + { + "api": "[REST endpoint]", + "socket": "[Websocket endpoint]" + } + ], + "validators": [ + "[Validator endpoint 1", + "[Validator endpoint n]" + ], + "0xsquid": "[0xSquid endpoint for mainnet]", + "nobleValidator": "[noble validator endpoint for mainnet]" + }, + "featureFlags": { + "reduceOnlySupported": false + } + } + } +} \ No newline at end of file diff --git a/public/currencies/agix.png b/public/currencies/agix.png new file mode 100644 index 0000000..1ec65e8 Binary files /dev/null and b/public/currencies/agix.png differ diff --git a/public/currencies/bnb.png b/public/currencies/bnb.png new file mode 100644 index 0000000..f7f549a Binary files /dev/null and b/public/currencies/bnb.png differ diff --git a/public/currencies/chz.png b/public/currencies/chz.png new file mode 100644 index 0000000..a08a912 Binary files /dev/null and b/public/currencies/chz.png differ diff --git a/public/currencies/dym.png b/public/currencies/dym.png new file mode 100644 index 0000000..b8e4cca Binary files /dev/null and b/public/currencies/dym.png differ diff --git a/public/currencies/ens.png b/public/currencies/ens.png new file mode 100644 index 0000000..e9f5408 Binary files /dev/null and b/public/currencies/ens.png differ diff --git a/public/currencies/fet.png b/public/currencies/fet.png new file mode 100644 index 0000000..a6d3b03 Binary files /dev/null and b/public/currencies/fet.png differ diff --git a/public/currencies/ftm.png b/public/currencies/ftm.png new file mode 100644 index 0000000..40fb7e5 Binary files /dev/null and b/public/currencies/ftm.png differ diff --git a/public/currencies/gala.png b/public/currencies/gala.png new file mode 100644 index 0000000..4f1e382 Binary files /dev/null and b/public/currencies/gala.png differ diff --git a/public/currencies/gmt.png b/public/currencies/gmt.png new file mode 100644 index 0000000..33926c1 Binary files /dev/null and b/public/currencies/gmt.png differ diff --git a/public/currencies/grt.png b/public/currencies/grt.png new file mode 100644 index 0000000..996331b Binary files /dev/null and b/public/currencies/grt.png differ diff --git a/public/currencies/hbar.png b/public/currencies/hbar.png new file mode 100644 index 0000000..497626f Binary files /dev/null and b/public/currencies/hbar.png differ diff --git a/public/currencies/imx.png b/public/currencies/imx.png new file mode 100644 index 0000000..a50d671 Binary files /dev/null and b/public/currencies/imx.png differ diff --git a/public/currencies/inj.png b/public/currencies/inj.png new file mode 100644 index 0000000..c4d8b92 Binary files /dev/null and b/public/currencies/inj.png differ diff --git a/public/currencies/jto.png b/public/currencies/jto.png new file mode 100644 index 0000000..491886e Binary files /dev/null and b/public/currencies/jto.png differ diff --git a/public/currencies/kava.png b/public/currencies/kava.png new file mode 100644 index 0000000..5973bca Binary files /dev/null and b/public/currencies/kava.png differ diff --git a/public/currencies/mana.png b/public/currencies/mana.png new file mode 100644 index 0000000..82850f4 Binary files /dev/null and b/public/currencies/mana.png differ diff --git a/public/currencies/mask.png b/public/currencies/mask.png new file mode 100644 index 0000000..6d52252 Binary files /dev/null and b/public/currencies/mask.png differ diff --git a/public/currencies/mina.png b/public/currencies/mina.png new file mode 100644 index 0000000..4e579dd Binary files /dev/null and b/public/currencies/mina.png differ diff --git a/public/currencies/ordi.png b/public/currencies/ordi.png new file mode 100644 index 0000000..a931aac Binary files /dev/null and b/public/currencies/ordi.png differ diff --git a/public/currencies/pyth.png b/public/currencies/pyth.png new file mode 100644 index 0000000..0495d51 Binary files /dev/null and b/public/currencies/pyth.png differ diff --git a/public/currencies/rndr.png b/public/currencies/rndr.png new file mode 100644 index 0000000..500ced3 Binary files /dev/null and b/public/currencies/rndr.png differ diff --git a/public/currencies/sand.png b/public/currencies/sand.png new file mode 100644 index 0000000..63abd4e Binary files /dev/null and b/public/currencies/sand.png differ diff --git a/public/currencies/stx.png b/public/currencies/stx.png new file mode 100644 index 0000000..56e6580 Binary files /dev/null and b/public/currencies/stx.png differ diff --git a/public/currencies/woo.png b/public/currencies/woo.png new file mode 100644 index 0000000..44aeb72 Binary files /dev/null and b/public/currencies/woo.png differ diff --git a/public/currencies/zeta.png b/public/currencies/zeta.png new file mode 100644 index 0000000..e414137 Binary files /dev/null and b/public/currencies/zeta.png differ diff --git a/public/libs/amplitude-analytics-browser-2.0.0-min.js b/public/libs/amplitude-analytics-browser-2.0.0-min.js new file mode 100644 index 0000000..80b8ab7 --- /dev/null +++ b/public/libs/amplitude-analytics-browser-2.0.0-min.js @@ -0,0 +1 @@ +!function(){"use strict";var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},e(t,n)};function t(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}var n=function(){return n=Object.assign||function(e){for(var t,n=1,i=arguments.length;n0&&r[r.length-1])||6!==u[0]&&2!==u[0])){s=0;continue}if(3===u[0]&&(!r||u[1]>r[0]&&u[1]=e.length&&(e=void 0),{value:e&&e[i++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function u(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var i,r,o=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(i=o.next()).done;)s.push(i.value)}catch(e){r={error:e}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return s}function a(e,t,n){if(n||2===arguments.length)for(var i,r=0,o=t.length;r1e3)return!1;for(var t in e){var n=e[t];if(!A(t,n))return!1}return!0},A=function(e,t){var n,i;if("string"!=typeof e)return!1;if(Array.isArray(t)){var r=!0;try{for(var o=s(t),u=o.next();!u.done;u=o.next()){var a=u.value;if(Array.isArray(a))return!1;if("object"==typeof a)r=r&&L(a);else if(!["number","string"].includes(typeof a))return!1;if(!r)return!1}}catch(e){n={error:e}}finally{try{u&&!u.done&&(i=o.return)&&i.call(o)}finally{if(n)throw n.error}}}else{if(null==t)return!1;if("object"==typeof t)return L(t);if(!["number","string","boolean"].includes(typeof t))return!1}return!0},j=function(){function e(){this._propertySet=new Set,this._properties={}}return e.prototype.getUserProperties=function(){return n({},this._properties)},e.prototype.set=function(e,t){return this._safeSet(c.SET,e,t),this},e.prototype.setOnce=function(e,t){return this._safeSet(c.SET_ONCE,e,t),this},e.prototype.append=function(e,t){return this._safeSet(c.APPEND,e,t),this},e.prototype.prepend=function(e,t){return this._safeSet(c.PREPEND,e,t),this},e.prototype.postInsert=function(e,t){return this._safeSet(c.POSTINSERT,e,t),this},e.prototype.preInsert=function(e,t){return this._safeSet(c.PREINSERT,e,t),this},e.prototype.remove=function(e,t){return this._safeSet(c.REMOVE,e,t),this},e.prototype.add=function(e,t){return this._safeSet(c.ADD,e,t),this},e.prototype.unset=function(e){return this._safeSet(c.UNSET,e,"-"),this},e.prototype.clearAll=function(){return this._properties={},this._properties[c.CLEAR_ALL]="-",this},e.prototype._safeSet=function(e,t,n){if(this._validate(e,t,n)){var i=this._properties[e];return void 0===i&&(i={},this._properties[e]=i),i[t]=n,this._propertySet.add(t),!0}return!1},e.prototype._validate=function(e,t,n){return void 0===this._properties[c.CLEAR_ALL]&&(!this._propertySet.has(t)&&(e===c.ADD?"number"==typeof n:e===c.UNSET||e===c.REMOVE||A(t,n)))},e}(),C=function(e,t){return n(n({},t),{event_type:d.IDENTIFY,user_properties:e.getUserProperties()})},M=function(e,t,n){return void 0===t&&(t=0),void 0===n&&(n=v.Unknown),{event:e,code:t,message:n}},V=function(e){return e?(e^16*Math.random()>>e/4).toString(16):(String(1e7)+String(-1e3)+String(-4e3)+String(-8e3)+String(-1e11)).replace(/[018]/g,V)},F=function(){function e(e){this.client=e,this.queue=[],this.applying=!1,this.plugins=[]}return e.prototype.register=function(e,t){var n,i,s;return r(this,void 0,void 0,(function(){return o(this,(function(r){switch(r.label){case 0:return e.name=null!==(n=e.name)&&void 0!==n?n:V(),e.type=null!==(i=e.type)&&void 0!==i?i:"enrichment",[4,null===(s=e.setup)||void 0===s?void 0:s.call(e,t,this.client)];case 1:return r.sent(),this.plugins.push(e),[2]}}))}))},e.prototype.deregister=function(e){return this.plugins.splice(this.plugins.findIndex((function(t){return t.name===e})),1),Promise.resolve()},e.prototype.reset=function(e){this.applying=!1,this.plugins=[],this.client=e},e.prototype.push=function(e){var t=this;return new Promise((function(n){t.queue.push([e,n]),t.scheduleApply(0)}))},e.prototype.scheduleApply=function(e){var t=this;this.applying||(this.applying=!0,setTimeout((function(){t.apply(t.queue.shift()).then((function(){t.applying=!1,t.queue.length>0&&t.scheduleApply(0)}))}),e))},e.prototype.apply=function(e){return r(this,void 0,void 0,(function(){var t,i,r,a,c,l,d,f,p,v,h,g,y,m,b,_,I,S,w,E;return o(this,(function(o){switch(o.label){case 0:if(!e)return[2];t=u(e,1),i=t[0],r=u(e,2),a=r[1],c=this.plugins.filter((function(e){return"before"===e.type})),o.label=1;case 1:o.trys.push([1,6,7,8]),l=s(c),d=l.next(),o.label=2;case 2:return d.done?[3,5]:(g=d.value).execute?[4,g.execute(n({},i))]:[3,4];case 3:if(null===(y=o.sent()))return a({event:i,code:0,message:""}),[2];i=y,o.label=4;case 4:return d=l.next(),[3,2];case 5:return[3,8];case 6:return f=o.sent(),I={error:f},[3,8];case 7:try{d&&!d.done&&(S=l.return)&&S.call(l)}finally{if(I)throw I.error}return[7];case 8:p=this.plugins.filter((function(e){return"enrichment"===e.type||void 0===e.type})),o.label=9;case 9:o.trys.push([9,14,15,16]),v=s(p),h=v.next(),o.label=10;case 10:return h.done?[3,13]:(g=h.value).execute?[4,g.execute(n({},i))]:[3,12];case 11:if(null===(y=o.sent()))return a({event:i,code:0,message:""}),[2];i=y,o.label=12;case 12:return h=v.next(),[3,10];case 13:return[3,16];case 14:return m=o.sent(),w={error:m},[3,16];case 15:try{h&&!h.done&&(E=v.return)&&E.call(v)}finally{if(w)throw w.error}return[7];case 16:return b=this.plugins.filter((function(e){return"destination"===e.type})),_=b.map((function(e){var t=n({},i);return e.execute(t).catch((function(e){return M(t,0,String(e))}))})),Promise.all(_).then((function(e){var t=u(e,1)[0];a(t)})),[2]}}))}))},e.prototype.flush=function(){return r(this,void 0,void 0,(function(){var e,t,n,i=this;return o(this,(function(r){switch(r.label){case 0:return e=this.queue,this.queue=[],[4,Promise.all(e.map((function(e){return i.apply(e)})))];case 1:return r.sent(),t=this.plugins.filter((function(e){return"destination"===e.type})),n=t.map((function(e){return e.flush&&e.flush()})),[4,Promise.all(n)];case 2:return r.sent(),[2]}}))}))},e}(),Q="Event rejected due to exceeded retry count",$=function(e){return{promise:e||Promise.resolve()}},K=function(){function e(e){void 0===e&&(e="$default"),this.initializing=!1,this.q=[],this.dispatchQ=[],this.logEvent=this.track.bind(this),this.timeline=new F(this),this.name=e}return e.prototype._init=function(e){return r(this,void 0,void 0,(function(){return o(this,(function(t){switch(t.label){case 0:return this.config=e,this.timeline.reset(this),[4,this.runQueuedFunctions("q")];case 1:return t.sent(),[2]}}))}))},e.prototype.runQueuedFunctions=function(e){return r(this,void 0,void 0,(function(){var t,n,i,r,u,a;return o(this,(function(o){switch(o.label){case 0:t=this[e],this[e]=[],o.label=1;case 1:o.trys.push([1,6,7,8]),n=s(t),i=n.next(),o.label=2;case 2:return i.done?[3,5]:[4,(0,i.value)()];case 3:o.sent(),o.label=4;case 4:return i=n.next(),[3,2];case 5:return[3,8];case 6:return r=o.sent(),u={error:r},[3,8];case 7:try{i&&!i.done&&(a=n.return)&&a.call(n)}finally{if(u)throw u.error}return[7];case 8:return[2]}}))}))},e.prototype.track=function(e,t,i){var r=function(e,t,i){return n(n(n({},"string"==typeof e?{event_type:e}:e),i),t&&{event_properties:t})}(e,t,i);return $(this.dispatch(r))},e.prototype.identify=function(e,t){var n=C(e,t);return $(this.dispatch(n))},e.prototype.groupIdentify=function(e,t,i,r){var o=function(e,t,i,r){var o;return n(n({},r),{event_type:d.GROUP_IDENTIFY,group_properties:i.getUserProperties(),groups:(o={},o[e]=t,o)})}(e,t,i,r);return $(this.dispatch(o))},e.prototype.setGroup=function(e,t,i){var r=function(e,t,i){var r,o=new j;return o.set(e,t),n(n({},i),{event_type:d.IDENTIFY,user_properties:o.getUserProperties(),groups:(r={},r[e]=t,r)})}(e,t,i);return $(this.dispatch(r))},e.prototype.revenue=function(e,t){var i=function(e,t){return n(n({},t),{event_type:d.REVENUE,event_properties:e.getEventProperties()})}(e,t);return $(this.dispatch(i))},e.prototype.add=function(e){return this.config?$(this.timeline.register(e,this.config)):(this.q.push(this.add.bind(this,e)),$())},e.prototype.remove=function(e){return this.config?$(this.timeline.deregister(e)):(this.q.push(this.remove.bind(this,e)),$())},e.prototype.dispatchWithCallback=function(e,t){if(!this.config)return t(M(e,0,"Client not initialized"));this.process(e).then(t)},e.prototype.dispatch=function(e){return r(this,void 0,void 0,(function(){var t=this;return o(this,(function(n){return this.config?[2,this.process(e)]:[2,new Promise((function(n){t.dispatchQ.push(t.dispatchWithCallback.bind(t,e,n))}))]}))}))},e.prototype.process=function(e){return r(this,void 0,void 0,(function(){var t,n,i;return o(this,(function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),this.config.optOut?[2,M(e,0,"Event skipped due to optOut config")]:[4,this.timeline.push(e)];case 1:return 200===(i=r.sent()).code?this.config.loggerProvider.log(i.message):this.config.loggerProvider.error(i.message),[2,i];case 2:return t=r.sent(),n=String(t),this.config.loggerProvider.error(n),[2,i=M(e,0,n)];case 3:return[2]}}))}))},e.prototype.setOptOut=function(e){this.config?this.config.optOut=Boolean(e):this.q.push(this.setOptOut.bind(this,Boolean(e)))},e.prototype.flush=function(){return $(this.timeline.flush())},e}(),B=function(){function e(){this.productId="",this.quantity=1,this.price=0}return e.prototype.setProductId=function(e){return this.productId=e,this},e.prototype.setQuantity=function(e){return e>0&&(this.quantity=e),this},e.prototype.setPrice=function(e){return this.price=e,this},e.prototype.setRevenueType=function(e){return this.revenueType=e,this},e.prototype.setRevenue=function(e){return this.revenue=e,this},e.prototype.setEventProperties=function(e){return L(e)&&(this.properties=e),this},e.prototype.getEventProperties=function(){var e=this.properties?n({},this.properties):{};return e[l.REVENUE_PRODUCT_ID]=this.productId,e[l.REVENUE_QUANTITY]=this.quantity,e[l.REVENUE_PRICE]=this.price,e[l.REVENUE_TYPE]=this.revenueType,e[l.REVENUE]=this.revenue,e},e}(),z="Amplitude Logger ",W=function(){function e(){this.logLevel=f.None}return e.prototype.disable=function(){this.logLevel=f.None},e.prototype.enable=function(e){void 0===e&&(e=f.Warn),this.logLevel=e},e.prototype.log=function(){for(var e=[],t=0;t0&&Promise.all(n.map((function(e){return i.execute(e)}))).catch(),[2,Promise.resolve(void 0)]}}))}))},e.prototype.execute=function(e){var t=this;return new Promise((function(n){var i={event:e,attempts:0,callback:function(e){return n(e)},timeout:0};t.addToQueue(i)}))},e.prototype.addToQueue=function(){for(var e=this,t=[],n=0;n0&&t.schedule(e)}))}),e))},e.prototype.flush=function(e){return void 0===e&&(e=!1),r(this,void 0,void 0,(function(){var t,n,i,r=this;return o(this,(function(o){switch(o.label){case 0:return t=[],n=[],this.queue.forEach((function(e){return 0===e.timeout?t.push(e):n.push(e)})),this.queue=n,this.scheduled&&(clearTimeout(this.scheduled),this.scheduled=null),s=t,u=this.config.flushQueueSize,a=Math.max(u,1),i=s.reduce((function(e,t,n){var i=Math.floor(n/a);return e[i]||(e[i]=[]),e[i].push(t),e}),[]),[4,Promise.all(i.map((function(t){return r.send(t,e)})))];case 1:return o.sent(),[2]}var s,u,a}))}))},e.prototype.send=function(e,t){return void 0===t&&(t=!0),r(this,void 0,void 0,(function(){var n,r,s,u,a;return o(this,(function(o){switch(o.label){case 0:if(!this.config.apiKey)return[2,this.fulfillRequest(e,400,"Event rejected due to missing API key")];n={api_key:this.config.apiKey,events:e.map((function(e){var t=e.event;return t.extra,i(t,["extra"])})),options:{min_id_length:this.config.minIdLength}},o.label=1;case 1:return o.trys.push([1,3,,4]),r=Y(this.config.serverUrl,this.config.serverZone,this.config.useBatch).serverUrl,[4,this.config.transportProvider.send(r,n)];case 2:return null===(s=o.sent())?(this.fulfillRequest(e,0,"Unexpected error occurred"),[2]):t?(this.handleResponse(s,e),[3,4]):("body"in s?this.fulfillRequest(e,s.statusCode,"".concat(s.status,": ").concat(H(s))):this.fulfillRequest(e,s.statusCode,s.status),[2]);case 3:return u=o.sent(),a=(c=u)instanceof Error?c.message:String(c),this.config.loggerProvider.error(a),this.fulfillRequest(e,0,a),[3,4];case 4:return[2]}var c}))}))},e.prototype.handleResponse=function(e,t){var n=e.status;switch(n){case v.Success:this.handleSuccessResponse(e,t);break;case v.Invalid:this.handleInvalidResponse(e,t);break;case v.PayloadTooLarge:this.handlePayloadTooLargeResponse(e,t);break;case v.RateLimit:this.handleRateLimitResponse(e,t);break;default:this.config.loggerProvider.warn("{code: 0, error: \"Status '".concat(n,"' provided for ").concat(t.length,' events"}')),this.handleOtherResponse(t)}},e.prototype.handleSuccessResponse=function(e,t){this.fulfillRequest(t,e.statusCode,"Event tracked successfully")},e.prototype.handleInvalidResponse=function(e,t){var n=this;if(e.body.missingField||e.body.error.startsWith("Invalid API key"))this.fulfillRequest(t,e.statusCode,e.body.error);else{var i=a(a(a(a([],u(Object.values(e.body.eventsWithInvalidFields)),!1),u(Object.values(e.body.eventsWithMissingFields)),!1),u(Object.values(e.body.eventsWithInvalidIdLengths)),!1),u(e.body.silencedEvents),!1).flat(),r=new Set(i),o=t.filter((function(t,i){if(!r.has(i))return!0;n.fulfillRequest([t],e.statusCode,e.body.error)}));o.length>0&&this.config.loggerProvider.warn(H(e)),this.addToQueue.apply(this,a([],u(o),!1))}},e.prototype.handlePayloadTooLargeResponse=function(e,t){1!==t.length?(this.config.loggerProvider.warn(H(e)),this.config.flushQueueSize/=2,this.addToQueue.apply(this,a([],u(t),!1))):this.fulfillRequest(t,e.statusCode,e.body.error)},e.prototype.handleRateLimitResponse=function(e,t){var n=this,i=Object.keys(e.body.exceededDailyQuotaUsers),r=Object.keys(e.body.exceededDailyQuotaDevices),o=e.body.throttledEvents,s=new Set(i),c=new Set(r),l=new Set(o),d=t.filter((function(t,i){if(!(t.event.user_id&&s.has(t.event.user_id)||t.event.device_id&&c.has(t.event.device_id)))return l.has(i)&&(t.timeout=n.throttleTimeout),!0;n.fulfillRequest([t],e.statusCode,e.body.error)}));d.length>0&&this.config.loggerProvider.warn(H(e)),this.addToQueue.apply(this,a([],u(d),!1))},e.prototype.handleOtherResponse=function(e){var t=this;this.addToQueue.apply(this,a([],u(e.map((function(e){return e.timeout=e.attempts*t.retryTimeout,e}))),!1))},e.prototype.fulfillRequest=function(e,t,n){this.saveEvents(),e.forEach((function(e){return e.callback(M(e.event,t,n))}))},e.prototype.saveEvents=function(){if(this.config.storageProvider){var e=Array.from(this.queue.map((function(e){return e.event})));this.config.storageProvider.set(this.storageKey,e)}},e}(),ee=function(e){return void 0===e&&(e=0),((new Error).stack||"").split("\n").slice(2+e).map((function(e){return e.trim()}))},te=function(e){return function(){var t=n({},e.config);return{logger:t.loggerProvider,logLevel:t.logLevel}}},ne=function(e,t){var n,i;t=(t=t.replace(/\[(\w+)\]/g,".$1")).replace(/^\./,"");try{for(var r=s(t.split(".")),o=r.next();!o.done;o=r.next()){var u=o.value;if(!(u in e))return;e=e[u]}}catch(e){n={error:e}}finally{try{o&&!o.done&&(i=r.return)&&i.call(r)}finally{if(n)throw n.error}}return e},ie=function(e,t){return function(){var n,i,r={};try{for(var o=s(t),u=o.next();!u.done;u=o.next()){var a=u.value;r[a]=ne(e,a)}}catch(e){n={error:e}}finally{try{u&&!u.done&&(i=o.return)&&i.call(o)}finally{if(n)throw n.error}}return r}},re=function(e,t,n,i,r){return void 0===r&&(r=null),function(){for(var o=[],s=0;s=200&&e<300?v.Success:429===e?v.RateLimit:413===e?v.PayloadTooLarge:408===e?v.Timeout:e>=400&&e<500?v.Invalid:e>=500?v.Failed:v.Unknown},e}(),ue=function(e,t,n){return void 0===t&&(t=""),void 0===n&&(n=10),[q,t,e.substring(0,n)].filter(Boolean).join("_")},ae=function(){function e(e){this.options=n({},e)}return e.prototype.isEnabled=function(){return r(this,void 0,void 0,(function(){var t,n,i;return o(this,(function(r){switch(r.label){case 0:if(!h())return[2,!1];t=String(Date.now()),n=new e(this.options),i="AMP_TEST",r.label=1;case 1:return r.trys.push([1,4,5,7]),[4,n.set(i,t)];case 2:return r.sent(),[4,n.get(i)];case 3:return[2,r.sent()===t];case 4:return r.sent(),[2,!1];case 5:return[4,n.remove(i)];case 6:return r.sent(),[7];case 7:return[2]}}))}))},e.prototype.get=function(e){return r(this,void 0,void 0,(function(){var t;return o(this,(function(n){switch(n.label){case 0:return[4,this.getRaw(e)];case 1:if(!(t=n.sent()))return[2,void 0];try{try{t=decodeURIComponent(atob(t))}catch(e){}return[2,JSON.parse(t)]}catch(e){return[2,void 0]}return[2]}}))}))},e.prototype.getRaw=function(e){var t;return r(this,void 0,void 0,(function(){var n,i,r;return o(this,(function(o){return n=h(),i=null!==(t=null==n?void 0:n.document.cookie.split("; "))&&void 0!==t?t:[],(r=i.find((function(t){return 0===t.indexOf(e+"=")})))?[2,r.substring(e.length+1)]:[2,void 0]}))}))},e.prototype.set=function(e,t){var n;return r(this,void 0,void 0,(function(){var i,r,s,u,a,c;return o(this,(function(o){try{i=null!==(n=this.options.expirationDays)&&void 0!==n?n:0,s=void 0,(r=null!==t?i:-1)&&((u=new Date).setTime(u.getTime()+24*r*60*60*1e3),s=u),a="".concat(e,"=").concat(btoa(encodeURIComponent(JSON.stringify(t)))),s&&(a+="; expires=".concat(s.toUTCString())),a+="; path=/",this.options.domain&&(a+="; domain=".concat(this.options.domain)),this.options.secure&&(a+="; Secure"),this.options.sameSite&&(a+="; SameSite=".concat(this.options.sameSite)),(c=h())&&(c.document.cookie=a)}catch(e){}return[2]}))}))},e.prototype.remove=function(e){return r(this,void 0,void 0,(function(){return o(this,(function(t){switch(t.label){case 0:return[4,this.set(e,null)];case 1:return t.sent(),[2]}}))}))},e.prototype.reset=function(){return r(this,void 0,void 0,(function(){return o(this,(function(e){return[2]}))}))},e}(),ce=function(e){function n(){return null!==e&&e.apply(this,arguments)||this}return t(n,e),n.prototype.send=function(e,t){return r(this,void 0,void 0,(function(){var n,i;return o(this,(function(r){switch(r.label){case 0:if("undefined"==typeof fetch)throw new Error("FetchTransport is not supported");return n={headers:{"Content-Type":"application/json",Accept:"*/*"},body:JSON.stringify(t),method:"POST"},[4,fetch(e,n)];case 1:return[4,r.sent().json()];case 2:return i=r.sent(),[2,this.buildResponse(i)]}}))}))},n}(se),le=function(){function e(){}return e.prototype.getApplicationContext=function(){return{versionName:this.versionName,language:de(),platform:"Web",os:void 0,deviceModel:void 0}},e}(),de=function(){return"undefined"!=typeof navigator&&(navigator.languages&&navigator.languages[0]||navigator.language)||""},fe=function(){function e(){this.queue=[]}return e.prototype.logEvent=function(e){this.receiver?this.receiver(e):this.queue.length<512&&this.queue.push(e)},e.prototype.setEventReceiver=function(e){this.receiver=e,this.queue.length>0&&(this.queue.forEach((function(t){e(t)})),this.queue=[])},e}(),pe=function(){return pe=Object.assign||function(e){for(var t,n=1,i=arguments.length;n=0;--s)i.push(n.slice(s).join("."));s=0,o.label=2;case 2:return s2?(r=t,o=i):"string"==typeof t?(r=t,o=void 0):(r=null==t?void 0:t.userId,o=t),$(this._init(n(n({},o),{userId:r,apiKey:e})))},i.prototype._init=function(t){var i,s;return r(this,void 0,void 0,(function(){var u,a,c,l,d=this;return o(this,(function(f){switch(f.label){case 0:return this.initializing?[2]:(this.initializing=!0,[4,Ge(t.apiKey,t,this)]);case 1:return u=f.sent(),[4,e.prototype._init.call(this,u)];case 2:return f.sent(),this.setSessionId(null!==(s=null!==(i=t.sessionId)&&void 0!==i?i:this.config.sessionId)&&void 0!==s?s:Date.now()),(a=me(t.instanceName)).identityStore.setIdentity({userId:this.config.userId,deviceId:this.config.deviceId}),[4,this.add(new X).promise];case 3:return f.sent(),[4,this.add(new ke).promise];case 4:return f.sent(),[4,this.add(new be).promise];case 5:return f.sent(),v=this.config.defaultTracking,Ie(v,"fileDownloads")?[4,this.add({name:"@amplitude/plugin-file-download-tracking-browser",type:"enrichment",setup:function(e,t){return r(void 0,void 0,void 0,(function(){var n,i;return o(this,(function(r){return t?(n=function(e){var n;try{n=new URL(e.href,window.location.href)}catch(e){return}var r=i.exec(n.href),o=null==r?void 0:r[1];o&&e.addEventListener("click",(function(){var i;o&&t.track(je,((i={})[Ve]=o,i[Fe]=n.pathname,i[Qe]=e.id,i[$e]=e.text,i[Ke]=e.href,i))}))},i=/\.(pdf|xlsx?|docx?|txt|rtf|csv|exe|key|pp(s|t|tx)|7z|pkg|rar|gz|zip|avi|mov|mp4|mpe?g|wmv|midi?|mp3|wav|wma)$/,Array.from(document.getElementsByTagName("a")).forEach(n),"undefined"!=typeof MutationObserver&&new MutationObserver((function(e){e.forEach((function(e){e.addedNodes.forEach((function(e){"A"===e.nodeName&&n(e),"querySelectorAll"in e&&"function"==typeof e.querySelectorAll&&Array.from(e.querySelectorAll("a")).map(n)}))}))})).observe(document.body,{subtree:!0,childList:!0}),[2]):(e.loggerProvider.warn("File download tracking requires a later version of @amplitude/analytics-browser. File download events are not tracked."),[2])}))}))},execute:function(e){return r(void 0,void 0,void 0,(function(){return o(this,(function(t){return[2,e]}))}))}}).promise]:[3,7];case 6:f.sent(),f.label=7;case 7:return function(e){return Ie(e,"formInteractions")}(this.config.defaultTracking)?[4,this.add({name:"@amplitude/plugin-form-interaction-tracking-browser",type:"enrichment",setup:function(e,t){return r(void 0,void 0,void 0,(function(){var n;return o(this,(function(i){return t?(n=function(e){var n=!1;e.addEventListener("change",(function(){var i;n||t.track(Le,((i={})[Be]=e.id,i[ze]=e.name,i[We]=e.action,i)),n=!0}),{}),e.addEventListener("submit",(function(){var i,r;n||t.track(Le,((i={})[Be]=e.id,i[ze]=e.name,i[We]=e.action,i)),t.track(Ae,((r={})[Be]=e.id,r[ze]=e.name,r[We]=e.action,r)),n=!1}))},Array.from(document.getElementsByTagName("form")).forEach(n),"undefined"!=typeof MutationObserver&&new MutationObserver((function(e){e.forEach((function(e){e.addedNodes.forEach((function(e){"FORM"===e.nodeName&&n(e),"querySelectorAll"in e&&"function"==typeof e.querySelectorAll&&Array.from(e.querySelectorAll("form")).map(n)}))}))})).observe(document.body,{subtree:!0,childList:!0}),[2]):(e.loggerProvider.warn("Form interaction tracking requires a later version of @amplitude/analytics-browser. Form interaction events are not tracked."),[2])}))}))},execute:function(e){return r(void 0,void 0,void 0,(function(){return o(this,(function(t){return[2,e]}))}))}}).promise]:[3,9];case 8:f.sent(),f.label=9;case 9:return Se(this.config.defaultTracking)?(p=this.config,c=Se(p.defaultTracking)&&p.defaultTracking&&"object"==typeof p.defaultTracking&&p.defaultTracking.attribution&&"object"==typeof p.defaultTracking.attribution?n({},p.defaultTracking.attribution):{},l=nt(c),[4,this.add(l).promise]):[3,11];case 10:f.sent(),f.label=11;case 11:return[4,this.add(rt(we(this.config))).promise];case 12:return f.sent(),this.initializing=!1,[4,this.runQueuedFunctions("dispatchQ")];case 13:return f.sent(),a.eventBridge.setEventReceiver((function(e){d.track(e.eventType,e.eventProperties)})),[2]}var p,v}))}))},i.prototype.getUserId=function(){var e;return null===(e=this.config)||void 0===e?void 0:e.userId},i.prototype.setUserId=function(e){this.config?e===this.config.userId&&void 0!==e||(this.config.userId=e,function(e,t){me(t).identityStore.editIdentity().setUserId(e).commit()}(e,this.config.instanceName)):this.q.push(this.setUserId.bind(this,e))},i.prototype.getDeviceId=function(){var e;return null===(e=this.config)||void 0===e?void 0:e.deviceId},i.prototype.setDeviceId=function(e){this.config?(this.config.deviceId=e,function(e,t){me(t).identityStore.editIdentity().setDeviceId(e).commit()}(e,this.config.instanceName)):this.q.push(this.setDeviceId.bind(this,e))},i.prototype.reset=function(){this.setDeviceId(V()),this.setUserId(void 0)},i.prototype.getSessionId=function(){var e;return null===(e=this.config)||void 0===e?void 0:e.sessionId},i.prototype.setSessionId=function(e){var t;if(this.config){if(e!==this.config.sessionId){var n,i=this.getSessionId(),r=this.config.lastEventTime,o=null!==(t=this.config.lastEventId)&&void 0!==t?t:-1;this.config.sessionId=e,this.config.lastEventTime=void 0,n=this.config.defaultTracking,Ie(n,"sessions")&&(i&&r&&this.track(Me,void 0,{device_id:this.previousSessionDeviceId,event_id:++o,session_id:i,time:r+1,user_id:this.previousSessionUserId}),this.config.lastEventTime=this.config.sessionId,this.track(Ce,void 0,{event_id:++o,session_id:this.config.sessionId,time:this.config.lastEventTime})),this.previousSessionDeviceId=this.config.deviceId,this.previousSessionUserId=this.config.userId}}else this.q.push(this.setSessionId.bind(this,e))},i.prototype.extendSession=function(){this.config?this.config.lastEventTime=Date.now():this.q.push(this.extendSession.bind(this))},i.prototype.setTransport=function(e){this.config?this.config.transportProvider=He(e):this.q.push(this.setTransport.bind(this,e))},i.prototype.identify=function(t,n){if(Te(t)){var i=t._q;t._q=[],t=Oe(new j,i)}return(null==n?void 0:n.user_id)&&this.setUserId(n.user_id),(null==n?void 0:n.device_id)&&this.setDeviceId(n.device_id),e.prototype.identify.call(this,t,n)},i.prototype.groupIdentify=function(t,n,i,r){if(Te(i)){var o=i._q;i._q=[],i=Oe(new j,o)}return e.prototype.groupIdentify.call(this,t,n,i,r)},i.prototype.revenue=function(t,n){if(Te(t)){var i=t._q;t._q=[],t=Oe(new B,i)}return e.prototype.revenue.call(this,t,n)},i.prototype.process=function(t){return r(this,void 0,void 0,(function(){var n,i,r;return o(this,(function(o){return n=Date.now(),i=this.config.lastEventTime||Date.now(),r=n-i,t.event_type!==Ce&&t.event_type!==Me&&(!t.session_id||t.session_id===this.getSessionId())&&r>this.config.sessionTimeout&&this.setSessionId(n),[2,e.prototype.process.call(this,t)]}))}))},i}(K),ct=function(){var e=new at;return{init:re(e.init.bind(e),"init",te(e),ie(e,["config"])),add:re(e.add.bind(e),"add",te(e),ie(e,["config.apiKey","timeline.plugins"])),remove:re(e.remove.bind(e),"remove",te(e),ie(e,["config.apiKey","timeline.plugins"])),track:re(e.track.bind(e),"track",te(e),ie(e,["config.apiKey","timeline.queue.length"])),logEvent:re(e.logEvent.bind(e),"logEvent",te(e),ie(e,["config.apiKey","timeline.queue.length"])),identify:re(e.identify.bind(e),"identify",te(e),ie(e,["config.apiKey","timeline.queue.length"])),groupIdentify:re(e.groupIdentify.bind(e),"groupIdentify",te(e),ie(e,["config.apiKey","timeline.queue.length"])),setGroup:re(e.setGroup.bind(e),"setGroup",te(e),ie(e,["config.apiKey","timeline.queue.length"])),revenue:re(e.revenue.bind(e),"revenue",te(e),ie(e,["config.apiKey","timeline.queue.length"])),flush:re(e.flush.bind(e),"flush",te(e),ie(e,["config.apiKey","timeline.queue.length"])),getUserId:re(e.getUserId.bind(e),"getUserId",te(e),ie(e,["config","config.userId"])),setUserId:re(e.setUserId.bind(e),"setUserId",te(e),ie(e,["config","config.userId"])),getDeviceId:re(e.getDeviceId.bind(e),"getDeviceId",te(e),ie(e,["config","config.deviceId"])),setDeviceId:re(e.setDeviceId.bind(e),"setDeviceId",te(e),ie(e,["config","config.deviceId"])),reset:re(e.reset.bind(e),"reset",te(e),ie(e,["config","config.userId","config.deviceId"])),getSessionId:re(e.getSessionId.bind(e),"getSessionId",te(e),ie(e,["config"])),setSessionId:re(e.setSessionId.bind(e),"setSessionId",te(e),ie(e,["config"])),extendSession:re(e.extendSession.bind(e),"extendSession",te(e),ie(e,["config"])),setOptOut:re(e.setOptOut.bind(e),"setOptOut",te(e),ie(e,["config"])),setTransport:re(e.setTransport.bind(e),"setTransport",te(e),ie(e,["config"]))}},lt=ct(),dt=lt.add,ft=lt.extendSession,pt=lt.flush,vt=lt.getDeviceId,ht=lt.getSessionId,gt=lt.getUserId,yt=lt.groupIdentify,mt=lt.identify,bt=lt.init,_t=lt.logEvent,It=lt.remove,St=lt.reset,wt=lt.revenue,Et=lt.setDeviceId,Ot=lt.setGroup,Tt=lt.setOptOut,kt=lt.setSessionId,Pt=lt.setTransport,Rt=lt.setUserId,xt=lt.track,Ut=Object.freeze({__proto__:null,add:dt,extendSession:ft,flush:pt,getDeviceId:vt,getSessionId:ht,getUserId:gt,groupIdentify:yt,identify:mt,init:bt,logEvent:_t,remove:It,reset:St,revenue:wt,setDeviceId:Et,setGroup:Ot,setOptOut:Tt,setSessionId:kt,setTransport:Pt,setUserId:Rt,track:xt,Types:U,createInstance:ct,runQueuedFunctions:Ee,Revenue:B,Identify:j});!function(){var e=h();if(e){var t=function(e){var t=ct(),n=h();return n&&n.amplitude&&n.amplitude._iq&&e&&(n.amplitude._iq[e]=t),t};if(e.amplitude=Object.assign(e.amplitude||{},Ut,{createInstance:t}),e.amplitude.invoked){var n=e.amplitude._q;e.amplitude._q=[],Ee(Ut,n);for(var i=Object.keys(e.amplitude._iq)||[],r=0;r - !function(){"use strict";!function(e,t){var n=e.amplitude||{_q:[],_iq:{}};if(n.invoked)e.console&&console.error&&console.error("Amplitude snippet has been loaded.");else{var r=function(e,t){e.prototype[t]=function(){return this._q.push({name:t,args:Array.prototype.slice.call(arguments,0)}),this}},s=function(e,t,n){return function(r){e._q.push({name:t,args:Array.prototype.slice.call(n,0),resolve:r})}},o=function(e,t,n){e[t]=function(){if(n)return{promise:new Promise(s(e,t,Array.prototype.slice.call(arguments)))}}},i=function(e){for(var t=0;t `; diff --git a/src/components/AssetIcon.tsx b/src/components/AssetIcon.tsx index 2a977d6..c7ac58b 100644 --- a/src/components/AssetIcon.tsx +++ b/src/components/AssetIcon.tsx @@ -8,6 +8,7 @@ const assetIcons = { '1INCH': '/currencies/1inch.png', AAVE: '/currencies/aave.png', ADA: '/currencies/ada.png', + AGIX: '/currencies/agix.png', ALGO: '/currencies/algo.png', APE: '/currencies/ape.png', APT: '/currencies/apt.png', @@ -16,35 +17,57 @@ const assetIcons = { AVAX: '/currencies/avax.png', BCH: '/currencies/bch.png', BLUR: '/currencies/blur.png', + BNB: '/currencies/bnb.png', BONK: '/currencies/bonk.png', BTC: '/currencies/btc.png', CELO: '/currencies/celo.png', + CHZ: '/currencies/chz.png', COMP: '/currencies/comp.png', CRV: '/currencies/crv.png', DAI: '/currencies/dai.png', DOGE: '/currencies/doge.png', DOT: '/currencies/dot.png', DYDX: '/currencies/dydx.png', + DYM: '/currencies/dym.png', ENJ: '/currencies/enj.png', + ENS: '/currencies/ens.png', EOS: '/currencies/eos.png', ETC: '/currencies/etc.png', ETH: '/currencies/eth.png', + FET: '/currencies/fet.png', FIL: '/currencies/fil.png', + FTM: '/currencies/ftm.png', + GALA: "/currencies/gala.png", + GMT: "/currencies/gmt.png", + GRT: "/currencies/grt.png", + HBAR: "/currencies/hbar.png", ICP: '/currencies/icp.png', + IMX: '/currencies/imx.png', + INJ: '/currencies/inj.png', + JTO: '/currencies/jto.png', JUP: '/currencies/jup.png', + KAVA: '/currencies/kava.png', LDO: '/currencies/ldo.png', LINK: '/currencies/link.png', LTC: '/currencies/ltc.png', + MANA: '/currencies/mana.png', MATIC: '/currencies/matic.png', + MASK: '/currencies/mask.png', + MINA: '/currencies/mina.png', MKR: '/currencies/mkr.png', NEAR: '/currencies/near.png', + ORDI: "/currencies/ordi.png", OP: '/currencies/op.png', PEPE: '/currencies/pepe.png', + PYTH: '/currencies/pyth.png', + RNDR: '/currencies/rndr.png', RUNE: '/currencies/rune.png', + SAND: '/currencies/sand.png', SEI: '/currencies/sei.png', SHIB: '/currencies/shib.png', SNX: '/currencies/snx.png', SOL: '/currencies/sol.png', + STX: '/currencies/stx.png', SUI: '/currencies/sui.png', SUSHI: '/currencies/sushi.png', TIA: '/currencies/tia.png', @@ -55,6 +78,7 @@ const assetIcons = { USDT: '/currencies/usdt.png', WBTC: '/currencies/wbtc.png', WETH: '/currencies/weth.png', + WOO: '/currencies/woo.png', WLD: '/currencies/wld.png', XLM: '/currencies/xlm.png', XMR: '/currencies/xmr.png', @@ -62,6 +86,7 @@ const assetIcons = { XTZ: '/currencies/xtz.png', YFI: '/currencies/yfi.png', ZEC: '/currencies/zec.png', + ZETA: '/currencies/zeta.png', ZRX: '/currencies/zrx.png', } as const; diff --git a/src/components/SearchSelectMenu.tsx b/src/components/SearchSelectMenu.tsx index fa368ea..ac6f620 100644 --- a/src/components/SearchSelectMenu.tsx +++ b/src/components/SearchSelectMenu.tsx @@ -39,7 +39,7 @@ export const SearchSelectMenu = ({ disabled, label, items, - withSearch, + withSearch = true, withReceiptItems, }: SearchSelectMenuProps) => { const [open, setOpen] = useState(false); @@ -77,6 +77,7 @@ export const SearchSelectMenu = ({ withSearch={withSearch} onItemSelected={() => setOpen(false)} withStickyLayout + $withSearch={withSearch} /> @@ -127,7 +128,7 @@ Styled.Popover = styled(Popover)` box-shadow: none; `; -Styled.ComboboxMenu = styled(ComboboxMenu)` +Styled.ComboboxMenu = styled(ComboboxMenu)<{ $withSearch?: boolean }>` ${layoutMixins.withInnerHorizontalBorders} --comboboxMenu-backgroundColor: var(--color-layer-4); @@ -140,7 +141,8 @@ Styled.ComboboxMenu = styled(ComboboxMenu)` --comboboxMenu-item-checked-textColor: var(--color-text-2); --comboboxMenu-item-highlighted-textColor: var(--color-text-2); - --stickyArea1-topHeight: var(--form-input-height); + --stickyArea1-topHeight: ${({ $withSearch }) => + !$withSearch ? '0' : 'var(--form-input-height)'}; input:focus-visible { outline: none; diff --git a/src/components/Tag.stories.tsx b/src/components/Tag.stories.tsx index 8d3e2c3..a399da0 100644 --- a/src/components/Tag.stories.tsx +++ b/src/components/Tag.stories.tsx @@ -33,4 +33,9 @@ TagStory.argTypes = { control: { type: 'select' }, defaultValue: undefined, }, + isHighlighted: { + options: [true, false], + control: { type: 'select' }, + defaultValue: false, + }, }; diff --git a/src/components/Tag.tsx b/src/components/Tag.tsx index 71d20cf..76a9246 100644 --- a/src/components/Tag.tsx +++ b/src/components/Tag.tsx @@ -76,5 +76,6 @@ export const Tag = styled.span` isHighlighted && css` background-color: var(--color-accent); + color: var(--color-text-button); `} `; diff --git a/src/components/TimeoutButton.tsx b/src/components/TimeoutButton.tsx index 4e0c4e6..1f59548 100644 --- a/src/components/TimeoutButton.tsx +++ b/src/components/TimeoutButton.tsx @@ -1,4 +1,4 @@ -import { type ReactNode, useState } from 'react'; +import { type ReactNode, useState, useEffect } from 'react'; import { ButtonAction, ButtonState } from '@/constants/buttons'; import { STRING_KEYS } from '@/constants/localization'; @@ -8,6 +8,7 @@ import { Button, type ButtonStateConfig, type ButtonProps } from '@/components/B type ElementProps = { timeoutInSeconds: number; + onTimeOut?: () => void; slotFinal?: ReactNode; } & ButtonProps; @@ -16,6 +17,7 @@ export type TimeoutButtonProps = ElementProps; export const TimeoutButton = ({ children, timeoutInSeconds, + onTimeOut, slotFinal, ...otherProps }: TimeoutButtonProps) => { @@ -25,6 +27,11 @@ export const TimeoutButton = ({ const secondsLeft = Math.max(0, (timeoutDeadline - now) / 1000); + useEffect(() => { + if (secondsLeft > 0) return; + onTimeOut?.(); + }, [secondsLeft]); + if (slotFinal && secondsLeft <= 0) return slotFinal; return ( diff --git a/src/constants/analytics.ts b/src/constants/analytics.ts index 5fefc73..4bb9f50 100644 --- a/src/constants/analytics.ts +++ b/src/constants/analytics.ts @@ -144,9 +144,17 @@ export type AnalyticsEventData = validatorUrl: string; } : T extends AnalyticsEvent.TransferDeposit - ? {} + ? { + chainId?: string; + tokenAddress?: string; + tokenSymbol?: string; + } : T extends AnalyticsEvent.TransferWithdraw - ? {} + ? { + chainId?: string; + tokenAddress?: string; + tokenSymbol?: string; + } : // Trading T extends AnalyticsEvent.TradeOrderTypeSelected ? { diff --git a/src/constants/networks.ts b/src/constants/networks.ts index 8bfe05e..b659440 100644 --- a/src/constants/networks.ts +++ b/src/constants/networks.ts @@ -1,4 +1,4 @@ -import environments from '../../public/configs/env.json'; +import environments from '../../public/configs/v1/env.json'; const CURRENT_MODE = ({ production: 'MAINNET', @@ -14,5 +14,10 @@ export const isDev = CURRENT_MODE === 'DEV'; export const AVAILABLE_ENVIRONMENTS = environments.deployments[CURRENT_MODE]; export const CURRENT_ABACUS_DEPLOYMENT = CURRENT_MODE; export const ENVIRONMENT_CONFIG_MAP = environments.environments; +export const TOKEN_CONFIG_MAP = environments.tokens; +export const LINKS_CONFIG_MAP = environments.links; +export const WALLETS_CONFIG_MAP = environments.wallets; +export const GOVERNANCE_CONFIG_MAP = environments.governance; export type DydxNetwork = keyof typeof ENVIRONMENT_CONFIG_MAP; +export type DydxChainId = keyof typeof TOKEN_CONFIG_MAP; export const DEFAULT_APP_ENVIRONMENT = AVAILABLE_ENVIRONMENTS.default as DydxNetwork; diff --git a/src/constants/notifications.ts b/src/constants/notifications.ts index d6728d1..b876815 100644 --- a/src/constants/notifications.ts +++ b/src/constants/notifications.ts @@ -140,6 +140,7 @@ export type TransferNotifcation = { isCctp?: boolean; errorCount?: number; status?: StatusResponse; + isExchange?: boolean; }; /** diff --git a/src/constants/numbers.ts b/src/constants/numbers.ts index e515d83..dc6914d 100644 --- a/src/constants/numbers.ts +++ b/src/constants/numbers.ts @@ -22,4 +22,5 @@ export enum NumberSign { // Deposit/Withdraw export const MAX_CCTP_TRANSFER_AMOUNT = 1_000_000; +export const MIN_CCTP_TRANSFER_AMOUNT = 10; export const MAX_PRICE_IMPACT = 0.02; // 2% diff --git a/src/constants/styles/colors.ts b/src/constants/styles/colors.ts index 7443864..7075c17 100644 --- a/src/constants/styles/colors.ts +++ b/src/constants/styles/colors.ts @@ -1,4 +1,12 @@ -import { AppColorMode } from '@/state/configs'; +import type { ThemeName } from 'public/tradingview/charting_library'; + +import { AppColorMode, AppTheme } from '@/state/configs'; + +export const THEME_NAMES: Record = { + [AppTheme.Classic]: 'Classic', + [AppTheme.Dark]: 'Dark', + [AppTheme.Light]: 'Light', +}; export type Theme = { [AppColorMode.GreenUp]: ThemeColorBase; diff --git a/src/constants/trade.ts b/src/constants/trade.ts index ff042cf..658134d 100644 --- a/src/constants/trade.ts +++ b/src/constants/trade.ts @@ -4,7 +4,6 @@ import { AlertType } from '@/constants/alerts'; import { STRING_KEYS } from '@/constants/localization'; import { TimeUnitShort } from '@/constants/time'; -// TODO: rename to OrderType export enum TradeTypes { MARKET = 'MARKET', LIMIT = 'LIMIT', @@ -15,6 +14,16 @@ export enum TradeTypes { TRAILING_STOP = 'TRAILING_STOP', } +enum ClosingTradeTypes { + LIQUIDATED = 'LIQUIDATED', + LIQUIDATION = 'LIQUIDATION', + OFFSETTING = 'OFFSETTING', + DELEVERAGED = 'DELEVERAGED', + FINAL_SETTLEMENT = 'FINAL_SETTLEMENT', +} + +export type OrderType = TradeTypes | ClosingTradeTypes; + export enum TimeInForceOptions { GTT = 'GTT', FOK = 'FOK', @@ -40,49 +49,74 @@ export const POSITION_SIDE_STRINGS: Record = { [PositionSide.Short]: STRING_KEYS.SHORT_POSITION_SHORT, }; -export const TRADE_TYPE_STRINGS: Record< - TradeTypes, +export const ORDER_TYPE_STRINGS: Record< + OrderType, { - tradeTypeKeyShort: string; - tradeTypeKey: string; - descriptionKey: string; + orderTypeKeyShort: string; + orderTypeKey: string; + descriptionKey: string | null; } > = { [TradeTypes.LIMIT]: { - tradeTypeKeyShort: STRING_KEYS.LIMIT_ORDER_SHORT, - tradeTypeKey: STRING_KEYS.LIMIT_ORDER, + orderTypeKeyShort: STRING_KEYS.LIMIT_ORDER_SHORT, + orderTypeKey: STRING_KEYS.LIMIT_ORDER, descriptionKey: STRING_KEYS.LIMIT_ORDER_DESCRIPTION, }, [TradeTypes.MARKET]: { - tradeTypeKeyShort: STRING_KEYS.MARKET_ORDER_SHORT, - tradeTypeKey: STRING_KEYS.MARKET_ORDER, + orderTypeKeyShort: STRING_KEYS.MARKET_ORDER_SHORT, + orderTypeKey: STRING_KEYS.MARKET_ORDER, descriptionKey: STRING_KEYS.MARKET_ORDER_DESCRIPTION, }, [TradeTypes.STOP_LIMIT]: { - tradeTypeKeyShort: STRING_KEYS.STOP_LIMIT, - tradeTypeKey: STRING_KEYS.STOP_LIMIT, + orderTypeKeyShort: STRING_KEYS.STOP_LIMIT, + orderTypeKey: STRING_KEYS.STOP_LIMIT, descriptionKey: STRING_KEYS.STOP_LIMIT_DESCRIPTION, }, [TradeTypes.STOP_MARKET]: { - tradeTypeKeyShort: STRING_KEYS.STOP_MARKET, - tradeTypeKey: STRING_KEYS.STOP_MARKET, + orderTypeKeyShort: STRING_KEYS.STOP_MARKET, + orderTypeKey: STRING_KEYS.STOP_MARKET, descriptionKey: STRING_KEYS.STOP_MARKET_DESCRIPTION, }, [TradeTypes.TAKE_PROFIT]: { - tradeTypeKeyShort: STRING_KEYS.TAKE_PROFIT_LIMIT, - tradeTypeKey: STRING_KEYS.TAKE_PROFIT_LIMIT, + orderTypeKeyShort: STRING_KEYS.TAKE_PROFIT_LIMIT, + orderTypeKey: STRING_KEYS.TAKE_PROFIT_LIMIT, descriptionKey: STRING_KEYS.TAKE_PROFIT_LIMIT_DESCRIPTION, }, [TradeTypes.TAKE_PROFIT_MARKET]: { - tradeTypeKeyShort: STRING_KEYS.TAKE_PROFIT_MARKET, - tradeTypeKey: STRING_KEYS.TAKE_PROFIT_MARKET, + orderTypeKeyShort: STRING_KEYS.TAKE_PROFIT_MARKET, + orderTypeKey: STRING_KEYS.TAKE_PROFIT_MARKET, descriptionKey: STRING_KEYS.TAKE_PROFIT_MARKET_DESCRIPTION, }, [TradeTypes.TRAILING_STOP]: { - tradeTypeKeyShort: STRING_KEYS.TRAILING_STOP, - tradeTypeKey: STRING_KEYS.TRAILING_STOP, + orderTypeKeyShort: STRING_KEYS.TRAILING_STOP, + orderTypeKey: STRING_KEYS.TRAILING_STOP, descriptionKey: STRING_KEYS.TRAILING_STOP_DESCRIPTION, }, + [ClosingTradeTypes.LIQUIDATED]: { + orderTypeKeyShort: STRING_KEYS.LIQUIDATED, + orderTypeKey: STRING_KEYS.LIQUIDATED, + descriptionKey: null, + }, + [ClosingTradeTypes.LIQUIDATION]: { + orderTypeKeyShort: STRING_KEYS.LIQUIDATION, + orderTypeKey: STRING_KEYS.LIQUIDATION, + descriptionKey: null, + }, + [ClosingTradeTypes.OFFSETTING]: { + orderTypeKeyShort: STRING_KEYS.OFFSETTING, + orderTypeKey: STRING_KEYS.OFFSETTING, + descriptionKey: null, + }, + [ClosingTradeTypes.DELEVERAGED]: { + orderTypeKeyShort: STRING_KEYS.DELEVERAGED, + orderTypeKey: STRING_KEYS.DELEVERAGED, + descriptionKey: null, + }, + [ClosingTradeTypes.FINAL_SETTLEMENT]: { + orderTypeKeyShort: STRING_KEYS.FINAL_SETTLEMENT, + orderTypeKey: STRING_KEYS.FINAL_SETTLEMENT, + descriptionKey: null, + }, }; export const GOOD_TIL_TIME_TIMESCALE_STRINGS: Record = { diff --git a/src/constants/tvchart.ts b/src/constants/tvchart.ts new file mode 100644 index 0000000..62503ac --- /dev/null +++ b/src/constants/tvchart.ts @@ -0,0 +1,16 @@ +import { OrderSide } from '@dydxprotocol/v4-client-js'; + +import type { + IChartingLibraryWidget, + IOrderLineAdapter, + IPositionLineAdapter, +} from 'public/tradingview/charting_library'; + +export type TvWidget = IChartingLibraryWidget & { _id?: string; _ready?: boolean }; + +export type ChartLineType = OrderSide | 'position'; + +export type ChartLine = { + line: IOrderLineAdapter | IPositionLineAdapter; + chartLineType: ChartLineType; +}; diff --git a/src/constants/wallets.ts b/src/constants/wallets.ts index 43e80c9..b4ab501 100644 --- a/src/constants/wallets.ts +++ b/src/constants/wallets.ts @@ -24,7 +24,7 @@ import { import { isMetaMask } from '@/lib/wallet/providers'; -import { DydxNetwork, ENVIRONMENT_CONFIG_MAP } from './networks'; +import { DydxChainId, WALLETS_CONFIG_MAP } from './networks'; // Wallet connection types @@ -40,6 +40,7 @@ export enum WalletErrorType { // General ChainMismatch, UserCanceled, + SwitchChainMethodMissing, // Non-Deterministic NonDeterministicWallet, @@ -290,17 +291,17 @@ export const COSMOS_DERIVATION_PATH = "m/44'/118'/0'/0/0"; /** * @description typed data to sign for dYdX Chain onboarding */ -export const getSignTypedData = (selectedNetwork: DydxNetwork) => +export const getSignTypedData = (selectedDydxChainId: DydxChainId) => ({ primaryType: 'dYdX', domain: { - name: ENVIRONMENT_CONFIG_MAP[selectedNetwork].wallets.signTypedDataDomainName, + name: WALLETS_CONFIG_MAP[selectedDydxChainId].signTypedDataDomainName, }, types: { dYdX: [{ name: 'action', type: 'string' }], }, message: { - action: ENVIRONMENT_CONFIG_MAP[selectedNetwork].wallets.signTypedDataAction, + action: WALLETS_CONFIG_MAP[selectedDydxChainId].signTypedDataAction, }, } as const); diff --git a/src/hooks/tradingView/index.ts b/src/hooks/tradingView/index.ts index 13ecccc..5d26196 100644 --- a/src/hooks/tradingView/index.ts +++ b/src/hooks/tradingView/index.ts @@ -1,2 +1,4 @@ +export { useChartLines } from './useChartLines'; +export { useChartMarketAndResolution } from './useChartMarketAndResolution'; export { useTradingView } from './useTradingView'; export { useTradingViewTheme } from './useTradingViewTheme'; diff --git a/src/hooks/tradingView/useChartLines.ts b/src/hooks/tradingView/useChartLines.ts new file mode 100644 index 0000000..81620e1 --- /dev/null +++ b/src/hooks/tradingView/useChartLines.ts @@ -0,0 +1,209 @@ +import { useEffect, useState } from 'react'; + +import { shallowEqual, useSelector } from 'react-redux'; + +import { AbacusOrderStatus, ORDER_SIDES, SubaccountOrder } from '@/constants/abacus'; +import { STRING_KEYS } from '@/constants/localization'; +import { type OrderType, ORDER_TYPE_STRINGS } from '@/constants/trade'; +import type { ChartLine, TvWidget } from '@/constants/tvchart'; + +import { useStringGetter } from '@/hooks'; + +import { getCurrentMarketOrders, getCurrentMarketPositionData } from '@/state/accountSelectors'; +import { getAppTheme, getAppColorMode } from '@/state/configsSelectors'; + +import { MustBigNumber } from '@/lib/numbers'; +import { getChartLineColors } from '@/lib/tradingView/utils'; + +let chartLines: Record = {}; + +/** + * @description Hook to handle drawing chart lines + */ + +export const useChartLines = ({ + tvWidget, + displayButton, + isChartReady, +}: { + tvWidget: TvWidget | null; + displayButton: HTMLElement | null; + isChartReady?: boolean; +}) => { + const [showOrderLines, setShowOrderLines] = useState(false); + + const stringGetter = useStringGetter(); + + const appTheme = useSelector(getAppTheme); + const appColorMode = useSelector(getAppColorMode); + + const currentMarketPositionData = useSelector(getCurrentMarketPositionData, shallowEqual); + const currentMarketOrders: SubaccountOrder[] = useSelector(getCurrentMarketOrders, shallowEqual); + + useEffect(() => { + if (isChartReady && displayButton) { + displayButton.onclick = () => { + const newShowOrderLinesState = !showOrderLines; + if (newShowOrderLinesState) { + displayButton?.classList?.add('order-lines-active'); + } else { + displayButton?.classList?.remove('order-lines-active'); + } + setShowOrderLines(newShowOrderLinesState); + }; + } + }, [isChartReady, showOrderLines]); + + useEffect(() => { + if (tvWidget && isChartReady) { + tvWidget.onChartReady(() => { + tvWidget.chart().dataReady(() => { + if (showOrderLines) { + drawOrderLines(); + drawPositionLine(); + } else { + deleteChartLines(); + } + }); + }); + } + }, [isChartReady, showOrderLines, currentMarketPositionData, currentMarketOrders]); + + const drawPositionLine = () => { + if (!currentMarketPositionData) return; + + const entryPrice = currentMarketPositionData.entryPrice?.current; + const size = currentMarketPositionData.size?.current; + + const key = currentMarketPositionData.id; + const price = MustBigNumber(entryPrice).toNumber(); + + const maybePositionLine = chartLines[key]?.line; + const shouldShow = size && size !== 0; + + if (!shouldShow) { + if (maybePositionLine) { + maybePositionLine.remove(); + delete chartLines[key]; + return; + } + } else { + const quantity = size.toString(); + + if (maybePositionLine) { + if (maybePositionLine.getQuantity() !== quantity) { + maybePositionLine.setQuantity(quantity); + } + if (maybePositionLine.getPrice() !== price) { + maybePositionLine.setPrice(price); + } + } else { + const positionLine = tvWidget + ?.chart() + .createPositionLine({ disableUndo: false }) + .setText(stringGetter({ key: STRING_KEYS.ENTRY_PRICE_SHORT })) + .setPrice(price) + .setQuantity(quantity); + + if (positionLine) { + const chartLine = { line: positionLine, chartLineType: 'position' }; + setLineColors({ chartLine: chartLine }); + chartLines[key] = chartLine; + } + } + } + }; + + const drawOrderLines = () => { + if (!currentMarketOrders) return; + + currentMarketOrders.forEach( + ({ + id, + type, + status, + side, + cancelReason, + remainingSize, + size, + triggerPrice, + price, + trailingPercent, + }) => { + const key = id; + const quantity = (remainingSize ?? size).toString(); + + const orderType = type.rawValue as OrderType; + const orderLabel = stringGetter({ + key: ORDER_TYPE_STRINGS[orderType].orderTypeKey, + }); + const orderString = trailingPercent ? `${orderLabel} ${trailingPercent}%` : orderLabel; + + const shouldShow = + !cancelReason && + (status === AbacusOrderStatus.open || status === AbacusOrderStatus.untriggered); + + const maybeOrderLine = chartLines[key]?.line; + + if (!shouldShow) { + if (maybeOrderLine) { + maybeOrderLine.remove(); + delete chartLines[key]; + return; + } + } else { + if (maybeOrderLine) { + if (maybeOrderLine.getQuantity() !== quantity) { + maybeOrderLine.setQuantity(quantity); + } + } else { + const orderLine = tvWidget + ?.chart() + .createOrderLine({ disableUndo: false }) + .setPrice(MustBigNumber(triggerPrice ?? price).toNumber()) + .setQuantity(quantity) + .setText(orderString); + + if (orderLine) { + const chartLine: ChartLine = { + line: orderLine, + chartLineType: ORDER_SIDES[side.name], + }; + setLineColors({ chartLine: chartLine }); + chartLines[key] = chartLine; + } + } + } + } + ); + }; + + const deleteChartLines = () => { + Object.values(chartLines).forEach(({ line }) => { + line.remove(); + }); + chartLines = {}; + }; + + const setLineColors = ({ chartLine }: { chartLine: ChartLine }) => { + const { line, chartLineType } = chartLine; + const { maybeQuantityColor, borderColor, backgroundColor, textColor, textButtonColor } = + getChartLineColors({ + appTheme, + appColorMode, + chartLineType, + }); + + line + .setQuantityBorderColor(borderColor) + .setBodyBackgroundColor(backgroundColor) + .setBodyBorderColor(borderColor) + .setBodyTextColor(textColor) + .setQuantityTextColor(textButtonColor); + + maybeQuantityColor && + line.setLineColor(maybeQuantityColor).setQuantityBackgroundColor(maybeQuantityColor); + }; + + return { chartLines }; +}; diff --git a/src/hooks/tradingView/useChartMarketAndResolution.ts b/src/hooks/tradingView/useChartMarketAndResolution.ts new file mode 100644 index 0000000..a6b5451 --- /dev/null +++ b/src/hooks/tradingView/useChartMarketAndResolution.ts @@ -0,0 +1,72 @@ +import { useEffect } from 'react'; + +import { useDispatch, useSelector } from 'react-redux'; + +import type { ResolutionString } from 'public/tradingview/charting_library'; + +import { DEFAULT_RESOLUTION, RESOLUTION_CHART_CONFIGS } from '@/constants/candles'; +import { DEFAULT_MARKETID } from '@/constants/markets'; +import type { TvWidget } from '@/constants/tvchart'; + +import { setTvChartResolution } from '@/state/perpetuals'; +import { getCurrentMarketId, getSelectedResolutionForMarket } from '@/state/perpetualsSelectors'; + +/** + * @description Hook to handle changing markets and setting chart resolution + */ + +export const useChartMarketAndResolution = ({ + tvWidget, + isWidgetReady, + savedResolution, +}: { + tvWidget: TvWidget | null; + isWidgetReady?: boolean; + savedResolution?: ResolutionString; +}) => { + const dispatch = useDispatch(); + + const currentMarketId: string = useSelector(getCurrentMarketId) || DEFAULT_MARKETID; + + const selectedResolution: string = + useSelector(getSelectedResolutionForMarket(currentMarketId)) || DEFAULT_RESOLUTION; + + const chart = isWidgetReady ? tvWidget?.chart() : undefined; + const chartResolution = chart?.resolution?.(); + + /** + * @description Hook to handle changing markets - intentionally should avoid triggering on change of resolutions. + */ + useEffect(() => { + if (currentMarketId && isWidgetReady) { + const resolution = savedResolution || selectedResolution; + tvWidget?.setSymbol(currentMarketId, resolution as ResolutionString, () => {}); + } + }, [currentMarketId, isWidgetReady]); + + /** + * @description Hook to handle changing chart resolution + */ + useEffect(() => { + if (chartResolution) { + if (chartResolution !== selectedResolution) { + dispatch(setTvChartResolution({ marketId: currentMarketId, resolution: chartResolution })); + } + + setVisibleRangeForResolution({ resolution: chartResolution }); + } + }, [currentMarketId, chartResolution, selectedResolution]); + + const setVisibleRangeForResolution = ({ resolution }: { resolution: ResolutionString }) => { + // Different resolutions have different timeframes to display data efficiently. + const { defaultRange } = RESOLUTION_CHART_CONFIGS[resolution]; + + // from/to values converted to epoch seconds + const newRange = { + from: (Date.now() - defaultRange) / 1000, + to: Date.now() / 1000, + }; + + tvWidget?.activeChart().setVisibleRange(newRange, { percentRightMargin: 10 }); + }; +}; diff --git a/src/hooks/tradingView/useTradingView.ts b/src/hooks/tradingView/useTradingView.ts index 68065d8..0de4d18 100644 --- a/src/hooks/tradingView/useTradingView.ts +++ b/src/hooks/tradingView/useTradingView.ts @@ -1,15 +1,19 @@ -import { useEffect } from 'react'; +import React, { useEffect } from 'react'; + import { shallowEqual, useSelector } from 'react-redux'; + import isEmpty from 'lodash/isEmpty'; import { LanguageCode, ResolutionString, widget } from 'public/tradingview/charting_library'; import { DEFAULT_RESOLUTION } from '@/constants/candles'; -import { SUPPORTED_LOCALE_BASE_TAGS } from '@/constants/localization'; +import { SUPPORTED_LOCALE_BASE_TAGS, STRING_KEYS } from '@/constants/localization'; import { LocalStorageKey } from '@/constants/localStorage'; -import { useDydxClient, useLocalStorage } from '@/hooks'; -import { store } from '@/state/_store'; +import type { TvWidget } from '@/constants/tvchart'; +import { useDydxClient, useLocalStorage, useStringGetter } from '@/hooks'; + +import { store } from '@/state/_store'; import { getSelectedNetwork } from '@/state/appSelectors'; import { getAppTheme, getAppColorMode } from '@/state/configsSelectors'; import { getSelectedLocale } from '@/state/localizationSelectors'; @@ -23,14 +27,19 @@ import { getSavedResolution, getWidgetOptions, getWidgetOverrides } from '@/lib/ */ export const useTradingView = ({ tvWidgetRef, + displayButtonRef, setIsChartReady, }: { - tvWidgetRef: React.MutableRefObject; + tvWidgetRef: React.MutableRefObject; + displayButtonRef: React.MutableRefObject; setIsChartReady: React.Dispatch>; }) => { - const marketId = useSelector(getCurrentMarketId); + const stringGetter = useStringGetter(); + const appTheme = useSelector(getAppTheme); const appColorMode = useSelector(getAppColorMode); + + const marketId = useSelector(getCurrentMarketId); const marketIds = useSelector(getMarketIds, shallowEqual); const selectedLocale = useSelector(getSelectedLocale); const selectedNetwork = useSelector(getSelectedNetwork); @@ -49,7 +58,6 @@ export const useTradingView = ({ const widgetOptions = getWidgetOptions(); const widgetOverrides = getWidgetOverrides({ appTheme, appColorMode }); const options = { - // debug: true, ...widgetOptions, ...widgetOverrides, datafeed: getDydxDatafeed(store, getCandlesForDatafeed), @@ -63,6 +71,19 @@ export const useTradingView = ({ tvWidgetRef.current = tvChartWidget; tvWidgetRef.current.onChartReady(() => { + tvWidgetRef.current?.headerReady().then(() => { + if (displayButtonRef && tvWidgetRef.current) { + displayButtonRef.current = tvWidgetRef.current.createButton(); + displayButtonRef.current.innerHTML = `${stringGetter({ + key: STRING_KEYS.ORDER_LINES, + })}
`; + displayButtonRef.current.setAttribute( + 'title', + stringGetter({ key: STRING_KEYS.ORDER_LINES_TOOLTIP }) + ); + } + }); + tvWidgetRef?.current?.subscribe('onAutoSaveNeeded', () => tvWidgetRef?.current?.save((chartConfig: object) => setTvChartConfig(chartConfig)) ); @@ -72,6 +93,8 @@ export const useTradingView = ({ } return () => { + displayButtonRef.current?.remove(); + displayButtonRef.current = null; tvWidgetRef.current?.remove(); tvWidgetRef.current = null; setIsChartReady(false); diff --git a/src/hooks/tradingView/useTradingViewTheme.ts b/src/hooks/tradingView/useTradingViewTheme.ts index b0ed677..8930cbf 100644 --- a/src/hooks/tradingView/useTradingViewTheme.ts +++ b/src/hooks/tradingView/useTradingViewTheme.ts @@ -1,12 +1,14 @@ import { useEffect } from 'react'; + import { useSelector } from 'react-redux'; -import type { IChartingLibraryWidget, ThemeName } from 'public/tradingview/charting_library'; +import { THEME_NAMES } from '@/constants/styles/colors'; +import type { ChartLine, TvWidget } from '@/constants/tvchart'; import { AppColorMode, AppTheme } from '@/state/configs'; import { getAppTheme, getAppColorMode } from '@/state/configsSelectors'; -import { getWidgetOverrides } from '@/lib/tradingView/utils'; +import { getWidgetOverrides, getChartLineColors } from '@/lib/tradingView/utils'; /** * @description Method to define a type guard and check that an element is an IFRAME @@ -22,10 +24,12 @@ const isIFrame = (element: HTMLElement | null): element is HTMLIFrameElement => * In order to support our Classic along with Dark/Light, we are directly accessing the within the iFrame. */ export const useTradingViewTheme = ({ + chartLines, tvWidget, isWidgetReady, }: { - tvWidget: (IChartingLibraryWidget & { _id?: string; _ready?: boolean }) | null; + chartLines: Record; + tvWidget: TvWidget | null; isWidgetReady?: boolean; }) => { const appTheme: AppTheme = useSelector(getAppTheme); @@ -33,47 +37,64 @@ export const useTradingViewTheme = ({ useEffect(() => { if (tvWidget && isWidgetReady) { - tvWidget - .changeTheme?.( - { - [AppTheme.Classic]: '', - [AppTheme.Dark]: 'Dark', - [AppTheme.Light]: 'Light', - }[appTheme] as ThemeName - ) - .then(() => { - const tvChartId = tvWidget?._id; + tvWidget.changeTheme?.(THEME_NAMES[appTheme]).then(() => { + const tvChartId = tvWidget?._id; - if (tvChartId) { - const frame = document?.getElementById(tvChartId); + if (tvChartId) { + const frame = document?.getElementById(tvChartId); - if (isIFrame(frame) && frame.contentWindow) { - const innerHtml = frame.contentWindow.document.documentElement; - - if (appTheme === AppTheme.Classic) { + if (isIFrame(frame) && frame.contentWindow) { + const innerHtml = frame.contentWindow.document.documentElement; + switch (appTheme) { + case AppTheme.Classic: innerHtml?.classList.remove('theme-dark', 'theme-light'); - } + break; + case AppTheme.Dark: + innerHtml?.classList.remove('theme-light'); + innerHtml?.classList.add('theme-dark'); + break; + case AppTheme.Light: + innerHtml?.classList.remove('theme-dark'); + innerHtml?.classList.add('theme-light'); } } + } - const { overrides, studies_overrides } = getWidgetOverrides({ appTheme, appColorMode }); - tvWidget?.applyOverrides(overrides); - tvWidget?.applyStudiesOverrides(studies_overrides); + const { overrides, studies_overrides } = getWidgetOverrides({ appTheme, appColorMode }); + tvWidget?.applyOverrides(overrides); + tvWidget?.applyStudiesOverrides(studies_overrides); - // Necessary to update existing indicators - const volumeStudyId = tvWidget - ?.activeChart() - ?.getAllStudies() - ?.find((x) => x.name === 'Volume')?.id; + // Necessary to update existing indicators + const volumeStudyId = tvWidget + ?.activeChart() + ?.getAllStudies() + ?.find((x) => x.name === 'Volume')?.id; - if (volumeStudyId) { - const volume = tvWidget?.activeChart()?.getStudyById(volumeStudyId); - volume.applyOverrides({ - 'volume.color.0': studies_overrides['volume.volume.color.0'], - 'volume.color.1': studies_overrides['volume.volume.color.1'], - }); + if (volumeStudyId) { + const volume = tvWidget?.activeChart()?.getStudyById(volumeStudyId); + volume.applyOverrides({ + 'volume.color.0': studies_overrides['volume.volume.color.0'], + 'volume.color.1': studies_overrides['volume.volume.color.1'], + }); + } + + // Necessary to update existing chart lines + Object.values(chartLines).forEach(({ chartLineType, line }) => { + const { maybeQuantityColor, borderColor, backgroundColor, textColor, textButtonColor } = + getChartLineColors({ chartLineType: chartLineType, appTheme, appColorMode }); + + if (maybeQuantityColor) { + line.setLineColor(maybeQuantityColor).setQuantityBackgroundColor(maybeQuantityColor); } + + line + .setQuantityBorderColor(borderColor) + .setBodyBackgroundColor(backgroundColor) + .setBodyBorderColor(borderColor) + .setBodyTextColor(textColor) + .setQuantityTextColor(textButtonColor); }); + }); } - }, [appTheme, appColorMode]); + }, [appTheme, appColorMode, isWidgetReady]); }; diff --git a/src/hooks/useDydxClient.tsx b/src/hooks/useDydxClient.tsx index b9371ee..979dc84 100644 --- a/src/hooks/useDydxClient.tsx +++ b/src/hooks/useDydxClient.tsx @@ -18,14 +18,13 @@ import type { ResolutionString } from 'public/tradingview/charting_library'; import type { ConnectNetworkEvent, NetworkConfig } from '@/constants/abacus'; import { DEFAULT_TRANSACTION_MEMO } from '@/constants/analytics'; import { type Candle, RESOLUTION_MAP } from '@/constants/candles'; -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; -import { DydxChainAsset } from '@/constants/wallets'; import { getSelectedNetwork } from '@/state/appSelectors'; import { log } from '@/lib/telemetry'; import { useRestrictions } from './useRestrictions'; +import { useTokenConfigs } from './useTokenConfigs'; type DydxContextType = ReturnType; const DydxContext = createContext({} as DydxContextType); @@ -41,7 +40,8 @@ const useDydxClientContext = () => { // ------ Network ------ // const selectedNetwork = useSelector(getSelectedNetwork); - const tokensConfigs = ENVIRONMENT_CONFIG_MAP[selectedNetwork].tokens; + const { usdcDenom, usdcDecimals, usdcGasDenom, chainTokenDenom, chainTokenDecimals } = + useTokenConfigs(); const [networkConfig, setNetworkConfig] = useState(); @@ -75,11 +75,11 @@ const useDydxClientContext = () => { networkConfig.validatorUrl, networkConfig.chainId, { - USDC_DENOM: tokensConfigs[DydxChainAsset.USDC].denom, - USDC_DECIMALS: tokensConfigs[DydxChainAsset.USDC].decimals, - USDC_GAS_DENOM: tokensConfigs[DydxChainAsset.USDC].gasDenom, - CHAINTOKEN_DENOM: tokensConfigs[DydxChainAsset.CHAINTOKEN].denom, - CHAINTOKEN_DECIMALS: tokensConfigs[DydxChainAsset.CHAINTOKEN].decimals, + USDC_DENOM: usdcDenom, + USDC_DECIMALS: usdcDecimals, + USDC_GAS_DENOM: usdcGasDenom, + CHAINTOKEN_DENOM: chainTokenDenom, + CHAINTOKEN_DECIMALS: chainTokenDecimals, }, { broadcastPollIntervalMs: 3_000, diff --git a/src/hooks/useGovernanceVariables.ts b/src/hooks/useGovernanceVariables.ts index 0234ea0..4fc5bed 100644 --- a/src/hooks/useGovernanceVariables.ts +++ b/src/hooks/useGovernanceVariables.ts @@ -1,5 +1,8 @@ -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; -import { useSelectedNetwork } from '@/hooks'; +import { useSelector } from 'react-redux'; + +import { GOVERNANCE_CONFIG_MAP } from '@/constants/networks'; + +import { getSelectedDydxChainId } from '@/state/appSelectors'; export interface GovernanceVariables { newMarketProposal: { @@ -10,7 +13,7 @@ export interface GovernanceVariables { } export const useGovernanceVariables = (): GovernanceVariables => { - const { selectedNetwork } = useSelectedNetwork(); - const governanceVars = ENVIRONMENT_CONFIG_MAP[selectedNetwork].governance as GovernanceVariables; + const selectedDydxChainId = useSelector(getSelectedDydxChainId); + const governanceVars = GOVERNANCE_CONFIG_MAP[selectedDydxChainId] as GovernanceVariables; return governanceVars; }; diff --git a/src/hooks/useLocalNotifications.tsx b/src/hooks/useLocalNotifications.tsx index 5b2742a..450e6d5 100644 --- a/src/hooks/useLocalNotifications.tsx +++ b/src/hooks/useLocalNotifications.tsx @@ -82,24 +82,30 @@ const useLocalNotificationsContext = () => { isCctp, errorCount, status: currentStatus, + isExchange, } = transferNotification; - // @ts-ignore status.errors is not in the type definition but can be returned - // also error can some time come back as an empty object so we need to ignore for that - const hasErrors = !!currentStatus?.errors || - (currentStatus?.error && Object.keys(currentStatus.error).length !== 0); + const hasErrors = + // @ts-ignore status.errors is not in the type definition but can be returned + // also error can some time come back as an empty object so we need to ignore for that + !!currentStatus?.errors || + (currentStatus?.error && Object.keys(currentStatus.error).length !== 0); if ( + !isExchange && !hasErrors && (!currentStatus?.squidTransactionStatus || currentStatus?.squidTransactionStatus === 'ongoing') ) { try { - const status = await fetchSquidStatus({ - transactionId: txHash, - toChainId, - fromChainId, - }, isCctp); + const status = await fetchSquidStatus( + { + transactionId: txHash, + toChainId, + fromChainId, + }, + isCctp + ); if (status) { transferNotification.status = status; diff --git a/src/hooks/useNotificationTypes.tsx b/src/hooks/useNotificationTypes.tsx index b7be4f3..3063a84 100644 --- a/src/hooks/useNotificationTypes.tsx +++ b/src/hooks/useNotificationTypes.tsx @@ -5,7 +5,6 @@ import { isEqual, groupBy } from 'lodash'; import { useNavigate } from 'react-router-dom'; import { DialogTypes } from '@/constants/dialogs'; -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; import { AppRoute } from '@/constants/routes'; import { DydxChainAsset } from '@/constants/wallets'; @@ -23,7 +22,7 @@ import { TransferNotificationTypes, } from '@/constants/notifications'; -import { useSelectedNetwork, useStringGetter } from '@/hooks'; +import { useStringGetter } from '@/hooks'; import { useLocalNotifications } from '@/hooks/useLocalNotifications'; import { AssetIcon } from '@/components/AssetIcon'; @@ -36,6 +35,7 @@ import { getSubaccountFills, getSubaccountOrders } from '@/state/accountSelector import { openDialog } from '@/state/dialogs'; import { getAbacusNotifications } from '@/state/notificationsSelectors'; import { getMarketIds } from '@/state/perpetualsSelectors'; +import { getSelectedDydxChainId } from '@/state/appSelectors'; import { formatSeconds } from '@/lib/timeUtils'; @@ -175,16 +175,17 @@ export const notificationTypes: NotificationTypeConfig[] = [ useTrigger: ({ trigger }) => { const stringGetter = useStringGetter(); const { transferNotifications } = useLocalNotifications(); - const { selectedNetwork } = useSelectedNetwork(); + const selectedDydxChainId = useSelector(getSelectedDydxChainId); useEffect(() => { for (const transfer of transferNotifications) { - const { fromChainId, status, txHash, toAmount, type } = transfer; - const isFinished = Boolean(status) && status?.squidTransactionStatus !== 'ongoing'; + const { fromChainId, status, txHash, toAmount, type, isExchange } = transfer; + const isFinished = + (Boolean(status) && status?.squidTransactionStatus !== 'ongoing') || isExchange; const icon = ; const transferType = - type ?? fromChainId === ENVIRONMENT_CONFIG_MAP[selectedNetwork].dydxChainId + type ?? fromChainId === selectedDydxChainId ? TransferNotificationTypes.Withdrawal : TransferNotificationTypes.Deposit; diff --git a/src/hooks/usePageTitlePriceUpdates.ts b/src/hooks/usePageTitlePriceUpdates.ts index 3093974..98013d8 100644 --- a/src/hooks/usePageTitlePriceUpdates.ts +++ b/src/hooks/usePageTitlePriceUpdates.ts @@ -4,8 +4,11 @@ import { useSelector } from 'react-redux'; import { DEFAULT_DOCUMENT_TITLE } from '@/constants/routes'; import { getSelectedLocale } from '@/state/localizationSelectors'; -import { getCurrentMarketData, getCurrentMarketId } from '@/state/perpetualsSelectors'; -import type { RootState } from '@/state/_store'; +import { + getCurrentMarketId, + getCurrentMarketMidMarketPrice, + getCurrentMarketOraclePrice, +} from '@/state/perpetualsSelectors'; import { useBreakpoints } from './useBreakpoints'; @@ -13,11 +16,14 @@ export const usePageTitlePriceUpdates = () => { const selectedLocale = useSelector(getSelectedLocale); const { isNotTablet } = useBreakpoints(); const id = useSelector(getCurrentMarketId); - const oraclePrice = useSelector((state: RootState) => getCurrentMarketData(state)?.oraclePrice); + const oraclePrice = useSelector(getCurrentMarketOraclePrice); + const orderbookMidMarketPrice = useSelector(getCurrentMarketMidMarketPrice); + + const price = orderbookMidMarketPrice ?? oraclePrice; useEffect(() => { - if (id && oraclePrice && isNotTablet) { - const priceString = oraclePrice.toLocaleString(selectedLocale); + if (id && price && isNotTablet) { + const priceString = price.toLocaleString(selectedLocale); document.title = `$${priceString} ${id} · ${DEFAULT_DOCUMENT_TITLE}`; } else { document.title = DEFAULT_DOCUMENT_TITLE; @@ -26,5 +32,5 @@ export const usePageTitlePriceUpdates = () => { return () => { document.title = DEFAULT_DOCUMENT_TITLE; }; - }, [oraclePrice]); + }, [price]); }; diff --git a/src/hooks/usePotentialMarkets.tsx b/src/hooks/usePotentialMarkets.tsx index 443900b..2cad7ef 100644 --- a/src/hooks/usePotentialMarkets.tsx +++ b/src/hooks/usePotentialMarkets.tsx @@ -47,8 +47,9 @@ export const PotentialMarketsProvider = ({ ...props }) => ( export const usePotentialMarkets = () => useContext(PotentialMarketsContext); -const EXCHANGE_CONFIG_FILE_PATH = '/configs/potentialMarketExchangeConfig.json'; -const POTENTIAL_MARKETS_FILE_PATH = '/configs/potentialMarketParameters.json'; + +const EXCHANGE_CONFIG_FILE_PATH = '/configs/otherMarketExchangeConfig.json'; +const POTENTIAL_MARKETS_FILE_PATH = '/configs/otherMarketParameters.json'; export const usePotentialMarketsContext = () => { const stringGetter = useStringGetter(); diff --git a/src/hooks/useSelectedNetwork.ts b/src/hooks/useSelectedNetwork.ts index 9b7a898..b7086b7 100644 --- a/src/hooks/useSelectedNetwork.ts +++ b/src/hooks/useSelectedNetwork.ts @@ -2,7 +2,7 @@ import { useCallback } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { LocalStorageKey } from '@/constants/localStorage'; -import { DEFAULT_APP_ENVIRONMENT, DydxNetwork, ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; +import { DEFAULT_APP_ENVIRONMENT, DydxNetwork } from '@/constants/networks'; import { useAccounts, useLocalStorage } from '@/hooks'; diff --git a/src/hooks/useSubaccount.tsx b/src/hooks/useSubaccount.tsx index e5900bc..c975f76 100644 --- a/src/hooks/useSubaccount.tsx +++ b/src/hooks/useSubaccount.tsx @@ -28,7 +28,7 @@ import { setSubaccount, setHistoricalPnl, removeUncommittedOrderClientId } from import { getBalances } from '@/state/accountSelectors'; import abacusStateManager from '@/lib/abacus'; -import { hashFromTx } from '@/lib/hashfromTx'; +import { hashFromTx } from '@/lib/txUtils'; import { log } from '@/lib/telemetry'; import { useAccounts } from './useAccounts'; diff --git a/src/hooks/useTokenConfigs.ts b/src/hooks/useTokenConfigs.ts index 2bbe155..73cc08f 100644 --- a/src/hooks/useTokenConfigs.ts +++ b/src/hooks/useTokenConfigs.ts @@ -1,7 +1,9 @@ -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; +import { useSelector } from 'react-redux'; + +import { TOKEN_CONFIG_MAP } from '@/constants/networks'; import { DydxChainAsset } from '@/constants/wallets'; -import { useSelectedNetwork } from '@/hooks'; +import { getSelectedDydxChainId } from '@/state/appSelectors'; export const useTokenConfigs = (): { tokensConfigs: { @@ -10,31 +12,33 @@ export const useTokenConfigs = (): { name: string; decimals: number; gasDenom?: string; - }, + }; [DydxChainAsset.CHAINTOKEN]: { denom: string; name: string; decimals: number; gasDenom?: string; - }, + }; }; usdcDenom: string; usdcDecimals: number; + usdcGasDenom: string; usdcLabel: string; chainTokenDenom: string; chainTokenDecimals: number; chainTokenLabel: string; } => { - const { selectedNetwork } = useSelectedNetwork(); - const tokensConfigs = ENVIRONMENT_CONFIG_MAP[selectedNetwork].tokens; + const selectedDydxChainId = useSelector(getSelectedDydxChainId); + const tokensConfigs = TOKEN_CONFIG_MAP[selectedDydxChainId]; - return { + return { tokensConfigs, - usdcDenom: tokensConfigs[DydxChainAsset.USDC].denom, - usdcDecimals: tokensConfigs[DydxChainAsset.USDC].decimals, + usdcDenom: tokensConfigs[DydxChainAsset.USDC].denom, + usdcDecimals: tokensConfigs[DydxChainAsset.USDC].decimals, + usdcGasDenom: tokensConfigs[DydxChainAsset.USDC].gasDenom, usdcLabel: tokensConfigs[DydxChainAsset.USDC].name, chainTokenDenom: tokensConfigs[DydxChainAsset.CHAINTOKEN].denom, - chainTokenDecimals: tokensConfigs[DydxChainAsset.CHAINTOKEN].decimals, + chainTokenDecimals: tokensConfigs[DydxChainAsset.CHAINTOKEN].decimals, chainTokenLabel: tokensConfigs[DydxChainAsset.CHAINTOKEN].name, }; }; diff --git a/src/hooks/useURLConfigs.ts b/src/hooks/useURLConfigs.ts index 121e168..8bc509a 100644 --- a/src/hooks/useURLConfigs.ts +++ b/src/hooks/useURLConfigs.ts @@ -1,12 +1,15 @@ -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; +import { useSelector } from 'react-redux'; -import { useSelectedNetwork } from '@/hooks'; +import { LINKS_CONFIG_MAP } from '@/constants/networks'; + +import { getSelectedDydxChainId } from '@/state/appSelectors'; const FALLBACK_URL = 'https://help.dydx.exchange/'; export interface LinksConfigs { tos: string; privacy: string; + statusPage: string; mintscan: string; mintscanBase: string; feedback?: string; @@ -28,12 +31,13 @@ export interface LinksConfigs { } export const useURLConfigs = (): LinksConfigs => { - const { selectedNetwork } = useSelectedNetwork(); - const linksConfigs = ENVIRONMENT_CONFIG_MAP[selectedNetwork].links as LinksConfigs; + const selectedDydxChainId = useSelector(getSelectedDydxChainId); + const linksConfigs = LINKS_CONFIG_MAP[selectedDydxChainId] as LinksConfigs; return { tos: linksConfigs.tos, privacy: linksConfigs.privacy, + statusPage: linksConfigs.statusPage, mintscan: linksConfigs.mintscan, mintscanBase: linksConfigs.mintscanBase, feedback: linksConfigs.feedback || FALLBACK_URL, diff --git a/src/hooks/useWalletConnection.ts b/src/hooks/useWalletConnection.ts index ef36fc1..39b8887 100644 --- a/src/hooks/useWalletConnection.ts +++ b/src/hooks/useWalletConnection.ts @@ -4,7 +4,7 @@ import { useSelector } from 'react-redux'; import { EvmDerivedAddresses } from '@/constants/account'; import { STRING_KEYS } from '@/constants/localization'; import { LocalStorageKey } from '@/constants/localStorage'; -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; +import { ENVIRONMENT_CONFIG_MAP, WALLETS_CONFIG_MAP } from '@/constants/networks'; import { type DydxAddress, @@ -32,7 +32,7 @@ import { WalletType as CosmosWalletType, } from 'graz'; -import { getSelectedNetwork } from '@/state/appSelectors'; +import { getSelectedDydxChainId } from '@/state/appSelectors'; import { resolveWagmiConnector } from '@/lib/wagmi'; import { getWalletConnection, parseWalletError } from '@/lib/wallet'; @@ -91,8 +91,8 @@ export const useWalletConnection = () => { // Wallet connection - const selectedNetwork = useSelector(getSelectedNetwork); - const walletConnectConfig = ENVIRONMENT_CONFIG_MAP[selectedNetwork].wallets.walletconnect; + const selectedDydxChainId = useSelector(getSelectedDydxChainId); + const walletConnectConfig = WALLETS_CONFIG_MAP[selectedDydxChainId].walletconnect; const wagmiConnector = useMemo( () => walletType && walletConnectionType @@ -163,17 +163,20 @@ export const useWalletConnection = () => { } } } catch (error) { - throw Object.assign( - new Error([error.message, error.cause?.message].filter(Boolean).join('\n')), - { - walletConnectionType: walletConnection?.type, - } - ); + const { isErrorExpected } = parseWalletError({ error, stringGetter }); + if (!isErrorExpected) { + throw Object.assign( + new Error([error.message, error.cause?.message].filter(Boolean).join('\n')), + { + walletConnectionType: walletConnection?.type, + } + ); + } } return { walletType, - walletConnectionType: walletConnection.type, + walletConnectionType: walletConnection?.type, }; }, [isConnectedGraz, signerGraz, isConnectedWagmi, signerWagmi] diff --git a/src/layout/Footer/FooterDesktop.tsx b/src/layout/Footer/FooterDesktop.tsx index 7426cd2..9a6c524 100644 --- a/src/layout/Footer/FooterDesktop.tsx +++ b/src/layout/Footer/FooterDesktop.tsx @@ -3,9 +3,9 @@ import styled, { type AnyStyledComponent, css } from 'styled-components'; import { AbacusApiStatus } from '@/constants/abacus'; import { ButtonSize, ButtonType } from '@/constants/buttons'; import { STRING_KEYS } from '@/constants/localization'; -import { ENVIRONMENT_CONFIG_MAP, isDev } from '@/constants/networks'; +import { isDev } from '@/constants/networks'; -import { useApiState, useSelectedNetwork, useStringGetter } from '@/hooks'; +import { useApiState, useStringGetter, useURLConfigs } from '@/hooks'; import { ChatIcon, LinkOutIcon } from '@/icons'; import { layoutMixins } from '@/styles/layoutMixins'; @@ -28,8 +28,7 @@ enum ExchangeStatus { export const FooterDesktop = () => { const stringGetter = useStringGetter(); const { height, indexerHeight, status, statusErrorMessage } = useApiState(); - const { selectedNetwork } = useSelectedNetwork(); - const { statusPage } = ENVIRONMENT_CONFIG_MAP[selectedNetwork].links; + const { statusPage } = useURLConfigs(); const { exchangeStatus, label } = !status || status === AbacusApiStatus.NORMAL diff --git a/src/lib/abacus/dydxChainTransactions.ts b/src/lib/abacus/dydxChainTransactions.ts index 3185c3b..79bc0d0 100644 --- a/src/lib/abacus/dydxChainTransactions.ts +++ b/src/lib/abacus/dydxChainTransactions.ts @@ -34,7 +34,7 @@ import { import { DEFAULT_TRANSACTION_MEMO } from '@/constants/analytics'; import { DialogTypes } from '@/constants/dialogs'; import { UNCOMMITTED_ORDER_TIMEOUT_MS } from '@/constants/trade'; -import { ENVIRONMENT_CONFIG_MAP, DydxNetwork, isTestnet } from '@/constants/networks'; +import { DydxChainId, isTestnet } from '@/constants/networks'; import { RootStore } from '@/state/_store'; import { addUncommittedOrderClientId, removeUncommittedOrderClientId } from '@/state/account'; @@ -43,7 +43,11 @@ import { openDialog } from '@/state/dialogs'; import { StatefulOrderError } from '../errors'; import { bytesToBigInt } from '../numbers'; import { log } from '../telemetry'; -import { hashFromTx } from '../hashfromTx'; +import { hashFromTx, getMintscanTxLink } from '../txUtils'; + +(BigInt.prototype as any).toJSON = function () { + return this.toString(); +}; class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol { private compositeClient: CompositeClient | undefined; @@ -238,9 +242,7 @@ class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol { if (isTestnet) { console.log( - `${ENVIRONMENT_CONFIG_MAP[ - this.compositeClient.network.getString() as DydxNetwork - ]?.links?.mintscan?.replace('{tx_hash}', hash.toString())}` + getMintscanTxLink(this.compositeClient.network.getString() as DydxChainId, hash) ); } else console.log(`txHash: ${hash}`); @@ -536,7 +538,6 @@ class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol { const result = await this.cctpWithdraw(params); callback(result); break; - break; } default: { break; diff --git a/src/lib/addressUtils.ts b/src/lib/addressUtils.ts index 9763e4d..1e2f954 100644 --- a/src/lib/addressUtils.ts +++ b/src/lib/addressUtils.ts @@ -25,3 +25,22 @@ export function convertBech32Address({ }): string { return toBech32(bech32Prefix, fromHex(toHex(fromBech32(address).data))); } + +/** + * Validates a Cosmos address with a specific prefix. + * @param {string} address The Cosmos address to validate. + * @param {string} prefix The expected prefix for the address. + * @returns {boolean} True if the address is valid and matches the prefix, false otherwise. + */ +export function validateCosmosAddress(address: string, prefix: string) { + try { + // Decode the address to verify its structure and prefix + const { prefix: decodedPrefix } = fromBech32(address); + + // Check if the decoded address has the expected prefix + return decodedPrefix === prefix; + } catch (error) { + // If decoding fails, the address is not valid + return false; + } +} diff --git a/src/lib/hashfromTx.ts b/src/lib/hashfromTx.ts deleted file mode 100644 index 98696e6..0000000 --- a/src/lib/hashfromTx.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const hashFromTx = ( - txHash: string | Uint8Array -): string => `0x${Buffer.from(txHash).toString('hex')}`; diff --git a/src/lib/network.ts b/src/lib/network.ts index 56131de..75585ea 100644 --- a/src/lib/network.ts +++ b/src/lib/network.ts @@ -1,4 +1,4 @@ -import { type DydxNetwork, ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; +import { type DydxNetwork, ENVIRONMENT_CONFIG_MAP, type DydxChainId } from '@/constants/networks'; export const validateAgainstAvailableEnvironments = (value: DydxNetwork) => - Object.keys(ENVIRONMENT_CONFIG_MAP).includes(value); + Object.keys(ENVIRONMENT_CONFIG_MAP).includes(value); \ No newline at end of file diff --git a/src/lib/squid.ts b/src/lib/squid.ts index ec2c413..362d922 100644 --- a/src/lib/squid.ts +++ b/src/lib/squid.ts @@ -31,13 +31,13 @@ export const fetchSquidStatus = async ( const response = await fetch(url, { headers: { - "x-integrator-id": integratorId || 'dYdX-api' + 'x-integrator-id': integratorId || 'dYdX-api', }, }); if (!response.ok) { const error = await response.json(); - throw new Error(error); + throw error; } return response.json(); @@ -45,4 +45,4 @@ export const fetchSquidStatus = async ( export const getNobleChainId = () => { return isMainnet ? 'noble-1' : 'grand-1'; -} +}; diff --git a/src/lib/testFlags.ts b/src/lib/testFlags.ts index a3e1a62..74a8cd9 100644 --- a/src/lib/testFlags.ts +++ b/src/lib/testFlags.ts @@ -19,13 +19,17 @@ class TestFlags { return !!this.queryParams.displayinitializingmarkets; } - get addressOverride():string { + get addressOverride(): string { return this.queryParams.address; } - + get showTradingRewards() { return !!this.queryParams.tradingrewards; } + + get showCexWithdrawal() { + return !!this.queryParams.cexwithdrawal; + } } export const testFlags = new TestFlags(); diff --git a/src/lib/tradingView/utils.ts b/src/lib/tradingView/utils.ts index 471a468..4359731 100644 --- a/src/lib/tradingView/utils.ts +++ b/src/lib/tradingView/utils.ts @@ -1,6 +1,10 @@ -import { Candle, TradingViewBar, TradingViewSymbol } from '@/constants/candles'; +import { OrderSide } from '@dydxprotocol/v4-client-js'; -import type { AppTheme, AppColorMode } from '@/state/configs'; +import { Candle, TradingViewBar, TradingViewSymbol } from '@/constants/candles'; +import { THEME_NAMES } from '@/constants/styles/colors'; +import type { ChartLineType } from '@/constants/tvchart'; + +import { type AppColorMode, AppTheme } from '@/state/configs'; import { Themes } from '@/styles/themes'; @@ -47,6 +51,31 @@ export const getHistorySlice = ({ return bars.filter(({ time }) => time >= fromMs); }; +export const getChartLineColors = ({ + appTheme, + appColorMode, + chartLineType, +}: { + appTheme: AppTheme; + appColorMode: AppColorMode; + chartLineType: ChartLineType; +}) => { + const theme = Themes[appTheme][appColorMode]; + const orderColors = { + [OrderSide.BUY]: theme.positive, + [OrderSide.SELL]: theme.negative, + ['position']: null, + }; + + return { + maybeQuantityColor: orderColors[chartLineType], + borderColor: theme.borderDefault, + backgroundColor: theme.layer1, + textColor: theme.textTertiary, + textButtonColor: theme.textButton, + }; +}; + export const getWidgetOverrides = ({ appTheme, appColorMode, @@ -57,6 +86,7 @@ export const getWidgetOverrides = ({ const theme = Themes[appTheme][appColorMode]; return { + theme: THEME_NAMES[appTheme], overrides: { 'paneProperties.background': theme.layer2, 'paneProperties.horzGridProperties.color': theme.layer3, diff --git a/src/lib/txUtils.ts b/src/lib/txUtils.ts new file mode 100644 index 0000000..81413fb --- /dev/null +++ b/src/lib/txUtils.ts @@ -0,0 +1,7 @@ +import { DydxChainId, LINKS_CONFIG_MAP } from '@/constants/networks'; + +export const hashFromTx = (txHash: string | Uint8Array): string => + `0x${Buffer.from(txHash).toString('hex')}`; + +export const getMintscanTxLink = (dydxChainId: DydxChainId, txHash: string): string => + `${LINKS_CONFIG_MAP[dydxChainId]?.mintscan?.replace('{tx_hash}', txHash.toString())}`; diff --git a/src/lib/wallet/index.ts b/src/lib/wallet/index.ts index ba11110..7ce29c9 100644 --- a/src/lib/wallet/index.ts +++ b/src/lib/wallet/index.ts @@ -92,6 +92,10 @@ export const getWalletErrorType = ({ error }: { error: Error }) => { return WalletErrorType.ChainMismatch; } + if (messageLower.includes('Missing or invalid. request() method: wallet_switchEthereumChain')) { + return WalletErrorType.SwitchChainMethodMissing; + } + // ImToken - User canceled if (messageLower.includes('用户取消了操作')) { return WalletErrorType.UserCanceled; @@ -113,13 +117,18 @@ export const parseWalletError = ({ }) => { const walletErrorType = getWalletErrorType({ error }); let message; + let isErrorExpected; switch (walletErrorType) { case WalletErrorType.ChainMismatch: - case WalletErrorType.UserCanceled: { + case WalletErrorType.UserCanceled: + case WalletErrorType.SwitchChainMethodMissing: { + isErrorExpected = true; + message = error.message; break; } default: { + isErrorExpected = false; message = stringGetter({ key: STRING_KEYS.SOMETHING_WENT_WRONG_WITH_MESSAGE, params: { @@ -132,5 +141,6 @@ export const parseWalletError = ({ return { walletErrorType, message, + isErrorExpected, }; }; diff --git a/src/pages/token/rewards/LaunchIncentivesPanel.tsx b/src/pages/token/rewards/LaunchIncentivesPanel.tsx index 3cb7334..d679a36 100644 --- a/src/pages/token/rewards/LaunchIncentivesPanel.tsx +++ b/src/pages/token/rewards/LaunchIncentivesPanel.tsx @@ -26,8 +26,6 @@ import { openDialog } from '@/state/dialogs'; import { log } from '@/lib/telemetry'; -const SEASON_NUMBER = 2; - export const LaunchIncentivesPanel = ({ className }: { className?: string }) => { const { isNotTablet } = useBreakpoints(); const dispatch = useDispatch(); @@ -74,14 +72,38 @@ const EstimatedRewards = () => { const stringGetter = useStringGetter(); const { dydxAddress } = useAccounts(); + const { data: seasonNumber } = useQuery({ + queryKey: 'chaos_labs_season_number', + queryFn: async () => { + const resp = await fetch('https://cloud.chaoslabs.co/query/ccar-perpetuals', { + method: 'POST', + headers: { + 'apollographql-client-name': 'dydx-v4', + 'content-type': 'application/json', + protocol: 'dydx-v4', + }, + body: JSON.stringify({ + operationName: 'TradingSeasons', + variables: {}, + query: `query TradingSeasons { + tradingSeasons { + label + } + }`, + }), + }); + const seasons = (await resp.json())?.data?.tradingSeasons; + return seasons && seasons.length > 0 ? seasons[seasons.length - 1].label : undefined; + }, + onError: (error: Error) => log('LaunchIncentives/fetchSeasonNumber', error), + }); + const { data, isLoading } = useQuery({ enabled: !!dydxAddress, - queryKey: `launch_incentives_rewards_${dydxAddress ?? ''}_${SEASON_NUMBER}`, + queryKey: `launch_incentives_rewards_${dydxAddress ?? ''}`, queryFn: async () => { if (!dydxAddress) return undefined; - const resp = await fetch( - `https://cloud.chaoslabs.co/query/api/dydx/points/${dydxAddress}?n=${SEASON_NUMBER}` - ); + const resp = await fetch(`https://cloud.chaoslabs.co/query/api/dydx/points/${dydxAddress}`); return (await resp.json())?.incentivePoints; }, onError: (error: Error) => log('LaunchIncentives/fetchPoints', error), @@ -92,12 +114,14 @@ const EstimatedRewards = () => {
{stringGetter({ key: STRING_KEYS.ESTIMATED_REWARDS })} - - {stringGetter({ - key: STRING_KEYS.LAUNCH_INCENTIVES_SEASON_NUM, - params: { SEASON_NUMBER }, - })} - + {seasonNumber !== undefined && ( + + {stringGetter({ + key: STRING_KEYS.LAUNCH_INCENTIVES_SEASON_NUM, + params: { SEASON_NUMBER: seasonNumber }, + })} + + )}
diff --git a/src/pages/token/rewards/RewardHistoryPanel.tsx b/src/pages/token/rewards/RewardHistoryPanel.tsx index c79da79..d98f515 100644 --- a/src/pages/token/rewards/RewardHistoryPanel.tsx +++ b/src/pages/token/rewards/RewardHistoryPanel.tsx @@ -9,10 +9,13 @@ import { HistoricalTradingRewardsPeriods, } from '@/constants/abacus'; +import { isMainnet } from '@/constants/networks'; import { STRING_KEYS } from '@/constants/localization'; + import breakpoints from '@/styles/breakpoints'; import { layoutMixins } from '@/styles/layoutMixins'; +import { Output, OutputType } from '@/components/Output'; import { Panel } from '@/components/Panel'; import { ToggleGroup } from '@/components/ToggleGroup'; import { WithTooltip } from '@/components/WithTooltip'; @@ -20,6 +23,9 @@ import { TradingRewardHistoryTable } from '@/views/tables/TradingRewardHistoryTa import abacusStateManager from '@/lib/abacus'; +// TODO: set in env featureFlag config +const REWARDS_HISTORY_START_DATE_MS = isMainnet ? 1706486400000 : 1704844800000; + export const RewardHistoryPanel = () => { const stringGetter = useStringGetter(); @@ -47,7 +53,20 @@ export const RewardHistoryPanel = () => {

{stringGetter({ key: STRING_KEYS.REWARD_HISTORY })}

- {stringGetter({ key: STRING_KEYS.REWARD_HISTORY_DESCRIPTION })} + + {stringGetter({ + key: STRING_KEYS.REWARD_HISTORY_DESCRIPTION, + params: { + REWARDS_HISTORY_START_DATE: ( + + ), + }, + })} + { const { isTablet, isNotTablet } = useBreakpoints(); const navigate = useNavigate(); + const showTradingRewards = testFlags.showTradingRewards || !isMainnet; + return (
{isTablet && ( @@ -37,7 +40,7 @@ const RewardsPage = () => { )} {import.meta.env.VITE_V3_TOKEN_ADDRESS && isNotTablet && } @@ -51,7 +54,7 @@ const RewardsPage = () => { )} - {testFlags.showTradingRewards && ( + {showTradingRewards && ( {isTablet && } @@ -60,7 +63,7 @@ const RewardsPage = () => { )} {isNotTablet && ( - + )} diff --git a/src/pages/trade/TradeDialogTrigger.tsx b/src/pages/trade/TradeDialogTrigger.tsx index 79e4094..e746142 100644 --- a/src/pages/trade/TradeDialogTrigger.tsx +++ b/src/pages/trade/TradeDialogTrigger.tsx @@ -3,7 +3,7 @@ import { useSelector, shallowEqual } from 'react-redux'; import styled, { AnyStyledComponent } from 'styled-components'; import { STRING_KEYS } from '@/constants/localization'; -import { TRADE_TYPE_STRINGS } from '@/constants/trade'; +import { ORDER_TYPE_STRINGS } from '@/constants/trade'; import { layoutMixins } from '@/styles/layoutMixins'; @@ -43,7 +43,7 @@ export const TradeDialogTrigger = () => { - {stringGetter({ key: TRADE_TYPE_STRINGS[selectedTradeType].tradeTypeKey })} + {stringGetter({ key: ORDER_TYPE_STRINGS[selectedTradeType].orderTypeKey })} diff --git a/src/state/appSelectors.ts b/src/state/appSelectors.ts index 2917494..2351386 100644 --- a/src/state/appSelectors.ts +++ b/src/state/appSelectors.ts @@ -1,4 +1,8 @@ +import { DydxChainId, ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; import type { RootState } from './_store'; export const getApiState = (state: RootState) => state.app.apiState; export const getSelectedNetwork = (state: RootState) => state.app.selectedNetwork; + +export const getSelectedDydxChainId = (state: RootState) => + ENVIRONMENT_CONFIG_MAP[state.app.selectedNetwork].dydxChainId as DydxChainId; diff --git a/src/state/perpetualsSelectors.ts b/src/state/perpetualsSelectors.ts index 0c02a6b..f83fe78 100644 --- a/src/state/perpetualsSelectors.ts +++ b/src/state/perpetualsSelectors.ts @@ -107,6 +107,12 @@ export const getCurrentMarketHistoricalFundings = createSelector( currentMarketId ? historicalFundings?.[currentMarketId] ?? [] : [] ); +/** + * @returns oracle price of the market the user is currently viewing + */ +export const getCurrentMarketOraclePrice = (state: RootState) => + getCurrentMarketData(state)?.oraclePrice; + /** * @returns Mid market price for the market the user is currently viewing */ diff --git a/src/views/charts/TvChart.tsx b/src/views/charts/TvChart.tsx index f3586ff..45b4455 100644 --- a/src/views/charts/TvChart.tsx +++ b/src/views/charts/TvChart.tsx @@ -1,73 +1,40 @@ -import { useEffect, useRef, useState } from 'react'; +import { useRef, useState } from 'react'; + import styled, { type AnyStyledComponent, css } from 'styled-components'; -import { useDispatch, useSelector } from 'react-redux'; -import type { IChartingLibraryWidget, ResolutionString } from 'public/tradingview/charting_library'; +import type { ResolutionString } from 'public/tradingview/charting_library'; -import { DEFAULT_MARKETID } from '@/constants/markets'; -import { DEFAULT_RESOLUTION, RESOLUTION_CHART_CONFIGS } from '@/constants/candles'; -import { useTradingView, useTradingViewTheme } from '@/hooks/tradingView'; +import type { TvWidget } from '@/constants/tvchart'; + +import { + useChartLines, + useChartMarketAndResolution, + useTradingView, + useTradingViewTheme, +} from '@/hooks/tradingView'; import { LoadingSpace } from '@/components/Loading/LoadingSpinner'; -import { setTvChartResolution } from '@/state/perpetuals'; - -import { getCurrentMarketId, getSelectedResolutionForMarket } from '@/state/perpetualsSelectors'; - import { layoutMixins } from '@/styles/layoutMixins'; -type TvWidget = IChartingLibraryWidget & { _id?: string; _ready?: boolean }; - export const TvChart = () => { const [isChartReady, setIsChartReady] = useState(false); - const dispatch = useDispatch(); - const currentMarketId: string = useSelector(getCurrentMarketId) || DEFAULT_MARKETID; - - const selectedResolution: string = - useSelector(getSelectedResolutionForMarket(currentMarketId)) || DEFAULT_RESOLUTION; - const tvWidgetRef = useRef(null); const tvWidget = tvWidgetRef.current; const isWidgetReady = tvWidget?._ready; - const chart = isWidgetReady ? tvWidget?.chart() : undefined; - const chartResolution = chart?.resolution?.(); - const { savedResolution } = useTradingView({ tvWidgetRef, setIsChartReady }); - useTradingViewTheme({ tvWidget, isWidgetReady }); + const displayButtonRef = useRef(null); + const displayButton = displayButtonRef.current; - const setVisibleRangeForResolution = ({ resolution }: { resolution: ResolutionString }) => { - // Different resolutions have different timeframes to display data efficiently. - const { defaultRange } = RESOLUTION_CHART_CONFIGS[resolution]; - - // from/to values converted to epoch seconds - const newRange = { - from: (Date.now() - defaultRange) / 1000, - to: Date.now() / 1000, - }; - - tvWidget?.activeChart().setVisibleRange(newRange, { percentRightMargin: 10 }); - }; - - useEffect(() => { - if (chartResolution) { - if (chartResolution !== selectedResolution) { - dispatch(setTvChartResolution({ marketId: currentMarketId, resolution: chartResolution })); - } - - setVisibleRangeForResolution({ resolution: chartResolution }); - } - }, [chartResolution]); - - /** - * @description Hook to handle changing markets - */ - useEffect(() => { - if (currentMarketId && isWidgetReady) { - const resolution = savedResolution || selectedResolution; - tvWidget?.setSymbol(currentMarketId, resolution as ResolutionString, () => {}); - } - }, [currentMarketId, isWidgetReady]); + const { savedResolution } = useTradingView({ tvWidgetRef, displayButtonRef, setIsChartReady }); + useChartMarketAndResolution({ + tvWidget, + isWidgetReady, + savedResolution: savedResolution as ResolutionString | undefined, + }); + const { chartLines } = useChartLines({ tvWidget, displayButton, isChartReady }); + useTradingViewTheme({ tvWidget, isWidgetReady, chartLines }); return ( diff --git a/src/views/dialogs/DepositDialog.tsx b/src/views/dialogs/DepositDialog.tsx index d9dbba2..f46022d 100644 --- a/src/views/dialogs/DepositDialog.tsx +++ b/src/views/dialogs/DepositDialog.tsx @@ -13,8 +13,6 @@ export const DepositDialog = ({ setIsOpen }: ElementProps) => { const stringGetter = useStringGetter(); const { isMobile } = useBreakpoints(); - const closeDialog = () => setIsOpen?.(false); - return ( { title={stringGetter({ key: STRING_KEYS.DEPOSIT })} placement={isMobile ? DialogPlacement.FullScreen : DialogPlacement.Default} > - + ); }; diff --git a/src/views/dialogs/DepositDialog/DepositDialogContent.tsx b/src/views/dialogs/DepositDialog/DepositDialogContent.tsx index ce51e4b..bfd9046 100644 --- a/src/views/dialogs/DepositDialog/DepositDialogContent.tsx +++ b/src/views/dialogs/DepositDialog/DepositDialogContent.tsx @@ -2,6 +2,7 @@ import { useEffect, useState } from 'react'; import styled, { type AnyStyledComponent } from 'styled-components'; import { TransferInputField, TransferType } from '@/constants/abacus'; +import { AnalyticsEvent } from '@/constants/analytics'; import { isMainnet } from '@/constants/networks'; import { layoutMixins } from '@/styles/layoutMixins'; @@ -9,6 +10,7 @@ import { DepositForm } from '@/views/forms/AccountManagementForms/DepositForm'; import { TestnetDepositForm } from '@/views/forms/AccountManagementForms/TestnetDepositForm'; import abacusStateManager from '@/lib/abacus'; +import { track } from '@/lib/analytics'; type ElementProps = { onDeposit?: () => void; @@ -34,9 +36,19 @@ export const DepositDialogContent = ({ onDeposit }: ElementProps) => { return ( {isMainnet || !showFaucet ? ( - + { + track(AnalyticsEvent.TransferDeposit, event); + onDeposit?.(); + }} + /> ) : ( - + { + track(AnalyticsEvent.TransferFaucet); + onDeposit?.(); + }} + /> )} {!isMainnet && ( setShowFaucet(!showFaucet)}> diff --git a/src/views/dialogs/ExternalNavKeplrDialog.tsx b/src/views/dialogs/ExternalNavKeplrDialog.tsx index 9a11d1c..d1622c6 100644 --- a/src/views/dialogs/ExternalNavKeplrDialog.tsx +++ b/src/views/dialogs/ExternalNavKeplrDialog.tsx @@ -32,7 +32,15 @@ export const ExternalNavKeplrDialog = ({ setIsOpen }: ElementProps) => { openDialog({ type: DialogTypes.ExternalLink, dialogProps: { + buttonText: stringGetter({ key: STRING_KEYS.CONTINUE }), link: keplrDashboard, + title: stringGetter({ key: STRING_KEYS.LEAVING_WEBSITE_STAKING_GOVERNANCE }), + slotContent: stringGetter({ + key: STRING_KEYS.STAKE_WITH_KEPLR_AND_LEAVING_DESCRIPTION, + params: { + CTA: stringGetter({ key: STRING_KEYS.CONTINUE }), + }, + }), }, }) ); diff --git a/src/views/dialogs/OnboardingDialog.tsx b/src/views/dialogs/OnboardingDialog.tsx index a4449d9..54fb939 100644 --- a/src/views/dialogs/OnboardingDialog.tsx +++ b/src/views/dialogs/OnboardingDialog.tsx @@ -105,8 +105,8 @@ export const OnboardingDialog = ({ setIsOpen }: ElementProps) => { {isMainnet ? ( { - track(AnalyticsEvent.TransferDeposit); + onDeposit={(event) => { + track(AnalyticsEvent.TransferDeposit, event); }} /> ) : ( diff --git a/src/views/dialogs/OnboardingDialog/GenerateKeys.tsx b/src/views/dialogs/OnboardingDialog/GenerateKeys.tsx index 4bc6a86..23c560e 100644 --- a/src/views/dialogs/OnboardingDialog/GenerateKeys.tsx +++ b/src/views/dialogs/OnboardingDialog/GenerateKeys.tsx @@ -25,7 +25,7 @@ import { Switch } from '@/components/Switch'; import { WithReceipt } from '@/components/WithReceipt'; import { WithTooltip } from '@/components/WithTooltip'; -import { getSelectedNetwork } from '@/state/appSelectors'; +import { getSelectedNetwork, getSelectedDydxChainId } from '@/state/appSelectors'; import { track } from '@/lib/analytics'; import { isTruthy } from '@/lib/isTruthy'; @@ -44,7 +44,6 @@ export const GenerateKeys = ({ onKeysDerived = () => {}, }: ElementProps) => { const stringGetter = useStringGetter(); - const { isMobile } = useBreakpoints(); const [shouldRememberMe, setShouldRememberMe] = useState(false); @@ -66,17 +65,30 @@ export const GenerateKeys = ({ try { await matchNetwork?.(); + return true; } catch (error) { - const { message, walletErrorType } = parseWalletError({ error, stringGetter }); + const { message, walletErrorType, isErrorExpected } = parseWalletError({ + error, + stringGetter, + }); + + if (!isErrorExpected) { + log('GenerateKeys/switchNetwork', error, { walletErrorType }); + } if (message) { - log('GenerateKeys/switchNetwork', error, { walletErrorType }); setError(message); - throw error; } + + return false; } }; + const switchNetworkAndDeriveKeys = async () => { + const networkSwitched = await switchNetwork(); + if (networkSwitched) await deriveKeys(); + }; + // 2. Derive keys from EVM account const { getWalletFromEvmSignature } = useDydxClient(); const { getSubaccounts } = useAccounts(); @@ -86,7 +98,8 @@ export const GenerateKeys = ({ EvmDerivedAccountStatus.Derived, ].includes(status); - const signTypedData = getSignTypedData(selectedNetwork); + const selectedDydxChainId = useSelector(getSelectedDydxChainId); + const signTypedData = getSignTypedData(selectedDydxChainId); const { signTypedDataAsync } = useSignTypedData({ ...signTypedData, domain: { @@ -154,11 +167,16 @@ export const GenerateKeys = ({ setStatus(EvmDerivedAccountStatus.Derived); } catch (error) { setStatus(EvmDerivedAccountStatus.NotDerived); - const { message, walletErrorType } = parseWalletError({ error, stringGetter }); + const { message, walletErrorType, isErrorExpected } = parseWalletError({ + error, + stringGetter, + }); if (message) { setError(message); - log('GenerateKeys/deriveKeys', error, { walletErrorType }); + if (!isErrorExpected) { + log('GenerateKeys/deriveKeys', error, { walletErrorType }); + } } } }; @@ -231,7 +249,7 @@ export const GenerateKeys = ({ {!isMatchingNetwork ? ( + ); + + const submitButton = ( + : undefined + } + > + {stringGetter({ + key: buttonTextStringKey, + params: { + ORDER: stringGetter({ + key: confirmButtonConfig.stringKey, + }), + }, + })} + + ); + return ( - {!canAccountTrade || showConnectWallet ? ( + {!canAccountTrade ? ( ) : showDeposit ? ( - + depositButton ) : ( - + + {submitButton} + )} ); }; + +const Styled: Record = {}; + +Styled.Button = styled(Button)` + width: 100%; +`; + +Styled.WarningIcon = styled(Icon)` + color: var(--color-warning); +`; diff --git a/src/views/forms/TransferForm.tsx b/src/views/forms/TransferForm.tsx index 6a3a01c..e715173 100644 --- a/src/views/forms/TransferForm.tsx +++ b/src/views/forms/TransferForm.tsx @@ -9,7 +9,6 @@ import { TransferInputField, TransferType } from '@/constants/abacus'; import { AlertType } from '@/constants/alerts'; import { ButtonShape, ButtonSize } from '@/constants/buttons'; import { STRING_KEYS } from '@/constants/localization'; -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; import { NumberSign } from '@/constants/numbers'; import { DydxChainAsset } from '@/constants/wallets'; @@ -18,7 +17,6 @@ import { useAccounts, useDydxClient, useRestrictions, - useSelectedNetwork, useStringGetter, useSubaccount, useTokenConfigs, @@ -42,6 +40,7 @@ import { TransferButtonAndReceipt } from '@/views/forms/TransferForm/TransferBut import { WithDetailsReceipt } from '@/components/WithDetailsReceipt'; import { getSubaccount } from '@/state/accountSelectors'; +import { getSelectedDydxChainId } from '@/state/appSelectors'; import { getTransferInputs } from '@/state/inputsSelectors'; import abacusStateManager from '@/lib/abacus'; @@ -64,7 +63,7 @@ export const TransferForm = ({ const { dydxAddress } = useAccounts(); const { transfer } = useSubaccount(); const { nativeTokenBalance, usdcBalance } = useAccountBalance(); - const { selectedNetwork } = useSelectedNetwork(); + const selectedDydxChainId = useSelector(getSelectedDydxChainId); const { tokensConfigs, usdcLabel, chainTokenLabel } = useTokenConfigs(); useWithdrawalInfo({ isTransfer: true }); @@ -241,7 +240,7 @@ export const TransferForm = ({ const networkOptions = [ { - chainId: ENVIRONMENT_CONFIG_MAP[selectedNetwork].dydxChainId, + chainId: selectedDydxChainId, label: ( {stringGetter({ key: STRING_KEYS.DYDX_CHAIN })} @@ -324,7 +323,7 @@ export const TransferForm = ({ /> {networkOptions.map(({ chainId, label }) => ( diff --git a/src/views/notifications/TradeNotification/index.tsx b/src/views/notifications/TradeNotification/index.tsx index d628b2d..b723f13 100644 --- a/src/views/notifications/TradeNotification/index.tsx +++ b/src/views/notifications/TradeNotification/index.tsx @@ -11,7 +11,7 @@ import { } from '@/constants/abacus'; import { STRING_KEYS } from '@/constants/localization'; -import { TRADE_TYPE_STRINGS, TradeTypes } from '@/constants/trade'; +import { ORDER_TYPE_STRINGS, TradeTypes } from '@/constants/trade'; import { useStringGetter } from '@/hooks'; import { layoutMixins } from '@/styles/layoutMixins'; @@ -48,7 +48,7 @@ export const TradeNotification = ({ isToast, data, notification }: TradeNotifica const { assetId } = marketData ?? {}; const orderType = ORDER_TYPE as KotlinIrEnumValues; const tradeType = TRADE_TYPES[orderType]; - const titleKey = tradeType && TRADE_TYPE_STRINGS[tradeType]?.tradeTypeKey; + const titleKey = tradeType && ORDER_TYPE_STRINGS[tradeType]?.orderTypeKey; const orderStatus = ORDER_STATUS as KotlinIrEnumValues; return ( diff --git a/src/views/notifications/TransferStatusNotification/TransferStatusSteps.tsx b/src/views/notifications/TransferStatusNotification/TransferStatusSteps.tsx index 96c1adf..f522a06 100644 --- a/src/views/notifications/TransferStatusNotification/TransferStatusSteps.tsx +++ b/src/views/notifications/TransferStatusNotification/TransferStatusSteps.tsx @@ -1,18 +1,21 @@ import { useMemo } from 'react'; +import { useSelector } from 'react-redux'; import styled, { css, type AnyStyledComponent } from 'styled-components'; import { StatusResponse } from '@0xsquid/sdk'; -import { useStringGetter, useSelectedNetwork, useURLConfigs } from '@/hooks'; +import { STRING_KEYS } from '@/constants/localization'; +import { TransferNotificationTypes } from '@/constants/notifications'; + +import { useStringGetter, useURLConfigs } from '@/hooks'; + +import { layoutMixins } from '@/styles/layoutMixins'; import { Link } from '@/components/Link'; import { Icon, IconName } from '@/components/Icon'; import { LoadingDots } from '@/components/Loading/LoadingDots'; import { LoadingSpinner } from '@/components/Loading/LoadingSpinner'; -import { layoutMixins } from '@/styles/layoutMixins'; -import { STRING_KEYS } from '@/constants/localization'; -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; -import { TransferNotificationTypes } from '@/constants/notifications'; +import { getSelectedDydxChainId } from '@/state/appSelectors'; type ElementProps = { status?: StatusResponse; @@ -32,9 +35,8 @@ enum TransferStatusStep { export const TransferStatusSteps = ({ className, status, type }: ElementProps & StyleProps) => { const stringGetter = useStringGetter(); - const { selectedNetwork } = useSelectedNetwork(); + const selectedDydxChainId = useSelector(getSelectedDydxChainId); const { mintscan: mintscanTxUrl } = useURLConfigs(); - const dydxChainId = ENVIRONMENT_CONFIG_MAP[selectedNetwork].dydxChainId; const { currentStep, steps } = useMemo(() => { const routeStatus = status?.routeStatus; @@ -55,7 +57,7 @@ export const TransferStatusSteps = ({ className, status, type }: ElementProps & link: type === TransferNotificationTypes.Deposit ? status?.fromChain?.transactionUrl - : routeStatus?.[0]?.chainId === dydxChainId && routeStatus[0].txHash + : routeStatus?.[0]?.chainId === selectedDydxChainId && routeStatus[0].txHash ? `${mintscanTxUrl?.replace('{tx_hash}', routeStatus[0].txHash.replace('0x', ''))}` : undefined, }, @@ -81,7 +83,7 @@ export const TransferStatusSteps = ({ className, status, type }: ElementProps & link: type === TransferNotificationTypes.Withdrawal ? status?.toChain?.transactionUrl - : currentStatus?.chainId === dydxChainId && currentStatus?.txHash + : currentStatus?.chainId === selectedDydxChainId && currentStatus?.txHash ? `${mintscanTxUrl?.replace('{tx_hash}', currentStatus.txHash.replace('0x', ''))}` : undefined, }, diff --git a/src/views/notifications/TransferStatusNotification/index.tsx b/src/views/notifications/TransferStatusNotification/index.tsx index 36a0bbe..eb8c5ab 100644 --- a/src/views/notifications/TransferStatusNotification/index.tsx +++ b/src/views/notifications/TransferStatusNotification/index.tsx @@ -40,7 +40,7 @@ export const TransferStatusNotification = ({ const stringGetter = useStringGetter(); const [open, setOpen] = useState(false); const [secondsLeft, setSecondsLeft] = useState(0); - const { fromChainId, status, txHash, toAmount } = transfer; + const { fromChainId, status, txHash, toAmount, isExchange } = transfer; // @ts-ignore status.errors is not in the type definition but can be returned const error = status?.errors?.length ? status?.errors[0] : status?.error; @@ -54,6 +54,8 @@ export const TransferStatusNotification = ({ useInterval({ callback: updateSecondsLeft }); + const isComplete = status?.squidTransactionStatus === 'success' || isExchange; + const inProgressStatusString = type === TransferNotificationTypes.Deposit ? secondsLeft > 0 @@ -65,10 +67,10 @@ export const TransferStatusNotification = ({ const statusString = type === TransferNotificationTypes.Deposit - ? status?.squidTransactionStatus === 'success' + ? isComplete ? STRING_KEYS.DEPOSIT_COMPLETE : inProgressStatusString - : status?.squidTransactionStatus === 'success' + : isComplete ? STRING_KEYS.WITHDRAW_COMPLETE : inProgressStatusString; @@ -108,12 +110,12 @@ export const TransferStatusNotification = ({ slotIcon={isToast && slotIcon} slotTitle={slotTitle} slotCustomContent={ - !status ? ( + !status && !isExchange ? ( ) : ( {content} - {!isToast && status?.squidTransactionStatus !== 'success' && !hasError && ( + {!isToast && !isComplete && !hasError && ( )} diff --git a/tradingview/tradingview.tgz b/tradingview/tradingview.tgz index ebc537f..e845da8 100644 Binary files a/tradingview/tradingview.tgz and b/tradingview/tradingview.tgz differ