From 1a41ccaf2ab65de07a4f0566469df8ccf75cf4e5 Mon Sep 17 00:00:00 2001 From: Jared Vu Date: Wed, 7 Feb 2024 11:17:54 -0800 Subject: [PATCH] Liquid Staking CTA (#281) * :construction: feat(token-page): Scaffold sidebar components for token page * :construction: feat(staking/governance): Scaffold adding Panels to Staking and Governance page * :sparkles: Update and add icons * :bricks: Add strideZoneApp to shared config * :bricks: Add dialogs, update ExternalLinkDialog * :construction: Add New Panels/Update paths * Fix mobile Profile Panel * :lipstick: fix desktop padding * :sparkles: Add New tag * :lipstick: Highlight tag on StrideStakingPanel * :lipstick: Single columns for panels on mobile breakpoint * :lipstick: fix import nits and alignment nits on panels * Add circular keplr icon --- public/configs/env.json | 2608 ++++++++--------- public/third-party/keplr.png | Bin 0 -> 12200 bytes public/third-party/stride.png | Bin 0 -> 17818 bytes src/App.tsx | 5 +- src/components/ContentSectionHeader.tsx | 22 +- src/components/Icon.tsx | 9 + src/components/WithSidebar.tsx | 3 +- src/constants/dialogs.ts | 1 + src/constants/routes.ts | 6 + src/hooks/useMarketsData.ts | 7 +- src/hooks/useURLConfigs.ts | 2 + src/icons/chaos-labs.tsx | 8 +- src/icons/currency-sign.svg | 4 + src/icons/governance.svg | 3 + src/icons/index.ts | 4 +- src/icons/token.svg | 5 + src/layout/DialogManager.tsx | 2 + src/pages/Profile.tsx | 61 +- src/pages/portfolio/Portfolio.tsx | 62 +- src/pages/token/Governance.tsx | 60 + src/pages/token/Token.tsx | 126 + .../{ => token}/rewards/DYDXBalancePanel.tsx | 0 .../{ => token}/rewards/GovernancePanel.tsx | 5 +- .../rewards/LaunchIncentivesPanel.tsx | 10 +- .../{ => token}/rewards/MigratePanel.tsx | 0 .../{ => token}/rewards/NewMarketsPanel.tsx | 5 +- .../rewards/RewardHistoryPanel.tsx | 0 .../{ => token}/rewards/RewardsHelpPanel.tsx | 0 src/pages/{ => token}/rewards/RewardsPage.tsx | 127 +- .../rewards/TradingRewardsSummaryPanel.tsx | 7 +- src/pages/token/staking/StakingPage.tsx | 67 + .../staking}/StakingPanel.tsx | 60 +- .../token/staking/StrideStakingPanel.tsx | 94 + src/views/dialogs/ExternalLinkDialog.tsx | 15 +- src/views/dialogs/ExternalNavStrideDialog.tsx | 137 + src/views/menus/AccountMenu.tsx | 6 +- 36 files changed, 2056 insertions(+), 1475 deletions(-) create mode 100644 public/third-party/keplr.png create mode 100644 public/third-party/stride.png create mode 100644 src/icons/currency-sign.svg create mode 100644 src/icons/governance.svg create mode 100644 src/icons/token.svg create mode 100644 src/pages/token/Governance.tsx create mode 100644 src/pages/token/Token.tsx rename src/pages/{ => token}/rewards/DYDXBalancePanel.tsx (100%) rename src/pages/{ => token}/rewards/GovernancePanel.tsx (94%) rename src/pages/{ => token}/rewards/LaunchIncentivesPanel.tsx (96%) rename src/pages/{ => token}/rewards/MigratePanel.tsx (100%) rename src/pages/{ => token}/rewards/NewMarketsPanel.tsx (94%) rename src/pages/{ => token}/rewards/RewardHistoryPanel.tsx (100%) rename src/pages/{ => token}/rewards/RewardsHelpPanel.tsx (100%) rename src/pages/{ => token}/rewards/RewardsPage.tsx (58%) rename src/pages/{ => token}/rewards/TradingRewardsSummaryPanel.tsx (96%) create mode 100644 src/pages/token/staking/StakingPage.tsx rename src/pages/{rewards => token/staking}/StakingPanel.tsx (67%) create mode 100644 src/pages/token/staking/StrideStakingPanel.tsx create mode 100644 src/views/dialogs/ExternalNavStrideDialog.tsx diff --git a/public/configs/env.json b/public/configs/env.json index a3a3dea..b94740f 100644 --- a/public/configs/env.json +++ b/public/configs/env.json @@ -1,1319 +1,1315 @@ { - "apps": { - "ios": { - "scheme": "dydx-t-v4" + "apps": { + "ios": { + "scheme": "dydx-t-v4" + } + }, + "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, + "tokens": { + "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" + } + }, + "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" + }, + "links": { + "tos": "https://dydx.exchange/v4-terms", + "privacy": "https://dydx.exchange/privacy", + "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" + }, + "wallets": { + "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" + }, + "governance": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "featureFlags": { + "reduceOnlySupported": true } - }, - "deployments": { - "MAINNET": { - "environments": [ - "dydxprotocol-mainnet" - ], - "default": "dydxprotocol-mainnet" + }, + "dydxprotocol-dev-2": { + "name": "v4 Dev 2", + "ethereumChainId": "11155111", + "dydxChainId": "dydxprotocol-testnet", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "tokens": { + "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" + } }, - "TESTFLIGHT": { - "environments": [ - "dydxprotocol-mainnet", - "dydxprotocol-testnet" - ], - "default": "dydxprotocol-mainnet" + "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/" }, - "TESTNET": { - "environments": [ - "dydxprotocol-testnet" - ], - "default": "dydxprotocol-testnet" + "links": { + "tos": "https://dydx.exchange/v4-terms", + "privacy": "https://dydx.exchange/privacy", + "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" }, - "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" + "wallets": { + "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" + }, + "governance": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "featureFlags": { + "reduceOnlySupported": true } - }, - "environments": { - "dydxprotocol-dev": { - "name": "v4 Dev", - "ethereumChainId": "11155111", - "dydxChainId": "dydxprotocol-testnet", - "chainName": "dYdX Chain", - "chainLogo": "/dydx-chain.png", - "squidIntegratorId": "dYdX-api", - "isMainNet": false, - "tokens": { - "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" - } - }, - "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" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "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/", - "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", - "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" - }, - "wallets": { - "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" - }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } - }, - "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, + "tokens": { + "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" + } }, - "dydxprotocol-dev-2": { - "name": "v4 Dev 2", - "ethereumChainId": "11155111", - "dydxChainId": "dydxprotocol-testnet", - "chainName": "dYdX Chain", - "chainLogo": "/dydx-chain.png", - "squidIntegratorId": "dYdX-api", - "isMainNet": false, - "tokens": { - "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" - } - }, - "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/" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "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/", - "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", - "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" - }, - "wallets": { - "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" - }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } - }, - "featureFlags": { - "reduceOnlySupported": true - } + "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" }, - "dydxprotocol-dev-4": { - "name": "v4 Dev 4", - "ethereumChainId": "11155111", - "dydxChainId": "dydxprotocol-testnet", - "chainName": "dYdX Chain", - "chainLogo": "/dydx-chain.png", - "squidIntegratorId": "dYdX-api", - "isMainNet": false, - "tokens": { - "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" - } - }, - "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" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "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/", - "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", - "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" - }, - "wallets": { - "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" - }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } - }, - "featureFlags": { - "reduceOnlySupported": true - } + "links": { + "tos": "https://dydx.exchange/v4-terms", + "privacy": "https://dydx.exchange/privacy", + "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" }, - "dydxprotocol-dev-5": { - "name": "v4 Dev 5", - "ethereumChainId": "11155111", - "dydxChainId": "dydxprotocol-testnet", - "chainName": "dYdX Chain", - "chainLogo": "/dydx-chain.png", - "squidIntegratorId": "dYdX-api", - "isMainNet": false, - "tokens": { - "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" - } - }, - "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/" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "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/", - "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", - "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" - }, - "wallets": { - "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" - }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } - }, - "featureFlags": { - "reduceOnlySupported": true - } + "wallets": { + "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" }, - "dydxprotocol-staging": { - "name": "v4 Staging", - "ethereumChainId": "11155111", - "dydxChainId": "dydxprotocol-testnet", - "chainName": "dYdX Chain", - "chainLogo": "/dydx-chain.png", - "squidIntegratorId": "dYdX-api", - "isMainNet": false, - "tokens": { - "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" - } - }, - "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/" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "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", - "help": "https://help.dydx.exchange", - "foundation": "https://www.dydx.foundation", - "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/", - "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", - "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" - }, - "wallets": { - "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" - }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } - }, - "featureFlags": { - "reduceOnlySupported": true - } + "governance": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } }, - "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, - "tokens": { - "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" - } - }, - "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/" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}", - "mintscanBase": "https://testnet.mintscan.io/dydx-testnet", - "documentation": "https://v4-teacher.vercel.app/", - "community": "https://discord.com/invite/dydx", - "feedback": "https://docs.google.com/forms/d/e/1FAIpQLSezLsWCKvAYDEb7L-2O4wOON1T56xxro9A2Azvl6IxXHP_15Q/viewform", - "blogs": "https://www.dydx.foundation/blog", - "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals" - }, - "wallets": { - "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" - }, - "apps": { - "ios": { - "minimalVersion": "1.0", - "build": 40000, - "url": "https://apps.apple.com/app/dydx/id1564787350" - } - }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } - }, - "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, - "tokens": { - "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" - } - }, - "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/" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "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", - "help": "https://help.dydx.exchange", - "foundation": "https://www.dydx.foundation", - "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/", - "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", - "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" - }, - "wallets": { - "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" - }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } - }, - "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, - "tokens": { - "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" - } - }, - "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" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "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/", - "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", - "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" - }, - "wallets": { - "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 V4" - }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } - }, - "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, - "tokens": { - "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" - } - }, - "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" - }, - "links": { - "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/", - "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", - "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" - }, - "wallets": { - "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 V4" - }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } - }, - "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, - "tokens": { - "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" - } - }, - "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" - }, - "links": { - "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/", - "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", - "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" - }, - "wallets": { - "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 V4" - }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } - }, - "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, - "tokens": { - "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" - } - }, - "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" - }, - "links": { - "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/", - "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", - "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" - }, - "wallets": { - "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 V4" - }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } - }, - "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, - "tokens": { - "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" - } - }, - "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" - }, - "links": { - "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/", - "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", - "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" - }, - "wallets": { - "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 V4" - }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } - }, - "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, - "tokens": { - "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" - } - }, - "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" - }, - "links": { - "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}", - "mintscanBase": "https://testnet.mintscan.io/dydx-testnet", - "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", - "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals" - }, - "wallets": { - "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 V4" - }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } - }, - "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, - "tokens": { - "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" - } - }, - "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" - }, - "links": { - "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/", - "accountExportLearnmore": "https://help.dydx.exchange", - "walletLearnmore": "https://www.dydx.academy/video/defi-wallet" - }, - "wallets": { - "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 V4" - }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } - }, - "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, - "tokens": { - "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" - } - }, - "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]" - }, - "links": { - "tos": "[HTTP link to TOS]", - "privacy": "[HTTP link to Privacy Policy]", - "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]", - "accountExportLearnMore": "[HTTP link to account export learn more, can be null]", - "walletLearnMore": "[HTTP link to wallet learn more, can be null]" - }, - "wallets": { - "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": { - "newMarketProposal": { - "initialDepositAmount": 0, - "delayBlocks": 0, - "newMarketsMethodology": "[URL to spreadsheet or document that explains methodology]" - } - }, - "featureFlags": { - "reduceOnlySupported": false - } + "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, + "tokens": { + "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" + } + }, + "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/" + }, + "links": { + "tos": "https://dydx.exchange/v4-terms", + "privacy": "https://dydx.exchange/privacy", + "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" + }, + "wallets": { + "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" + }, + "governance": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "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, + "tokens": { + "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" + } + }, + "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/" + }, + "links": { + "tos": "https://dydx.exchange/v4-terms", + "privacy": "https://dydx.exchange/privacy", + "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", + "help": "https://help.dydx.exchange", + "foundation": "https://www.dydx.foundation", + "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" + }, + "wallets": { + "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" + }, + "governance": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "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, + "tokens": { + "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" + } + }, + "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/" + }, + "links": { + "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", + "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", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals" + }, + "wallets": { + "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" + }, + "apps": { + "ios": { + "minimalVersion": "1.0", + "build": 40000, + "url": "https://apps.apple.com/app/dydx/id1564787350" + } + }, + "governance": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "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, + "tokens": { + "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" + } + }, + "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/" + }, + "links": { + "tos": "https://dydx.exchange/v4-terms", + "privacy": "https://dydx.exchange/privacy", + "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", + "help": "https://help.dydx.exchange", + "foundation": "https://www.dydx.foundation", + "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" + }, + "wallets": { + "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" + }, + "governance": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "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, + "tokens": { + "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" + } + }, + "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" + }, + "links": { + "tos": "https://dydx.exchange/v4-terms", + "privacy": "https://dydx.exchange/privacy", + "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" + }, + "wallets": { + "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 V4" + }, + "governance": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "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, + "tokens": { + "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" + } + }, + "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" + }, + "links": { + "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" + }, + "wallets": { + "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 V4" + }, + "governance": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "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, + "tokens": { + "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" + } + }, + "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" + }, + "links": { + "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", + "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", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals" + }, + "wallets": { + "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 V4" + }, + "governance": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "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, + "tokens": { + "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" + } + }, + "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" + }, + "links": { + "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" + }, + "wallets": { + "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 V4" + }, + "governance": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "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, + "tokens": { + "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" + } + }, + "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" + }, + "links": { + "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" + }, + "wallets": { + "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 V4" + }, + "governance": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "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, + "tokens": { + "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" + } + }, + "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" + }, + "links": { + "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", + "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", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", + "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" + }, + "wallets": { + "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 V4" + }, + "governance": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "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, + "tokens": { + "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" + } + }, + "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" + }, + "links": { + "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", + "walletLearnmore": "https://www.dydx.academy/video/defi-wallet" + }, + "wallets": { + "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 V4" + }, + "governance": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "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, + "tokens": { + "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" + } + }, + "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]" + }, + "links": { + "tos": "[HTTP link to TOS]", + "privacy": "[HTTP link to Privacy Policy]", + "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": { + "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": { + "newMarketProposal": { + "initialDepositAmount": 0, + "delayBlocks": 0, + "newMarketsMethodology": "[URL to spreadsheet or document that explains methodology]" + } + }, + "featureFlags": { + "reduceOnlySupported": false + } + } + } } diff --git a/public/third-party/keplr.png b/public/third-party/keplr.png new file mode 100644 index 0000000000000000000000000000000000000000..3f765e2f21415aa3ae3adeca6337eb9b46b0b281 GIT binary patch literal 12200 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 literal 0 HcmV?d00001 diff --git a/src/App.tsx b/src/App.tsx index a1c0e69..d1093e5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -52,9 +52,9 @@ const AlertsPage = lazy(() => import('@/pages/AlertsPage')); const ProfilePage = lazy(() => import('@/pages/Profile')); const SettingsPage = lazy(() => import('@/pages/settings/Settings')); const TradePage = lazy(() => import('@/pages/trade/Trade')); -const RewardsPage = lazy(() => import('@/pages/rewards/RewardsPage')); const TermsOfUsePage = lazy(() => import('@/pages/TermsOfUsePage')); const PrivacyPolicyPage = lazy(() => import('@/pages/PrivacyPolicyPage')); +const TokenPage = lazy(() => import('@/pages/token/Token')); const queryClient = new QueryClient(); @@ -87,7 +87,7 @@ const Content = () => { } /> } /> - } /> + } /> {isTablet && ( <> } /> @@ -207,6 +207,7 @@ Styled.Content = styled.div<{ isShowingHeader: boolean; isShowingFooter: boolean Styled.Main = styled.main` ${layoutMixins.contentSectionAttached} + box-shadow: none; grid-area: Main; diff --git a/src/components/ContentSectionHeader.tsx b/src/components/ContentSectionHeader.tsx index 4582cf5..5f1e2db 100644 --- a/src/components/ContentSectionHeader.tsx +++ b/src/components/ContentSectionHeader.tsx @@ -6,6 +6,7 @@ import { layoutMixins } from '@/styles/layoutMixins'; type ElementProps = { title: string; subtitle?: React.ReactNode; + slotLeft?: React.ReactNode; slotRight?: React.ReactNode; }; @@ -16,14 +17,16 @@ type StyleProps = { export const ContentSectionHeader = ({ title, subtitle, + slotLeft, slotRight, className, }: ElementProps & StyleProps) => ( -
+ {slotLeft} + {title &&

{title}

} {subtitle &&

{subtitle}

} -
+ {slotRight}
); @@ -40,9 +43,15 @@ Styled.ContentSectionHeader = styled.header` padding: 1rem var(--header-horizontal-padding); - > div { - ${layoutMixins.column} + @media ${breakpoints.tablet} { + flex-wrap: wrap; + --header-horizontal-padding: 1.25rem; } +`; + +Styled.Header = styled.div` + ${layoutMixins.column} + flex: 1; h3 { color: var(--color-text-2); @@ -54,9 +63,4 @@ Styled.ContentSectionHeader = styled.header` font: var(--font-small-book); margin-top: 0.25rem; } - - @media ${breakpoints.tablet} { - flex-wrap: wrap; - --header-horizontal-padding: 1.25rem; - } `; diff --git a/src/components/Icon.tsx b/src/components/Icon.tsx index 216da7d..81427ad 100644 --- a/src/components/Icon.tsx +++ b/src/components/Icon.tsx @@ -25,6 +25,7 @@ import { CoinsIcon, CommentIcon, CopyIcon, + CurrencySignIcon, DepositIcon, DepthChartIcon, DiscordIcon, @@ -35,6 +36,7 @@ import { FundingChartIcon, GearIcon, GiftboxIcon, + GovernanceIcon, HelpCircleIcon, HideIcon, HistoryIcon, @@ -70,6 +72,7 @@ import { StarIcon, SunIcon, TerminalIcon, + TokenIcon, TradeIcon, TransferIcon, TriangleIcon, @@ -103,6 +106,7 @@ export enum IconName { Coins = 'Coins', Comment = 'Comment', Copy = 'Copy', + CurrencySign = 'CurrencySign', Deposit = 'Deposit', DepthChart = 'DepthChart', Discord = 'Discord', @@ -113,6 +117,7 @@ export enum IconName { FundingChart = 'FundingChart', Gear = 'Gear', Giftbox = 'Giftbox', + Governance = 'Governance', HelpCircle = 'HelpCircle', Hide = 'Hide', History = 'History', @@ -149,6 +154,7 @@ export enum IconName { Sun = 'Sun', Terminal = 'Terminal', TogglesMenu = 'TogglesMenu', + Token = 'Token', Trade = 'Trade', Transfer = 'Transfer', Triangle = 'Triangle', @@ -182,6 +188,7 @@ const icons = { [IconName.Coins]: CoinsIcon, [IconName.Comment]: CommentIcon, [IconName.Copy]: CopyIcon, + [IconName.CurrencySign]: CurrencySignIcon, [IconName.Deposit]: DepositIcon, [IconName.DepthChart]: DepthChartIcon, [IconName.Discord]: DiscordIcon, @@ -192,6 +199,7 @@ const icons = { [IconName.FundingChart]: FundingChartIcon, [IconName.Gear]: GearIcon, [IconName.Giftbox]: GiftboxIcon, + [IconName.Governance]: GovernanceIcon, [IconName.HelpCircle]: HelpCircleIcon, [IconName.Hide]: HideIcon, [IconName.History]: HistoryIcon, @@ -227,6 +235,7 @@ const icons = { [IconName.Sun]: SunIcon, [IconName.Terminal]: TerminalIcon, [IconName.TogglesMenu]: TogglesMenuIcon, + [IconName.Token]: TokenIcon, [IconName.Trade]: TradeIcon, [IconName.Transfer]: TransferIcon, [IconName.Triangle]: TriangleIcon, diff --git a/src/components/WithSidebar.tsx b/src/components/WithSidebar.tsx index 4e4c79a..676c634 100644 --- a/src/components/WithSidebar.tsx +++ b/src/components/WithSidebar.tsx @@ -106,8 +106,6 @@ Styled.Container = styled.div` --stickyArea1-leftGap: var(--border-width); min-height: var(--stickyArea-height); - ${layoutMixins.withOuterAndInnerBorders} - display: grid; grid-template: var(--withSidebar-gridTemplate); `; @@ -120,6 +118,7 @@ Styled.Side = styled.aside` ${layoutMixins.sticky} max-height: var(--stickyArea-height); backdrop-filter: none; + background-color: var(--color-layer-2); ${layoutMixins.stack} `; diff --git a/src/constants/dialogs.ts b/src/constants/dialogs.ts index bad393c..6ed34ec 100644 --- a/src/constants/dialogs.ts +++ b/src/constants/dialogs.ts @@ -5,6 +5,7 @@ export enum DialogTypes { DisplaySettings = 'DisplaySettings', ExchangeOffline = 'ExchangeOffline', ExternalLink = 'ExternalLink', + ExternalNavStride = 'ExternalNavStride', FillDetails = 'FillDetails', Help = 'Help', ExternalNavKeplr = 'ExternalNavKeplr', diff --git a/src/constants/routes.ts b/src/constants/routes.ts index 5c86896..491cabd 100644 --- a/src/constants/routes.ts +++ b/src/constants/routes.ts @@ -29,6 +29,12 @@ export enum HistoryRoute { Payments = 'payments', } +export enum TokenRoute { + TradingRewards = 'trading-rewards', + StakingRewards = 'staking-rewards', + Governance = 'governance', +} + export enum MobileSettingsRoute { Language = 'language', Notifications = 'notifications', diff --git a/src/hooks/useMarketsData.ts b/src/hooks/useMarketsData.ts index 020db64..b5c6011 100644 --- a/src/hooks/useMarketsData.ts +++ b/src/hooks/useMarketsData.ts @@ -33,7 +33,7 @@ export const useMarketsData = ( return Object.values(allPerpetualMarkets) .filter(isTruthy) .map((marketData) => ({ - asset: allAssets[marketData.assetId], + asset: allAssets[marketData.assetId] ?? {}, tickSizeDecimals: marketData.configs?.tickSizeDecimals, ...marketData, ...marketData.perpetual, @@ -46,9 +46,10 @@ export const useMarketsData = ( if (searchFilter) { return filtered.filter( - ({ asset }) => + ({ asset, id }) => asset?.name?.toLocaleLowerCase().includes(searchFilter.toLowerCase()) || - asset?.id?.toLocaleLowerCase().includes(searchFilter.toLowerCase()) + asset?.id?.toLocaleLowerCase().includes(searchFilter.toLowerCase()) || + id?.toLocaleLowerCase().includes(searchFilter.toLowerCase()) ); } return filtered; diff --git a/src/hooks/useURLConfigs.ts b/src/hooks/useURLConfigs.ts index 570fdff..67cfc1d 100644 --- a/src/hooks/useURLConfigs.ts +++ b/src/hooks/useURLConfigs.ts @@ -21,6 +21,7 @@ export interface LinksConfigs { newMarketProposalLearnMore: string; stakingLearnMore?: string; keplrDashboard?: string; + strideZoneApp?: string; accountExportLearnMore?: string; walletLearnMore?: string; } @@ -46,6 +47,7 @@ export const useURLConfigs = (): LinksConfigs => { newMarketProposalLearnMore: linksConfigs.newMarketProposalLearnMore || FALLBACK_URL, stakingLearnMore: linksConfigs.stakingLearnMore || FALLBACK_URL, keplrDashboard: linksConfigs.keplrDashboard || FALLBACK_URL, + strideZoneApp: linksConfigs.strideZoneApp || FALLBACK_URL, accountExportLearnMore: linksConfigs.accountExportLearnMore || FALLBACK_URL, walletLearnMore: linksConfigs.walletLearnMore || FALLBACK_URL, }; diff --git a/src/icons/chaos-labs.tsx b/src/icons/chaos-labs.tsx index 8779b79..cf42b6d 100644 --- a/src/icons/chaos-labs.tsx +++ b/src/icons/chaos-labs.tsx @@ -36,8 +36,8 @@ const ChaosLabsIcon: React.FC = () => { fill={fills[1]} /> @@ -50,8 +50,8 @@ const ChaosLabsIcon: React.FC = () => { fill={fills[1]} /> diff --git a/src/icons/currency-sign.svg b/src/icons/currency-sign.svg new file mode 100644 index 0000000..f8b4440 --- /dev/null +++ b/src/icons/currency-sign.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/icons/governance.svg b/src/icons/governance.svg new file mode 100644 index 0000000..4c17dfe --- /dev/null +++ b/src/icons/governance.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/index.ts b/src/icons/index.ts index 15b17c1..836b130 100644 --- a/src/icons/index.ts +++ b/src/icons/index.ts @@ -1,4 +1,3 @@ -import ChaosLabsIcon from './chaos-labs'; export { default as AddressConnectorIcon } from './address-connector.svg'; export { default as ArrowIcon } from './arrow.svg'; export { default as Bar3Icon } from './bar3.svg'; @@ -20,6 +19,7 @@ export { default as CoinMarketCapIcon } from './logos/coinmarketcap.svg'; export { default as CoinsIcon } from './coins.svg'; export { default as CommentIcon } from './comment.svg'; export { default as CopyIcon } from './copy.svg'; +export { default as CurrencySignIcon } from './currency-sign.svg'; export { default as DepositIcon } from './deposit.svg'; export { default as DepthChartIcon } from './depth-chart.svg'; export { default as DiscordIcon } from './discord.svg'; @@ -29,6 +29,7 @@ export { default as FileIcon } from './file.svg'; export { default as FundingChartIcon } from './funding-chart.svg'; export { default as GearIcon } from './gear.svg'; export { default as GiftboxIcon } from './giftbox.svg'; +export { default as GovernanceIcon } from './governance.svg'; export { default as HelpCircleIcon } from './help-circle.svg'; export { default as HideIcon } from './hide.svg'; export { default as HistoryIcon } from './history.svg'; @@ -60,6 +61,7 @@ export { default as StarIcon } from './star.svg'; export { default as SunIcon } from './sun.svg'; export { default as TerminalIcon } from './terminal.svg'; export { default as TogglesMenuIcon } from './toggles-menu.svg'; +export { default as TokenIcon } from './token.svg'; export { default as TradeIcon } from './trade.svg'; export { default as TransferIcon } from './transfer.svg'; export { default as TriangleIcon } from './triangle.svg'; diff --git a/src/icons/token.svg b/src/icons/token.svg new file mode 100644 index 0000000..10197b1 --- /dev/null +++ b/src/icons/token.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/layout/DialogManager.tsx b/src/layout/DialogManager.tsx index 04406cc..4c5ec7e 100644 --- a/src/layout/DialogManager.tsx +++ b/src/layout/DialogManager.tsx @@ -30,6 +30,7 @@ import { OrderDetailsDialog } from '@/views/dialogs/DetailsDialog/OrderDetailsDi import { FillDetailsDialog } from '@/views/dialogs/DetailsDialog/FillDetailsDialog'; import { NewMarketMessageDetailsDialog } from '@/views/dialogs/NewMarketMessageDetailsDialog'; import { NewMarketAgreementDialog } from '@/views/dialogs/NewMarketAgreementDialog'; +import { ExternalNavStrideDialog } from '@/views/dialogs/ExternalNavStrideDialog'; export const DialogManager = () => { const dispatch = useDispatch(); @@ -59,6 +60,7 @@ export const DialogManager = () => { [DialogTypes.Help]: , [DialogTypes.ExternalNavKeplr]: , [DialogTypes.ExternalLink]: , + [DialogTypes.ExternalNavStride]: , [DialogTypes.MnemonicExport]: , [DialogTypes.MobileSignIn]: , [DialogTypes.Onboarding]: , diff --git a/src/pages/Profile.tsx b/src/pages/Profile.tsx index 1324824..0d5253c 100644 --- a/src/pages/Profile.tsx +++ b/src/pages/Profile.tsx @@ -4,9 +4,15 @@ import { useDispatch, useSelector } from 'react-redux'; import { useEnsName } from 'wagmi'; import { useNavigate } from 'react-router-dom'; -import { ButtonSize } from '@/constants/buttons'; import { TransferType } from '@/constants/abacus'; - +import { OnboardingState } from '@/constants/account'; +import { ButtonSize } from '@/constants/buttons'; +import { DialogTypes } from '@/constants/dialogs'; +import { STRING_KEYS } from '@/constants/localization'; +import { AppRoute, PortfolioRoute, HistoryRoute } from '@/constants/routes'; +import { wallets } from '@/constants/wallets'; +import { useAccounts, useStringGetter, useTokenConfigs } from '@/hooks'; +import { breakpoints } from '@/styles'; import { layoutMixins } from '@/styles/layoutMixins'; import { Details } from '@/components/Details'; @@ -16,13 +22,6 @@ import { IconButton, type IconButtonProps } from '@/components/IconButton'; import { Panel } from '@/components/Panel'; import { Toolbar } from '@/components/Toolbar'; -import { OnboardingState } from '@/constants/account'; -import { DialogTypes } from '@/constants/dialogs'; -import { STRING_KEYS } from '@/constants/localization'; -import { AppRoute, PortfolioRoute, HistoryRoute } from '@/constants/routes'; -import { wallets } from '@/constants/wallets'; -import { useAccounts, useStringGetter, useTokenConfigs } from '@/hooks'; - import { getHistoricalTradingRewardsForCurrentWeek, getOnboardingState, @@ -32,10 +31,12 @@ import { openDialog } from '@/state/dialogs'; import { isTruthy } from '@/lib/isTruthy'; import { truncateAddress } from '@/lib/wallet'; -import { DYDXBalancePanel } from './rewards/DYDXBalancePanel'; -import { MigratePanel } from './rewards/MigratePanel'; -import { GovernancePanel } from './rewards/GovernancePanel'; -import { StakingPanel } from './rewards/StakingPanel'; +import { DYDXBalancePanel } from './token/rewards/DYDXBalancePanel'; +import { MigratePanel } from './token/rewards/MigratePanel'; +import { GovernancePanel } from './token/rewards/GovernancePanel'; +import { StakingPanel } from './token/staking/StakingPanel'; +import { StrideStakingPanel } from './token/staking/StrideStakingPanel'; +import { NewMarketsPanel } from './token/rewards/NewMarketsPanel'; const ENS_CHAIN_ID = 1; // Ethereum @@ -236,7 +237,9 @@ const Profile = () => { + + ); }; @@ -249,11 +252,12 @@ Styled.MobileProfileLayout = styled.div` ${layoutMixins.contentContainerPage} display: grid; - grid-template-columns: 1fr 1fr; gap: 1rem; padding: 1.25rem 0.9rem; max-width: 100vw; + grid-template-columns: 1fr 1fr; + grid-template-areas: 'header header' 'actions actions' @@ -262,8 +266,23 @@ Styled.MobileProfileLayout = styled.div` 'balance balance' 'rewards fees' 'history history' - 'governance governance' - 'staking staking'; + 'governance newMarkets' + 'keplr stride'; + + @media ${breakpoints.mobile} { + grid-template-areas: + 'header header' + 'actions actions' + 'settings help' + 'migrate migrate' + 'balance balance' + 'rewards fees' + 'history history' + 'governance governance' + 'newMarkets newMarkets' + 'keplr keplr' + 'stride stride'; + } `; Styled.Header = styled.header` @@ -431,5 +450,13 @@ Styled.GovernancePanel = styled(GovernancePanel)` `; Styled.StakingPanel = styled(StakingPanel)` - grid-area: staking; + grid-area: keplr; +`; + +Styled.NewMarketsPanel = styled(NewMarketsPanel)` + grid-area: newMarkets; +`; + +Styled.StrideStakingPanel = styled(StrideStakingPanel)` + grid-area: stride; `; diff --git a/src/pages/portfolio/Portfolio.tsx b/src/pages/portfolio/Portfolio.tsx index f3652b0..58aaeff 100644 --- a/src/pages/portfolio/Portfolio.tsx +++ b/src/pages/portfolio/Portfolio.tsx @@ -45,7 +45,8 @@ export default () => { const { freeCollateral } = useSelector(getSubaccount, shallowEqual) || {}; const { nativeTokenBalance } = useAccountBalance(); - const { numTotalPositions, numTotalOpenOrders } = useSelector(getTradeInfoNumbers, shallowEqual) || {}; + const { numTotalPositions, numTotalOpenOrders } = + useSelector(getTradeInfoNumbers, shallowEqual) || {}; const numPositions = shortenNumberForDisplay(numTotalPositions); const numOrders = shortenNumberForDisplay(numTotalOpenOrders); @@ -119,30 +120,43 @@ export default () => { items: [ { value: PortfolioRoute.Overview, - slotBefore: , + slotBefore: ( + + + + ), label: stringGetter({ key: STRING_KEYS.OVERVIEW }), href: PortfolioRoute.Overview, }, { value: PortfolioRoute.Positions, - slotBefore: , + slotBefore: ( + + + + ), label: ( <> {stringGetter({ key: STRING_KEYS.POSITIONS })} - {numPositions > 0 && ( - {numPositions} - )} + {numPositions && + (typeof numPositions === 'string' || numPositions > 0) && ( + {numPositions} + )} ), href: PortfolioRoute.Positions, }, { value: PortfolioRoute.Orders, - slotBefore: , + slotBefore: ( + + + + ), label: ( <> {stringGetter({ key: STRING_KEYS.ORDERS })} - {numOrders > 0 && ( + {numOrders && (typeof numOrders === 'string' || numOrders > 0) && ( {numOrders} )} @@ -151,13 +165,21 @@ export default () => { }, { value: PortfolioRoute.Fees, - slotBefore: , + slotBefore: ( + + + + ), label: stringGetter({ key: STRING_KEYS.FEES }), href: PortfolioRoute.Fees, }, { value: PortfolioRoute.History, - slotBefore: , + slotBefore: ( + + + + ), label: stringGetter({ key: STRING_KEYS.HISTORY }), href: PortfolioRoute.History, }, @@ -232,16 +254,14 @@ Styled.NavigationMenu = styled(NavigationMenu)` padding-top: 0; `; -Styled.Icon = styled(Icon)` - --icon-backgroundColor: var(--color-layer-4); - - width: 1em; - height: 1em; - - margin-left: -0.25em; - - box-sizing: content-box; - background-color: var(--icon-backgroundColor); +Styled.IconContainer = styled.div` + width: 1.5rem; + height: 1.5rem; + font-size: 0.75rem; + display: flex; + justify-content: center; + align-items: center; + background-color: var(--color-layer-4); border-radius: 50%; - padding: 0.25em; + margin-left: -0.25rem; `; diff --git a/src/pages/token/Governance.tsx b/src/pages/token/Governance.tsx new file mode 100644 index 0000000..1c0fe1f --- /dev/null +++ b/src/pages/token/Governance.tsx @@ -0,0 +1,60 @@ +import styled, { AnyStyledComponent } from 'styled-components'; + +import { STRING_KEYS } from '@/constants/localization'; +import { useStringGetter } from '@/hooks'; +import { breakpoints } from '@/styles'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { DetachedSection } from '@/components/ContentSection'; +import { ContentSectionHeader } from '@/components/ContentSectionHeader'; + +import { GovernancePanel } from './rewards/GovernancePanel'; +import { NewMarketsPanel } from './rewards/NewMarketsPanel'; + +export default () => { + const stringGetter = useStringGetter(); + + return ( + + + + + + + + + + + + + ); +}; + +const Styled: Record = {}; + +Styled.HeaderSection = styled.section` + ${layoutMixins.contentSectionDetached} + + @media ${breakpoints.tablet} { + ${layoutMixins.flexColumn} + gap: 1rem; + + margin-bottom: 0.5rem; + } +`; + +Styled.ContentWrapper = styled.div` + ${layoutMixins.flexColumn} + gap: 1.5rem; + max-width: 80rem; + padding: 0 1rem; +`; + +Styled.Row = styled.div` + gap: 1rem; + display: grid; + grid-template-columns: repeat(3, 1fr); +`; diff --git a/src/pages/token/Token.tsx b/src/pages/token/Token.tsx new file mode 100644 index 0000000..38cdc88 --- /dev/null +++ b/src/pages/token/Token.tsx @@ -0,0 +1,126 @@ +import { Suspense, lazy } from 'react'; +import { Navigate, Route, Routes } from 'react-router-dom'; +import styled, { AnyStyledComponent } from 'styled-components'; + +import { STRING_KEYS } from '@/constants/localization'; +import { TokenRoute } from '@/constants/routes'; +import { useBreakpoints, useStringGetter } from '@/hooks'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { Icon, IconName } from '@/components/Icon'; +import { LoadingSpace } from '@/components/Loading/LoadingSpinner'; +import { NavigationMenu } from '@/components/NavigationMenu'; +import { WithSidebar } from '@/components/WithSidebar'; + +const RewardsPage = lazy(() => import('./rewards/RewardsPage')); +const StakingPage = lazy(() => import('./staking/StakingPage')); +const GovernancePage = lazy(() => import('./Governance')); + +export default () => { + const { isTablet } = useBreakpoints(); + const stringGetter = useStringGetter(); + + const routesComponent = ( + }> + + } /> + } /> + } /> + } /> + + + ); + + return ( + + + + + ), + label: stringGetter({ key: STRING_KEYS.TRADING_REWARDS }), + href: TokenRoute.TradingRewards, + }, + { + value: TokenRoute.StakingRewards, + slotBefore: ( + + + + ), + label: 'Staking Rewards', // stringGetter({ key: STRING_KEYS.STAKING_REWARDS }), + href: TokenRoute.StakingRewards, + tag: stringGetter({ key: STRING_KEYS.NEW }), + }, + { + value: TokenRoute.Governance, + slotBefore: ( + + + + ), + label: stringGetter({ key: STRING_KEYS.GOVERNANCE }), + href: TokenRoute.Governance, + }, + ], + }, + ]} + /> + + ) + } + > + {routesComponent} + + ); +}; + +const Styled: Record = {}; + +Styled.SideBar = styled.div` + ${layoutMixins.flexColumn} + justify-content: space-between; + + height: 100%; +`; + +Styled.Footer = styled.div` + ${layoutMixins.row} + flex-wrap: wrap; + + padding: 1rem; + + gap: 0.5rem; + + > button { + flex-grow: 1; + } +`; + +Styled.NavigationMenu = styled(NavigationMenu)` + padding: 0.5rem; + padding-top: 0; +`; + +Styled.IconContainer = styled.div` + width: 1.5rem; + height: 1.5rem; + font-size: 0.75rem; + display: flex; + justify-content: center; + align-items: center; + background-color: var(--color-layer-4); + border-radius: 50%; + margin-left: -0.25rem; +`; diff --git a/src/pages/rewards/DYDXBalancePanel.tsx b/src/pages/token/rewards/DYDXBalancePanel.tsx similarity index 100% rename from src/pages/rewards/DYDXBalancePanel.tsx rename to src/pages/token/rewards/DYDXBalancePanel.tsx diff --git a/src/pages/rewards/GovernancePanel.tsx b/src/pages/token/rewards/GovernancePanel.tsx similarity index 94% rename from src/pages/rewards/GovernancePanel.tsx rename to src/pages/token/rewards/GovernancePanel.tsx index 2cfde09..6796a6a 100644 --- a/src/pages/rewards/GovernancePanel.tsx +++ b/src/pages/token/rewards/GovernancePanel.tsx @@ -14,13 +14,14 @@ import { Link } from '@/components/Link'; import { openDialog } from '@/state/dialogs'; -export const GovernancePanel = () => { +export const GovernancePanel = ({ className }: { className?: string }) => { const stringGetter = useStringGetter(); const dispatch = useDispatch(); const { governanceLearnMore } = useURLConfigs(); return ( {stringGetter({ key: STRING_KEYS.GOVERNANCE })} } @@ -72,4 +73,4 @@ Styled.Title = styled.h3` font: var(--font-medium-book); color: var(--color-text-2); margin-bottom: -1rem; -`; \ No newline at end of file +`; diff --git a/src/pages/rewards/LaunchIncentivesPanel.tsx b/src/pages/token/rewards/LaunchIncentivesPanel.tsx similarity index 96% rename from src/pages/rewards/LaunchIncentivesPanel.tsx rename to src/pages/token/rewards/LaunchIncentivesPanel.tsx index c5283a7..3cb7334 100644 --- a/src/pages/rewards/LaunchIncentivesPanel.tsx +++ b/src/pages/token/rewards/LaunchIncentivesPanel.tsx @@ -28,7 +28,7 @@ import { log } from '@/lib/telemetry'; const SEASON_NUMBER = 2; -export const LaunchIncentivesPanel = () => { +export const LaunchIncentivesPanel = ({ className }: { className?: string }) => { const { isNotTablet } = useBreakpoints(); const dispatch = useDispatch(); @@ -37,11 +37,15 @@ export const LaunchIncentivesPanel = () => { }, []); return isNotTablet ? ( - } slotRight={}> + } + slotRight={} + > ) : ( - + diff --git a/src/pages/rewards/MigratePanel.tsx b/src/pages/token/rewards/MigratePanel.tsx similarity index 100% rename from src/pages/rewards/MigratePanel.tsx rename to src/pages/token/rewards/MigratePanel.tsx diff --git a/src/pages/rewards/NewMarketsPanel.tsx b/src/pages/token/rewards/NewMarketsPanel.tsx similarity index 94% rename from src/pages/rewards/NewMarketsPanel.tsx rename to src/pages/token/rewards/NewMarketsPanel.tsx index a88d80b..26f0c2f 100644 --- a/src/pages/rewards/NewMarketsPanel.tsx +++ b/src/pages/token/rewards/NewMarketsPanel.tsx @@ -19,21 +19,22 @@ import { Tag } from '@/components/Tag'; import { MustBigNumber } from '@/lib/numbers'; import { layoutMixins } from '@/styles/layoutMixins'; -export const NewMarketsPanel = () => { +export const NewMarketsPanel = ({ className }: { className?: string }) => { const stringGetter = useStringGetter(); const navigate = useNavigate(); const { hasPotentialMarketsData } = usePotentialMarkets(); const { chainTokenDecimals, chainTokenLabel } = useTokenConfigs(); const { newMarketProposal } = useGovernanceVariables(); + const initialDepositAmountDecimals = isMainnet ? 0 : 11; const initialDepositAmountBN = MustBigNumber(newMarketProposal.initialDepositAmount).div( Number(`1e${chainTokenDecimals}`) ); - const initialDepositAmountDecimals = isMainnet ? 0 : chainTokenDecimals; if (!hasPotentialMarketsData) return null; return ( {stringGetter({ key: STRING_KEYS.ADD_A_MARKET })} diff --git a/src/pages/rewards/RewardHistoryPanel.tsx b/src/pages/token/rewards/RewardHistoryPanel.tsx similarity index 100% rename from src/pages/rewards/RewardHistoryPanel.tsx rename to src/pages/token/rewards/RewardHistoryPanel.tsx diff --git a/src/pages/rewards/RewardsHelpPanel.tsx b/src/pages/token/rewards/RewardsHelpPanel.tsx similarity index 100% rename from src/pages/rewards/RewardsHelpPanel.tsx rename to src/pages/token/rewards/RewardsHelpPanel.tsx diff --git a/src/pages/rewards/RewardsPage.tsx b/src/pages/token/rewards/RewardsPage.tsx similarity index 58% rename from src/pages/rewards/RewardsPage.tsx rename to src/pages/token/rewards/RewardsPage.tsx index c68df83..b550f36 100644 --- a/src/pages/rewards/RewardsPage.tsx +++ b/src/pages/token/rewards/RewardsPage.tsx @@ -10,6 +10,8 @@ import { breakpoints } from '@/styles'; import { layoutMixins } from '@/styles/layoutMixins'; import { BackButton } from '@/components/BackButton'; +import { DetachedSection } from '@/components/ContentSection'; +import { ContentSectionHeader } from '@/components/ContentSectionHeader'; import { testFlags } from '@/lib/testFlags'; @@ -19,9 +21,6 @@ import { MigratePanel } from './MigratePanel'; import { RewardsHelpPanel } from './RewardsHelpPanel'; import { TradingRewardsSummaryPanel } from './TradingRewardsSummaryPanel'; import { RewardHistoryPanel } from './RewardHistoryPanel'; -import { GovernancePanel } from './GovernancePanel'; -import { StakingPanel } from './StakingPanel'; -import { NewMarketsPanel } from './NewMarketsPanel'; const RewardsPage = () => { const stringGetter = useStringGetter(); @@ -29,46 +28,45 @@ const RewardsPage = () => { const navigate = useNavigate(); return ( - +
{isTablet && ( - - navigate(AppRoute.Profile)} /> - {stringGetter({ key: STRING_KEYS.TRADING_REWARDS })} - + navigate(AppRoute.Profile)} />} + /> )} - - {import.meta.env.VITE_V3_TOKEN_ADDRESS && isNotTablet && } + + + {import.meta.env.VITE_V3_TOKEN_ADDRESS && isNotTablet && } - {isTablet ? ( - - ) : ( - <> + {isTablet ? ( - - - )} + ) : ( + <> + + + + )} - {testFlags.showTradingRewards && ( - - - {isTablet && } - - - )} + {testFlags.showTradingRewards && ( + + + {isTablet && } + + + )} - {isNotTablet && ( - - - - - - - )} - - + {isNotTablet && ( + + + + )} + + +
); }; @@ -76,27 +74,6 @@ export default RewardsPage; const Styled: Record = {}; -Styled.Page = styled.div` - ${layoutMixins.contentContainerPage} - padding: 2rem; - align-items: center; - - > * { - --content-max-width: 80rem; - max-width: min(calc(100vw - 4rem), var(--content-max-width)); - } - - @media ${breakpoints.tablet} { - --stickyArea-topHeight: var(--page-header-height-mobile); - padding: 0 1rem 1rem; - - > * { - max-width: calc(100vw - 2rem); - width: 100%; - } - } -`; - Styled.MobileHeader = styled.header` ${layoutMixins.contentSectionDetachedScrollable} ${layoutMixins.stickyHeader} @@ -113,6 +90,7 @@ Styled.GridLayout = styled.div<{ showTradingRewards?: boolean; showMigratePanel? display: grid; grid-template-columns: 2fr 1fr; gap: var(--gap); + max-width: 80rem; > * { gap: var(--gap); @@ -123,24 +101,39 @@ Styled.GridLayout = styled.div<{ showTradingRewards?: boolean; showMigratePanel? ? css` grid-template-areas: 'migrate migrate' - 'incentives balance' + 'incentives incentives' + 'balance balance' 'rewards other'; ` : showTradingRewards ? css` - grid-template-areas: 'incentives balance' 'rewards other'; + grid-template-areas: + 'incentives balance' + 'rewards other'; ` : showMigratePanel ? css` - grid-template-areas: 'migrate migrate' 'incentives balance' 'other other'; + grid-template-areas: + 'migrate migrate' + 'incentives incentives' + 'balance balance' + 'other other'; ` : css` - grid-template-areas: 'incentives balance' 'other other'; + grid-template-areas: + 'incentives balance' + 'other other'; `}; + @media ${breakpoints.notTablet} { + padding: 1rem; + } + @media ${breakpoints.tablet} { --gap: 1rem; grid-template-columns: 1fr; + width: calc(100vw - 2rem); + margin: 0 auto; ${({ showTradingRewards }) => showTradingRewards @@ -187,13 +180,3 @@ Styled.OtherColumn = styled.div<{ showTradingRewards?: boolean }>` } `} `; - -Styled.RewardHistoryHeader = styled.div` - h3 { - font: var(--font-medium-book); - color: var(--color-text-2); - } - - padding: 1rem 1.5rem 0; - margin-bottom: -0.5rem; -`; diff --git a/src/pages/rewards/TradingRewardsSummaryPanel.tsx b/src/pages/token/rewards/TradingRewardsSummaryPanel.tsx similarity index 96% rename from src/pages/rewards/TradingRewardsSummaryPanel.tsx rename to src/pages/token/rewards/TradingRewardsSummaryPanel.tsx index 13871bf..c76940a 100644 --- a/src/pages/rewards/TradingRewardsSummaryPanel.tsx +++ b/src/pages/token/rewards/TradingRewardsSummaryPanel.tsx @@ -3,8 +3,8 @@ import styled, { AnyStyledComponent } from 'styled-components'; import { shallowEqual, useSelector } from 'react-redux'; import { STRING_KEYS } from '@/constants/localization'; -import { layoutMixins } from '@/styles/layoutMixins'; import { useStringGetter, useTokenConfigs } from '@/hooks'; +import { layoutMixins } from '@/styles/layoutMixins'; import { AssetIcon } from '@/components/AssetIcon'; import { Details } from '@/components/Details'; @@ -18,7 +18,10 @@ import abacusStateManager from '@/lib/abacus'; export const TradingRewardsSummaryPanel = () => { const stringGetter = useStringGetter(); const { chainTokenLabel } = useTokenConfigs(); - const currentWeekTradingReward = useSelector(getHistoricalTradingRewardsForCurrentWeek, shallowEqual); + const currentWeekTradingReward = useSelector( + getHistoricalTradingRewardsForCurrentWeek, + shallowEqual + ); useEffect(() => { abacusStateManager.refreshHistoricalTradingRewards(); diff --git a/src/pages/token/staking/StakingPage.tsx b/src/pages/token/staking/StakingPage.tsx new file mode 100644 index 0000000..ff95117 --- /dev/null +++ b/src/pages/token/staking/StakingPage.tsx @@ -0,0 +1,67 @@ +import styled, { AnyStyledComponent } from 'styled-components'; + +import { breakpoints } from '@/styles'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { DetachedSection } from '@/components/ContentSection'; +import { ContentSectionHeader } from '@/components/ContentSectionHeader'; + +import { StakingPanel } from './StakingPanel'; +import { StrideStakingPanel } from './StrideStakingPanel'; +import { DYDXBalancePanel } from '../rewards/DYDXBalancePanel'; + +export default () => { + return ( + + + + + + + + + + + + + + + + ); +}; + +const Styled: Record = {}; + +Styled.HeaderSection = styled.section` + ${layoutMixins.contentSectionDetached} + + @media ${breakpoints.tablet} { + ${layoutMixins.flexColumn} + gap: 1rem; + + margin-bottom: 0.5rem; + } +`; + +Styled.ContentWrapper = styled.div` + ${layoutMixins.flexColumn} + gap: 1.5rem; + max-width: 80rem; + padding: 0 1rem; +`; + +Styled.Row = styled.div` + gap: 1rem; + display: grid; + grid-template-columns: 2fr 1fr; +`; + +Styled.InnerRow = styled.div` + gap: 1rem; + display: grid; + grid-template-columns: 1fr 1fr; + height: fit-content; +`; diff --git a/src/pages/rewards/StakingPanel.tsx b/src/pages/token/staking/StakingPanel.tsx similarity index 67% rename from src/pages/rewards/StakingPanel.tsx rename to src/pages/token/staking/StakingPanel.tsx index 9d2a1a6..4636a9e 100644 --- a/src/pages/rewards/StakingPanel.tsx +++ b/src/pages/token/staking/StakingPanel.tsx @@ -1,7 +1,6 @@ import styled, { AnyStyledComponent } from 'styled-components'; import { useDispatch } from 'react-redux'; -import { ButtonAction, ButtonSize } from '@/constants/buttons'; import { STRING_KEYS } from '@/constants/localization'; import { DialogTypes } from '@/constants/dialogs'; @@ -14,22 +13,19 @@ import { Link } from '@/components/Link'; import { openDialog } from '@/state/dialogs'; -export const StakingPanel = () => { +export const StakingPanel = ({ className }: { className?: string }) => { const stringGetter = useStringGetter(); const dispatch = useDispatch(); const { stakingLearnMore } = useURLConfigs(); return ( - {stringGetter({ key: STRING_KEYS.STAKING })}} - slotRight={ - - - + + Stake with Keplr + + } onClick={() => dispatch(openDialog({ type: DialogTypes.ExternalNavKeplr }))} > @@ -39,12 +35,40 @@ export const StakingPanel = () => { {stringGetter({ key: STRING_KEYS.LEARN_MORE })} → - +
); }; const Styled: Record = {}; +Styled.Panel = styled(Panel)` + align-items: start; + + header { + justify-content: unset; + padding-bottom: 0; + } +`; + +Styled.Header = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; +`; + +Styled.Title = styled.h3` + font: var(--font-medium-book); + color: var(--color-text-2); +`; + +Styled.Img = styled.img` + width: 2rem; + height: 2rem; + margin-left: 0.5rem; +`; + Styled.Description = styled.div` color: var(--color-text-0); --link-color: var(--color-text-1); @@ -61,13 +85,3 @@ Styled.IconButton = styled(IconButton)` color: var(--color-text-0); --color-border: var(--color-layer-6); `; - -Styled.Arrow = styled.div` - padding-right: 1.5rem; -`; - -Styled.Title = styled.h3` - font: var(--font-medium-book); - color: var(--color-text-2); - margin-bottom: -1rem; -`; diff --git a/src/pages/token/staking/StrideStakingPanel.tsx b/src/pages/token/staking/StrideStakingPanel.tsx new file mode 100644 index 0000000..4eecd8e --- /dev/null +++ b/src/pages/token/staking/StrideStakingPanel.tsx @@ -0,0 +1,94 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import { useDispatch } from 'react-redux'; + +import { STRING_KEYS } from '@/constants/localization'; +import { DialogTypes } from '@/constants/dialogs'; +import { useStringGetter, useTokenConfigs, useURLConfigs } from '@/hooks'; + +import { IconButton } from '@/components/IconButton'; +import { Link } from '@/components/Link'; +import { Panel } from '@/components/Panel'; +import { Tag } from '@/components/Tag'; + +import { openDialog } from '@/state/dialogs'; + +export const StrideStakingPanel = ({ className }: { className?: string }) => { + const stringGetter = useStringGetter(); + const dispatch = useDispatch(); + const { stakingLearnMore } = useURLConfigs(); + const { chainTokenLabel } = useTokenConfigs(); + + return ( + + + Liquid Stake with Stride + {stringGetter({ key: STRING_KEYS.NEW })} + + + + } + onClick={() => dispatch(openDialog({ type: DialogTypes.ExternalNavStride }))} + > + + {`Stake your ${chainTokenLabel} tokens for st${chainTokenLabel} which you can deploy around the ecosystem.`} + e.stopPropagation()}> + {stringGetter({ key: STRING_KEYS.LEARN_MORE })} → + + + + ); +}; + +const Styled: Record = {}; + +Styled.Panel = styled(Panel)` + align-items: start; + + header { + justify-content: unset; + padding-bottom: 0; + } +`; + +Styled.Header = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; +`; + +Styled.Title = styled.h3` + font: var(--font-medium-book); + color: var(--color-text-2); + + display: flex; + align-items: center; + gap: 0.5ch; +`; + +Styled.Img = styled.img` + width: 2rem; + height: 2rem; + margin-left: 0.5rem; +`; + +Styled.Description = styled.div` + color: var(--color-text-0); + --link-color: var(--color-text-1); + + a { + display: inline; + ::before { + content: ' '; + } + } +`; + +Styled.IconButton = styled(IconButton)` + color: var(--color-text-0); + --color-border: var(--color-layer-6); +`; diff --git a/src/views/dialogs/ExternalLinkDialog.tsx b/src/views/dialogs/ExternalLinkDialog.tsx index ae2bdb8..e7d8648 100644 --- a/src/views/dialogs/ExternalLinkDialog.tsx +++ b/src/views/dialogs/ExternalLinkDialog.tsx @@ -1,3 +1,4 @@ +import type { ReactNode } from 'react'; import styled, { type AnyStyledComponent } from 'styled-components'; import { ButtonAction, ButtonType } from '@/constants/buttons'; @@ -10,18 +11,26 @@ import { Dialog } from '@/components/Dialog'; import { layoutMixins } from '@/styles/layoutMixins'; type ElementProps = { + buttonText?: ReactNode; link: string; linkDescription?: string; + title?: ReactNode; setIsOpen: (open: boolean) => void; }; -export const ExternalLinkDialog = ({ setIsOpen, link, linkDescription }: ElementProps) => { +export const ExternalLinkDialog = ({ + setIsOpen, + buttonText, + link, + linkDescription, + title, +}: ElementProps) => { const stringGetter = useStringGetter(); return (

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

diff --git a/src/views/dialogs/ExternalNavStrideDialog.tsx b/src/views/dialogs/ExternalNavStrideDialog.tsx new file mode 100644 index 0000000..cb5c584 --- /dev/null +++ b/src/views/dialogs/ExternalNavStrideDialog.tsx @@ -0,0 +1,137 @@ +import { useCallback } from 'react'; +import styled, { type AnyStyledComponent } from 'styled-components'; +import { useDispatch } from 'react-redux'; + +import { ButtonAction, ButtonSize, ButtonType } from '@/constants/buttons'; +import { DialogTypes } from '@/constants/dialogs'; +import { STRING_KEYS } from '@/constants/localization'; +import { useBreakpoints, useStringGetter, useURLConfigs } from '@/hooks'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { Button } from '@/components/Button'; +import { Dialog, DialogPlacement } from '@/components/Dialog'; +import { Icon, IconName } from '@/components/Icon'; +import { IconButton } from '@/components/IconButton'; + +import { closeDialog, openDialog } from '@/state/dialogs'; + +type ElementProps = { + setIsOpen: (open: boolean) => void; +}; + +export const ExternalNavStrideDialog = ({ setIsOpen }: ElementProps) => { + const stringGetter = useStringGetter(); + const { strideZoneApp, accountExportLearnMore } = useURLConfigs(); + const dispatch = useDispatch(); + const { isTablet } = useBreakpoints(); + + const openExternalNavDialog = useCallback(() => { + dispatch(closeDialog()); + dispatch( + openDialog({ + type: DialogTypes.ExternalLink, + dialogProps: { + buttonText: ( + + Liquid Stake on Stride + + ), + link: strideZoneApp, + title: 'Liquid staking and leaving website', + }, + }) + ); + }, [dispatch]); + + return ( + + + + + {stringGetter({ key: STRING_KEYS.YES })}, Navigate to Stride Zone. + + + + + + + + {stringGetter({ + key: STRING_KEYS.LEARN_TO_EXPORT, + params: { + STRONG_NO: {stringGetter({ key: STRING_KEYS.NO })}, + }, + })} + + + + + + + ); +}; + +const Styled: Record = {}; + +Styled.TextToggle = styled.div` + ${layoutMixins.stickyFooter} + color: var(--color-accent); + cursor: pointer; + + margin-top: auto; + + &:hover { + text-decoration: underline; + } +`; + +Styled.Content = styled.div` + ${layoutMixins.stickyArea0} + --stickyArea0-bottomHeight: 2rem; + --stickyArea0-bottomGap: 1rem; + --stickyArea0-totalInsetBottom: 0.5rem; + + ${layoutMixins.flexColumn} + gap: 1rem; +`; + +Styled.Button = styled(Button)` + --button-font: var(--font-base-book); + --button-padding: 0 1.5rem; + + gap: 0; + + justify-content: space-between; +`; + +Styled.IconButton = styled(IconButton)` + color: var(--color-text-0); + --color-border: var(--color-layer-6); +`; + +Styled.Span = styled.span` + display: flex; + align-items: center; + gap: 0.5ch; +`; diff --git a/src/views/menus/AccountMenu.tsx b/src/views/menus/AccountMenu.tsx index af4cb80..f40b2b4 100644 --- a/src/views/menus/AccountMenu.tsx +++ b/src/views/menus/AccountMenu.tsx @@ -1,4 +1,4 @@ -import { memo } from 'react'; +import { ElementType, memo } from 'react'; import styled, { AnyStyledComponent, css } from 'styled-components'; import { shallowEqual, useDispatch, useSelector } from 'react-redux'; import type { Dispatch } from '@reduxjs/toolkit'; @@ -106,7 +106,7 @@ export const AccountMenu = () => { {walletType && ( - + )} @@ -220,7 +220,7 @@ export const AccountMenu = () => { {onboardingState === OnboardingState.WalletConnected ? ( ) : onboardingState === OnboardingState.AccountConnected ? ( - walletType && + walletType && ) : null} {!isTablet && {truncateAddress(dydxAddress)}}