From 2704baf378435755950a92e9142048417ac5cd26 Mon Sep 17 00:00:00 2001 From: moo-onthelawn <70078372+moo-onthelawn@users.noreply.github.com> Date: Mon, 5 Feb 2024 10:22:00 -0500 Subject: [PATCH 01/19] Update PoweredBy string key to use all caps version (#272) * bump package + update stringkey * styling --- package.json | 2 +- pnpm-lock.yaml | 8 ++++---- src/pages/rewards/LaunchIncentivesPanel.tsx | 5 +++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 0775463..dee3e98 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "@cosmjs/tendermint-rpc": "^0.32.1", "@dydxprotocol/v4-abacus": "^1.3.2", "@dydxprotocol/v4-client-js": "^1.0.20", - "@dydxprotocol/v4-localization": "^1.1.19", + "@dydxprotocol/v4-localization": "^1.1.22", "@ethersproject/providers": "^5.7.2", "@js-joda/core": "^5.5.3", "@radix-ui/react-accordion": "^1.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7036164..40c1b4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,8 +36,8 @@ dependencies: specifier: ^1.0.20 version: 1.0.20 '@dydxprotocol/v4-localization': - specifier: ^1.1.19 - version: 1.1.19 + specifier: ^1.1.22 + version: 1.1.22 '@ethersproject/providers': specifier: ^5.7.2 version: 5.7.2 @@ -1135,8 +1135,8 @@ packages: - utf-8-validate dev: false - /@dydxprotocol/v4-localization@1.1.19: - resolution: {integrity: sha512-EA0J5dXyjFoAuSaEYOt066wEMJAXpSb1+ByAcxnEW1PbRznJ9LwrwNDlRtHQk0lkcWC5vdi+UtmSV8D2TsS+vQ==} + /@dydxprotocol/v4-localization@1.1.22: + resolution: {integrity: sha512-DURyvBx0qjXmtebSRMW4ZdTsX5xI8Mb6c7LQ8WUPU0O3Jr7n7iUT/phzZszTpwNOMFFMukMFtn7fHCgijw1TOg==} dev: false /@dydxprotocol/v4-proto@4.0.0-dev.0: diff --git a/src/pages/rewards/LaunchIncentivesPanel.tsx b/src/pages/rewards/LaunchIncentivesPanel.tsx index d37cd1e..c5283a7 100644 --- a/src/pages/rewards/LaunchIncentivesPanel.tsx +++ b/src/pages/rewards/LaunchIncentivesPanel.tsx @@ -117,7 +117,7 @@ const LaunchIncentivesContent = () => { {stringGetter({ key: STRING_KEYS.LAUNCH_INCENTIVES_DESCRIPTION })}{' '} - {stringGetter({ key: STRING_KEYS.POWERED_BY })} + {stringGetter({ key: STRING_KEYS.POWERED_BY_ALL_CAPS })} Date: Mon, 5 Feb 2024 12:24:12 -0500 Subject: [PATCH 02/19] Add historical trading rewards gated by feature flag (#260) * add historical trading rewards gated by feature flag --- package.json | 2 +- pnpm-lock.yaml | 179 ++++++++--------- src/components/Output.tsx | 11 +- src/components/Table.tsx | 12 +- src/constants/abacus.ts | 19 ++ src/constants/localization.ts | 2 +- src/constants/tooltips/trade.ts | 3 + src/lib/abacus/index.ts | 17 +- src/lib/abacus/stateNotification.ts | 7 + src/lib/testFlags.ts | 4 + src/pages/Profile.tsx | 180 +++++++++++------- src/pages/rewards/DYDXBalancePanel.tsx | 3 +- src/pages/rewards/RewardHistoryPanel.tsx | 105 ++++++++++ src/pages/rewards/RewardsHelpPanel.tsx | 28 ++- src/pages/rewards/RewardsPage.tsx | 148 ++++++++++---- .../rewards/TradingRewardsSummaryPanel.tsx | 134 +++++++++++++ src/state/account.ts | 6 + src/state/accountSelectors.ts | 35 ++++ .../tables/TradingRewardHistoryTable.tsx | 164 ++++++++++++++++ 19 files changed, 835 insertions(+), 224 deletions(-) create mode 100644 src/pages/rewards/RewardHistoryPanel.tsx create mode 100644 src/pages/rewards/TradingRewardsSummaryPanel.tsx create mode 100644 src/views/tables/TradingRewardHistoryTable.tsx diff --git a/package.json b/package.json index dee3e98..b03fda7 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@cosmjs/proto-signing": "^0.32.1", "@cosmjs/stargate": "^0.32.1", "@cosmjs/tendermint-rpc": "^0.32.1", - "@dydxprotocol/v4-abacus": "^1.3.2", + "@dydxprotocol/v4-abacus": "^1.4.0", "@dydxprotocol/v4-client-js": "^1.0.20", "@dydxprotocol/v4-localization": "^1.1.22", "@ethersproject/providers": "^5.7.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 40c1b4f..28f3fa6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,9 +1,5 @@ lockfileVersion: '6.0' -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - overrides: follow-redirects: 1.15.3 @@ -13,25 +9,25 @@ dependencies: version: 1.10.0 '@cosmjs/amino': specifier: ^0.32.1 - version: 0.32.1 + version: 0.32.2 '@cosmjs/crypto': specifier: ^0.32.1 - version: 0.32.1 + version: 0.32.2 '@cosmjs/encoding': specifier: ^0.32.1 - version: 0.32.1 + version: 0.32.2 '@cosmjs/proto-signing': specifier: ^0.32.1 - version: 0.32.1 + version: 0.32.2 '@cosmjs/stargate': specifier: ^0.32.1 - version: 0.32.1 + version: 0.32.2 '@cosmjs/tendermint-rpc': specifier: ^0.32.1 - version: 0.32.1 + version: 0.32.2 '@dydxprotocol/v4-abacus': - specifier: ^1.3.2 - version: 1.3.2 + specifier: ^1.4.0 + version: 1.4.0 '@dydxprotocol/v4-client-js': specifier: ^1.0.20 version: 1.0.20 @@ -382,7 +378,7 @@ packages: /@0xsquid/sdk@1.10.0: resolution: {integrity: sha512-NKxHYB+g/TMPY+XmCHs+LuhyfbhH4KvAbGpVBOBPXM9Q5FsKcKrDJpTd5YnGYCLF9B3qXAzVTR0XhiC73GmOOA==} dependencies: - '@cosmjs/encoding': 0.31.1 + '@cosmjs/encoding': 0.31.0 '@cosmjs/stargate': 0.31.0 axios: 0.27.2 cosmjs-types: 0.8.0 @@ -689,16 +685,16 @@ packages: resolution: {integrity: sha512-xJ5CCEK7H79FTpOuEmlpSzVI+ZeYESTVvO3wHDgbnceIyAne3C68SvyaKqLUR4uJB0Z4q4+DZHbqW6itUiv4lA==} dependencies: '@cosmjs/crypto': 0.31.0 - '@cosmjs/encoding': 0.31.1 - '@cosmjs/math': 0.31.1 - '@cosmjs/utils': 0.31.1 + '@cosmjs/encoding': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/utils': 0.31.0 dev: false - /@cosmjs/amino@0.32.1: - resolution: {integrity: sha512-5l2xQ2XuAhV/B3kTIMPBcVZ/OQ+9Yyddzw/lIVs4qE5e/oBI0PVNWXw1oyR0wgfGHrMUxgKjsoOOqE2IbXVyCw==} + /@cosmjs/amino@0.32.2: + resolution: {integrity: sha512-lcK5RCVm4OfdAooxKcF2+NwaDVVpghOq6o/A40c2mHXDUzUoRZ33VAHjVJ9Me6vOFxshrw/XEFn1f4KObntjYA==} dependencies: - '@cosmjs/crypto': 0.32.1 - '@cosmjs/encoding': 0.32.1 + '@cosmjs/crypto': 0.32.2 + '@cosmjs/encoding': 0.32.2 '@cosmjs/math': 0.32.2 '@cosmjs/utils': 0.32.2 dev: false @@ -753,19 +749,19 @@ packages: /@cosmjs/crypto@0.31.0: resolution: {integrity: sha512-UaqCe6Tgh0pe1QlZ66E13t6FlIF86QrnBXXq+EN7Xe1Rouza3fJ1ojGlPleJZkBoq3tAyYVIOOqdZIxtVj/sIQ==} dependencies: - '@cosmjs/encoding': 0.31.1 - '@cosmjs/math': 0.31.1 - '@cosmjs/utils': 0.31.1 + '@cosmjs/encoding': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/utils': 0.31.0 '@noble/hashes': 1.3.3 bn.js: 5.2.1 elliptic: 6.5.4 libsodium-wrappers-sumo: 0.7.11 dev: false - /@cosmjs/crypto@0.32.1: - resolution: {integrity: sha512-AsKucEg5o8evU0wXF/lDwX+ZSwCKF4bbc57nFzraHywlp3sNu4dfPPURoMrT0r7kT7wQZAy4Pdnvmm9nnCCm/Q==} + /@cosmjs/crypto@0.32.2: + resolution: {integrity: sha512-RuxrYKzhrPF9g6NmU7VEq++Hn1vZJjqqJpZ9Tmw9lOYOV8BUsv+j/0BE86kmWi7xVJ7EwxiuxYsKuM8IR18CIA==} dependencies: - '@cosmjs/encoding': 0.32.1 + '@cosmjs/encoding': 0.32.2 '@cosmjs/math': 0.32.2 '@cosmjs/utils': 0.32.2 '@noble/hashes': 1.3.3 @@ -790,16 +786,16 @@ packages: readonly-date: 1.0.0 dev: false - /@cosmjs/encoding@0.31.1: - resolution: {integrity: sha512-IuxP6ewwX6vg9sUJ8ocJD92pkerI4lyG8J5ynAM3NaX3q+n+uMoPRSQXNeL9bnlrv01FF1kIm8if/f5F7ZPtkA==} + /@cosmjs/encoding@0.31.0: + resolution: {integrity: sha512-NYGQDRxT7MIRSlcbAezwxK0FqnaSPKCH7O32cmfpHNWorFxhy9lwmBoCvoe59Kd0HmArI4h+NGzLEfX3OLnA4Q==} dependencies: base64-js: 1.5.1 bech32: 1.1.4 readonly-date: 1.0.0 dev: false - /@cosmjs/encoding@0.32.1: - resolution: {integrity: sha512-x60Lfds+Eq42rVV29NaoIAson3kBhATBI3zPp7X3GJTryBc5HFHQ6L/976tE1WB2DrvkfUdWS3ayCMVOY/qm1g==} + /@cosmjs/encoding@0.32.2: + resolution: {integrity: sha512-WX7m1wLpA9V/zH0zRcz4EmgZdAv1F44g4dbXOgNj1eXZw1PIGR12p58OEkLN51Ha3S4DKRtCv5CkhK1KHEvQtg==} dependencies: base64-js: 1.5.1 bech32: 1.1.4 @@ -859,12 +855,6 @@ packages: bn.js: 5.2.1 dev: false - /@cosmjs/math@0.31.1: - resolution: {integrity: sha512-kiuHV6m6DSB8/4UV1qpFhlc4ul8SgLXTGRlYkYiIIP4l0YNeJ+OpPYaOlEgx4Unk2mW3/O2FWYj7Jc93+BWXng==} - dependencies: - bn.js: 5.2.1 - dev: false - /@cosmjs/math@0.32.2: resolution: {integrity: sha512-b8+ruAAY8aKtVKWSft2IvtCVCUH1LigIlf9ALIiY8n9jtM4kMASiaRbQ/27etnSAInV88IaezKK9rQZrtxTjcw==} dependencies: @@ -888,19 +878,19 @@ packages: dependencies: '@cosmjs/amino': 0.31.0 '@cosmjs/crypto': 0.31.0 - '@cosmjs/encoding': 0.31.1 - '@cosmjs/math': 0.31.1 - '@cosmjs/utils': 0.31.1 + '@cosmjs/encoding': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/utils': 0.31.0 cosmjs-types: 0.8.0 long: 4.0.0 dev: false - /@cosmjs/proto-signing@0.32.1: - resolution: {integrity: sha512-IHJMXQ8XnfzR5K1hWb8VV/jEfJof6BL2mgGIA7X4hSPegwoVfb9hnFKPEPgFjGCTTvGZ8SfnCdXxpsOjianVIA==} + /@cosmjs/proto-signing@0.32.2: + resolution: {integrity: sha512-UV4WwkE3W3G3s7wwU9rizNcUEz2g0W8jQZS5J6/3fiN0mRPwtPKQ6EinPN9ASqcAJ7/VQH4/9EPOw7d6XQGnqw==} dependencies: - '@cosmjs/amino': 0.32.1 - '@cosmjs/crypto': 0.32.1 - '@cosmjs/encoding': 0.32.1 + '@cosmjs/amino': 0.32.2 + '@cosmjs/crypto': 0.32.2 + '@cosmjs/encoding': 0.32.2 '@cosmjs/math': 0.32.2 '@cosmjs/utils': 0.32.2 cosmjs-types: 0.9.0 @@ -968,7 +958,7 @@ packages: dependencies: '@confio/ics23': 0.6.8 '@cosmjs/amino': 0.31.0 - '@cosmjs/encoding': 0.31.1 + '@cosmjs/encoding': 0.31.0 '@cosmjs/math': 0.31.0 '@cosmjs/proto-signing': 0.31.0 '@cosmjs/stream': 0.31.0 @@ -984,16 +974,16 @@ packages: - utf-8-validate dev: false - /@cosmjs/stargate@0.32.1: - resolution: {integrity: sha512-S0E1qKQ2CMJU79G8bQTquTyrbU03gFsvCkbo3RvK8v2OltVCByjFNh+0nGN5do+uDOzwwmDvnNLhR+SaIyNQoQ==} + /@cosmjs/stargate@0.32.2: + resolution: {integrity: sha512-AsJa29fT7Jd4xt9Ai+HMqhyj7UQu7fyYKdXj/8+/9PD74xe6lZSYhQPcitUmMLJ1ckKPgXSk5Dd2LbsQT0IhZg==} dependencies: '@confio/ics23': 0.6.8 - '@cosmjs/amino': 0.32.1 - '@cosmjs/encoding': 0.32.1 + '@cosmjs/amino': 0.32.2 + '@cosmjs/encoding': 0.32.2 '@cosmjs/math': 0.32.2 - '@cosmjs/proto-signing': 0.32.1 + '@cosmjs/proto-signing': 0.32.2 '@cosmjs/stream': 0.32.2 - '@cosmjs/tendermint-rpc': 0.32.1 + '@cosmjs/tendermint-rpc': 0.32.2 '@cosmjs/utils': 0.32.2 cosmjs-types: 0.9.0 xstream: 11.14.0 @@ -1044,12 +1034,12 @@ packages: resolution: {integrity: sha512-yo9xbeuI6UoEKIhFZ9g0dvUKLqnBzwdpEc/uldQygQc51j38gQVwFko+6sjmhieJqRYYvrYumcbJMiV6GFM9aA==} dependencies: '@cosmjs/crypto': 0.31.0 - '@cosmjs/encoding': 0.31.1 + '@cosmjs/encoding': 0.31.0 '@cosmjs/json-rpc': 0.31.0 - '@cosmjs/math': 0.31.1 + '@cosmjs/math': 0.31.0 '@cosmjs/socket': 0.31.0 '@cosmjs/stream': 0.31.0 - '@cosmjs/utils': 0.31.1 + '@cosmjs/utils': 0.31.0 axios: 0.21.4 readonly-date: 1.0.0 xstream: 11.14.0 @@ -1059,11 +1049,11 @@ packages: - utf-8-validate dev: false - /@cosmjs/tendermint-rpc@0.32.1: - resolution: {integrity: sha512-4uGSxB2JejWhwBUgxca4GqcK/BGnCFMIP7ptwEledrC3AY/shPeIYcPXWEBwO7sfwCta8DhAOCLrc9zhVC+VAQ==} + /@cosmjs/tendermint-rpc@0.32.2: + resolution: {integrity: sha512-DXyJHDmcAfCix4H/7/dKR0UMdshP01KxJOXHdHxBCbLIpck94BsWD3B2ZTXwfA6sv98so9wOzhp7qGQa5malxg==} dependencies: - '@cosmjs/crypto': 0.32.1 - '@cosmjs/encoding': 0.32.1 + '@cosmjs/crypto': 0.32.2 + '@cosmjs/encoding': 0.32.2 '@cosmjs/json-rpc': 0.32.2 '@cosmjs/math': 0.32.2 '@cosmjs/socket': 0.32.2 @@ -1090,10 +1080,6 @@ packages: resolution: {integrity: sha512-nNcycZWUYLNJlrIXgpcgVRqdl6BXjF4YlXdxobQWpW9Tikk61bEGeAFhDYtC0PwHlokCNw0KxWiHGJL4nL7Q5A==} dev: false - /@cosmjs/utils@0.31.1: - resolution: {integrity: sha512-n4Se1wu4GnKwztQHNFfJvUeWcpvx3o8cWhSbNs9JQShEuB3nv3R5lqFBtDCgHZF/emFQAP+ZjF8bTfCs9UBGhA==} - dev: false - /@cosmjs/utils@0.32.2: resolution: {integrity: sha512-Gg5t+eR7vPJMAmhkFt6CZrzPd0EKpAslWwk5rFVYZpJsM8JG5KT9XQ99hgNM3Ov6ScNoIWbXkpX27F6A9cXR4Q==} dev: false @@ -1102,29 +1088,29 @@ packages: resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==} dev: true - /@dydxprotocol/v4-abacus@1.3.2: - resolution: {integrity: sha512-zo0IHjGMlJRKOYDgNqNFQ9GtBJKJP4+Y9YY7V0X3Wt61ppKAYzodaYQhc9V/RYchcZTtS/xkicLug444YrvehQ==} + /@dydxprotocol/v4-abacus@1.4.0: + resolution: {integrity: sha512-mkdkXQXTVF1K6UmZwIwLC9gjsXg+Nt3h5/iW+WriVv1cUMPmHfPyRWL31eDDvkVO5UeECf05kiYXPk1y+7dPuA==} dev: false /@dydxprotocol/v4-client-js@1.0.20: resolution: {integrity: sha512-dXKW2NC1XlVVIRKvHWVDofLZSCPTJAaRY5eXzxH5CcXpnl2kdXorr7ykqWZxW0jHFPWWvRSJtUDqZN1qFrEe/w==} dependencies: - '@cosmjs/amino': 0.32.1 - '@cosmjs/encoding': 0.32.1 + '@cosmjs/amino': 0.32.2 + '@cosmjs/encoding': 0.32.2 '@cosmjs/math': 0.32.2 - '@cosmjs/proto-signing': 0.32.1 - '@cosmjs/stargate': 0.32.1 - '@cosmjs/tendermint-rpc': 0.32.1 + '@cosmjs/proto-signing': 0.32.2 + '@cosmjs/stargate': 0.32.2 + '@cosmjs/tendermint-rpc': 0.32.2 '@cosmjs/utils': 0.32.2 '@dydxprotocol/v4-proto': 4.0.0-dev.0 '@osmonauts/lcd': 0.6.0 - '@scure/bip32': 1.3.3 - '@scure/bip39': 1.2.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 axios: 1.1.3 bech32: 1.1.4 bignumber.js: 9.1.1 cosmjs-types: 0.9.0 - ethereum-cryptography: 2.1.3 + ethereum-cryptography: 2.1.2 ethers: 6.6.1 long: 4.0.0 protobufjs: 6.11.4 @@ -2158,18 +2144,18 @@ packages: '@noble/hashes': 1.3.0 dev: false + /@noble/curves@1.1.0: + resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + dependencies: + '@noble/hashes': 1.3.1 + dev: false + /@noble/curves@1.2.0: resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} dependencies: '@noble/hashes': 1.3.2 dev: false - /@noble/curves@1.3.0: - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} - dependencies: - '@noble/hashes': 1.3.3 - dev: false - /@noble/ed25519@1.7.3: resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} dev: true @@ -5035,18 +5021,18 @@ packages: '@scure/base': 1.1.1 dev: false - /@scure/bip32@1.3.2: - resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + /@scure/bip32@1.3.1: + resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} dependencies: - '@noble/curves': 1.2.0 + '@noble/curves': 1.1.0 '@noble/hashes': 1.3.3 '@scure/base': 1.1.5 dev: false - /@scure/bip32@1.3.3: - resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} + /@scure/bip32@1.3.2: + resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} dependencies: - '@noble/curves': 1.3.0 + '@noble/curves': 1.2.0 '@noble/hashes': 1.3.3 '@scure/base': 1.1.5 dev: false @@ -5065,13 +5051,6 @@ packages: '@scure/base': 1.1.5 dev: false - /@scure/bip39@1.2.2: - resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} - dependencies: - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.5 - dev: false - /@solana/buffer-layout@4.0.1: resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} engines: {node: '>=5.10'} @@ -5083,7 +5062,7 @@ packages: resolution: {integrity: sha512-up5VG1dK+GPhykmuMIozJZBbVqpm77vbOG6/r5dS7NBGZonwHfTLdBbsYc3rjmaQ4DpCXUa3tUc4RZHRORvZrw==} dependencies: '@babel/runtime': 7.22.10 - '@noble/curves': 1.3.0 + '@noble/curves': 1.2.0 '@noble/hashes': 1.3.3 '@solana/buffer-layout': 4.0.1 agentkeepalive: 4.5.0 @@ -9307,13 +9286,13 @@ packages: fast-safe-stringify: 2.1.1 dev: false - /ethereum-cryptography@2.1.3: - resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} + /ethereum-cryptography@2.1.2: + resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} dependencies: - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@scure/bip32': 1.3.3 - '@scure/bip39': 1.2.2 + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@scure/bip32': 1.3.1 + '@scure/bip39': 1.2.1 dev: false /ethers@5.7.2: @@ -14933,3 +14912,7 @@ packages: /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: true + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false diff --git a/src/components/Output.tsx b/src/components/Output.tsx index 8df09d2..ec55d8f 100644 --- a/src/components/Output.tsx +++ b/src/components/Output.tsx @@ -65,6 +65,9 @@ type ElementProps = { resolution?: number; stripRelativeWords?: boolean; }; + timeOptions?: { + useUTC?: boolean; + }; tag?: React.ReactNode; withParentheses?: boolean; locale?: string; @@ -89,6 +92,7 @@ export const Output = ({ relativeTimeFormatOptions = { format: 'singleCharacter', }, + timeOptions, tag, withParentheses, locale = navigator.language || 'en-US', @@ -166,16 +170,21 @@ export const Output = ({ if ((typeof value !== 'string' && typeof value !== 'number') || !value) return null; const date = new Date(value); const dateString = { - [OutputType.Date]: date.toLocaleString(selectedLocale, { dateStyle: 'medium' }), + [OutputType.Date]: date.toLocaleString(selectedLocale, { + dateStyle: 'medium', + timeZone: timeOptions?.useUTC ? 'UTC' : undefined, + }), [OutputType.DateTime]: date.toLocaleString(selectedLocale, { dateStyle: 'short', timeStyle: 'short', + timeZone: timeOptions?.useUTC ? 'UTC' : undefined, }), [OutputType.Time]: date.toLocaleString(selectedLocale, { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit', + timeZone: timeOptions?.useUTC ? 'UTC' : undefined, }), }[type]; diff --git a/src/components/Table.tsx b/src/components/Table.tsx index ce2c89b..7c0d692 100644 --- a/src/components/Table.tsx +++ b/src/components/Table.tsx @@ -68,7 +68,7 @@ export type TableItem = { onSelect?: (key: TableRowData) => void; }; -type ColumnDef = { +export type ColumnDef = { columnKey: string; label: React.ReactNode; tag?: React.ReactNode; @@ -513,7 +513,7 @@ const TableColumnHeader = ({ export const ViewMoreRow = ({ colSpan, onClick }: { colSpan: number; onClick: () => void }) => { const stringGetter = useStringGetter(); return ( - + e.preventDefault()} @@ -523,7 +523,7 @@ export const ViewMoreRow = ({ colSpan, onClick }: { colSpan: number; onClick: () {stringGetter({ key: STRING_KEYS.VIEW_MORE })} - + ); }; @@ -673,6 +673,8 @@ Styled.TableWrapper = styled.div<{ --table-lastColumn-cell-align: end; // start | center | end | var(--table-cell-align) --tableCell-padding: 0 1rem; + --tableViewMore-borderColor: inherit; + // Rules flex: 1; @@ -984,3 +986,7 @@ Styled.ViewMoreButton = styled(Button)` margin-left: 0.5ch; } `; + +Styled.ViewMoreTr = styled(Styled.Tr)` + --border-color: var(--tableViewMore-borderColor); +`; diff --git a/src/constants/abacus.ts b/src/constants/abacus.ts index 1cdbfcc..ac44cf3 100644 --- a/src/constants/abacus.ts +++ b/src/constants/abacus.ts @@ -119,6 +119,13 @@ export const InputSelectionOption = Abacus.exchange.dydx.abacus.output.input.Sel // ------ Wallet ------ // export type Wallet = Abacus.exchange.dydx.abacus.output.Wallet; export type AccountBalance = Abacus.exchange.dydx.abacus.output.AccountBalance; +export type TradingRewards = Abacus.exchange.dydx.abacus.output.TradingRewards; +export type HistoricalTradingReward = Abacus.exchange.dydx.abacus.output.HistoricalTradingReward; +export const HistoricalTradingRewardsPeriod = + Abacus.exchange.dydx.abacus.state.manager.HistoricalTradingRewardsPeriod; +const historicalTradingRewardsPeriod = [...HistoricalTradingRewardsPeriod.values()] as const; +export type HistoricalTradingRewardsPeriods = (typeof historicalTradingRewardsPeriod)[number]; + export type Subaccount = Abacus.exchange.dydx.abacus.output.Subaccount; export type SubaccountPosition = Abacus.exchange.dydx.abacus.output.SubaccountPosition; export type SubaccountOrder = Abacus.exchange.dydx.abacus.output.SubaccountOrder; @@ -202,6 +209,9 @@ export const RestrictionType = Abacus.exchange.dydx.abacus.output.Restriction; const restrictionTypes = [...RestrictionType.values()] as const; export type RestrictionTypes = (typeof restrictionTypes)[number]; +// ------ Api data ------ // +export const ApiData = Abacus.exchange.dydx.abacus.state.manager.ApiData; + // ------ Enum Conversions ------ // type IfEquals = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 ? A @@ -236,6 +246,15 @@ export const HISTORICAL_PNL_PERIODS: Record< [HistoricalPnlPeriod.Period90d.name]: HistoricalPnlPeriod.Period90d, }; +export const HISTORICAL_TRADING_REWARDS_PERIODS: Record< + KotlinIrEnumValues, + HistoricalTradingRewardsPeriods +> = { + [HistoricalTradingRewardsPeriod.MONTHLY.name]: HistoricalTradingRewardsPeriod.MONTHLY, + [HistoricalTradingRewardsPeriod.WEEKLY.name]: HistoricalTradingRewardsPeriod.WEEKLY, + [HistoricalTradingRewardsPeriod.DAILY.name]: HistoricalTradingRewardsPeriod.DAILY, +}; + export const ORDER_STATUS_STRINGS: Record, string> = { [AbacusOrderStatus.open.name]: STRING_KEYS.OPEN_STATUS, [AbacusOrderStatus.open.rawValue]: STRING_KEYS.OPEN_STATUS, diff --git a/src/constants/localization.ts b/src/constants/localization.ts index 5ff02b2..3c77561 100644 --- a/src/constants/localization.ts +++ b/src/constants/localization.ts @@ -95,7 +95,7 @@ export type TooltipStrings = { stringParams?: any; urlConfigs?: LinksConfigs; }) => { - title: string; + title?: string; body: string; learnMoreLink?: string; }; diff --git a/src/constants/tooltips/trade.ts b/src/constants/tooltips/trade.ts index 081e3f0..4382ce8 100644 --- a/src/constants/tooltips/trade.ts +++ b/src/constants/tooltips/trade.ts @@ -198,4 +198,7 @@ export const tradeTooltips: TooltipStrings = { title: stringGetter({ key: TOOLTIP_STRING_KEYS.UNREALIZED_PNL_TITLE }), body: stringGetter({ key: TOOLTIP_STRING_KEYS.UNREALIZED_PNL_BODY }), }), + 'reward-history': ({ stringGetter }) => ({ + body: stringGetter({ key: TOOLTIP_STRING_KEYS.REWARD_HISTORY_BODY }), + }), } as const; diff --git a/src/lib/abacus/index.ts b/src/lib/abacus/index.ts index 199f834..c3be440 100644 --- a/src/lib/abacus/index.ts +++ b/src/lib/abacus/index.ts @@ -3,6 +3,8 @@ import type { LocalWallet } from '@dydxprotocol/v4-client-js'; import type { ClosePositionInputFields, Nullable, + HistoricalTradingRewardsPeriod, + HistoricalTradingRewardsPeriods, HumanReadablePlaceOrderPayload, HumanReadableCancelOrderPayload, TradeInputFields, @@ -23,6 +25,7 @@ import { CoroutineTimer, TransferType, AbacusAppConfig, + ApiData, } from '@/constants/abacus'; import { DEFAULT_MARKETID } from '@/constants/markets'; @@ -33,8 +36,6 @@ import type { RootStore } from '@/state/_store'; import { setTradeFormInputs } from '@/state/inputs'; import { getInputTradeOptions, getTransferInputs } from '@/state/inputsSelectors'; -import { testFlags } from '@/lib/testFlags'; - import AbacusRest from './rest'; import AbacusAnalytics from './analytics'; import AbacusWebsocket from './websocket'; @@ -227,6 +228,15 @@ class AbacusStateManager { this.stateManager.historicalPnlPeriod = period; }; + setHistoricalTradingRewardPeriod = ( + period: (typeof HistoricalTradingRewardsPeriod)[keyof typeof HistoricalTradingRewardsPeriod] + ) => { + this.stateManager.historicalTradingRewardPeriod = period; + }; + + refreshHistoricalTradingRewards = () => + this.stateManager.refresh(ApiData.HISTORICAL_TRADING_REWARDS); + switchNetwork = (network: DydxNetwork) => { this.stateManager.environmentId = network; @@ -278,6 +288,9 @@ class AbacusStateManager { getHistoricalPnlPeriod = (): Nullable => this.stateManager.historicalPnlPeriod; + getHistoricalTradingRewardPeriod = (): HistoricalTradingRewardsPeriods => + this.stateManager.historicalTradingRewardPeriod; + handleCandlesSubscription = ({ channelId, subscribe, diff --git a/src/lib/abacus/stateNotification.ts b/src/lib/abacus/stateNotification.ts index 216b7b7..b8b328c 100644 --- a/src/lib/abacus/stateNotification.ts +++ b/src/lib/abacus/stateNotification.ts @@ -29,6 +29,7 @@ import { setSubaccount, setTransfers, setWallet, + setTradingRewards, } from '@/state/account'; import { setApiState } from '@/state/app'; @@ -96,6 +97,12 @@ class AbacusStateNotifier implements AbacusStateNotificationProtocol { } } + if (changes.has(Changes.tradingRewards)) { + if (updatedState.account?.tradingRewards) { + dispatch(setTradingRewards(updatedState.account?.tradingRewards)); + } + } + if (changes.has(Changes.configs)) { dispatch(setConfigs(updatedState.configs)); } diff --git a/src/lib/testFlags.ts b/src/lib/testFlags.ts index 66c4b59..36f8a8b 100644 --- a/src/lib/testFlags.ts +++ b/src/lib/testFlags.ts @@ -26,6 +26,10 @@ class TestFlags { get addressOverride():string { return this.queryParams.address; } + + get showTradingRewards() { + return !!this.queryParams.tradingrewards; + } } export const testFlags = new TestFlags(); diff --git a/src/pages/Profile.tsx b/src/pages/Profile.tsx index 270131b..5136f43 100644 --- a/src/pages/Profile.tsx +++ b/src/pages/Profile.tsx @@ -23,7 +23,10 @@ import { AppRoute, PortfolioRoute, HistoryRoute } from '@/constants/routes'; import { wallets } from '@/constants/wallets'; import { useAccounts, useStringGetter, useTokenConfigs } from '@/hooks'; -import { getOnboardingState } from '@/state/accountSelectors'; +import { + getHistoricalTradingRewardsForCurrentWeek, + getOnboardingState, +} from '@/state/accountSelectors'; import { openDialog } from '@/state/dialogs'; import { isTruthy } from '@/lib/isTruthy'; @@ -52,6 +55,8 @@ const Profile = () => { chainId: ENS_CHAIN_ID, }); + const currentWeekTradingReward = useSelector(getHistoricalTradingRewardsForCurrentWeek); + const actions = [ { key: 'deposit', @@ -159,64 +164,62 @@ const Profile = () => { ); })} - - - - {stringGetter({ key: STRING_KEYS.SETTINGS })} - - } - onClick={() => navigate(AppRoute.Settings)} + + + + {stringGetter({ key: STRING_KEYS.SETTINGS })} + + } + onClick={() => navigate(AppRoute.Settings)} + /> + + + {stringGetter({ key: STRING_KEYS.HELP })} + + } + onClick={() => dispatch(openDialog({ type: DialogTypes.Help }))} + /> + + + + + + + - - - {stringGetter({ key: STRING_KEYS.HELP })} - - } - onClick={() => dispatch(openDialog({ type: DialogTypes.Help }))} + + + - + - - - - - - - - - - - - - { ]} withInnerBorders={false} /> - + - - + + ); }; @@ -245,14 +248,27 @@ const Styled: Record = {}; 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-areas: + 'header header' + 'actions actions' + 'settings help' + 'migrate migrate' + 'balance balance' + 'rewards fees' + 'history history' + 'governance governance' + 'staking staking'; `; Styled.Header = styled.header` + grid-area: header; ${layoutMixins.row} - padding: 0 1rem; `; @@ -299,6 +315,7 @@ Styled.Address = styled.h1` Styled.Actions = styled(Toolbar)` ${layoutMixins.spacedRow} --stickyArea-topHeight: 5rem; + grid-area: actions; > a, > label { @@ -329,22 +346,16 @@ Styled.ActionButton = styled(IconButton)<{ iconName?: IconName }>` `} `; -Styled.EqualGrid = styled.div` - ${layoutMixins.gridEqualColumns} - - gap: 1rem; -`; - Styled.Details = styled(Details)` font: var(--font-small-book); --details-value-font: var(--font-medium-book); `; Styled.RewardsPanel = styled(Panel)` + grid-area: rewards; align-self: flex-start; - - &, - > * { + height: 100%; + > div { height: 100%; } @@ -353,7 +364,12 @@ Styled.RewardsPanel = styled(Panel)` } `; -Styled.TablePanel = styled(Panel)` +Styled.FeesPanel = styled(Panel)` + grid-area: fees; +`; + +Styled.HistoryPanel = styled(Panel)` + grid-area: history; --panel-content-paddingY: 0; --panel-content-paddingX: 0; @@ -393,3 +409,27 @@ Styled.PanelButton = styled(Panel)` --panel-paddingY: 0 --panel-paddingX:0; `; + +Styled.SettingsButton = styled(Styled.PanelButton)` + grid-area: settings; +`; + +Styled.HelpButton = styled(Styled.PanelButton)` + grid-area: help; +`; + +Styled.MigratePanel = styled(MigratePanel)` + grid-area: migrate; +`; + +Styled.DYDXBalancePanel = styled(DYDXBalancePanel)` + grid-area: balance; +`; + +Styled.GovernancePanel = styled(GovernancePanel)` + grid-area: governance; +`; + +Styled.StakingPanel = styled(StakingPanel)` + grid-area: staking; +`; diff --git a/src/pages/rewards/DYDXBalancePanel.tsx b/src/pages/rewards/DYDXBalancePanel.tsx index 5300fc2..b601783 100644 --- a/src/pages/rewards/DYDXBalancePanel.tsx +++ b/src/pages/rewards/DYDXBalancePanel.tsx @@ -22,7 +22,7 @@ import { OnboardingTriggerButton } from '@/views/dialogs/OnboardingTriggerButton import { openDialog } from '@/state/dialogs'; import { calculateCanAccountTrade } from '@/state/accountCalculators'; -export const DYDXBalancePanel = () => { +export const DYDXBalancePanel = ({ className }: { className?: string }) => { const dispatch = useDispatch(); const stringGetter = useStringGetter(); @@ -33,6 +33,7 @@ export const DYDXBalancePanel = () => { return ( diff --git a/src/pages/rewards/RewardHistoryPanel.tsx b/src/pages/rewards/RewardHistoryPanel.tsx new file mode 100644 index 0000000..c79da79 --- /dev/null +++ b/src/pages/rewards/RewardHistoryPanel.tsx @@ -0,0 +1,105 @@ +import { useCallback, useState } from 'react'; +import styled, { AnyStyledComponent } from 'styled-components'; + +import { useStringGetter } from '@/hooks'; + +import { + HISTORICAL_TRADING_REWARDS_PERIODS, + HistoricalTradingRewardsPeriod, + HistoricalTradingRewardsPeriods, +} from '@/constants/abacus'; + +import { STRING_KEYS } from '@/constants/localization'; +import breakpoints from '@/styles/breakpoints'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { Panel } from '@/components/Panel'; +import { ToggleGroup } from '@/components/ToggleGroup'; +import { WithTooltip } from '@/components/WithTooltip'; +import { TradingRewardHistoryTable } from '@/views/tables/TradingRewardHistoryTable'; + +import abacusStateManager from '@/lib/abacus'; + +export const RewardHistoryPanel = () => { + const stringGetter = useStringGetter(); + + const [selectedPeriod, setSelectedPeriod] = useState( + abacusStateManager.getHistoricalTradingRewardPeriod() || HistoricalTradingRewardsPeriod.WEEKLY + ); + + const onSelectPeriod = useCallback( + (periodName: string) => { + const selectedPeriod = + HISTORICAL_TRADING_REWARDS_PERIODS[ + periodName as keyof typeof HISTORICAL_TRADING_REWARDS_PERIODS + ]; + setSelectedPeriod(selectedPeriod); + abacusStateManager.setHistoricalTradingRewardPeriod(selectedPeriod); + }, + [setSelectedPeriod, selectedPeriod] + ); + + return ( + + + +

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

+
+ {stringGetter({ key: STRING_KEYS.REWARD_HISTORY_DESCRIPTION })} +
+ + + } + > + +
+ ); +}; + +const Styled: Record = {}; + +Styled.Header = styled.div` + ${layoutMixins.spacedRow} + + padding: 1rem 1rem 0; + margin-bottom: -0.5rem; + + @media ${breakpoints.notTablet} { + padding: 1.25rem 1.5rem 0; + } +`; + +Styled.Title = styled.div` + ${layoutMixins.column} + color: var(--color-text-0); + font: var(--font-small-book); + + h3 { + font: var(--font-medium-book); + color: var(--color-text-2); + } +`; + +Styled.Content = styled.div` + ${layoutMixins.flexColumn} + gap: 0.75rem; +`; diff --git a/src/pages/rewards/RewardsHelpPanel.tsx b/src/pages/rewards/RewardsHelpPanel.tsx index ac26d95..6696e37 100644 --- a/src/pages/rewards/RewardsHelpPanel.tsx +++ b/src/pages/rewards/RewardsHelpPanel.tsx @@ -29,20 +29,18 @@ export const RewardsHelpPanel = () => { > @@ -72,7 +70,7 @@ Styled.Header = styled.div` font: var(--font-small-book); @media ${breakpoints.notTablet} { - padding: 1.5rem 1.25rem; + padding: 1.5rem; } h3 { diff --git a/src/pages/rewards/RewardsPage.tsx b/src/pages/rewards/RewardsPage.tsx index 4329ca6..c68df83 100644 --- a/src/pages/rewards/RewardsPage.tsx +++ b/src/pages/rewards/RewardsPage.tsx @@ -1,5 +1,4 @@ -import styled, { AnyStyledComponent } from 'styled-components'; -import { useDispatch } from 'react-redux'; +import styled, { AnyStyledComponent, css } from 'styled-components'; import { useNavigate } from 'react-router-dom'; import { STRING_KEYS } from '@/constants/localization'; @@ -11,18 +10,20 @@ import { breakpoints } from '@/styles'; import { layoutMixins } from '@/styles/layoutMixins'; import { BackButton } from '@/components/BackButton'; -import { Panel } from '@/components/Panel'; + +import { testFlags } from '@/lib/testFlags'; import { DYDXBalancePanel } from './DYDXBalancePanel'; import { LaunchIncentivesPanel } from './LaunchIncentivesPanel'; 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 dispatch = useDispatch(); const stringGetter = useStringGetter(); const { isTablet, isNotTablet } = useBreakpoints(); const navigate = useNavigate(); @@ -35,25 +36,38 @@ const RewardsPage = () => { {stringGetter({ key: STRING_KEYS.TRADING_REWARDS })} )} - {import.meta.env.VITE_V3_TOKEN_ADDRESS && isNotTablet && } + + {import.meta.env.VITE_V3_TOKEN_ADDRESS && isNotTablet && } - {isTablet ? ( - - ) : ( - - - - - )} - {isNotTablet && ( - - - - - - )} + {isTablet ? ( + + ) : ( + <> + + + + )} - + {testFlags.showTradingRewards && ( + + + {isTablet && } + + + )} + + {isNotTablet && ( + + + + + + + )} + ); }; @@ -64,7 +78,6 @@ const Styled: Record = {}; Styled.Page = styled.div` ${layoutMixins.contentContainerPage} - gap: 1.5rem; padding: 2rem; align-items: center; @@ -89,27 +102,98 @@ Styled.MobileHeader = styled.header` ${layoutMixins.stickyHeader} z-index: 2; padding: 1.25rem 0; - margin-bottom: -1.5rem; font: var(--font-large-medium); color: var(--color-text-2); background-color: var(--color-layer-2); `; -Styled.Panel = styled(Panel)` - height: fit-content; -`; +Styled.GridLayout = styled.div<{ showTradingRewards?: boolean; showMigratePanel?: boolean }>` + --gap: 1.5rem; + display: grid; + grid-template-columns: 2fr 1fr; + gap: var(--gap); -Styled.PanelRow = styled.div` - ${layoutMixins.gridEqualColumns} - gap: 1.5rem; + > * { + gap: var(--gap); + } + + ${({ showTradingRewards, showMigratePanel }) => + showTradingRewards && showMigratePanel + ? css` + grid-template-areas: + 'migrate migrate' + 'incentives balance' + 'rewards other'; + ` + : showTradingRewards + ? css` + grid-template-areas: 'incentives balance' 'rewards other'; + ` + : showMigratePanel + ? css` + grid-template-areas: 'migrate migrate' 'incentives balance' 'other other'; + ` + : css` + grid-template-areas: 'incentives balance' 'other other'; + `}; @media ${breakpoints.tablet} { - grid-auto-flow: row; + --gap: 1rem; grid-template-columns: 1fr; + + ${({ showTradingRewards }) => + showTradingRewards + ? css` + grid-template-areas: + 'incentives' + 'rewards'; + ` + : css` + grid-template-areas: 'incentives'; + `} } `; -Styled.PanelRowIncentivesAndBalance = styled(Styled.PanelRow)` - grid-template-columns: 2fr 1fr; +Styled.MigratePanel = styled(MigratePanel)` + grid-area: migrate; +`; + +Styled.LaunchIncentivesPanel = styled(LaunchIncentivesPanel)` + grid-area: incentives; +`; + +Styled.DYDXBalancePanel = styled(DYDXBalancePanel)` + grid-area: balance; +`; + +Styled.TradingRewardsColumn = styled.div` + grid-area: rewards; + ${layoutMixins.flexColumn} +`; + +Styled.OtherColumn = styled.div<{ showTradingRewards?: boolean }>` + grid-area: other; + ${layoutMixins.flexColumn} + + ${({ showTradingRewards }) => + !showTradingRewards && + css` + display: grid; + grid-template-columns: repeat(3, 1fr); + + > section:last-of-type { + grid-column: 1 / -1; + } + `} +`; + +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/rewards/TradingRewardsSummaryPanel.tsx new file mode 100644 index 0000000..13871bf --- /dev/null +++ b/src/pages/rewards/TradingRewardsSummaryPanel.tsx @@ -0,0 +1,134 @@ +import { useEffect } from 'react'; +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 { AssetIcon } from '@/components/AssetIcon'; +import { Details } from '@/components/Details'; +import { Output, OutputType } from '@/components/Output'; +import { Panel } from '@/components/Panel'; + +import { getHistoricalTradingRewardsForCurrentWeek } from '@/state/accountSelectors'; + +import abacusStateManager from '@/lib/abacus'; + +export const TradingRewardsSummaryPanel = () => { + const stringGetter = useStringGetter(); + const { chainTokenLabel } = useTokenConfigs(); + const currentWeekTradingReward = useSelector(getHistoricalTradingRewardsForCurrentWeek, shallowEqual); + + useEffect(() => { + abacusStateManager.refreshHistoricalTradingRewards(); + }, []); + + return !currentWeekTradingReward ? null : ( + {stringGetter({ key: STRING_KEYS.TRADING_REWARDS_SUMMARY })} + } + > + + +

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

+ + ), + value: ( + + } + type={OutputType.Asset} + value={currentWeekTradingReward.amount} + /> + + + → + + + + ), + }, + // TODO(@aforaleka): add all-time when supported + ]} + /> +
+
+ ); +}; + +const Styled: Record = {}; + +Styled.Header = styled.div` + padding: var(--panel-paddingY) var(--panel-paddingX) 0; + font: var(--font-medium-book); + color: var(--color-text-2); +`; + +Styled.Content = styled.div` + ${layoutMixins.flexColumn} + gap: 0.75rem; +`; + +Styled.TradingRewardsDetails = styled(Details)` + --details-item-backgroundColor: var(--color-layer-6); + + grid-template-columns: 1fr; // TODO(@aforaleka): change to 1fr 1fr when all-time is supported + gap: 1rem; + + > div { + gap: 0.5rem; + padding: 1rem; + border-radius: 0.75em; + background-color: var(--color-layer-5); + } + + dt { + width: 100%; + } + + output { + color: var(--color-text-2); + font: var(--font-large-book); + } +`; + +Styled.Label = styled.div` + ${layoutMixins.spacedRow} + + font: var(--font-base-book); + color: var(--color-text-1); +`; + +Styled.TimePeriod = styled.div` + ${layoutMixins.inlineRow} + + &, output { + color: var(--color-text-0); + font: var(--font-small-book); + } +`; + +Styled.Column = styled.div` + ${layoutMixins.flexColumn} + gap: 0.33rem; +`; + +Styled.AssetIcon = styled(AssetIcon)` + margin-left: 0.5ch; +`; diff --git a/src/state/account.ts b/src/state/account.ts index aae7b2d..57d7a54 100644 --- a/src/state/account.ts +++ b/src/state/account.ts @@ -13,6 +13,7 @@ import type { HistoricalPnlPeriods, SubAccountHistoricalPNLs, UsageRestriction, + TradingRewards, } from '@/constants/abacus'; import { OnboardingGuard, OnboardingState } from '@/constants/account'; @@ -24,6 +25,7 @@ import { getLocalStorage } from '@/lib/localStorage'; export type AccountState = { balances?: Record; stakingBalances?: Record; + tradingRewards?: TradingRewards; wallet?: Nullable; walletType?: WalletType; @@ -179,6 +181,9 @@ export const accountSlice = createSlice({ setStakingBalances: (state, action: PayloadAction>) => { state.stakingBalances = action.payload; }, + setTradingRewards: (state, action: PayloadAction) => { + state.tradingRewards = action.payload; + }, addUncommittedOrderClientId: (state, action: PayloadAction) => { state.uncommittedOrderClientIds.push(action.payload); }, @@ -206,6 +211,7 @@ export const { viewedOrders, setBalances, setStakingBalances, + setTradingRewards, addUncommittedOrderClientId, removeUncommittedOrderClientId, } = accountSlice.actions; diff --git a/src/state/accountSelectors.ts b/src/state/accountSelectors.ts index 809a027..e7390eb 100644 --- a/src/state/accountSelectors.ts +++ b/src/state/accountSelectors.ts @@ -1,3 +1,4 @@ +import type { Nullable, kollections } from '@dydxprotocol/v4-abacus'; import { OrderSide } from '@dydxprotocol/v4-client-js'; import { createSelector } from 'reselect'; @@ -9,6 +10,8 @@ import { AbacusOrderStatus, AbacusPositionSide, ORDER_SIDES, + HistoricalTradingReward, + HistoricalTradingRewardsPeriod, } from '@/constants/abacus'; import { OnboardingState } from '@/constants/account'; @@ -349,6 +352,38 @@ export const getBalances = (state: RootState) => state.account?.balances; * */ export const getStakingBalances = (state: RootState) => state.account?.stakingBalances; +/** + * @returns account all time trading rewards + */ +export const getTotalTradingRewards = (state: RootState) => state.account?.tradingRewards?.total; + +/** + * @returns account trading rewards aggregated by period + */ +export const getHistoricalTradingRewards = (state: RootState) => + state.account?.tradingRewards?.historical; + +/** + * @returns account historical trading rewards for the specified perid + */ +export const getHistoricalTradingRewardsForPeriod = (period: string) => + createSelector( + [getHistoricalTradingRewards], + ( + historicalTradingRewards: Nullable< + kollections.Map> + > + ) => historicalTradingRewards?.get(period) + ); + +/** + * @returns account historical trading rewards for the current week + */ +export const getHistoricalTradingRewardsForCurrentWeek = createSelector( + [getHistoricalTradingRewardsForPeriod(HistoricalTradingRewardsPeriod.WEEKLY.name)], + (historicalTradingRewards) => historicalTradingRewards?.firstOrNull() +); + /** * @returns UsageRestriction of the current session */ diff --git a/src/views/tables/TradingRewardHistoryTable.tsx b/src/views/tables/TradingRewardHistoryTable.tsx new file mode 100644 index 0000000..fd27bae --- /dev/null +++ b/src/views/tables/TradingRewardHistoryTable.tsx @@ -0,0 +1,164 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; +import { shallowEqual, useSelector } from 'react-redux'; + +import { HistoricalTradingRewardsPeriods, HistoricalTradingReward } from '@/constants/abacus'; +import { STRING_KEYS, StringGetterFunction } from '@/constants/localization'; +import { useStringGetter, useTokenConfigs } from '@/hooks'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { AssetIcon } from '@/components/AssetIcon'; +import { Output, OutputType } from '@/components/Output'; +import { Table, TableCell, type ColumnDef } from '@/components/Table'; + +import { + getHistoricalTradingRewards, + getHistoricalTradingRewardsForPeriod, +} from '@/state/accountSelectors'; + +export enum TradingRewardHistoryTableColumnKey { + Event = 'Event', + Earned = 'Earned', +} + +const getTradingRewardHistoryTableColumnDef = ({ + key, + chainTokenLabel, + stringGetter, +}: { + key: TradingRewardHistoryTableColumnKey; + chainTokenLabel: string; + stringGetter: StringGetterFunction; +}): ColumnDef => ({ + ...( + { + [TradingRewardHistoryTableColumnKey.Event]: { + columnKey: TradingRewardHistoryTableColumnKey.Event, + getCellValue: (row) => row.startedAtInMilliseconds, + label: stringGetter({ key: STRING_KEYS.EVENT }), + renderCell: ({ startedAtInMilliseconds, endedAtInMilliseconds }) => ( + + {stringGetter({ key: STRING_KEYS.REWARDED })} + + {stringGetter({ + key: STRING_KEYS.FOR_TRADING, + params: { + PERIOD: ( + <> + + → + + + ), + }, + })} + + + ), + }, + [TradingRewardHistoryTableColumnKey.Earned]: { + columnKey: TradingRewardHistoryTableColumnKey.Earned, + getCellValue: (row) => row.amount, + label: stringGetter({ key: STRING_KEYS.EARNED }), + renderCell: ({ amount }) => ( + } + /> + ), + }, + } as Record> + )[key], +}); + +type ElementProps = { + columnKeys?: TradingRewardHistoryTableColumnKey[]; + period: HistoricalTradingRewardsPeriods; +}; + +type StyleProps = { + withOuterBorder?: boolean; + withInnerBorders?: boolean; +}; + +export const TradingRewardHistoryTable = ({ + period, + columnKeys = Object.values(TradingRewardHistoryTableColumnKey), + withOuterBorder, + withInnerBorders = true, +}: ElementProps & StyleProps) => { + const stringGetter = useStringGetter(); + const { chainTokenLabel } = useTokenConfigs(); + + const periodTradingRewards = useSelector( + getHistoricalTradingRewardsForPeriod(period.name), + shallowEqual + ); + + return ( + row.startedAtInMilliseconds} + columns={columnKeys.map((key: TradingRewardHistoryTableColumnKey) => + getTradingRewardHistoryTableColumnDef({ + key, + chainTokenLabel, + stringGetter, + }) + )} + slotEmpty={ +
{stringGetter({ key: STRING_KEYS.EMPTY_HISTORICAL_REWARDS_DESCRIPTION })}
+ } + selectionBehavior="replace" + withOuterBorder={withOuterBorder} + withInnerBorders={withInnerBorders} + initialNumRowsToShow={5} + withScrollSnapColumns + withScrollSnapRows + /> + ); +}; + +const Styled: Record = {}; + +Styled.Table = styled(Table)` + --tableCell-padding: 0.5rem 0; + --tableHeader-backgroundColor: var(--color-layer-3); + --tableRow-backgroundColor: var(--color-layer-3); + --tableViewMore-borderColor: var(--color-layer-3); + + tbody { + font: var(--font-medium-book); + } +`; + +Styled.Rewarded = styled.span` + color: var(--color-text-2); +`; + +Styled.TimePeriod = styled.div` + ${layoutMixins.inlineRow} + + && { + color: var(--color-text-0); + font: var(--font-base-book); + } + + output { + color: var(--color-text-1); + font: var(--font-base-book); + } +`; + +Styled.AssetIcon = styled(AssetIcon)` + margin-left: 0.5ch; +`; From 2fc55bbe9f624d828fb8e10a2f4cb9990971caed Mon Sep 17 00:00:00 2001 From: moo-onthelawn <70078372+moo-onthelawn@users.noreply.github.com> Date: Mon, 5 Feb 2024 18:39:33 -0500 Subject: [PATCH 03/19] Bump abacus to enable ROC (#275) * bump * fixed --- package.json | 2 +- pnpm-lock.yaml | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index b03fda7..f2bba09 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@cosmjs/proto-signing": "^0.32.1", "@cosmjs/stargate": "^0.32.1", "@cosmjs/tendermint-rpc": "^0.32.1", - "@dydxprotocol/v4-abacus": "^1.4.0", + "@dydxprotocol/v4-abacus": "^1.4.1", "@dydxprotocol/v4-client-js": "^1.0.20", "@dydxprotocol/v4-localization": "^1.1.22", "@ethersproject/providers": "^5.7.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28f3fa6..94ab3fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5 +1,9 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + overrides: follow-redirects: 1.15.3 @@ -26,8 +30,8 @@ dependencies: specifier: ^0.32.1 version: 0.32.2 '@dydxprotocol/v4-abacus': - specifier: ^1.4.0 - version: 1.4.0 + specifier: ^1.4.1 + version: 1.4.1 '@dydxprotocol/v4-client-js': specifier: ^1.0.20 version: 1.0.20 @@ -1088,8 +1092,8 @@ packages: resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==} dev: true - /@dydxprotocol/v4-abacus@1.4.0: - resolution: {integrity: sha512-mkdkXQXTVF1K6UmZwIwLC9gjsXg+Nt3h5/iW+WriVv1cUMPmHfPyRWL31eDDvkVO5UeECf05kiYXPk1y+7dPuA==} + /@dydxprotocol/v4-abacus@1.4.1: + resolution: {integrity: sha512-u7OSQ2zPt0EqNlm0mE9L4gj4Xwbd7RDG/4fOyzrOZZsRgXedghXGBNxonbqgx6Rp7yRYfA4Il76y+k7EOZcU2Q==} dev: false /@dydxprotocol/v4-client-js@1.0.20: @@ -14912,7 +14916,3 @@ packages: /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: true - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false From 42595a366723189b43d7bd184f369fe14145be47 Mon Sep 17 00:00:00 2001 From: Jonathan Fung <121899091+jonfung-dydx@users.noreply.github.com> Date: Mon, 5 Feb 2024 17:25:29 -0700 Subject: [PATCH 04/19] Revert "Bump abacus to enable ROC (#275)" (#277) This reverts commit 2fc55bbe9f624d828fb8e10a2f4cb9990971caed. --- package.json | 2 +- pnpm-lock.yaml | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index f2bba09..b03fda7 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@cosmjs/proto-signing": "^0.32.1", "@cosmjs/stargate": "^0.32.1", "@cosmjs/tendermint-rpc": "^0.32.1", - "@dydxprotocol/v4-abacus": "^1.4.1", + "@dydxprotocol/v4-abacus": "^1.4.0", "@dydxprotocol/v4-client-js": "^1.0.20", "@dydxprotocol/v4-localization": "^1.1.22", "@ethersproject/providers": "^5.7.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 94ab3fe..28f3fa6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,9 +1,5 @@ lockfileVersion: '6.0' -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - overrides: follow-redirects: 1.15.3 @@ -30,8 +26,8 @@ dependencies: specifier: ^0.32.1 version: 0.32.2 '@dydxprotocol/v4-abacus': - specifier: ^1.4.1 - version: 1.4.1 + specifier: ^1.4.0 + version: 1.4.0 '@dydxprotocol/v4-client-js': specifier: ^1.0.20 version: 1.0.20 @@ -1092,8 +1088,8 @@ packages: resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==} dev: true - /@dydxprotocol/v4-abacus@1.4.1: - resolution: {integrity: sha512-u7OSQ2zPt0EqNlm0mE9L4gj4Xwbd7RDG/4fOyzrOZZsRgXedghXGBNxonbqgx6Rp7yRYfA4Il76y+k7EOZcU2Q==} + /@dydxprotocol/v4-abacus@1.4.0: + resolution: {integrity: sha512-mkdkXQXTVF1K6UmZwIwLC9gjsXg+Nt3h5/iW+WriVv1cUMPmHfPyRWL31eDDvkVO5UeECf05kiYXPk1y+7dPuA==} dev: false /@dydxprotocol/v4-client-js@1.0.20: @@ -14916,3 +14912,7 @@ packages: /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: true + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false From 44ed52d5e2b93a58e4a0dbf0f6229c59a221d28a Mon Sep 17 00:00:00 2001 From: aleka Date: Tue, 6 Feb 2024 11:48:49 -0500 Subject: [PATCH 05/19] add more controlled pagination to table (#276) --- src/components/Table.tsx | 25 +++++++++++++------ .../tables/TradingRewardHistoryTable.tsx | 2 +- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/components/Table.tsx b/src/components/Table.tsx index 7c0d692..d9dc80a 100644 --- a/src/components/Table.tsx +++ b/src/components/Table.tsx @@ -95,7 +95,10 @@ export type ElementProps void; slotEmpty?: React.ReactNode; - initialNumRowsToShow?: number; + viewMoreConfig?: { + initialNumRowsToShow: number; + numRowsPerPage?: number; + }; // collection: TableCollection; // children: React.ReactNode; }; @@ -125,7 +128,7 @@ export const Table = ({ selectionMode = 'single', selectionBehavior = 'toggle', slotEmpty, - initialNumRowsToShow, + viewMoreConfig, // shouldRowRender, // collection, @@ -141,8 +144,18 @@ export const Table = ({ style, }: ElementProps & StyleProps) => { const [selectedKeys, setSelectedKeys] = useState(new Set()); - const [numRowsToShow, setNumRowsToShow] = useState(initialNumRowsToShow); - const enableViewMore = numRowsToShow !== undefined; + const [numRowsToShow, setNumRowsToShow] = useState(viewMoreConfig?.initialNumRowsToShow); + const enableViewMore = viewMoreConfig !== undefined; + + const onViewMoreClick = () => { + if (!viewMoreConfig) return; + const { numRowsPerPage } = viewMoreConfig; + if (numRowsPerPage) { + setNumRowsToShow((prev) => (prev ?? 0) + numRowsPerPage); + } else { + setNumRowsToShow(data.length); + } + }; const currentBreakpoints = useBreakpoints(); const shownColumns = columns.filter( @@ -218,9 +231,7 @@ export const Table = ({ } numColumns={shownColumns.length} onViewMoreClick={ - enableViewMore && numRowsToShow < data.length - ? () => setNumRowsToShow(data.length) - : undefined + enableViewMore && numRowsToShow! < data.length ? onViewMoreClick : undefined } // shouldRowRender={shouldRowRender} hideHeader={hideHeader} diff --git a/src/views/tables/TradingRewardHistoryTable.tsx b/src/views/tables/TradingRewardHistoryTable.tsx index fd27bae..f856ed7 100644 --- a/src/views/tables/TradingRewardHistoryTable.tsx +++ b/src/views/tables/TradingRewardHistoryTable.tsx @@ -121,7 +121,7 @@ export const TradingRewardHistoryTable = ({ selectionBehavior="replace" withOuterBorder={withOuterBorder} withInnerBorders={withInnerBorders} - initialNumRowsToShow={5} + viewMoreConfig={{ initialNumRowsToShow: 5, numRowsPerPage: 10 }} withScrollSnapColumns withScrollSnapRows /> From b4f9f03bdc6326ff8b39cd0e3b787c9d92c427e4 Mon Sep 17 00:00:00 2001 From: Rui <102453770+ruixhuang@users.noreply.github.com> Date: Tue, 6 Feb 2024 09:09:02 -0800 Subject: [PATCH 06/19] Add Digital Asset Links for android app (#280) --- public/.well-known/assetlinks.json | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 public/.well-known/assetlinks.json diff --git a/public/.well-known/assetlinks.json b/public/.well-known/assetlinks.json new file mode 100644 index 0000000..35c6d16 --- /dev/null +++ b/public/.well-known/assetlinks.json @@ -0,0 +1,22 @@ +[ + { + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "exchange.dydx.trading.debug", + "sha256_cert_fingerprints": [ + "8A:9C:CC:49:B0:35:9A:91:67:CB:98:B0:B5:87:92:5F:9E:B7:EF:CE:A0:47:57:85:A4:35:3E:0C:E1:56:9E:A2" + ] + } + }, + { + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "exchange.dydx.trading", + "sha256_cert_fingerprints": [ + "B2:2D:CC:27:9D:52:05:98:63:C9:7B:34:36:70:A3:8E:00:31:28:08:2D:2E:70:76:C9:31:AE:F9:55:21:15:A5" + ] + } + } +] From ed3c336cc029023b180c72ffed15957edfd4e6e3 Mon Sep 17 00:00:00 2001 From: Bill Date: Tue, 6 Feb 2024 09:27:10 -0800 Subject: [PATCH 07/19] Add memo to transactions for onchain tracking (#279) --- src/constants/analytics.ts | 2 ++ src/hooks/useDydxClient.tsx | 4 +++- src/lib/abacus/dydxChainTransactions.ts | 18 ++++++++++++------ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/constants/analytics.ts b/src/constants/analytics.ts index 49598a3..5fefc73 100644 --- a/src/constants/analytics.ts +++ b/src/constants/analytics.ts @@ -173,3 +173,5 @@ export type AnalyticsEventData = validatorUrl: string; } : never; + +export const DEFAULT_TRANSACTION_MEMO = 'dYdX Frontend (web)'; diff --git a/src/hooks/useDydxClient.tsx b/src/hooks/useDydxClient.tsx index 581dd58..b629c18 100644 --- a/src/hooks/useDydxClient.tsx +++ b/src/hooks/useDydxClient.tsx @@ -16,6 +16,7 @@ import { import type { ResolutionString } from 'public/tradingview/charting_library'; import type { ConnectNetworkEvent, NetworkConfig } from '@/constants/abacus'; +import { DEFAULT_TRANSACTION_MEMO } from '@/constants/analytics'; import { type Candle, RESOLUTION_MAP } from '@/constants/candles'; import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; import { DydxChainAsset } from '@/constants/wallets'; @@ -83,7 +84,8 @@ const useDydxClientContext = () => { { broadcastPollIntervalMs: 3_000, broadcastTimeoutMs: 60_000, - } + }, + DEFAULT_TRANSACTION_MEMO ) ) ); diff --git a/src/lib/abacus/dydxChainTransactions.ts b/src/lib/abacus/dydxChainTransactions.ts index f0e5c6e..3185c3b 100644 --- a/src/lib/abacus/dydxChainTransactions.ts +++ b/src/lib/abacus/dydxChainTransactions.ts @@ -31,6 +31,7 @@ import { type HumanReadableTransferPayload, } from '@/constants/abacus'; +import { DEFAULT_TRANSACTION_MEMO } from '@/constants/analytics'; import { DialogTypes } from '@/constants/dialogs'; import { UNCOMMITTED_ORDER_TIMEOUT_MS } from '@/constants/trade'; import { ENVIRONMENT_CONFIG_MAP, DydxNetwork, isTestnet } from '@/constants/networks'; @@ -115,7 +116,8 @@ class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol { { broadcastPollIntervalMs: 3_000, broadcastTimeoutMs: 60_000, - } + }, + DEFAULT_TRANSACTION_MEMO ) ) ); @@ -370,8 +372,8 @@ class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol { value: { ...params.msg, timeoutTimestamp: params.msg.timeoutTimestamp - // Squid returns timeoutTimestamp as Long, but the signer expects BigInt - ? BigInt(Long.fromValue(params.msg.timeoutTimestamp).toString()) + ? // Squid returns timeoutTimestamp as Long, but the signer expects BigInt + BigInt(Long.fromValue(params.msg.timeoutTimestamp).toString()) : undefined, }, }; @@ -387,7 +389,11 @@ class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol { } ibcMsg.value.token.amount = amount.toString(); - const tx = await this.nobleClient.send([ibcMsg]); + const tx = await this.nobleClient.send( + [ibcMsg], + undefined, + `${DEFAULT_TRANSACTION_MEMO} | ${this.nobleWallet?.address}` + ); const parsedTx = this.parseToPrimitives(tx); @@ -426,8 +432,8 @@ class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol { value: { ...parsedIbcPayload.msg, timeoutTimestamp: parsedIbcPayload.msg.timeoutTimestamp - // Squid returns timeoutTimestamp as Long, but the signer expects BigInt - ? BigInt(Long.fromValue(parsedIbcPayload.msg.timeoutTimestamp).toString()) + ? // Squid returns timeoutTimestamp as Long, but the signer expects BigInt + BigInt(Long.fromValue(parsedIbcPayload.msg.timeoutTimestamp).toString()) : undefined, }, }; From f762e9bfaca66beb5baa607297e9b6a53d5abb92 Mon Sep 17 00:00:00 2001 From: aleka Date: Tue, 6 Feb 2024 12:31:08 -0500 Subject: [PATCH 08/19] add featureFlags to env config for reduce only + remove mobile sign in flag (#278) * add featureFlags to env config * update abacus and remove mobilesignin test flag --- package.json | 2 +- pnpm-lock.yaml | 8 +++--- public/configs/env.json | 45 +++++++++++++++++++++++++++++++++ src/lib/testFlags.ts | 4 --- src/views/menus/AccountMenu.tsx | 6 ++--- 5 files changed, 52 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index b03fda7..796147b 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@cosmjs/proto-signing": "^0.32.1", "@cosmjs/stargate": "^0.32.1", "@cosmjs/tendermint-rpc": "^0.32.1", - "@dydxprotocol/v4-abacus": "^1.4.0", + "@dydxprotocol/v4-abacus": "^1.4.2", "@dydxprotocol/v4-client-js": "^1.0.20", "@dydxprotocol/v4-localization": "^1.1.22", "@ethersproject/providers": "^5.7.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28f3fa6..06320de 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,8 +26,8 @@ dependencies: specifier: ^0.32.1 version: 0.32.2 '@dydxprotocol/v4-abacus': - specifier: ^1.4.0 - version: 1.4.0 + specifier: ^1.4.2 + version: 1.4.2 '@dydxprotocol/v4-client-js': specifier: ^1.0.20 version: 1.0.20 @@ -1088,8 +1088,8 @@ packages: resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==} dev: true - /@dydxprotocol/v4-abacus@1.4.0: - resolution: {integrity: sha512-mkdkXQXTVF1K6UmZwIwLC9gjsXg+Nt3h5/iW+WriVv1cUMPmHfPyRWL31eDDvkVO5UeECf05kiYXPk1y+7dPuA==} + /@dydxprotocol/v4-abacus@1.4.2: + resolution: {integrity: sha512-+hugk0RulMwMthR2xCMYXohcC3sEYqVW/lmiq0RUuHZ9yrjmgy48xl0aZUmXGUYXyoiHXPS4AULhRKHQ4OOLwg==} dev: false /@dydxprotocol/v4-client-js@1.0.20: diff --git a/public/configs/env.json b/public/configs/env.json index ce84f7a..913e22c 100644 --- a/public/configs/env.json +++ b/public/configs/env.json @@ -122,6 +122,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": true } }, "dydxprotocol-dev-2": { @@ -201,6 +204,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": true } }, "dydxprotocol-dev-4": { @@ -281,6 +287,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": true } }, "dydxprotocol-dev-5": { @@ -360,6 +369,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": true } }, "dydxprotocol-staging": { @@ -441,6 +453,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": true } }, "dydxprotocol-staging-forced-update": { @@ -521,6 +536,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": true } }, "dydxprotocol-staging-west": { @@ -602,6 +620,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": true } }, "dydxprotocol-testnet": { @@ -687,6 +708,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": false } }, "dydxprotocol-testnet-dydx": { @@ -769,6 +793,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": false } }, "dydxprotocol-testnet-nodefleet": { @@ -851,6 +878,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": false } }, "dydxprotocol-testnet-kingnodes": { @@ -933,6 +963,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": false } }, "dydxprotocol-testnet-liquify": { @@ -1015,6 +1048,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": false } }, "dydxprotocol-testnet-polkachu": { @@ -1089,6 +1125,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": false } }, "dydxprotocol-testnet-bware": { @@ -1171,6 +1210,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": false } }, "dydxprotocol-mainnet": { @@ -1253,6 +1295,9 @@ "delayBlocks": 0, "newMarketsMethodology": "[URL to spreadsheet or document that explains methodology]" } + }, + "featureFlags": { + "reduceOnlySupported": false } } } diff --git a/src/lib/testFlags.ts b/src/lib/testFlags.ts index 36f8a8b..a3e1a62 100644 --- a/src/lib/testFlags.ts +++ b/src/lib/testFlags.ts @@ -19,10 +19,6 @@ class TestFlags { return !!this.queryParams.displayinitializingmarkets; } - get showMobileSignInOption() { - return !!this.queryParams.mobilesignin; - } - get addressOverride():string { return this.queryParams.address; } diff --git a/src/views/menus/AccountMenu.tsx b/src/views/menus/AccountMenu.tsx index ac7bc6f..af4cb80 100644 --- a/src/views/menus/AccountMenu.tsx +++ b/src/views/menus/AccountMenu.tsx @@ -7,7 +7,6 @@ import { OnboardingState } from '@/constants/account'; import { ButtonAction, ButtonShape, ButtonSize, ButtonType } from '@/constants/buttons'; import { DialogTypes } from '@/constants/dialogs'; import { STRING_KEYS, StringGetterFunction, TOOLTIP_STRING_KEYS } from '@/constants/localization'; -import { isMainnet } from '@/constants/networks'; import { DydxChainAsset, wallets } from '@/constants/wallets'; import { layoutMixins } from '@/styles/layoutMixins'; @@ -41,7 +40,6 @@ import { getAppTheme } from '@/state/configsSelectors'; import { isTruthy } from '@/lib/isTruthy'; import { truncateAddress } from '@/lib/wallet'; import { MustBigNumber } from '@/lib/numbers'; -import { testFlags } from '@/lib/testFlags'; export const AccountMenu = () => { const stringGetter = useStringGetter(); @@ -193,7 +191,7 @@ export const AccountMenu = () => { }, ...(onboardingState === OnboardingState.AccountConnected && hdKey ? [ - (!isMainnet || testFlags.showMobileSignInOption) && { + { value: 'MobileQrSignIn', icon: , label: stringGetter({ key: STRING_KEYS.TITLE_SIGN_INTO_MOBILE }), @@ -206,7 +204,7 @@ export const AccountMenu = () => { highlightColor: 'destroy', onSelect: () => dispatch(openDialog({ type: DialogTypes.MnemonicExport })), }, - ].filter(isTruthy) + ] : []), { value: 'Disconnect', From dbc34599a6b41c45f043db7ab0caea531c892b1a Mon Sep 17 00:00:00 2001 From: moo-onthelawn <70078372+moo-onthelawn@users.noreply.github.com> Date: Tue, 6 Feb 2024 13:38:13 -0500 Subject: [PATCH 09/19] TRCL-3543 Create red/green color tokens and audit (replace) usages of error/success color tokens (#271) * audited * fix double header --- src/components/AlertMessage.tsx | 3 --- src/components/Button.tsx | 6 +++--- src/components/DropdownMenu.tsx | 4 ++-- src/components/Switch.tsx | 2 +- src/components/WithConfirmationPopover.tsx | 4 ++-- src/constants/styles/colors.ts | 10 ++++++++-- src/pages/Profile.tsx | 2 +- src/styles/globalStyle.ts | 4 ++++ src/styles/themes.ts | 15 ++++++++++++--- .../AccountInfo/AccountInfoConnectedState.tsx | 4 ++-- src/views/PositionInfo.tsx | 6 +++--- src/views/dialogs/DisplaySettingsDialog.tsx | 5 ++--- src/views/dialogs/MnemonicExportDialog.tsx | 3 +-- .../dialogs/OnboardingDialog/GenerateKeys.tsx | 2 +- src/views/forms/TransferForm.tsx | 8 ++++---- src/views/tables/OrdersTable/OrderActionsCell.tsx | 2 +- 16 files changed, 47 insertions(+), 33 deletions(-) diff --git a/src/components/AlertMessage.tsx b/src/components/AlertMessage.tsx index ba30b00..7fdc001 100644 --- a/src/components/AlertMessage.tsx +++ b/src/components/AlertMessage.tsx @@ -40,9 +40,6 @@ const AlertContainer = styled.div` case AlertType.Info: { return css` --alert-accent-color: var(--color-text-1); - - --alert-default-background-opacity: 0.133; // Relative - // --alert-background: var(--color-layer-6); // Absolute `; } case AlertType.Success: { diff --git a/src/components/Button.tsx b/src/components/Button.tsx index 633fc92..b86ae4c 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -103,14 +103,14 @@ const buttonActionVariants = { [ButtonAction.Create]: css` --button-textColor: var(--color-text-button); - --button-backgroundColor: var(--color-success); + --button-backgroundColor: var(--color-green); --button-border: solid var(--border-width) var(--color-border-white); --button-hover-filter: brightness(var(--hover-filter-variant)); `, [ButtonAction.Destroy]: css` --button-textColor: var(--color-text-button); - --button-backgroundColor: var(--color-error); + --button-backgroundColor: var(--color-red); --button-border: solid var(--border-width) var(--color-border-white); --button-hover-filter: brightness(var(--hover-filter-variant)); `, @@ -122,7 +122,7 @@ const buttonActionVariants = { `, [ButtonAction.Reset]: css` - --button-textColor: var(--color-error); + --button-textColor: var(--color-red); --button-backgroundColor: var(--color-layer-3); --button-border: solid var(--border-width) var(--color-border-red); --button-hover-filter: brightness(var(--hover-filter-variant)); diff --git a/src/components/DropdownMenu.tsx b/src/components/DropdownMenu.tsx index 908e3fa..5d19be8 100644 --- a/src/components/DropdownMenu.tsx +++ b/src/components/DropdownMenu.tsx @@ -91,10 +91,10 @@ Styled.Item = styled(Item)<{ $highlightColor: 'accent' | 'create' | 'destroy' }> --item-highlighted-textColor: var(--color-accent); `, ['create']: ` - --item-highlighted-textColor: var(--color-success); + --item-highlighted-textColor: var(--color-green); `, ['destroy']: ` - --item-highlighted-textColor: var(--color-error); + --item-highlighted-textColor: var(--color-red); `, }[$highlightColor])} diff --git a/src/components/Switch.tsx b/src/components/Switch.tsx index cc8b149..103f933 100644 --- a/src/components/Switch.tsx +++ b/src/components/Switch.tsx @@ -47,7 +47,7 @@ Styled.Root = styled(Root)` --switch-thumb-backgroundColor: var(--color-layer-6); --switch-active-backgroundColor: var(--color-accent); - --switch-active-thumb-backgroundColor: ${({ theme }) => theme.switchThumbActiveBackground}; + --switch-active-thumb-backgroundColor: var(--color-white); position: relative; width: var(--switch-width); diff --git a/src/components/WithConfirmationPopover.tsx b/src/components/WithConfirmationPopover.tsx index b65c5a7..eaae610 100644 --- a/src/components/WithConfirmationPopover.tsx +++ b/src/components/WithConfirmationPopover.tsx @@ -117,7 +117,7 @@ Styled.ConfirmButton = styled(Styled.IconButton)` --button-backgroundColor: hsla(203, 25%, 19%, 1); svg { - color: var(--color-success); + color: var(--color-green); } `; @@ -125,7 +125,7 @@ Styled.CancelButton = styled(Styled.IconButton)` --button-backgroundColor: hsla(296, 16%, 18%, 1); svg { - color: var(--color-error); + color: var(--color-red); width: 0.8em; height: 0.8em; diff --git a/src/constants/styles/colors.ts b/src/constants/styles/colors.ts index d83b9e2..7443864 100644 --- a/src/constants/styles/colors.ts +++ b/src/constants/styles/colors.ts @@ -5,7 +5,8 @@ export type Theme = { [AppColorMode.RedUp]: ThemeColorBase; }; -export type ThemeColorBase = LayerColors & +export type ThemeColorBase = BaseColors & + LayerColors & BorderColors & TextColors & GradientColors & @@ -17,6 +18,12 @@ export type ThemeColorBase = LayerColors & ComponentColors & Filters; +type BaseColors = { + white: string; + green: string; + red: string; +}; + type LayerColors = { layer0: string; layer1: string; @@ -86,7 +93,6 @@ type IconColors = { type ComponentColors = { inputBackground: string; popoverBackground: string; - switchThumbActiveBackground: string; toggleBackground: string; tooltipBackground: string; }; diff --git a/src/pages/Profile.tsx b/src/pages/Profile.tsx index 5136f43..1324824 100644 --- a/src/pages/Profile.tsx +++ b/src/pages/Profile.tsx @@ -335,7 +335,7 @@ Styled.ActionButton = styled(IconButton)<{ iconName?: IconName }>` ${({ iconName }) => iconName === IconName.Close ? css` - --button-textColor: var(--color-error); + --button-textColor: var(--color-red); --button-icon-size: 0.75em; ` : iconName === IconName.Transfer && diff --git a/src/styles/globalStyle.ts b/src/styles/globalStyle.ts index afd8b99..6038aa6 100644 --- a/src/styles/globalStyle.ts +++ b/src/styles/globalStyle.ts @@ -2,6 +2,10 @@ import { createGlobalStyle } from 'styled-components'; export const GlobalStyle = createGlobalStyle` :root { + --color-white: ${({ theme }) => theme.white}; + --color-green: ${({ theme }) => theme.green}; + --color-red: ${({ theme }) => theme.red}; + --color-layer-0: ${({ theme }) => theme.layer0}; --color-layer-1: ${({ theme }) => theme.layer1}; --color-layer-2: ${({ theme }) => theme.layer2}; diff --git a/src/styles/themes.ts b/src/styles/themes.ts index fcfa3b2..cf5d54b 100644 --- a/src/styles/themes.ts +++ b/src/styles/themes.ts @@ -4,6 +4,10 @@ import { BrightnessFilterToken, ColorToken, OpacityToken } from '@/constants/sty import { generateFadedColorVariant } from '@/lib/styles'; const ClassicThemeBase: ThemeColorBase = { + white: ColorToken.White, + green: ColorToken.Green1, + red: ColorToken.Red2, + layer0: ColorToken.GrayBlue7, layer1: ColorToken.GrayBlue6, layer2: ColorToken.GrayBlue5, @@ -51,7 +55,6 @@ const ClassicThemeBase: ThemeColorBase = { inputBackground: ColorToken.GrayBlue3, popoverBackground: generateFadedColorVariant(ColorToken.GrayBlue4, OpacityToken.Opacity90), - switchThumbActiveBackground: ColorToken.White, toggleBackground: ColorToken.GrayBlue3, tooltipBackground: generateFadedColorVariant(ColorToken.GrayBlue3, OpacityToken.Opacity66), @@ -61,6 +64,10 @@ const ClassicThemeBase: ThemeColorBase = { }; const DarkThemeBase: ThemeColorBase = { + white: ColorToken.White, + green: ColorToken.Green0, + red: ColorToken.Red0, + layer0: ColorToken.Black, layer1: ColorToken.DarkGray11, layer2: ColorToken.DarkGray13, @@ -108,7 +115,6 @@ const DarkThemeBase: ThemeColorBase = { inputBackground: ColorToken.DarkGray6, popoverBackground: generateFadedColorVariant(ColorToken.DarkGray8, OpacityToken.Opacity90), - switchThumbActiveBackground: ColorToken.White, toggleBackground: ColorToken.DarkGray6, tooltipBackground: generateFadedColorVariant(ColorToken.DarkGray6, OpacityToken.Opacity66), @@ -118,6 +124,10 @@ const DarkThemeBase: ThemeColorBase = { }; const LightThemeBase: ThemeColorBase = { + white: ColorToken.White, + green: ColorToken.Green2, + red: ColorToken.Red1, + layer0: ColorToken.White, layer1: ColorToken.LightGray6, layer2: ColorToken.White, @@ -165,7 +175,6 @@ const LightThemeBase: ThemeColorBase = { inputBackground: ColorToken.White, popoverBackground: generateFadedColorVariant(ColorToken.LightGray8, OpacityToken.Opacity90), - switchThumbActiveBackground: ColorToken.White, toggleBackground: ColorToken.LightGray4, tooltipBackground: generateFadedColorVariant(ColorToken.LightGray7, OpacityToken.Opacity66), diff --git a/src/views/AccountInfo/AccountInfoConnectedState.tsx b/src/views/AccountInfo/AccountInfoConnectedState.tsx index 9996def..b6b7dbb 100644 --- a/src/views/AccountInfo/AccountInfoConnectedState.tsx +++ b/src/views/AccountInfo/AccountInfoConnectedState.tsx @@ -173,7 +173,7 @@ export const AccountInfoConnectedState = () => { {label} - {hasError ? : slotRight} + {hasError ? : slotRight} ), @@ -230,7 +230,7 @@ Styled.CircleContainer = styled.div` border-radius: 50%; `; -Styled.Icon = styled(Icon)` +Styled.CautionIcon = styled(Icon)` color: var(--color-error); `; diff --git a/src/views/PositionInfo.tsx b/src/views/PositionInfo.tsx index 2ea9477..1df8cb6 100644 --- a/src/views/PositionInfo.tsx +++ b/src/views/PositionInfo.tsx @@ -557,11 +557,11 @@ Styled.PositionTile = styled(PositionTile)``; Styled.ClosePositionButton = styled(Button)` --button-border: solid var(--border-width) var(--color-border-red); - --button-textColor: var(--color-error); + --button-textColor: var(--color-red); `; Styled.ClosePositionToggleButton = styled(ToggleButton)` --button-border: solid var(--border-width) var(--color-border-red); - --button-toggle-off-textColor: var(--color-error); - --button-toggle-on-textColor: var(--color-error); + --button-toggle-off-textColor: var(--color-red); + --button-toggle-on-textColor: var(--color-red); `; diff --git a/src/views/dialogs/DisplaySettingsDialog.tsx b/src/views/dialogs/DisplaySettingsDialog.tsx index 6cf492c..61f5e12 100644 --- a/src/views/dialogs/DisplaySettingsDialog.tsx +++ b/src/views/dialogs/DisplaySettingsDialog.tsx @@ -39,7 +39,6 @@ export const DisplaySettingsDialog = ({ setIsOpen }: ElementProps) => { const sectionHeader = (heading: string) => { return ( - {heading} {heading} @@ -287,10 +286,10 @@ Styled.ArrowIcon = styled(Icon)<{ direction: 'up' | 'down'; color: 'green' | 're ${({ color }) => ({ ['green']: css` - color: var(--color-success); + color: var(--color-green); `, ['red']: css` - color: var(--color-error); + color: var(--color-red); `, }[color])} `; diff --git a/src/views/dialogs/MnemonicExportDialog.tsx b/src/views/dialogs/MnemonicExportDialog.tsx index a1c1c73..3b7c346 100644 --- a/src/views/dialogs/MnemonicExportDialog.tsx +++ b/src/views/dialogs/MnemonicExportDialog.tsx @@ -155,8 +155,7 @@ Styled.CautionIconContainer = styled.div` content: ''; width: 2.5rem; height: 2.5rem; - background-color: var(--color-error); - opacity: 0.1; + background-color: var(--color-gradient-error); } `; diff --git a/src/views/dialogs/OnboardingDialog/GenerateKeys.tsx b/src/views/dialogs/OnboardingDialog/GenerateKeys.tsx index ab824d5..4bc6a86 100644 --- a/src/views/dialogs/OnboardingDialog/GenerateKeys.tsx +++ b/src/views/dialogs/OnboardingDialog/GenerateKeys.tsx @@ -323,7 +323,7 @@ Styled.ReceiptArea = styled.div` `; Styled.Green = styled.span` - color: var(--color-success); + color: var(--color-green); `; Styled.GreenCheckCircle = styled(GreenCheckCircle)` diff --git a/src/views/forms/TransferForm.tsx b/src/views/forms/TransferForm.tsx index 4775c85..678e72e 100644 --- a/src/views/forms/TransferForm.tsx +++ b/src/views/forms/TransferForm.tsx @@ -306,7 +306,7 @@ export const TransferForm = ({ label={ {stringGetter({ key: STRING_KEYS.DESTINATION })} - {isAddressValid && } + {isAddressValid && } } type={InputType.Text} @@ -439,10 +439,10 @@ Styled.InlineRow = styled.span` Styled.DestinationInputLabel = styled.span` ${layoutMixins.inlineRow} +`; - svg { - color: var(--color-success); - } +Styled.CheckIcon = styled(Icon)` + color: var(--color-success); `; Styled.AddressValidationAlertMessage = styled(AlertMessage)` diff --git a/src/views/tables/OrdersTable/OrderActionsCell.tsx b/src/views/tables/OrdersTable/OrderActionsCell.tsx index fd4c867..e974384 100644 --- a/src/views/tables/OrdersTable/OrderActionsCell.tsx +++ b/src/views/tables/OrdersTable/OrderActionsCell.tsx @@ -82,6 +82,6 @@ Styled.ActionButton = styled(IconButton)` Styled.CancelButton = styled(Styled.ActionButton)` &:not(:disabled) { - --button-textColor: var(--color-error); + --button-textColor: var(--color-red); } `; From e4539772993be28e7d7a391f97f07e5fe79d7607 Mon Sep 17 00:00:00 2001 From: aleka Date: Tue, 6 Feb 2024 17:23:00 -0500 Subject: [PATCH 10/19] bump localization (#283) --- package.json | 2 +- pnpm-lock.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 796147b..bb9292e 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "@cosmjs/tendermint-rpc": "^0.32.1", "@dydxprotocol/v4-abacus": "^1.4.2", "@dydxprotocol/v4-client-js": "^1.0.20", - "@dydxprotocol/v4-localization": "^1.1.22", + "@dydxprotocol/v4-localization": "^1.1.24", "@ethersproject/providers": "^5.7.2", "@js-joda/core": "^5.5.3", "@radix-ui/react-accordion": "^1.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 06320de..949c0eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,8 +32,8 @@ dependencies: specifier: ^1.0.20 version: 1.0.20 '@dydxprotocol/v4-localization': - specifier: ^1.1.22 - version: 1.1.22 + specifier: ^1.1.24 + version: 1.1.24 '@ethersproject/providers': specifier: ^5.7.2 version: 5.7.2 @@ -1121,8 +1121,8 @@ packages: - utf-8-validate dev: false - /@dydxprotocol/v4-localization@1.1.22: - resolution: {integrity: sha512-DURyvBx0qjXmtebSRMW4ZdTsX5xI8Mb6c7LQ8WUPU0O3Jr7n7iUT/phzZszTpwNOMFFMukMFtn7fHCgijw1TOg==} + /@dydxprotocol/v4-localization@1.1.24: + resolution: {integrity: sha512-75XpxxYTpy8eIFcJINyLlvw5J93t0TrS5LacE6J5Raz9LOUWRK4VyRbdLCU2QX8AG7xiTZk1ma8ytylVZOVx3A==} dev: false /@dydxprotocol/v4-proto@4.0.0-dev.0: From 3b75e60bd2a4f2e8a3726f68920fc534f943b5a3 Mon Sep 17 00:00:00 2001 From: Bill Date: Tue, 6 Feb 2024 21:43:05 -0800 Subject: [PATCH 11/19] Add custom amplitude server URL (#282) * Add custom amplitude server URL * string * add to readme --- .env.example | 1 + README.md | 1 + scripts/inject-amplitude.js | 33 ++++++++++++++++++++++++++++++--- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index cbfc529..91cebfe 100644 --- a/.env.example +++ b/.env.example @@ -8,6 +8,7 @@ VITE_V3_TOKEN_ADDRESS= VITE_TOKEN_MIGRATION_URI= AMPLITUDE_API_KEY= +AMPLITUDE_SERVER_URL= BUGSNAG_API_KEY= IOS_APP_ID= INTERCOM_APP_ID= diff --git a/README.md b/README.md index 983ebc4..d7a22b2 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,7 @@ Set environment variables via `.env`. - `VITE_V3_TOKEN_ADDRESS` (optional): Address of the V3 $DYDX token. - `VITE_TOKEN_MIGRATION_URI` (optional): The URL of the token migration website. - `AMPLITUDE_API_KEY` (optional): Amplitude API key for enabling Amplitude; used with `pnpm run build:inject-amplitude`. +- `AMPLITUDE_SERVER_URL` (optional): Custom Amplitude server URL - `BUGSNAG_API_KEY` (optional): API key for enabling Bugsnag; used with `pnpm run build:inject-bugsnag`. - `IOS_APP_ID` (optional): iOS app ID used for enabling deep linking to the iOS app; used with `pnpm run build:inject-app-deeplinks`. - `INTERCOM_APP_ID` (optional): Used for enabling Intercom; utilized with `pnpm run build:inject-intercom`. diff --git a/scripts/inject-amplitude.js b/scripts/inject-amplitude.js index 6848b45..befa1c8 100644 --- a/scripts/inject-amplitude.js +++ b/scripts/inject-amplitude.js @@ -3,12 +3,13 @@ import path from 'path'; import { fileURLToPath } from 'url'; const AMPLITUDE_API_KEY = process.env.AMPLITUDE_API_KEY; +const AMPLITUDE_SERVER_URL = process.env.AMPLITUDE_SERVER_URL; const currentPath = fileURLToPath(import.meta.url); const projectRoot = path.dirname(currentPath); const htmlFilePath = path.resolve(projectRoot, '../dist/index.html'); -if(AMPLITUDE_API_KEY){ +if (AMPLITUDE_API_KEY) { try { const html = await fs.readFile(htmlFilePath, 'utf-8'); @@ -18,8 +19,34 @@ if(AMPLITUDE_API_KEY){ `; const amplitudeListenerScript = ``; + !(function () { + var e = "${AMPLITUDE_API_KEY}"; + e && + (globalThis.amplitude.init(e${ + AMPLITUDE_SERVER_URL + ? `, undefined, { + serverUrl: "${AMPLITUDE_SERVER_URL}" + }` + : '' + }), + globalThis.amplitude.setOptOut(!1), + globalThis.addEventListener("dydx:track", function (e) { + var t = e.detail.eventType, + d = e.detail.eventData; + globalThis.amplitude.track(t, d); + }), + globalThis.addEventListener("dydx:identify", function (e) { + var t = e.detail.property, + d = e.detail.propertyValue; + if ("walletAddress" === t) globalThis.amplitude.setUserId(d); + else { + var i = new globalThis.amplitude.Identify(); + i.set(t, d), globalThis.amplitude.identify(i); + } + }), + console.log("Amplitude enabled.")); + })(); + `; const injectedHtml = html.replace( '
', From 597456a0d17e956d5f57fc6bc372bcc46d76c672 Mon Sep 17 00:00:00 2001 From: Jared Vu Date: Wed, 7 Feb 2024 09:49:46 -0800 Subject: [PATCH 12/19] JUP Asset details (#285) * :sparkles: add JUP assets * localize eg --- package.json | 2 +- pnpm-lock.yaml | 16 ++-- public/configs/env.json | 19 ++++- public/configs/markets.json | 7 ++ public/currencies/jup.png | Bin 0 -> 11451 bytes src/components/AssetIcon.tsx | 1 + src/constants/potentialMarkets.ts | 60 --------------- src/hooks/usePotentialMarkets.tsx | 70 ++++++++++++++++-- src/hooks/useURLConfigs.ts | 36 ++++----- .../NewMarketForm/NewMarketPreviewStep.tsx | 21 +++++- .../NewMarketForm/NewMarketSelectionStep.tsx | 15 ++-- 11 files changed, 141 insertions(+), 106 deletions(-) create mode 100644 public/currencies/jup.png diff --git a/package.json b/package.json index bb9292e..903e5c4 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "@cosmjs/tendermint-rpc": "^0.32.1", "@dydxprotocol/v4-abacus": "^1.4.2", "@dydxprotocol/v4-client-js": "^1.0.20", - "@dydxprotocol/v4-localization": "^1.1.24", + "@dydxprotocol/v4-localization": "^1.1.25", "@ethersproject/providers": "^5.7.2", "@js-joda/core": "^5.5.3", "@radix-ui/react-accordion": "^1.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 949c0eb..2eb9489 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5 +1,9 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + overrides: follow-redirects: 1.15.3 @@ -32,8 +36,8 @@ dependencies: specifier: ^1.0.20 version: 1.0.20 '@dydxprotocol/v4-localization': - specifier: ^1.1.24 - version: 1.1.24 + specifier: ^1.1.25 + version: 1.1.25 '@ethersproject/providers': specifier: ^5.7.2 version: 5.7.2 @@ -1121,8 +1125,8 @@ packages: - utf-8-validate dev: false - /@dydxprotocol/v4-localization@1.1.24: - resolution: {integrity: sha512-75XpxxYTpy8eIFcJINyLlvw5J93t0TrS5LacE6J5Raz9LOUWRK4VyRbdLCU2QX8AG7xiTZk1ma8ytylVZOVx3A==} + /@dydxprotocol/v4-localization@1.1.25: + resolution: {integrity: sha512-84BJMybnZBrRnDpnHlMUcOYT1r0ODtgcdgrjdzTw8b0sViTY6ne9ob690fcn/vQO+6sEdDsdt+08ud0H+ZvyYg==} dev: false /@dydxprotocol/v4-proto@4.0.0-dev.0: @@ -14912,7 +14916,3 @@ packages: /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: true - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false diff --git a/public/configs/env.json b/public/configs/env.json index 913e22c..a3a3dea 100644 --- a/public/configs/env.json +++ b/public/configs/env.json @@ -93,6 +93,7 @@ "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", @@ -175,6 +176,7 @@ "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", @@ -258,6 +260,7 @@ "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", @@ -340,6 +343,7 @@ "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", @@ -424,6 +428,7 @@ "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", @@ -503,7 +508,8 @@ "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" + "blogs": "https://www.dydx.foundation/blog", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals" }, "wallets": { "walletconnect": { @@ -591,6 +597,7 @@ "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", @@ -679,6 +686,7 @@ "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", @@ -764,6 +772,7 @@ "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", @@ -849,6 +858,7 @@ "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", @@ -934,6 +944,7 @@ "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", @@ -1019,6 +1030,7 @@ "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", @@ -1099,7 +1111,8 @@ "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" + "blogs": "https://www.dydx.foundation/blog", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals" }, "wallets": { "walletconnect": { @@ -1181,6 +1194,7 @@ "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", @@ -1266,6 +1280,7 @@ "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]", diff --git a/public/configs/markets.json b/public/configs/markets.json index f743aa3..f896c1d 100644 --- a/public/configs/markets.json +++ b/public/configs/markets.json @@ -176,6 +176,13 @@ "whitepaperLink": "https://dfinity.org/whitepaper.pdf", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/internet-computer/" }, + "JUP-USD": { + "name": "Jupiter", + "tags": ["Defi"], + "websiteLink": "https://station.jup.ag/", + "whitepaperLink": "https://station.jup.ag/blog/green-paper", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/jupiter-ag/" + }, "LDO-USD": { "name": "Lido DAO", "tags": ["Defi"], diff --git a/public/currencies/jup.png b/public/currencies/jup.png new file mode 100644 index 0000000000000000000000000000000000000000..82e518e2b2a9457e30fee8752e897027e0b613cd GIT binary patch literal 11451 zcmV;sEJV|ZP)$)|kVfQ@X-6&o;+CkcTBlgUgnWH!LFvy-ryUBYg5CfUq0 z3CZq4o+lY#LN*}}0UH7sV~mX*@PTdlwk6q;Z{2QLhb2qun(zDT`m4Lu>Pxb0ctP&! z>h7xQ`rrDF_xt{81venl^D2tq8K{CsDT0D29w_MwR9dFz3{@@i`$0u%q}SZEm)fiIes6aKXD&o}`9WXg+=%m#^QMbVnTjOpz z-iYfM*Bt@Ui;B|G7gL2H+@~ta+F`Heu|tgtrN-e@Uv@XuZ^dxKa7d8O5!A>~mr zke*Xk z#JD5?U+wA;o`L4mZv<>roOpITx`=T_fE#e&y`VJG34hkzTK5vh3C0BhZv27w#`qz^ zH6;M2aO%+Di}=h8ycZO#R~#`KP9zXy+pBjqA|c2NP<^JIK-CK7W} z5A?a+eHdemxdqV7y+T+0HP7G28OSZD>SOM4_>zJBP#&#(GmLDsdgD(VpX`aFD&V3AI- z!Menh%>KTfj-41qj4Ad8`8`k9LUHuL(F^Od5R5-Pq_xlo53T=(+tHv{;2P1`qb^C3)hpL?3ViJkH86 z-;xF%?9wRbDp9E1Oz<7@Ih3O|^%wCjdS_v64 z2||HP8nzDWUpk79-#;_Tt|Gc5hzbF&w=~a)1#W+^RFHu!Mj*)Ug9lrV8|?2>DQ4&) z_t1=2ezAWPtwQuj5HSI6gdCr(!>R{Lanl`>ZDcUazHI&j5x^Vo|EZpcP%}zIhz@%1!l&6ENrr^F$b0!hB|y{&-^f7Zf4<=h#kH z!X`j!Zs{}hHNTA;7@YFG|9U+(zkX6^2`(Z-a$3B2&3lk#7hymqLkfLv>Ftw*W#JSu zih*K9B=v)^2#}gn_5^*cALBCu9xS#BOonr(I)$5HGWdgR2{aF@n%0AnHz@^6R!v4v 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 VoikC@T=M_`002ovPDHLkV1hN6w9)_o literal 0 HcmV?d00001 diff --git a/src/components/AssetIcon.tsx b/src/components/AssetIcon.tsx index 9d30239..2a977d6 100644 --- a/src/components/AssetIcon.tsx +++ b/src/components/AssetIcon.tsx @@ -31,6 +31,7 @@ const assetIcons = { ETH: '/currencies/eth.png', FIL: '/currencies/fil.png', ICP: '/currencies/icp.png', + JUP: '/currencies/jup.png', LDO: '/currencies/ldo.png', LINK: '/currencies/link.png', LTC: '/currencies/ltc.png', diff --git a/src/constants/potentialMarkets.ts b/src/constants/potentialMarkets.ts index da2707d..e2292c3 100644 --- a/src/constants/potentialMarkets.ts +++ b/src/constants/potentialMarkets.ts @@ -1,42 +1,9 @@ -export type ExchangeConfigParsedCsv = Array<{ - base_asset: string; - exchange: string; - pair: string; - - adjust_by_market: string; - min_2_depth: string; - avg_30d_vol: string; - reference_price: string; - risk_assessment: string; - num_oracles: string; - liquidity_tier: string; - asset_name: string; -}>; - export type ExchangeConfigItem = { exchangeName: string; ticker: string; adjustByMarket?: string; }; -export type PotentialMarketParsedCsv = Array<{ - base_asset: string; - reference_price: string; - num_oracles: string; - liquidity_tier: string; - asset_name: string; - p: string; - atomic_resolution: string; - min_exchanges: string; - min_price_change_ppm: string; - price_exponent: string; - step_base_quantum: string; - ticksize_exponent: string; - subticks_per_tick: string; - min_order_size: string; - quantum_conversion_exponent: string; -}>; - export type PotentialMarketItem = { baseAsset: string; referencePrice: string; @@ -56,30 +23,3 @@ export type PotentialMarketItem = { }; export const NUM_ORACLES_TO_QUALIFY_AS_SAFE = 6; - -export const LIQUIDITY_TIERS = { - 0: { - label: 'Large-cap', - initialMarginFraction: 0.05, - maintenanceMarginFraction: 0.03, - impactNotional: 10_000, - }, - 1: { - label: 'Mid-cap', - initialMarginFraction: 0.1, - maintenanceMarginFraction: 0.05, - impactNotional: 5_000, - }, - 2: { - label: 'Long-tail', - initialMarginFraction: 0.2, - maintenanceMarginFraction: 0.1, - impactNotional: 2_500, - }, - 3: { - label: 'Safety', - initialMarginFraction: 1, - maintenanceMarginFraction: 0.2, - impactNotional: 2_500, - }, -}; diff --git a/src/hooks/usePotentialMarkets.tsx b/src/hooks/usePotentialMarkets.tsx index c1391a0..af1a9d8 100644 --- a/src/hooks/usePotentialMarkets.tsx +++ b/src/hooks/usePotentialMarkets.tsx @@ -1,18 +1,42 @@ -import { createContext, useContext, useEffect, useState } from 'react'; +import { createContext, useContext, useEffect, useMemo, useState } from 'react'; -import type { - ExchangeConfigItem, - ExchangeConfigParsedCsv, - PotentialMarketItem, - PotentialMarketParsedCsv, -} from '@/constants/potentialMarkets'; +import { STRING_KEYS } from '@/constants/localization'; +import type { ExchangeConfigItem, PotentialMarketItem } from '@/constants/potentialMarkets'; import { log } from '@/lib/telemetry'; +import { useStringGetter } from './useStringGetter'; + const PotentialMarketsContext = createContext>({ potentialMarkets: undefined, exchangeConfigs: undefined, hasPotentialMarketsData: false, + liquidityTiers: { + 0: { + label: 'Large-cap', + initialMarginFraction: 0.05, + maintenanceMarginFraction: 0.03, + impactNotional: 10_000, + }, + 1: { + label: 'Mid-cap', + initialMarginFraction: 0.1, + maintenanceMarginFraction: 0.05, + impactNotional: 5_000, + }, + 2: { + label: 'Long-tail', + initialMarginFraction: 0.2, + maintenanceMarginFraction: 0.1, + impactNotional: 2_500, + }, + 3: { + label: 'Safety', + initialMarginFraction: 1, + maintenanceMarginFraction: 0.2, + impactNotional: 2_500, + }, + }, }); PotentialMarketsContext.displayName = 'PotentialMarkets'; @@ -27,6 +51,7 @@ const EXCHANGE_CONFIG_FILE_PATH = '/configs/potentialMarketExchangeConfig.json'; const POTENTIAL_MARKETS_FILE_PATH = '/configs/potentialMarketParameters.json'; export const usePotentialMarketsContext = () => { + const stringGetter = useStringGetter(); const [potentialMarkets, setPotentialMarkets] = useState(); const [exchangeConfigs, setExchangeConfigs] = useState>(); @@ -54,9 +79,40 @@ export const usePotentialMarketsContext = () => { } }, []); + const liquidityTiers = useMemo( + () => ({ + 0: { + label: stringGetter({ key: STRING_KEYS.LARGE_CAP }), + initialMarginFraction: 0.05, + maintenanceMarginFraction: 0.03, + impactNotional: 10_000, + }, + 1: { + label: 'Mid-cap', + initialMarginFraction: 0.1, + maintenanceMarginFraction: 0.05, + impactNotional: 5_000, + }, + 2: { + label: stringGetter({ key: STRING_KEYS.LONG_TAIL }), + initialMarginFraction: 0.2, + maintenanceMarginFraction: 0.1, + impactNotional: 2_500, + }, + 3: { + label: stringGetter({ key: STRING_KEYS.SAFETY }), + initialMarginFraction: 1, + maintenanceMarginFraction: 0.2, + impactNotional: 2_500, + }, + }), + [stringGetter] + ); + return { potentialMarkets, exchangeConfigs, hasPotentialMarketsData: Boolean(potentialMarkets && exchangeConfigs), + liquidityTiers, }; }; diff --git a/src/hooks/useURLConfigs.ts b/src/hooks/useURLConfigs.ts index 9c92cd1..570fdff 100644 --- a/src/hooks/useURLConfigs.ts +++ b/src/hooks/useURLConfigs.ts @@ -5,23 +5,24 @@ import { useSelectedNetwork } from '@/hooks'; const FALLBACK_URL = 'https://help.dydx.exchange/'; export interface LinksConfigs { - tos: string, - privacy: string, - mintscan: string, - mintscanBase: string, - feedback?: string, - help?: string, - blogs?: string, - foundation?: string, - initialMarginFractionLearnMore?: string, - reduceOnlyLearnMore?: string, - documentation?: string, - community?: string, - governanceLearnMore?: string, - stakingLearnMore?: string, - keplrDashboard?: string, - accountExportLearnMore?: string, - walletLearnMore?: string + tos: string; + privacy: string; + mintscan: string; + mintscanBase: string; + feedback?: string; + help?: string; + blogs?: string; + foundation?: string; + initialMarginFractionLearnMore?: string; + reduceOnlyLearnMore?: string; + documentation?: string; + community?: string; + governanceLearnMore?: string; + newMarketProposalLearnMore: string; + stakingLearnMore?: string; + keplrDashboard?: string; + accountExportLearnMore?: string; + walletLearnMore?: string; } export const useURLConfigs = (): LinksConfigs => { @@ -42,6 +43,7 @@ export const useURLConfigs = (): LinksConfigs => { documentation: linksConfigs.documentation || FALLBACK_URL, community: linksConfigs.community || FALLBACK_URL, governanceLearnMore: linksConfigs.governanceLearnMore || FALLBACK_URL, + newMarketProposalLearnMore: linksConfigs.newMarketProposalLearnMore || FALLBACK_URL, stakingLearnMore: linksConfigs.stakingLearnMore || FALLBACK_URL, keplrDashboard: linksConfigs.keplrDashboard || FALLBACK_URL, accountExportLearnMore: linksConfigs.accountExportLearnMore || FALLBACK_URL, diff --git a/src/views/forms/NewMarketForm/NewMarketPreviewStep.tsx b/src/views/forms/NewMarketForm/NewMarketPreviewStep.tsx index d4edce3..e57b31e 100644 --- a/src/views/forms/NewMarketForm/NewMarketPreviewStep.tsx +++ b/src/views/forms/NewMarketForm/NewMarketPreviewStep.tsx @@ -11,7 +11,7 @@ import { DialogTypes } from '@/constants/dialogs'; import { STRING_KEYS } from '@/constants/localization'; import { isMainnet } from '@/constants/networks'; import { NumberSign, TOKEN_DECIMALS } from '@/constants/numbers'; -import { LIQUIDITY_TIERS, type PotentialMarketItem } from '@/constants/potentialMarkets'; +import type { PotentialMarketItem } from '@/constants/potentialMarkets'; import { useAccountBalance, @@ -19,6 +19,7 @@ import { useStringGetter, useSubaccount, useTokenConfigs, + useURLConfigs, } from '@/hooks'; import { usePotentialMarkets } from '@/hooks/usePotentialMarkets'; @@ -31,6 +32,7 @@ import { DiffOutput } from '@/components/DiffOutput'; import { FormInput } from '@/components/FormInput'; import { Icon, IconName } from '@/components/Icon'; import { InputType } from '@/components/Input'; +import { Link } from '@/components/Link'; import { Output, OutputType } from '@/components/Output'; import { Tag } from '@/components/Tag'; import { WithDetailsReceipt } from '@/components/WithDetailsReceipt'; @@ -62,9 +64,10 @@ export const NewMarketPreviewStep = ({ const stringGetter = useStringGetter(); const { chainTokenDecimals, chainTokenLabel } = useTokenConfigs(); const [errorMessage, setErrorMessage] = useState(); - const { exchangeConfigs } = usePotentialMarkets(); + const { exchangeConfigs, liquidityTiers } = usePotentialMarkets(); const { submitNewMarketProposal } = useSubaccount(); const { newMarketProposal } = useGovernanceVariables(); + const { newMarketProposalLearnMore } = useURLConfigs(); const initialDepositAmountBN = MustBigNumber(newMarketProposal.initialDepositAmount).div( Number(`1e${chainTokenDecimals}`) ); @@ -73,7 +76,7 @@ export const NewMarketPreviewStep = ({ const [hasAcceptedTerms, setHasAcceptedTerms] = useState(false); const { label, initialMarginFraction, maintenanceMarginFraction, impactNotional } = - LIQUIDITY_TIERS[liquidityTier as unknown as keyof typeof LIQUIDITY_TIERS]; + liquidityTiers[liquidityTier as unknown as keyof typeof liquidityTiers]; const ticker = `${assetData.baseAsset}-USD`; @@ -311,10 +314,15 @@ export const NewMarketPreviewStep = ({
{stringGetter({ - key: STRING_KEYS.PROPOSAL_DISCLAIMER, + key: STRING_KEYS.PROPOSAL_DISCLAIMER_1, params: { NUM_TOKENS_REQUIRED: initialDepositAmount, NATIVE_TOKEN_DENOM: chainTokenLabel, + HERE: ( + + {stringGetter({ key: STRING_KEYS.HERE })} + + ), }, })} @@ -394,3 +402,8 @@ Styled.ButtonRow = styled.div` Styled.Button = styled(Button)` --button-padding: 0; `; + +Styled.Link = styled(Link)` + --link-color: var(--color-accent); + display: inline; +`; diff --git a/src/views/forms/NewMarketForm/NewMarketSelectionStep.tsx b/src/views/forms/NewMarketForm/NewMarketSelectionStep.tsx index a2bbd1c..c3ffda6 100644 --- a/src/views/forms/NewMarketForm/NewMarketSelectionStep.tsx +++ b/src/views/forms/NewMarketForm/NewMarketSelectionStep.tsx @@ -12,7 +12,6 @@ import { isMainnet } from '@/constants/networks'; import { TOKEN_DECIMALS } from '@/constants/numbers'; import { - LIQUIDITY_TIERS, NUM_ORACLES_TO_QUALIFY_AS_SAFE, type PotentialMarketItem, } from '@/constants/potentialMarkets'; @@ -74,7 +73,7 @@ export const NewMarketSelectionStep = ({ const { isMobile } = useBreakpoints(); const marketIds = useSelector(getMarketIds, shallowEqual); const { chainTokenDecimals, chainTokenLabel } = useTokenConfigs(); - const { potentialMarkets, exchangeConfigs } = usePotentialMarkets(); + const { potentialMarkets, exchangeConfigs, liquidityTiers } = usePotentialMarkets(); const stringGetter = useStringGetter(); const { newMarketProposal } = useGovernanceVariables(); const initialDepositAmountBN = MustBigNumber(newMarketProposal.initialDepositAmount).div( @@ -166,7 +165,7 @@ export const NewMarketSelectionStep = ({ {assetToAdd?.assetName ?? assetToAdd.baseAsset} {assetToAdd?.baseAsset}-USD ) : ( - 'e.g. "BTC-USD"' + `${stringGetter({ key: STRING_KEYS.EG })} "BTC-USD"` )} {assetToAdd && ( @@ -210,9 +209,9 @@ export const NewMarketSelectionStep = ({ - {Object.keys(LIQUIDITY_TIERS).map((tier) => { + {Object.keys(liquidityTiers).map((tier) => { const { maintenanceMarginFraction, impactNotional, label, initialMarginFraction } = - LIQUIDITY_TIERS[tier as unknown as keyof typeof LIQUIDITY_TIERS]; + liquidityTiers[tier as unknown as keyof typeof liquidityTiers]; return ( Date: Wed, 7 Feb 2024 10:10:22 -0800 Subject: [PATCH 13/19] Feature/mob 162 smartbanner (#274) * Implemented according to instructions but not working * Exclude touch screen windows (see in Issues on library repo) * Make the banner generic * Moved icon_url to generic section * Hide in Safari * Use injection script with ENV variables instead manual update * debugging * Use CDN for js and css * PR --- .env.example | 6 +++ .github/workflows/deploy-testnet.yml | 1 + README.md | 5 ++- package.json | 1 + public/smartbanner.html | 15 +++++++ scripts/README.md | 14 +++++++ scripts/inject-smartbanner.js | 60 ++++++++++++++++++++++++++++ 7 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 public/smartbanner.html create mode 100644 scripts/inject-smartbanner.js diff --git a/.env.example b/.env.example index 91cebfe..6a4d2ac 100644 --- a/.env.example +++ b/.env.example @@ -13,3 +13,9 @@ BUGSNAG_API_KEY= IOS_APP_ID= INTERCOM_APP_ID= STATUS_PAGE_SCRIPT_URI= + +SMARTBANNER_APP_NAME= +SMARTBANNER_ORG_NAME= +SMARTBANNER_ICON_URL= +SMARTBANNER_APPSTORE_URL= +SMARTBANNER_GOOGLEPLAY_URL= diff --git a/.github/workflows/deploy-testnet.yml b/.github/workflows/deploy-testnet.yml index f2edc93..10f4c0f 100644 --- a/.github/workflows/deploy-testnet.yml +++ b/.github/workflows/deploy-testnet.yml @@ -39,6 +39,7 @@ jobs: pnpm run build:inject-amplitude pnpm run build:inject-bugsnag pnpm run build:inject-statuspage + pnpm run build:inject-smartbanner sh scripts/inject-app-deeplinks.sh - name: Upload to IPFS via web3.storage diff --git a/README.md b/README.md index d7a22b2..fd87758 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ Set environment variables via `.env`. - `IOS_APP_ID` (optional): iOS app ID used for enabling deep linking to the iOS app; used with `pnpm run build:inject-app-deeplinks`. - `INTERCOM_APP_ID` (optional): Used for enabling Intercom; utilized with `pnpm run build:inject-intercom`. - `STATUS_PAGE_SCRIPT_URI` (optional): Used for enabling the status page; used with `pnpm run build:inject-statuspage`. - +- `SMARTBANNER_APP_NAME`, `SMARTBANNER_ORG_NAME`, `SMARTBANNER_ICON_URL`, `SMARTBANNER_APPSTORE_URL` (optional): Used for enabling the smart app banner; used with `pnpm run build:inject-smartbanner`. # Deployments @@ -107,6 +107,9 @@ pnpm run build --mode testnet If you wish to incorporate analytics via Amplitude and Bugsnag, you can use our scripts: `pnpm run build:inject-amplitude` and `pnpm run build:inject-bugsnag`. You will need to provide your own API keys for these services. In the Environment Variables section, name the variables as `AMPLITUDE_API_KEY` and `BUGSNAG_API_KEY` and provide the respective keys as their values. +If you wish to incorporate smart banner for iOS and/or Android apps, you can use our scripts: +`pnpm run build:inject-smartbanner`. You will need to provide your own app configurations for these services. In the Environment Variables section, name the variables as `SMARTBANNER_APP_NAME`, `SMARTBANNER_ORG_NAME`, `SMARTBANNER_ICON_URL` and `SMARTBANNER_APPSTORE_URL` or `SMARTBANNER_GOOGLEPLAY_URL` and provide the respective values. + For more details, check out Vercel's [official documentation](https://vercel.com/docs). ## Deploying to IPFS diff --git a/package.json b/package.json index 903e5c4..ef7cbc4 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "build:inject-bugsnag": "node scripts/inject-bugsnag.js", "build:inject-intercom": "node scripts/inject-intercom.js", "build:inject-statuspage": "node scripts/inject-statuspage.js", + "build:inject-smartbanner": "node scripts/inject-smartbanner.js", "deploy:ipfs": "node scripts/upload-ipfs.js --verbose", "deploy:update-ipns": "node scripts/update-ipns.js", "deploy:update-dnslink": "node scripts/update-dnslink.js", diff --git a/public/smartbanner.html b/public/smartbanner.html new file mode 100644 index 0000000..b9c3159 --- /dev/null +++ b/public/smartbanner.html @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/scripts/README.md b/scripts/README.md index dea4d27..242dc6f 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -36,3 +36,17 @@ Customize Intercom Messenger by adding logo and brand colors 3. Add API key in Github > Secrets and Variables > Actions as `INTERCOM_APP_ID` 4. In your deploy scripts add `pnpm run build:inject-intercom` after your pnpm build / vite build command. 5. If you are using with the Amplitude deployment scripts, your build command may look like the following: `pnpm build && pnpm run build:inject-amplitude && pnpm run build:inject-intercom` + +### Smartbanner +Smartbanner to show download links to iOS and/or Android native apps on mobile devices. + +To use with dydxprotocol/v4-web: +1. iOS app App Store link or Android app Google Play link. +2. Add configurations in Github > Secrets and Variables > Actions as + `SMARTBANNER_APP_NAME` for app name + `SMARTBANNER_ORG_NAME` for organization name + `SMARTBANNER_ICON_URL` for icon image + `SMARTBANNER_APPSTORE_URL` for iOS App Store link + `SMARTBANNER_GOOGLEPLAY_URL` for Android Google Play link +3. In your deploy scripts add `pnpm run build:inject-smartbanner` after your pnpm build / vite build command. +4. If you are using with the Amplitude deployment scripts, your build command may look like the following: `pnpm build && pnpm run build:inject-smartbanner` diff --git a/scripts/inject-smartbanner.js b/scripts/inject-smartbanner.js new file mode 100644 index 0000000..b5f4767 --- /dev/null +++ b/scripts/inject-smartbanner.js @@ -0,0 +1,60 @@ +/* eslint-disable no-console */ +import fs from 'fs/promises'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const SMARTBANNER_APP_NAME = process.env.SMARTBANNER_APP_NAME; +const SMARTBANNER_ORG_NAME = process.env.SMARTBANNER_ORG_NAME; +const SMARTBANNER_ICON_URL = process.env.SMARTBANNER_ICON_URL; +const SMARTBANNER_APPSTORE_URL = process.env.SMARTBANNER_APPSTORE_URL; +const SMARTBANNER_GOOGLEPLAY_URL = process.env.SMARTBANNER_GOOGLEPLAY_URL; + +const currentPath = fileURLToPath(import.meta.url); +const projectRoot = path.dirname(currentPath); +const htmlFilePath = path.resolve(projectRoot, '../dist/index.html'); +const smartbannerFilePath = path.resolve(projectRoot, '../dist/smartbanner.html'); + +if ( + SMARTBANNER_APP_NAME && + SMARTBANNER_ORG_NAME && + SMARTBANNER_ICON_URL && + (SMARTBANNER_APPSTORE_URL || SMARTBANNER_GOOGLEPLAY_URL) +) { + try { + const html = await fs.readFile(htmlFilePath, 'utf-8'); + let smartbanner = await fs.readFile(smartbannerFilePath, 'utf-8'); + smartbanner = smartbanner + .replace('SMARTBANNER_APP_NAME', SMARTBANNER_APP_NAME) + .replace('SMARTBANNER_ORG_NAME', SMARTBANNER_ORG_NAME) + .replace('SMARTBANNER_ICON_URL', SMARTBANNER_ICON_URL) + .replace('SMARTBANNER_ICON_URL', SMARTBANNER_ICON_URL); + + /* hardcoded injection depending on whether the app is available on App Store and/or Google Play */ + + if (SMARTBANNER_APPSTORE_URL) { + smartbanner = `\t\n` + smartbanner; + } + if (SMARTBANNER_GOOGLEPLAY_URL) { + smartbanner = `\t\n` + smartbanner; + } + if (SMARTBANNER_APPSTORE_URL) { + if (SMARTBANNER_GOOGLEPLAY_URL) { + smartbanner = `\t\n` + smartbanner; + } else { + smartbanner = `\t\n` + smartbanner; + } + } else { + if (SMARTBANNER_GOOGLEPLAY_URL) { + smartbanner = `\t\n` + smartbanner; + } + } + + const injectedHtml = html.replace('', `${smartbanner}\n`); + + await fs.writeFile(htmlFilePath, injectedHtml, 'utf-8'); + + console.log('Smartbanner scripts successfully injected.'); + } catch (err) { + console.error('Error injecting Smartbanner scripts:', err); + } +} From 26b426c9e9d9eaddf3364a641df76491902237eb Mon Sep 17 00:00:00 2001 From: Jared Vu Date: Wed, 7 Feb 2024 11:02:26 -0800 Subject: [PATCH 14/19] :sparkles: fix(ladle): Fix ladle environment and parameter types in stories (#286) --- .ladle/components.tsx | 61 +- package.json | 2 +- pnpm-lock.yaml | 2553 ++++++++++++----- src/components/Details.stories.tsx | 61 +- src/components/DropdownMenu.stories.tsx | 26 +- src/components/DropdownSelectMenu.stories.tsx | 17 +- src/components/Icon.stories.tsx | 2 +- src/components/Link.stories.tsx | 2 +- src/components/NavigationMenu.stories.tsx | 36 +- src/components/SearchInput.stories.tsx | 2 +- src/components/SearchSelectMenu.stories.tsx | 7 +- src/components/SelectMenu.stories.tsx | 2 +- src/components/Tabs.stories.tsx | 39 +- src/components/Tag.stories.tsx | 23 +- src/components/Tag.tsx | 16 +- src/components/ToggleButton.stories.tsx | 2 +- src/components/ToggleGroup.stories.tsx | 10 +- src/components/WithLabel.stories.tsx | 2 +- src/components/WithReceipt.stories.tsx | 41 +- src/components/WithTooltip.stories.tsx | 2 +- src/views/PositionTile.stories.tsx | 4 +- 21 files changed, 2065 insertions(+), 845 deletions(-) diff --git a/.ladle/components.tsx b/.ladle/components.tsx index 0ed9130..b8e8574 100644 --- a/.ladle/components.tsx +++ b/.ladle/components.tsx @@ -2,15 +2,25 @@ import '@/polyfills'; import { useEffect, useState } from 'react'; import { Provider } from 'react-redux'; import styled from 'styled-components'; +import { WagmiConfig } from 'wagmi'; +import { GrazProvider } from 'graz'; +import { QueryClient, QueryClientProvider } from 'react-query'; -import { store } from '@/state/_store'; +import { SupportedLocales } from '@/constants/localization'; + +import { AccountsProvider } from '@/hooks/useAccounts'; +import { AppThemeAndColorModeProvider } from '@/hooks/useAppThemeAndColorMode'; +import { DydxProvider } from '@/hooks/useDydxClient'; +import { DialogAreaProvider } from '@/hooks/useDialogArea'; +import { LocaleProvider } from '@/hooks/useLocaleSeparators'; +import { PotentialMarketsProvider } from '@/hooks/usePotentialMarkets'; +import { RestrictionProvider } from '@/hooks/useRestrictions'; +import { SubaccountProvider } from '@/hooks/useSubaccount'; import { GlobalStyle } from '@/styles/globalStyle'; import { SelectMenu, SelectItem } from '@/components/SelectMenu'; -import { AppThemeAndColorModeProvider } from '@/hooks/useAppThemeAndColorMode'; - import { AppTheme, AppThemeSystemSetting, @@ -18,11 +28,38 @@ import { setAppThemeSetting, setAppColorMode, } from '@/state/configs'; -import { setLocaleLoaded } from '@/state/localization'; + +import { setLocaleLoaded, setSelectedLocale } from '@/state/localization'; +import { store } from '@/state/_store'; + +import { config } from '@/lib/wagmi'; import '@/index.css'; import './ladle.css'; +const queryClient = new QueryClient(); + +const wrapProvider = (Component: React.ComponentType, props?: any) => { + // eslint-disable-next-line react/display-name + return ({ children }: { children: React.ReactNode }) => ( + {children} + ); +}; + +const providers = [ + wrapProvider(QueryClientProvider, { client: queryClient }), + wrapProvider(GrazProvider), + wrapProvider(WagmiConfig, { config }), + wrapProvider(LocaleProvider), + wrapProvider(RestrictionProvider), + wrapProvider(DydxProvider), + wrapProvider(AccountsProvider), + wrapProvider(SubaccountProvider), + wrapProvider(DialogAreaProvider), + wrapProvider(PotentialMarketsProvider), + wrapProvider(AppThemeAndColorModeProvider), +]; + export const StoryWrapper: React.FC<{ children: React.ReactNode }> = ({ children }) => { const [theme, setTheme] = useState(AppTheme.Classic); const [colorMode, setColorMode] = useState(AppColorMode.GreenUp); @@ -33,9 +70,20 @@ export const StoryWrapper: React.FC<{ children: React.ReactNode }> = ({ children }, [theme, colorMode]); useEffect(() => { + store.dispatch(setSelectedLocale({ locale: SupportedLocales.EN })); store.dispatch(setLocaleLoaded(true)); }, []); + const content = [...providers].reverse().reduce( + (children, Provider) => { + return {children}; + }, + + + {children} + + ); + return ( @@ -79,10 +127,7 @@ export const StoryWrapper: React.FC<{ children: React.ReactNode }> = ({ children
- - - {children} - + {content}
); }; diff --git a/package.json b/package.json index ef7cbc4..9e3446d 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ }, "devDependencies": { "@babel/core": "^7.22.5", - "@ladle/react": "^2.15.0", + "@ladle/react": "^4.0.2", "@types/color": "^3.0.3", "@types/crypto-js": "^4.1.1", "@types/luxon": "^3.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2eb9489..41d3607 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -260,8 +260,8 @@ devDependencies: specifier: ^7.22.5 version: 7.22.5 '@ladle/react': - specifier: ^2.15.0 - version: 2.15.0(@types/node@20.3.1)(react-dom@18.2.0)(react@18.2.0) + specifier: ^4.0.2 + version: 4.0.2(@types/node@20.3.1)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3) '@types/color': specifier: ^3.0.3 version: 3.0.3 @@ -424,10 +424,23 @@ packages: '@babel/highlight': 7.22.10 chalk: 2.4.2 + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: true + /@babel/compat-data@7.22.9: resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/core@7.22.5: resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} engines: {node: '>=6.9.0'} @@ -450,6 +463,29 @@ packages: transitivePeerDependencies: - supports-color + /@babel/core@7.23.9: + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/helpers': 7.23.9 + '@babel/parser': 7.23.9 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + convert-source-map: 2.0.0 + debug: 4.3.4(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/generator@7.22.10: resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} engines: {node: '>=6.9.0'} @@ -459,6 +495,16 @@ packages: '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.9 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: true + /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} @@ -475,6 +521,22 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} @@ -486,12 +548,27 @@ packages: '@babel/template': 7.22.5 '@babel/types': 7.22.10 + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 + dev: true + /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.10 + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.9 + dev: true + /@babel/helper-module-imports@7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} @@ -511,6 +588,20 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.5 + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} @@ -531,6 +622,16 @@ packages: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} @@ -539,6 +640,11 @@ packages: resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helpers@7.22.10: resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} engines: {node: '>=6.9.0'} @@ -549,6 +655,17 @@ packages: transitivePeerDependencies: - supports-color + /@babel/helpers@7.23.9: + resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight@7.22.10: resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} engines: {node: '>=6.9.0'} @@ -557,6 +674,15 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + /@babel/parser@7.22.10: resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} engines: {node: '>=6.0.0'} @@ -564,6 +690,14 @@ packages: dependencies: '@babel/types': 7.22.10 + /@babel/parser@7.23.9: + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.9 + dev: true + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} @@ -583,6 +717,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} engines: {node: '>=6.9.0'} @@ -593,6 +737,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/runtime@7.22.10: resolution: {integrity: sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==} engines: {node: '>=6.9.0'} @@ -607,6 +761,15 @@ packages: '@babel/parser': 7.22.10 '@babel/types': 7.22.10 + /@babel/template@7.23.9: + resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + dev: true + /@babel/traverse@7.22.10(supports-color@5.5.0): resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} engines: {node: '>=6.9.0'} @@ -624,6 +787,24 @@ packages: transitivePeerDependencies: - supports-color + /@babel/traverse@7.23.9: + resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + debug: 4.3.4(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/types@7.22.10: resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} engines: {node: '>=6.9.0'} @@ -632,6 +813,27 @@ packages: '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 + /@babel/types@7.23.9: + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@bundled-es-modules/cookie@2.0.0: + resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} + dependencies: + cookie: 0.5.0 + dev: true + + /@bundled-es-modules/statuses@1.0.1: + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + dependencies: + statuses: 2.0.1 + dev: true + /@coinbase/wallet-sdk@3.7.1: resolution: {integrity: sha512-LjyoDCB+7p0waQXfK+fUgcAs3Ezk6S6e+LYaoFjpJ6c9VTop3NyZF40Pi7df4z7QJohCwzuIDjz0Rhtig6Y7Pg==} engines: {node: '>= 10.0.0'} @@ -1088,10 +1290,6 @@ packages: resolution: {integrity: sha512-Gg5t+eR7vPJMAmhkFt6CZrzPd0EKpAslWwk5rFVYZpJsM8JG5KT9XQ99hgNM3Ov6ScNoIWbXkpX27F6A9cXR4Q==} dev: false - /@cush/relative@1.0.0: - resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==} - dev: true - /@dydxprotocol/v4-abacus@1.4.2: resolution: {integrity: sha512-+hugk0RulMwMthR2xCMYXohcC3sEYqVW/lmiq0RUuHZ9yrjmgy48xl0aZUmXGUYXyoiHXPS4AULhRKHQ4OOLwg==} dev: false @@ -1149,6 +1347,15 @@ packages: /@emotion/unitless@0.7.5: resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm64@0.17.19: resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -1158,6 +1365,15 @@ packages: dev: true optional: true + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm@0.17.19: resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -1167,6 +1383,15 @@ packages: dev: true optional: true + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64@0.17.19: resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -1176,6 +1401,15 @@ packages: dev: true optional: true + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-arm64@0.17.19: resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -1185,6 +1419,15 @@ packages: dev: true optional: true + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-x64@0.17.19: resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -1194,6 +1437,15 @@ packages: dev: true optional: true + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-arm64@0.17.19: resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -1203,6 +1455,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-x64@0.17.19: resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -1212,6 +1473,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64@0.17.19: resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -1221,6 +1491,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm@0.17.19: resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -1230,6 +1509,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32@0.17.19: resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -1239,6 +1527,15 @@ packages: dev: true optional: true + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-loong64@0.17.19: resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} @@ -1248,6 +1545,15 @@ packages: dev: true optional: true + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-mips64el@0.17.19: resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -1257,6 +1563,15 @@ packages: dev: true optional: true + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ppc64@0.17.19: resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -1266,6 +1581,15 @@ packages: dev: true optional: true + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-riscv64@0.17.19: resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -1275,6 +1599,15 @@ packages: dev: true optional: true + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-s390x@0.17.19: resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -1284,6 +1617,15 @@ packages: dev: true optional: true + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-x64@0.17.19: resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -1293,6 +1635,15 @@ packages: dev: true optional: true + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/netbsd-x64@0.17.19: resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -1302,6 +1653,15 @@ packages: dev: true optional: true + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/openbsd-x64@0.17.19: resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -1311,6 +1671,15 @@ packages: dev: true optional: true + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/sunos-x64@0.17.19: resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -1320,6 +1689,15 @@ packages: dev: true optional: true + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-arm64@0.17.19: resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -1329,6 +1707,15 @@ packages: dev: true optional: true + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-ia32@0.17.19: resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -1338,6 +1725,15 @@ packages: dev: true optional: true + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-x64@0.17.19: resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -1347,6 +1743,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.43.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1956,62 +2361,67 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@ladle/react@2.15.0(@types/node@20.3.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-rEl5WU1f0YQO+oXFV9fh2FQUHdXR/k4waLxHBnVyJoQvNvZKZJiKSXkzi7kNIxQazK5iVla12pbhlvDe2jR/Yw==} - engines: {node: '>=16.0.0'} + /@ladle/react@4.0.2(@types/node@20.3.1)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3): + resolution: {integrity: sha512-SnYniR/U7kJX1Zh199jhjxqiFa5e5eA8chuX6uYEZYAUtCCY/hQqGr7/7Grr0j6Q4FYu9iQyyV2K1NJKDdUZIw==} + engines: {node: '>=18.0.0'} hasBin: true peerDependencies: - react: '>=16.14.0' - react-dom: '>=16.14.0' + react: '>=18.0.0' + react-dom: '>=18.0.0' dependencies: - '@babel/code-frame': 7.22.10 - '@babel/core': 7.22.5 - '@babel/generator': 7.22.10 - '@babel/parser': 7.22.10 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10(supports-color@5.5.0) - '@babel/types': 7.22.10 + '@babel/code-frame': 7.23.5 + '@babel/core': 7.23.9 + '@babel/generator': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 '@ladle/react-context': 1.0.1(react-dom@18.2.0)(react@18.2.0) - '@mdx-js/mdx': 2.3.0 - '@mdx-js/react': 2.3.0(react@18.2.0) - '@vitejs/plugin-react': 3.1.0(vite@4.3.9) - '@vitejs/plugin-react-swc': 3.1.0(vite@4.3.9) - axe-core: 4.7.2 + '@mdx-js/mdx': 3.0.0 + '@mdx-js/react': 3.0.0(@types/react@18.2.14)(react@18.2.0) + '@vitejs/plugin-react': 4.2.1(vite@5.0.12) + '@vitejs/plugin-react-swc': 3.6.0(vite@5.0.12) + axe-core: 4.8.3 boxen: 7.1.1 chokidar: 3.5.3 classnames: 2.3.2 - commander: 10.0.1 + commander: 11.1.0 cross-spawn: 7.0.3 debug: 4.3.4(supports-color@5.5.0) - get-port: 6.1.2 - globby: 13.2.2 + get-port: 7.0.0 + globby: 14.0.0 history: 5.3.0 koa: 2.14.2 koa-connect: 2.1.0 lodash.merge: 4.6.2 + msw: 2.1.7(typescript@5.1.3) open: 9.1.0 - prism-react-renderer: 1.3.5(react@18.2.0) + prism-react-renderer: 2.3.1(react@18.2.0) prop-types: 15.8.1 query-string: 8.1.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-frame-component: 5.2.4(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + react-hotkeys-hook: 4.5.0(react-dom@18.2.0)(react@18.2.0) react-inspector: 6.0.2(react@18.2.0) - rehype-raw: 6.1.1 - remark-gfm: 3.0.1 + rehype-class-names: 1.0.14 + rehype-raw: 7.0.0 + remark-gfm: 4.0.0 source-map: 0.7.4 - vfile: 5.3.7 - vite: 4.3.9(@types/node@20.3.1) - vite-tsconfig-paths: 3.6.0(vite@4.3.9) + vfile: 6.0.1 + vite: 5.0.12(@types/node@20.3.1) + vite-tsconfig-paths: 4.3.1(typescript@5.1.3)(vite@5.0.12) transitivePeerDependencies: - '@swc/helpers' - '@types/node' + - '@types/react' - less + - lightningcss - sass - stylus - sugarss - supports-color - terser + - typescript dev: true /@lit-labs/ssr-dom-shim@1.1.2: @@ -2024,33 +2434,40 @@ packages: '@lit-labs/ssr-dom-shim': 1.1.2 dev: false - /@mdx-js/mdx@2.3.0: - resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + /@mdx-js/mdx@3.0.0: + resolution: {integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==} dependencies: + '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.0 + '@types/hast': 3.0.4 '@types/mdx': 2.0.6 - estree-util-build-jsx: 2.2.2 - estree-util-is-identifier-name: 2.1.0 - estree-util-to-js: 1.2.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 estree-walker: 3.0.3 - hast-util-to-estree: 2.3.3 - markdown-extensions: 1.1.1 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 + markdown-extensions: 2.0.0 periscopic: 3.1.0 - remark-mdx: 2.3.0 - remark-parse: 10.0.2 - remark-rehype: 10.1.0 - unified: 10.1.2 - unist-util-position-from-estree: 1.1.2 - unist-util-stringify-position: 3.0.3 - unist-util-visit: 4.1.2 - vfile: 5.3.7 + remark-mdx: 3.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + source-map: 0.7.4 + unified: 11.0.4 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 transitivePeerDependencies: - supports-color dev: true - /@mdx-js/react@2.3.0(react@18.2.0): - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} + /@mdx-js/react@3.0.0(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ==} peerDependencies: + '@types/react': '>=16' react: '>=16' dependencies: '@types/mdx': 2.0.6 @@ -2135,6 +2552,23 @@ packages: tslib: 2.6.2 dev: false + /@mswjs/cookies@1.1.0: + resolution: {integrity: sha512-0ZcCVQxifZmhwNBoQIrystCb+2sWBY2Zw8lpfJBPCHGCA/HWqehITeCRVIv4VMy8MPlaHo2w2pTHFV2pFfqKPw==} + engines: {node: '>=18'} + dev: true + + /@mswjs/interceptors@0.25.16: + resolution: {integrity: sha512-8QC8JyKztvoGAdPgyZy49c9vSHHAZjHagwl4RY9E8carULk8ym3iTaiawrT1YoLF/qb449h48f71XDPgkUSOUg==} + engines: {node: '>=18'} + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.2 + strict-event-emitter: 0.5.1 + dev: true + /@multiformats/murmur3@1.1.3: resolution: {integrity: sha512-wAPLUErGR8g6Lt+bAZn6218k9YQPym+sjszsXL6o4zfxbA22P+gxWZuuD9wDbwL55xrKO5idpcuQUX7/E3oHcw==} dependencies: @@ -2211,6 +2645,21 @@ packages: fastq: 1.15.0 dev: true + /@open-draft/deferred-promise@2.2.0: + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + dev: true + + /@open-draft/logger@0.3.0: + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.2 + dev: true + + /@open-draft/until@2.1.0: + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + dev: true + /@osmonauts/lcd@0.6.0: resolution: {integrity: sha512-vz9VavXrEfxZoXbSAfNfk90MLpn34XtBYPV3L9YilE+s56AhqYxUh83nne9J5somnTRfGnyR3oeV8C+lHkqiuA==} dependencies: @@ -4975,6 +5424,110 @@ packages: picomatch: 2.3.1 dev: true + /@rollup/rollup-android-arm-eabi@4.9.6: + resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.9.6: + resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.9.6: + resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.9.6: + resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.9.6: + resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.9.6: + resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.9.6: + resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.9.6: + resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.9.6: + resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.9.6: + resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.9.6: + resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.9.6: + resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.9.6: + resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@safe-global/safe-apps-provider@0.18.1(typescript@5.1.3): resolution: {integrity: sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg==} dependencies: @@ -5055,6 +5608,11 @@ packages: '@scure/base': 1.1.5 dev: false + /@sindresorhus/merge-streams@1.0.0: + resolution: {integrity: sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==} + engines: {node: '>=18'} + dev: true + /@solana/buffer-layout@4.0.1: resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} engines: {node: '>=5.10'} @@ -5323,8 +5881,8 @@ packages: - supports-color dev: true - /@swc/core-darwin-arm64@1.3.77: - resolution: {integrity: sha512-l4KGQAGB4Ih1Al2tWoUBrtVJCF/xZRjH3jCMCRD52KZDRAnRVDq42JKek7+aHjjH8juzTISaqzsI8Ipv6zvKhA==} + /@swc/core-darwin-arm64@1.4.0: + resolution: {integrity: sha512-UTJ/Vz+s7Pagef6HmufWt6Rs0aUu+EJF4Pzuwvr7JQQ5b1DZeAAUeUtkUTFx/PvCbM8Xfw4XdKBUZfrIKCfW8A==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -5332,8 +5890,8 @@ packages: dev: true optional: true - /@swc/core-darwin-x64@1.3.77: - resolution: {integrity: sha512-eFCkZg/BzObOn5IWn7t/Ywz+jlZKff/1XBymT7Arh/UkO39Agh+rYdBqjbylp4JQMl0qGRBfxD3wPgDRoViNVQ==} + /@swc/core-darwin-x64@1.4.0: + resolution: {integrity: sha512-f8v58u2GsGak8EtZFN9guXqE0Ep10Suny6xriaW2d8FGqESPyNrnBzli3aqkSeQk5gGqu2zJ7WiiKp3XoUOidA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -5341,8 +5899,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.77: - resolution: {integrity: sha512-+1BueyGcCQAtxSORJml0CU8aKQNssQ5E3ABMFJwCbcec+lUCiGYK1fBfqj4FmWQMbXuQ+mn1SMeXSZAtaXoQ3w==} + /@swc/core-linux-arm-gnueabihf@1.4.0: + resolution: {integrity: sha512-q2KAkBzmPcTnRij/Y1fgHCKAGevUX/H4uUESrw1J5gmUg9Qip6onKV80lTumA1/aooGJ18LOsB31qdbwmZk9OA==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -5350,8 +5908,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu@1.3.77: - resolution: {integrity: sha512-3smbzVcuuCiWWPFeUIp1c0aAXd+fGsc8x8rUcYvoJAWBgLJ45JymOI5WSUjIybl3rk0prdkbFylZuR0t1Rue3A==} + /@swc/core-linux-arm64-gnu@1.4.0: + resolution: {integrity: sha512-SknGu96W0mzHtLHWm+62fk5+Omp9fMPFO7AWyGFmz2tr8EgRRXtTSrBUnWhAbgcalnhen48GsvtMdxf1KNputg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -5359,8 +5917,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl@1.3.77: - resolution: {integrity: sha512-e81+i4ef5vDeu9AkMY2AamPcmtPVPUqeqq3aNWM1tcHCaUej1DwY4xhRxrd1OvEoYyVBLtiMb5nenF3V9OzXIQ==} + /@swc/core-linux-arm64-musl@1.4.0: + resolution: {integrity: sha512-/k3TDvpBRMDNskHooNN1KqwUhcwkfBlIYxRTnJvsfT2C7My4pffR+4KXmt0IKynlTTbCdlU/4jgX4801FSuliw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -5368,8 +5926,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu@1.3.77: - resolution: {integrity: sha512-gl3+9VESckZ/GYCmGClGgXqB2tAA2MivEV/51Wde+2alo2lPSSujEhxE6Q3TNYkXOLAHSupYyDZ0ou9RfXufOw==} + /@swc/core-linux-x64-gnu@1.4.0: + resolution: {integrity: sha512-GYsTMvNt5+WTVlwwQzOOWsPMw6P/F41u5PGHWmfev8Nd4QJ1h3rWPySKk4mV42IJwH9MgQCVSl3ygwNqwl6kFg==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -5377,8 +5935,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl@1.3.77: - resolution: {integrity: sha512-AqQLZAMYTaNrA4i/Nv/GhXdildDZyRv6xsK8u2actevv5PPjD/69yYB3Z4uaptwh/4ys4W/Y2vnt+OPCNH4OQg==} + /@swc/core-linux-x64-musl@1.4.0: + resolution: {integrity: sha512-jGVPdM/VwF7kK/uYRW5N6FwzKf/FnDjGIR3RPvQokjYJy7Auk+3Oj21C0Jev7sIT9RYnO/TrFEoEozKeD/z2Qw==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -5386,8 +5944,8 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc@1.3.77: - resolution: {integrity: sha512-Wdw++6w7WyavxZ3WruElCrRJ6EO0iHS0Mts4qHnbKgD08GJqIMTZPtZ5qhRe9zCf6sj2rQqhAMf/HKhYrHoF+w==} + /@swc/core-win32-arm64-msvc@1.4.0: + resolution: {integrity: sha512-biHYm1AronEKlt47O/H8sSOBM2BKXMmWT+ApvlxUw50m1RGNnVnE0bgY7tylFuuSiWyXsQPJbmUV708JqORXVg==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -5395,8 +5953,8 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc@1.3.77: - resolution: {integrity: sha512-ObNVpdtLdXDpmVKuMZh87yBYL4ti64WX95o2j5Oq3r0e0RqwIGqGvPDxvJVEiyCnaXHfl8eSNKWuiOxPHPkMNQ==} + /@swc/core-win32-ia32-msvc@1.4.0: + resolution: {integrity: sha512-TL5L2tFQb19kJwv6+elToGBj74QXCn9j+hZfwQatvZEJRA5rDK16eH6oAE751dGUArhnWlW3Vj65hViPvTuycw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -5404,8 +5962,8 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc@1.3.77: - resolution: {integrity: sha512-Ew6jg/qr0v/2ixeJXvIUBuAPMKTz8HRoDBO/nHkvlnDFmkhsyH7h5YwJS1rLBwAEhWuJaVYjYi7cibZTI/QRYQ==} + /@swc/core-win32-x64-msvc@1.4.0: + resolution: {integrity: sha512-e2xVezU7XZ2Stzn4i7TOQe2Kn84oYdG0M3A7XI7oTdcpsKCcKwgiMoroiAhqCv+iN20KNqhnWwJiUiTj/qN5AA==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -5413,8 +5971,8 @@ packages: dev: true optional: true - /@swc/core@1.3.77: - resolution: {integrity: sha512-CiLD2NGTdhE8JnWFHeRAglaCAcvwOxvpeWNtCIT261GrxTKCXHPAn4eqIWiBzXnwWDmZ6XdyrCL4/GmPESNnrg==} + /@swc/core@1.4.0: + resolution: {integrity: sha512-wc5DMI5BJftnK0Fyx9SNJKkA0+BZSJQx8430yutWmsILkHMBD3Yd9GhlMaxasab9RhgKqZp7Ht30hUYO5ZDvQg==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -5422,17 +5980,24 @@ packages: peerDependenciesMeta: '@swc/helpers': optional: true + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.5 optionalDependencies: - '@swc/core-darwin-arm64': 1.3.77 - '@swc/core-darwin-x64': 1.3.77 - '@swc/core-linux-arm-gnueabihf': 1.3.77 - '@swc/core-linux-arm64-gnu': 1.3.77 - '@swc/core-linux-arm64-musl': 1.3.77 - '@swc/core-linux-x64-gnu': 1.3.77 - '@swc/core-linux-x64-musl': 1.3.77 - '@swc/core-win32-arm64-msvc': 1.3.77 - '@swc/core-win32-ia32-msvc': 1.3.77 - '@swc/core-win32-x64-msvc': 1.3.77 + '@swc/core-darwin-arm64': 1.4.0 + '@swc/core-darwin-x64': 1.4.0 + '@swc/core-linux-arm-gnueabihf': 1.4.0 + '@swc/core-linux-arm64-gnu': 1.4.0 + '@swc/core-linux-arm64-musl': 1.4.0 + '@swc/core-linux-x64-gnu': 1.4.0 + '@swc/core-linux-x64-musl': 1.4.0 + '@swc/core-win32-arm64-msvc': 1.4.0 + '@swc/core-win32-ia32-msvc': 1.4.0 + '@swc/core-win32-x64-msvc': 1.4.0 + dev: true + + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} dev: true /@swc/helpers@0.4.14: @@ -5454,6 +6019,10 @@ packages: tslib: 2.6.2 dev: false + /@swc/types@0.1.5: + resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} + dev: true + /@tanstack/match-sorter-utils@8.8.4: resolution: {integrity: sha512-rKH8LjZiszWEvmi01NR72QWZ8m4xmXre0OOwlRGnjU01Eqz/QnN+cqpty2PJ0efHblq09+KilvyR7lsbzmXVEw==} engines: {node: '>=12'} @@ -5526,7 +6095,36 @@ packages: /@types/acorn@4.0.6: resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 + dev: true + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.23.9 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + dev: true + + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + dependencies: + '@babel/types': 7.23.9 dev: true /@types/chai-subset@1.3.3: @@ -5561,6 +6159,10 @@ packages: '@types/node': 20.10.5 dev: false + /@types/cookie@0.6.0: + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + dev: true + /@types/crypto-js@4.1.1: resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==} dev: true @@ -5621,7 +6223,7 @@ packages: /@types/estree-jsx@1.0.0: resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 dev: true /@types/estree@1.0.1: @@ -5632,8 +6234,8 @@ packages: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true - /@types/hast@2.3.5: - resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==} + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} dependencies: '@types/unist': 2.0.7 dev: true @@ -5668,8 +6270,8 @@ packages: resolution: {integrity: sha512-uKRI5QORDnrGFYgcdAVnHvEIvEZ8noTpP/Bg+HeUzZghwinDlIS87DEenV5r1YoOF9G4x600YsUXLWZ19rmTmg==} dev: true - /@types/mdast@3.0.12: - resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + /@types/mdast@4.0.3: + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} dependencies: '@types/unist': 2.0.7 dev: true @@ -5714,8 +6316,8 @@ packages: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/parse5@6.0.3: - resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + /@types/prismjs@1.26.3: + resolution: {integrity: sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==} dev: true /@types/prop-types@15.7.5: @@ -5744,6 +6346,10 @@ packages: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true + /@types/statuses@2.0.4: + resolution: {integrity: sha512-eqNDvZsCNY49OAXB0Firg/Sc2BgoWsntsLUdybGFOhAfCD6QJ2n9HXUIHGqt5qjrxmMv4wS8WLAw43ZkKcJ8Pw==} + dev: true + /@types/styled-components@5.1.26: resolution: {integrity: sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==} dependencies: @@ -5760,6 +6366,10 @@ packages: resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} dev: true + /@types/unist@3.0.2: + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + dev: true + /@types/use-sync-external-store@0.0.3: resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} dev: false @@ -5900,6 +6510,10 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + /@visx/annotation@3.0.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-otf2AZDlt/XCpOBG0gkPowXVerLJW5yXPFis94Km0bj629htyKOsY5GeJKlBeB89ddxdi4zWHkaFxGFJ79Pqog==} peerDependencies: @@ -6185,33 +6799,17 @@ packages: - react-dom dev: false - /@vitejs/plugin-react-swc@3.1.0(vite@4.3.9): - resolution: {integrity: sha512-xnDULNrkEbtTtRNnMPp+RsuIuIbk1JJV0xY7irchYyv9JJS4uvmc1EYip+qyrnkcX7TQ9c8vCS3AmkQqADI0Fw==} + /@vitejs/plugin-react-swc@3.6.0(vite@5.0.12): + resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==} peerDependencies: - vite: ^4 + vite: ^4 || ^5 dependencies: - '@swc/core': 1.3.77 - vite: 4.3.9(@types/node@20.3.1) + '@swc/core': 1.4.0 + vite: 5.0.12(@types/node@20.3.1) transitivePeerDependencies: - '@swc/helpers' dev: true - /@vitejs/plugin-react@3.1.0(vite@4.3.9): - resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.1.0-beta.0 - dependencies: - '@babel/core': 7.22.5 - '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.5) - magic-string: 0.27.0 - react-refresh: 0.14.0 - vite: 4.3.9(@types/node@20.3.1) - transitivePeerDependencies: - - supports-color - dev: true - /@vitejs/plugin-react@4.0.1(vite@4.3.9): resolution: {integrity: sha512-g25lL98essfeSj43HJ0o4DMp0325XK0ITkxpgChzJU/CyemgyChtlxfnRbjfwxDGCTRxTiXtQAsdebQXKMRSOA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -6227,6 +6825,22 @@ packages: - supports-color dev: true + /@vitejs/plugin-react@4.2.1(vite@5.0.12): + resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.9) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.0 + vite: 5.0.12(@types/node@20.3.1) + transitivePeerDependencies: + - supports-color + dev: true + /@vitest/expect@0.32.2: resolution: {integrity: sha512-6q5yzweLnyEv5Zz1fqK5u5E83LU+gOMVBDuxBl2d2Jfx1BAp5M+rZgc5mlyqdnxquyoiOXpXmFNkcGcfFnFH3Q==} dependencies: @@ -7199,6 +7813,14 @@ packages: acorn: 8.10.0 dev: true + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + dev: true + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -7285,6 +7907,13 @@ packages: string-width: 4.2.3 dev: true + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -7316,10 +7945,6 @@ packages: engines: {node: '>=12'} dev: true - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true - /any-signal@2.1.2: resolution: {integrity: sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ==} dependencies: @@ -7479,6 +8104,11 @@ packages: engines: {node: '>=4'} dev: true + /axe-core@4.8.3: + resolution: {integrity: sha512-d5ZQHPSPkF9Tw+yfyDcRoUOc4g/8UloJJe5J8m4L5+c7AtDdjDLRxew/knnI4CxvtdxEUVgWz4x3OIQUIFiMfw==} + engines: {node: '>=4'} + dev: true + /axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: @@ -7569,6 +8199,10 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + /bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + dev: true + /bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} dev: false @@ -7627,6 +8261,14 @@ packages: '@noble/hashes': 1.3.3 dev: false + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + /bl@5.1.0: resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} dependencies: @@ -7666,6 +8308,10 @@ packages: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} dev: false + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + /borsh@0.7.0: resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} dependencies: @@ -7773,6 +8419,13 @@ packages: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + /buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} dependencies: @@ -7925,6 +8578,10 @@ packages: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} dev: true + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + /check-error@1.0.2: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} dev: true @@ -7973,6 +8630,23 @@ packages: engines: {node: '>=10'} dev: true + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: true + + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: true + /clipboardy@3.0.0: resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7990,11 +8664,30 @@ packages: wrap-ansi: 6.2.0 dev: false + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + /clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} dev: false + /clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + dev: true + /cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} @@ -8019,6 +8712,10 @@ packages: engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true + /collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + dev: true + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -8066,19 +8763,14 @@ packages: resolution: {integrity: sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==} dev: false - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} dev: true /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true - /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true @@ -8124,10 +8816,19 @@ packages: /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + /cookie-es@1.0.0: resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} dev: false + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + /cookies@0.8.0: resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} engines: {node: '>= 0.8'} @@ -8233,6 +8934,10 @@ packages: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} + /css-selector-parser@3.0.4: + resolution: {integrity: sha512-pnmS1dbKsz6KA4EW4BznyPL2xxkNDRg62hcD0v8g6DEw2W7hxOln5M953jsp9hmw5Dg57S6o/A8GOn37mbAgcQ==} + dev: true + /css-to-react-native@3.2.0: resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} dependencies: @@ -8433,6 +9138,12 @@ packages: titleize: 3.0.0 dev: true + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + /define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -8515,16 +9226,17 @@ packages: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: false + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: true + /diff-sequences@29.4.3: resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: true - /dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} dev: false @@ -8536,6 +9248,11 @@ packages: path-type: 4.0.0 dev: true + /direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + dev: true + /dns-over-http-resolver@1.2.3(node-fetch@3.3.1): resolution: {integrity: sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==} dependencies: @@ -8772,6 +9489,37 @@ packages: '@esbuild/win32-x64': 0.17.19 dev: true + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: true + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -9200,37 +9948,38 @@ packages: engines: {node: '>=4.0'} dev: true - /estree-util-attach-comments@2.1.1: - resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + /estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 dev: true - /estree-util-build-jsx@2.2.2: - resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + /estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} dependencies: '@types/estree-jsx': 1.0.0 - estree-util-is-identifier-name: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 estree-walker: 3.0.3 dev: true - /estree-util-is-identifier-name@2.1.0: - resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} dev: true - /estree-util-to-js@1.2.0: - resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + /estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} dependencies: '@types/estree-jsx': 1.0.0 astring: 1.8.6 source-map: 0.7.4 dev: true - /estree-util-visit@1.2.1: - resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + /estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} dependencies: '@types/estree-jsx': 1.0.0 - '@types/unist': 2.0.7 + '@types/unist': 3.0.2 dev: true /estree-walker@2.0.2: @@ -9240,7 +9989,7 @@ packages: /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 dev: true /esutils@2.0.3: @@ -9399,6 +10148,15 @@ packages: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: true + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + /eyes@0.1.8: resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} engines: {node: '> 0.1.90'} @@ -9426,6 +10184,17 @@ packages: micromatch: 4.0.5 dev: true + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true @@ -9461,6 +10230,13 @@ packages: web-streams-polyfill: 3.2.1 dev: true + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -9602,7 +10378,6 @@ packages: /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: false /get-func-name@2.0.0: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} @@ -9629,9 +10404,9 @@ packages: resolution: {integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==} dev: false - /get-port@6.1.2: - resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /get-port@7.0.0: + resolution: {integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==} + engines: {node: '>=16'} dev: true /get-stream@6.0.1: @@ -9665,25 +10440,10 @@ packages: is-glob: 4.0.3 dev: true - /glob-regex@0.3.2: - resolution: {integrity: sha512-m5blUd3/OqDTWwzBBtWBPrGlAzatRywHameHeekAZyZrskYouOGdNB8T/q6JucucvJXtOuyHIn0/Yia7iDasDw==} - dev: true - /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -9734,6 +10494,18 @@ packages: slash: 4.0.0 dev: true + /globby@14.0.0: + resolution: {integrity: sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==} + engines: {node: '>=18'} + dependencies: + '@sindresorhus/merge-streams': 1.0.0 + fast-glob: 3.3.2 + ignore: 5.2.4 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + dev: true + /globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true @@ -9755,6 +10527,11 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true + /graphql@16.8.1: + resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + dev: true + /graz@0.0.43(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-cLHdOeYxwyvU8c/9eByK5m23XJH4L3mwZU58OIehNwnBGGF2kQQ0TyAviZ8XH+EPhgp/bzVOvgX+e/8FvwzxHg==} hasBin: true @@ -9881,87 +10658,160 @@ packages: minimalistic-assert: 1.0.1 dev: false - /hast-util-from-parse5@7.1.2: - resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + /hast-util-classnames@3.0.0: + resolution: {integrity: sha512-tI3JjoGDEBVorMAWK4jNRsfLMYmih1BUOG3VV36pH36njs1IEl7xkNrVTD2mD2yYHmQCa5R/fj61a8IAF4bRaQ==} dependencies: - '@types/hast': 2.3.5 - '@types/unist': 2.0.7 - hastscript: 7.2.0 + '@types/hast': 3.0.4 + space-separated-tokens: 2.0.2 + dev: true + + /hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 property-information: 6.2.0 - vfile: 5.3.7 - vfile-location: 4.1.0 + vfile: 6.0.1 + vfile-location: 5.0.2 web-namespaces: 2.0.1 dev: true - /hast-util-parse-selector@3.1.1: - resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + /hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} dependencies: - '@types/hast': 2.3.5 + '@types/hast': 3.0.4 dev: true - /hast-util-raw@7.2.3: - resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} dependencies: - '@types/hast': 2.3.5 - '@types/parse5': 6.0.3 - hast-util-from-parse5: 7.1.2 - hast-util-to-parse5: 7.1.0 - html-void-elements: 2.0.1 - parse5: 6.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - vfile: 5.3.7 + '@types/hast': 3.0.4 + dev: true + + /hast-util-raw@9.0.2: + resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + '@ungap/structured-clone': 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.1.0 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 web-namespaces: 2.0.1 zwitch: 2.0.4 dev: true - /hast-util-to-estree@2.3.3: - resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + /hast-util-select@6.0.2: + resolution: {integrity: sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==} dependencies: - '@types/estree': 1.0.1 - '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.5 - '@types/unist': 2.0.7 + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + bcp-47-match: 2.0.3 comma-separated-tokens: 2.0.3 - estree-util-attach-comments: 2.1.1 - estree-util-is-identifier-name: 2.1.0 - hast-util-whitespace: 2.0.1 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdxjs-esm: 1.3.1 + css-selector-parser: 3.0.4 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.0 + hast-util-whitespace: 3.0.0 + not: 0.1.0 + nth-check: 2.1.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + dev: true + + /hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.0 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 property-information: 6.2.0 space-separated-tokens: 2.0.2 style-to-object: 0.4.2 - unist-util-position: 4.0.4 + unist-util-position: 5.0.0 zwitch: 2.0.4 transitivePeerDependencies: - supports-color dev: true - /hast-util-to-parse5@7.1.0: - resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + /hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} dependencies: - '@types/hast': 2.3.5 + '@types/estree': 1.0.5 + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.5 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 property-information: 6.2.0 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 dev: true - /hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + /hast-util-to-string@3.0.0: + resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + dependencies: + '@types/hast': 3.0.4 dev: true - /hastscript@7.2.0: - resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} dependencies: - '@types/hast': 2.3.5 + '@types/hast': 3.0.4 + dev: true + + /hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + dependencies: + '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 3.1.1 + hast-util-parse-selector: 4.0.0 property-information: 6.2.0 space-separated-tokens: 2.0.2 dev: true + /headers-polyfill@4.0.2: + resolution: {integrity: sha512-EWGTfnTqAO2L/j5HZgoM/3z82L7necsJ0pO9Tp0X1wil3PDLrkypTBRgVO2ExehEEvUycejZD3FuRaXpZZc3kw==} + dev: true + /hey-listen@1.0.8: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} dev: false @@ -9996,8 +10846,8 @@ packages: lru-cache: 6.0.0 dev: true - /html-void-elements@2.0.1: - resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} dev: true /http-assert@1.5.0: @@ -10039,6 +10889,13 @@ packages: ms: 2.1.3 dev: false + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -10092,6 +10949,31 @@ packages: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: true + /inline-style-parser@0.2.2: + resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + dev: true + + /inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 6.2.0 + dev: true + /interface-blockstore@2.0.3: resolution: {integrity: sha512-OwVUnlNcx7H5HloK0Myv6c/C1q9cNG11HX6afdeU6q6kbuNj8jKCwVnmJHhC94LZaJ+9hvVOk4IUstb3Esg81w==} dependencies: @@ -10460,6 +11342,11 @@ packages: is-docker: 3.0.0 dev: true + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + /is-ip@3.1.0: resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} engines: {node: '>=8'} @@ -10480,6 +11367,10 @@ packages: engines: {node: '>= 0.4'} dev: true + /is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + dev: true + /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} @@ -10514,7 +11405,7 @@ packages: /is-reference@3.0.1: resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 dev: true /is-regex@1.1.4: @@ -10564,6 +11455,11 @@ packages: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} dev: false + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: @@ -10845,11 +11741,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true - /koa-compose@4.1.0: resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} dev: true @@ -11048,6 +11939,14 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} @@ -11092,13 +11991,6 @@ packages: engines: {node: '>=12'} dev: false - /magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /magic-string@0.30.2: resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} engines: {node: '>=12'} @@ -11123,9 +12015,9 @@ packages: engines: {node: '>=8'} dev: true - /markdown-extensions@1.1.1: - resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} - engines: {node: '>=0.10.0'} + /markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} dev: true /markdown-table@3.0.3: @@ -11158,190 +12050,199 @@ packages: safe-buffer: 5.2.1 dev: false - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + /mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} dependencies: - '@types/mdast': 3.0.12 - '@types/unist': 2.0.7 - unist-util-visit: 4.1.2 - dev: true - - /mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} - dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 4.0.3 escape-string-regexp: 5.0.0 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 dev: true - /mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} dependencies: - '@types/mdast': 3.0.12 - '@types/unist': 2.0.7 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.2.0 - micromark: 3.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-decode-string: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + /mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 4.0.3 ccount: 2.0.1 - mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.2.0 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.0 dev: true - /mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + /mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} dependencies: - '@types/mdast': 3.0.12 - mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.1.0 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color dev: true - /mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + /mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} dependencies: - '@types/mdast': 3.0.12 - mdast-util-to-markdown: 1.5.0 + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color dev: true - /mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + /mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 4.0.3 + devlop: 1.1.0 markdown-table: 3.0.3 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: true - /mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + /mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} dependencies: - '@types/mdast': 3.0.12 - mdast-util-to-markdown: 1.5.0 - dev: true - - /mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} - dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-gfm-autolink-literal: 1.0.3 - mdast-util-gfm-footnote: 1.0.2 - mdast-util-gfm-strikethrough: 1.0.3 - mdast-util-gfm-table: 1.0.7 - mdast-util-gfm-task-list-item: 1.0.2 - mdast-util-to-markdown: 1.5.0 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: true - /mdast-util-mdx-expression@1.3.2: - resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + /mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} dependencies: '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.5 - '@types/mdast': 3.0.12 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: true - /mdast-util-mdx-jsx@2.1.4: - resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + /mdast-util-mdx-jsx@3.0.0: + resolution: {integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==} dependencies: '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.5 - '@types/mdast': 3.0.12 - '@types/unist': 2.0.7 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 ccount: 2.0.1 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 parse-entities: 4.0.1 stringify-entities: 4.0.3 - unist-util-remove-position: 4.0.2 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 transitivePeerDependencies: - supports-color dev: true - /mdast-util-mdx@2.0.1: - resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + /mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdx-jsx: 2.1.4 - mdast-util-mdxjs-esm: 1.3.1 - mdast-util-to-markdown: 1.5.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: true - /mdast-util-mdxjs-esm@1.3.1: - resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} dependencies: '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.5 - '@types/mdast': 3.0.12 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: true - /mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + /mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} dependencies: - '@types/mdast': 3.0.12 - unist-util-is: 5.2.1 + '@types/mdast': 4.0.3 + unist-util-is: 6.0.0 dev: true - /mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + /mdast-util-to-hast@13.1.0: + resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} dependencies: - '@types/hast': 2.3.5 - '@types/mdast': 3.0.12 - mdast-util-definitions: 5.1.2 - micromark-util-sanitize-uri: 1.2.0 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 trim-lines: 3.0.1 - unist-util-generated: 2.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 dev: true - /mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} dependencies: - '@types/mdast': 3.0.12 - '@types/unist': 2.0.7 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 longest-streak: 3.1.0 - mdast-util-phrasing: 3.0.1 - mdast-util-to-string: 3.2.0 - micromark-util-decode-string: 1.1.0 - unist-util-visit: 4.1.2 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 zwitch: 2.0.4 dev: true - /mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 4.0.3 dev: true /media-typer@0.3.0: @@ -11382,336 +12283,336 @@ packages: engines: {node: '>= 8'} dev: true - /micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + /micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} dependencies: decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.1.0 - micromark-factory-label: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-factory-title: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-html-tag-name: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-gfm-autolink-literal@1.0.5: - resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + /micromark-extension-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-gfm-footnote@1.1.2: - resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + /micromark-extension-gfm-footnote@2.0.0: + resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} dependencies: - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-gfm-strikethrough@1.0.7: - resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + /micromark-extension-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-gfm-table@1.0.7: - resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + /micromark-extension-gfm-table@2.0.0: + resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-gfm-tagfilter@1.0.2: - resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + /micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} dependencies: - micromark-util-types: 1.1.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-gfm-task-list-item@1.0.5: - resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + /micromark-extension-gfm-task-list-item@2.0.1: + resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-gfm@2.0.3: - resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} + /micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} dependencies: - micromark-extension-gfm-autolink-literal: 1.0.5 - micromark-extension-gfm-footnote: 1.1.2 - micromark-extension-gfm-strikethrough: 1.0.7 - micromark-extension-gfm-table: 1.0.7 - micromark-extension-gfm-tagfilter: 1.0.2 - micromark-extension-gfm-task-list-item: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 + micromark-extension-gfm-autolink-literal: 2.0.0 + micromark-extension-gfm-footnote: 2.0.0 + micromark-extension-gfm-strikethrough: 2.0.0 + micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.0.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-mdx-expression@1.0.8: - resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + /micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} dependencies: - '@types/estree': 1.0.1 - micromark-factory-mdx-expression: 1.0.9 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-mdx-jsx@1.0.5: - resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + /micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.1 - estree-util-is-identifier-name: 2.1.0 - micromark-factory-mdx-expression: 1.0.9 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - vfile-message: 3.1.4 + '@types/estree': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 dev: true - /micromark-extension-mdx-md@1.0.1: - resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + /micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} dependencies: - micromark-util-types: 1.1.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-mdxjs-esm@1.0.5: - resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + /micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} dependencies: - '@types/estree': 1.0.1 - micromark-core-commonmark: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-position-from-estree: 1.1.2 - uvu: 0.5.6 - vfile-message: 3.1.4 + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 dev: true - /micromark-extension-mdxjs@1.0.1: - resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + /micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - micromark-extension-mdx-expression: 1.0.8 - micromark-extension-mdx-jsx: 1.0.5 - micromark-extension-mdx-md: 1.0.1 - micromark-extension-mdxjs-esm: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.0 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-factory-mdx-expression@1.0.9: - resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + /micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} dependencies: - '@types/estree': 1.0.1 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-position-from-estree: 1.1.2 - uvu: 0.5.6 - vfile-message: 3.1.4 + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 dev: true - /micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-types: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 dev: true - /micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + /micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} dependencies: - micromark-util-symbol: 1.1.0 + micromark-util-symbol: 2.0.0 dev: true - /micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} dependencies: - micromark-util-symbol: 1.1.0 + micromark-util-symbol: 2.0.0 dev: true - /micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} dependencies: decode-named-character-reference: 1.0.2 - micromark-util-character: 1.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-symbol: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 dev: true - /micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} dev: true - /micromark-util-events-to-acorn@1.2.3: - resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + /micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.1 - '@types/unist': 2.0.7 - estree-util-visit: 1.2.1 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - vfile-message: 3.1.4 + '@types/estree': 1.0.5 + '@types/unist': 3.0.2 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 dev: true - /micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} dev: true - /micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} dependencies: - micromark-util-symbol: 1.1.0 + micromark-util-symbol: 2.0.0 dev: true - /micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} dependencies: - micromark-util-types: 1.1.0 + micromark-util-types: 2.0.0 dev: true - /micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-encode: 1.1.0 - micromark-util-symbol: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 dev: true - /micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + /micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} dev: true - /micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} dev: true - /micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} dependencies: '@types/debug': 4.1.12 debug: 4.3.4(supports-color@5.5.0) decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-combine-extensions: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-encode: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 transitivePeerDependencies: - supports-color dev: true @@ -11825,6 +12726,7 @@ packages: /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + dev: false /mrmime@1.0.1: resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} @@ -11837,6 +12739,38 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /msw@2.1.7(typescript@5.1.3): + resolution: {integrity: sha512-yTIYqEMqDSrdbVMrfmqP6rTKQsnIbglTvVmAHDWwNegyXPXRcV+RjsaFEqubRS266gwWCDLm9YdOkWSKLdDvJQ==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + peerDependencies: + typescript: '>= 4.7.x <= 5.3.x' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@bundled-es-modules/cookie': 2.0.0 + '@bundled-es-modules/statuses': 1.0.1 + '@mswjs/cookies': 1.1.0 + '@mswjs/interceptors': 0.25.16 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.4 + chalk: 4.1.2 + chokidar: 3.5.3 + graphql: 16.8.1 + headers-polyfill: 4.0.2 + inquirer: 8.2.6 + is-node-process: 1.2.0 + outvariant: 1.4.2 + path-to-regexp: 6.2.1 + strict-event-emitter: 0.5.1 + type-fest: 4.10.2 + typescript: 5.1.3 + yargs: 17.7.2 + dev: true + /multiaddr-to-uri@8.0.0(node-fetch@3.3.1): resolution: {integrity: sha512-dq4p/vsOOUdVEd1J1gl+R2GFrXJQH8yjLtz4hodqdVbieg39LvBOdMQRdQnfbg5LSM/q1BYNVf5CBbwZFFqBgA==} deprecated: This module is deprecated, please upgrade to @multiformats/multiaddr-to-uri @@ -11870,12 +12804,8 @@ packages: engines: {node: '>=8.0.0'} dev: true - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: true /nan@2.18.0: @@ -11894,6 +12824,12 @@ packages: hasBin: true dev: true + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /napi-wasm@1.1.0: resolution: {integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==} dev: false @@ -12015,6 +12951,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + /not@0.1.0: + resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} + dev: true + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -12028,6 +12968,12 @@ packages: path-key: 4.0.0 dev: true + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -12158,6 +13104,30 @@ packages: type-check: 0.4.0 dev: true + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /outvariant@1.4.2: + resolution: {integrity: sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ==} + dev: true + /p-defer@3.0.0: resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} engines: {node: '>=8'} @@ -12257,8 +13227,10 @@ packages: lines-and-columns: 1.2.4 dev: true - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 dev: true /parseurl@1.3.3: @@ -12287,11 +13259,20 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: true + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true + /path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + dev: true + /pathe@1.1.1: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} @@ -12313,7 +13294,7 @@ packages: /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 estree-walker: 3.0.3 is-reference: 3.0.1 dev: true @@ -12363,11 +13344,6 @@ packages: thread-stream: 0.15.2 dev: false - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true - /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -12405,6 +13381,15 @@ packages: source-map-js: 1.0.2 dev: true + /postcss@8.4.34: + resolution: {integrity: sha512-4eLTO36woPSocqZ1zIrFD2K1v6wH7pY1uBh0JIM2KKfrVtGvPFiAku6aNOP0W1Wr9qwnaCsF0Z+CrVnryB2A8Q==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /preact@10.17.0: resolution: {integrity: sha512-SNsI8cbaCcUS5tbv9nlXuCfIXnJ9ysBMWk0WnB6UWwcVA3qZ2O6FxqDFECMAMttvLQcW/HaNZUe2BLidyvrVYw==} dev: false @@ -12436,11 +13421,13 @@ packages: react-is: 17.0.2 dev: true - /prism-react-renderer@1.3.5(react@18.2.0): - resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==} + /prism-react-renderer@2.3.1(react@18.2.0): + resolution: {integrity: sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==} peerDependencies: - react: '>=0.14.9' + react: '>=16.0.0' dependencies: + '@types/prismjs': 1.26.3 + clsx: 2.1.0 react: 18.2.0 dev: true @@ -12639,14 +13626,12 @@ packages: react: 18.2.0 scheduler: 0.23.0 - /react-frame-component@5.2.4(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-4xpZFcLNS6LCEYSlWgsUy81v7LjdgbvB0VHIq7sNSD25PK+e5YYCrdy5557ebGwNLKNLEpYVfAkT3pVzFLPb1g==} + /react-hotkeys-hook@4.5.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Samb85GSgAWFQNvVt3PS90LPPGSf9mkH/r4au81ZP1yOIFayLC3QAvqTgGtJ8YEDMXtPmaVBs6NgipHO6h4Mug==} peerDependencies: - prop-types: ^15.5.9 - react: '>= 16.3' - react-dom: '>= 16.3' + react: '>=16.8.1' + react-dom: '>=16.8.1' dependencies: - prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true @@ -12933,16 +13918,6 @@ packages: ms: 2.1.3 dev: true - /recrawl-sync@2.2.3: - resolution: {integrity: sha512-vSaTR9t+cpxlskkdUFrsEpnf67kSmPk66yAGT1fZPrDudxQjoMzPgQhSMImQ0pAw5k0NPirefQfhopSjhdUtpQ==} - dependencies: - '@cush/relative': 1.0.0 - glob-regex: 0.3.2 - slash: 3.0.0 - sucrase: 3.34.0 - tslib: 1.14.1 - dev: true - /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -13003,51 +13978,72 @@ packages: functions-have-names: 1.2.3 dev: true - /rehype-raw@6.1.1: - resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} + /rehype-class-names@1.0.14: + resolution: {integrity: sha512-eFBt6Qxb7K77y6P82tUtN9rKpU7guWlaK4XA4RrrSFHkUTCvr2D3cgb9OR5d4t1AaGOvR59FH9nRwUnbpn9AEg==} dependencies: - '@types/hast': 2.3.5 - hast-util-raw: 7.2.3 + '@types/hast': 3.0.4 + hast-util-classnames: 3.0.0 + hast-util-select: 6.0.2 unified: 10.1.2 dev: true - /remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + /rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} dependencies: - '@types/mdast': 3.0.12 - mdast-util-gfm: 2.0.2 - micromark-extension-gfm: 2.0.3 - unified: 10.1.2 + '@types/hast': 3.0.4 + hast-util-raw: 9.0.2 + vfile: 6.0.1 + dev: true + + /remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 transitivePeerDependencies: - supports-color dev: true - /remark-mdx@2.3.0: - resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + /remark-mdx@3.0.0: + resolution: {integrity: sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==} dependencies: - mdast-util-mdx: 2.0.1 - micromark-extension-mdxjs: 1.0.1 + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 transitivePeerDependencies: - supports-color dev: true - /remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} dependencies: - '@types/mdast': 3.0.12 - mdast-util-from-markdown: 1.3.1 - unified: 10.1.2 + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 transitivePeerDependencies: - supports-color dev: true - /remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + /remark-rehype@11.1.0: + resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} dependencies: - '@types/hast': 2.3.5 - '@types/mdast': 3.0.12 - mdast-util-to-hast: 12.3.0 - unified: 10.1.2 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + mdast-util-to-hast: 13.1.0 + unified: 11.0.4 + vfile: 6.0.1 + dev: true + + /remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 dev: true /remove-accents@0.4.2: @@ -13057,7 +14053,6 @@ packages: /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: false /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} @@ -13099,6 +14094,14 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + /retimer@2.0.0: resolution: {integrity: sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg==} dev: true @@ -13134,6 +14137,29 @@ packages: fsevents: 2.3.3 dev: true + /rollup@4.9.6: + resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.9.6 + '@rollup/rollup-android-arm64': 4.9.6 + '@rollup/rollup-darwin-arm64': 4.9.6 + '@rollup/rollup-darwin-x64': 4.9.6 + '@rollup/rollup-linux-arm-gnueabihf': 4.9.6 + '@rollup/rollup-linux-arm64-gnu': 4.9.6 + '@rollup/rollup-linux-arm64-musl': 4.9.6 + '@rollup/rollup-linux-riscv64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-musl': 4.9.6 + '@rollup/rollup-win32-arm64-msvc': 4.9.6 + '@rollup/rollup-win32-ia32-msvc': 4.9.6 + '@rollup/rollup-win32-x64-msvc': 4.9.6 + fsevents: 2.3.3 + dev: true + /rpc-websockets@7.6.0: resolution: {integrity: sha512-Jgcs8q6t8Go98dEulww1x7RysgTkzpCMelVxZW4hvuyFtOGpeUz9prpr2KjUa/usqxgFCd9Tu3+yhHEP9GVmiQ==} dependencies: @@ -13153,6 +14179,11 @@ packages: execa: 5.1.1 dev: true + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -13166,11 +14197,10 @@ packages: tslib: 1.14.1 dev: false - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - mri: 1.2.0 + tslib: 2.6.2 dev: true /safe-array-concat@1.0.0: @@ -13312,6 +14342,11 @@ packages: engines: {node: '>=12'} dev: true + /slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + dev: true + /sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} dependencies: @@ -13397,6 +14432,11 @@ packages: engines: {node: '>= 0.6'} dev: true + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + /std-env@3.3.3: resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} dev: true @@ -13427,6 +14467,10 @@ packages: engines: {node: '>=10'} dev: true + /strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + dev: true + /strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -13550,6 +14594,12 @@ packages: inline-style-parser: 0.1.1 dev: true + /style-to-object@1.0.5: + resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + dependencies: + inline-style-parser: 0.2.2 + dev: true + /styled-components@5.3.11(@babel/core@7.22.5)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} engines: {node: '>=10'} @@ -13574,20 +14624,6 @@ packages: transitivePeerDependencies: - '@babel/core' - /sucrase@3.34.0: - resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} - engines: {node: '>=8'} - hasBin: true - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - commander: 4.1.1 - glob: 7.1.6 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - dev: true - /superjson@1.13.3: resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} engines: {node: '>=10'} @@ -13694,19 +14730,6 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: true - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: true - /thread-stream@0.15.2: resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} dependencies: @@ -13719,7 +14742,6 @@ packages: /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: false /time-zone@1.0.0: resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} @@ -13769,6 +14791,13 @@ packages: engines: {node: '>=12'} dev: true + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -13804,8 +14833,17 @@ packages: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: true - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + /tsconfck@3.0.1(typescript@5.1.3): + resolution: {integrity: sha512-7ppiBlF3UEddCLeI1JRx5m2Ryq+xk4JrZuq4EuYXykipebaq1dV0Fhgr1hb7CkmHt32QSgOZlcqVLEtHBG4/mg==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.1.3 dev: true /tsconfig-paths@3.14.2: @@ -13817,15 +14855,6 @@ packages: strip-bom: 3.0.0 dev: true - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -13838,7 +14867,6 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false /tsscmp@1.0.6: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} @@ -13877,6 +14905,11 @@ packages: engines: {node: '>=10'} dev: true + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} @@ -13892,6 +14925,11 @@ packages: engines: {node: '>=12.20'} dev: true + /type-fest@4.10.2: + resolution: {integrity: sha512-anpAG63wSpdEbLwOqH8L84urkL6PiVIov3EMmgIhhThevh9aiMQov+6Btx0wldNcvm4wV+e2/Rt1QdDwKHFbHw==} + engines: {node: '>=16'} + dev: true + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -13995,6 +15033,11 @@ packages: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} dev: false + /unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + dev: true + /unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} dependencies: @@ -14007,33 +15050,41 @@ packages: vfile: 5.3.7 dev: true - /unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 6.0.1 dev: true - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} dependencies: - '@types/unist': 2.0.7 + '@types/unist': 3.0.2 dev: true - /unist-util-position-from-estree@1.1.2: - resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + /unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} dependencies: - '@types/unist': 2.0.7 + '@types/unist': 3.0.2 dev: true - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} dependencies: - '@types/unist': 2.0.7 + '@types/unist': 3.0.2 dev: true - /unist-util-remove-position@4.0.2: - resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} dependencies: - '@types/unist': 2.0.7 - unist-util-visit: 4.1.2 + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 dev: true /unist-util-stringify-position@3.0.3: @@ -14042,19 +15093,25 @@ packages: '@types/unist': 2.0.7 dev: true - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} dependencies: - '@types/unist': 2.0.7 - unist-util-is: 5.2.1 + '@types/unist': 3.0.2 dev: true - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} dependencies: - '@types/unist': 2.0.7 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + dev: true + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 dev: true /unload@2.2.0: @@ -14266,17 +15323,6 @@ packages: hasBin: true dev: false - /uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - dequal: 2.0.3 - diff: 5.1.0 - kleur: 4.1.5 - sade: 1.8.1 - dev: true - /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -14325,11 +15371,11 @@ packages: engines: {node: '>= 0.8'} dev: true - /vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + /vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} dependencies: - '@types/unist': 2.0.7 - vfile: 5.3.7 + '@types/unist': 3.0.2 + vfile: 6.0.1 dev: true /vfile-message@3.1.4: @@ -14339,6 +15385,13 @@ packages: unist-util-stringify-position: 3.0.3 dev: true + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + dev: true + /vfile@5.3.7: resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} dependencies: @@ -14348,6 +15401,14 @@ packages: vfile-message: 3.1.4 dev: true + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + dev: true + /viem@1.20.0(typescript@5.1.3): resolution: {integrity: sha512-yPjV9pJr10xi28C/9LEvs5zdZNEMiru3Kz7nufghVYABJAfeSkoZQXb6b23n7MscS7c55JO5nmUI3xKkd9g6Yg==} peerDependencies: @@ -14406,18 +15467,21 @@ packages: - supports-color dev: true - /vite-tsconfig-paths@3.6.0(vite@4.3.9): - resolution: {integrity: sha512-UfsPYonxLqPD633X8cWcPFVuYzx/CMNHAjZTasYwX69sXpa4gNmQkR0XCjj82h7zhLGdTWagMjC1qfb9S+zv0A==} + /vite-tsconfig-paths@4.3.1(typescript@5.1.3)(vite@5.0.12): + resolution: {integrity: sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw==} peerDependencies: - vite: '>2.0.0-0' + vite: '*' + peerDependenciesMeta: + vite: + optional: true dependencies: debug: 4.3.4(supports-color@5.5.0) globrex: 0.1.2 - recrawl-sync: 2.2.3 - tsconfig-paths: 4.2.0 - vite: 4.3.9(@types/node@20.3.1) + tsconfck: 3.0.1(typescript@5.1.3) + vite: 5.0.12(@types/node@20.3.1) transitivePeerDependencies: - supports-color + - typescript dev: true /vite@4.3.9(@types/node@20.3.1): @@ -14453,6 +15517,42 @@ packages: fsevents: 2.3.3 dev: true + /vite@5.0.12(@types/node@20.3.1): + resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.3.1 + esbuild: 0.19.12 + postcss: 8.4.34 + rollup: 4.9.6 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /vitest@0.32.2: resolution: {integrity: sha512-hU8GNNuQfwuQmqTLfiKcqEhZY72Zxb7nnN07koCUNmntNxbKQnVbeIS6sqUgR3eXSlbOpit8+/gr1KpqoMgWCQ==} engines: {node: '>=v14.18.0'} @@ -14583,6 +15683,12 @@ packages: graceful-fs: 4.2.11 dev: true + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + /web-encoding@1.1.5: resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} dependencies: @@ -14744,7 +15850,15 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true /wrap-ansi@8.1.0: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} @@ -14842,6 +15956,11 @@ packages: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: false + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -14861,6 +15980,11 @@ packages: engines: {node: '>=10'} dev: true + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + /yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} @@ -14878,6 +16002,19 @@ packages: yargs-parser: 18.1.3 dev: false + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + /ylru@1.3.2: resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} engines: {node: '>= 4.0.0'} diff --git a/src/components/Details.stories.tsx b/src/components/Details.stories.tsx index 58707b8..ed086fb 100644 --- a/src/components/Details.stories.tsx +++ b/src/components/Details.stories.tsx @@ -7,35 +7,50 @@ import { StoryWrapper } from '.ladle/components'; import styled, { type AnyStyledComponent } from 'styled-components'; import { layoutMixins } from '@/styles/layoutMixins'; -export const DetailsStory: Story> = () => ( +export const DetailsStory: Story[0]> = (args) => ( -
+
); +DetailsStory.args = { + items: [ + { + key: 'item-1', + label: 'Item 1', + tooltip: 'leverage', + value: 'Value 1', + }, + { + key: 'item-2', + label: 'Really really really long item name 2', + tooltip: 'liquidation-price', + value: 'Value 2', + }, + { + key: 'item-3', + label: 'Item 3', + tooltip: 'realized-pnl', + value: 'Value 3', + }, + ], + showSubitems: false, + isLoading: false, + withOverflow: false, + withSeparators: false, +}; + +DetailsStory.argTypes = { + justifyItems: { options: ['start', 'end'], control: { type: 'select' }, defaultValue: 'start' }, + layout: { + options: ['column', 'row', 'rowColumns', 'grid', 'stackColumn'], + control: { type: 'select' }, + defaultValue: 'column', + }, +}; + const Styled: Record = {}; Styled.Resizable = styled.section` diff --git a/src/components/DropdownMenu.stories.tsx b/src/components/DropdownMenu.stories.tsx index 939ae48..abe57cf 100644 --- a/src/components/DropdownMenu.stories.tsx +++ b/src/components/DropdownMenu.stories.tsx @@ -4,8 +4,18 @@ import { DropdownMenu } from '@/components/DropdownMenu'; import { StoryWrapper } from '.ladle/components'; -export const DropdownMenuStory: Story> = (args) => { - const exampleItems = [ +export const DropdownMenuStory: Story[0]> = (args) => { + return ( + + + Menu + + + ); +}; + +DropdownMenuStory.args = { + items: [ { value: '0', label: 'Item 0', @@ -29,19 +39,9 @@ export const DropdownMenuStory: Story> = (args) onSelect: () => alert('Item 3 action'), highlightColor: 'destroy', }, - ]; - - return ( - - - Menu - - - ); + ], }; -DropdownMenuStory.args = {}; - DropdownMenuStory.argTypes = { align: { options: ['start', 'center', 'end'], diff --git a/src/components/DropdownSelectMenu.stories.tsx b/src/components/DropdownSelectMenu.stories.tsx index 9108562..2262d10 100644 --- a/src/components/DropdownSelectMenu.stories.tsx +++ b/src/components/DropdownSelectMenu.stories.tsx @@ -28,21 +28,22 @@ const exampleItems = [ }, ]; -export const DropdownSelectMenuStory: Story> = (args) => { +export const DropdownSelectMenuStory: Story< + Pick[0], 'items' | 'align' | 'sideOffset' | 'disabled'> +> = (args) => { const [item, setItem] = useState(exampleItems[0].value); return ( - setItem(value)} - {...args} - /> + setItem(value)} {...args} /> ); }; -DropdownSelectMenuStory.args = {}; +DropdownSelectMenuStory.args = { + items: exampleItems, + sideOffset: 1, + disabled: false, +}; DropdownSelectMenuStory.argTypes = { align: { diff --git a/src/components/Icon.stories.tsx b/src/components/Icon.stories.tsx index 808ef50..e0e1392 100644 --- a/src/components/Icon.stories.tsx +++ b/src/components/Icon.stories.tsx @@ -4,7 +4,7 @@ import { Icon, IconName } from '@/components/Icon'; import { StoryWrapper } from '.ladle/components'; -export const IconStory: Story> = (args) => { +export const IconStory: Story[0]> = (args) => { return ( diff --git a/src/components/Link.stories.tsx b/src/components/Link.stories.tsx index 46721c6..2042b51 100644 --- a/src/components/Link.stories.tsx +++ b/src/components/Link.stories.tsx @@ -6,7 +6,7 @@ import { Link } from '@/components/Link'; import { StoryWrapper } from '.ladle/components'; import { layoutMixins } from '@/styles/layoutMixins'; -export const LinkStory: Story> = (args) => { +export const LinkStory: Story[0]> = (args) => { return ( diff --git a/src/components/NavigationMenu.stories.tsx b/src/components/NavigationMenu.stories.tsx index 290b0fa..10929f8 100644 --- a/src/components/NavigationMenu.stories.tsx +++ b/src/components/NavigationMenu.stories.tsx @@ -5,8 +5,24 @@ import { HashRouter } from 'react-router-dom'; import { StoryWrapper } from '.ladle/components'; -export const NavigationMenuStory: Story> = (args) => { - const exampleItems = [ +export const NavigationMenuStory: Story< + Pick[0], 'items' | 'orientation' | 'submenuPlacement'> +> = (args) => { + return ( + + + Menu + + } + /> + + ); +}; + +NavigationMenuStory.args = { + items: [ { group: 'navigation', groupLabel: 'Views', @@ -93,23 +109,9 @@ export const NavigationMenuStory: Story> = (ar }, ], }, - ]; - - return ( - - - Menu - - } - /> - - ); + ], }; -NavigationMenuStory.args = {}; - NavigationMenuStory.argTypes = { orientation: { options: ['vertical', 'horizontal'], diff --git a/src/components/SearchInput.stories.tsx b/src/components/SearchInput.stories.tsx index 8a8258e..67f06e7 100644 --- a/src/components/SearchInput.stories.tsx +++ b/src/components/SearchInput.stories.tsx @@ -7,7 +7,7 @@ import { StoryWrapper } from '.ladle/components'; import { layoutMixins } from '@/styles/layoutMixins'; import { InputType } from './Input'; -export const SearchInputStory: Story> = (args) => ( +export const SearchInputStory: Story[0]> = (args) => ( diff --git a/src/components/SearchSelectMenu.stories.tsx b/src/components/SearchSelectMenu.stories.tsx index 16a81d7..97ab8c7 100644 --- a/src/components/SearchSelectMenu.stories.tsx +++ b/src/components/SearchSelectMenu.stories.tsx @@ -6,7 +6,7 @@ import { SearchSelectMenu } from '@/components/SearchSelectMenu'; import { StoryWrapper } from '.ladle/components'; -export const SearchSelectMenuStory: Story> = (args) => { +export const SearchSelectMenuStory: Story[0]> = (args) => { const [selectedItem, setSelectedItem] = useState(); const exampleItems = [ @@ -24,10 +24,7 @@ export const SearchSelectMenuStory: Story> = return ( - + {!selectedItem ? Search and Select : {selectedItem}} diff --git a/src/components/SelectMenu.stories.tsx b/src/components/SelectMenu.stories.tsx index d6d50a7..168b9e8 100644 --- a/src/components/SelectMenu.stories.tsx +++ b/src/components/SelectMenu.stories.tsx @@ -26,7 +26,7 @@ const exampleItems: { value: string; label: string }[] = [ }, ]; -export const SelectMenuStory: Story> = (args) => { +export const SelectMenuStory: Story[0]> = (args) => { const [value, setValue] = useState(exampleItems[0].value); const [value2, setValue2] = useState(exampleItems[2].value); diff --git a/src/components/Tabs.stories.tsx b/src/components/Tabs.stories.tsx index 6adb027..68fcf56 100644 --- a/src/components/Tabs.stories.tsx +++ b/src/components/Tabs.stories.tsx @@ -13,29 +13,11 @@ enum TabItem { Item3 = 'Item3', } -const TabItems = [ - { - value: TabItem.Item1, - label: 'Item 1', - content:
Item 1 Content
, - }, - { - value: TabItem.Item2, - label: 'Item 2', - content:
Item 2 Content
, - }, - { - value: TabItem.Item3, - label: 'Item 3', - content:
Item 3 Content
, - }, -]; - -export const TabsStory: Story> = (args) => { +export const TabsStory: Story[0]> = (args) => { return ( - + ); @@ -43,6 +25,23 @@ export const TabsStory: Story> = (args) => { TabsStory.args = { fullWidthTabs: false, + items: [ + { + value: TabItem.Item1, + label: 'Item 1', + content:
Item 1 Content
, + }, + { + value: TabItem.Item2, + label: 'Item 2', + content:
Item 2 Content
, + }, + { + value: TabItem.Item3, + label: 'Item 3', + content:
Item 3 Content
, + }, + ], }; TabsStory.argTypes = { diff --git a/src/components/Tag.stories.tsx b/src/components/Tag.stories.tsx index b83d740..8d3e2c3 100644 --- a/src/components/Tag.stories.tsx +++ b/src/components/Tag.stories.tsx @@ -1,10 +1,10 @@ import type { Story } from '@ladle/react'; -import { Tag } from '@/components/Tag'; +import { Tag, TagSign, TagSize, TagType } from '@/components/Tag'; import { StoryWrapper } from '.ladle/components'; -export const TagStory: Story> = (args) => { +export const TagStory: Story[0]> = (args) => { return ( @@ -14,4 +14,23 @@ export const TagStory: Story> = (args) => { TagStory.args = { children: 'USDC', + isHighlighted: false, +}; + +TagStory.argTypes = { + size: { + options: Object.values(TagSize), + control: { type: 'select' }, + defaultValue: TagSize.Small, + }, + type: { + options: [...Object.values(TagType), undefined], + control: { type: 'select' }, + defaultValue: undefined, + }, + sign: { + options: [...Object.values(TagSign), undefined], + control: { type: 'select' }, + defaultValue: undefined, + }, }; diff --git a/src/components/Tag.tsx b/src/components/Tag.tsx index 28ad37f..71d20cf 100644 --- a/src/components/Tag.tsx +++ b/src/components/Tag.tsx @@ -1,20 +1,20 @@ import styled, { css } from 'styled-components'; export enum TagSize { - Small, - Medium, + Small = 'Small', + Medium = 'Medium', } export enum TagType { - Asset, - Side, - Number, + Asset = 'Asset', + Side = 'Side', + Number = 'Number', } export enum TagSign { - Positive, - Negative, - Neutral, + Positive = 'Positive', + Negative = 'Negative', + Neutral = 'Neutral', } type StyleProps = { diff --git a/src/components/ToggleButton.stories.tsx b/src/components/ToggleButton.stories.tsx index dd96fcc..339b3d1 100644 --- a/src/components/ToggleButton.stories.tsx +++ b/src/components/ToggleButton.stories.tsx @@ -5,7 +5,7 @@ import { ButtonShape, ButtonSize } from '@/constants/buttons'; import { StoryWrapper } from '.ladle/components'; import { ToggleButton } from './ToggleButton'; -export const ToggleButtonStory: Story> = (args) => ( +export const ToggleButtonStory: Story[0]> = (args) => ( Toggle me diff --git a/src/components/ToggleGroup.stories.tsx b/src/components/ToggleGroup.stories.tsx index 2e556cf..71ab558 100644 --- a/src/components/ToggleGroup.stories.tsx +++ b/src/components/ToggleGroup.stories.tsx @@ -21,16 +21,22 @@ const ToggleGroupItems = [ }, ]; -export const ToggleGroupStory: Story> = (args) => { +export const ToggleGroupStory: Story< + Pick[0], 'items' | 'size' | 'shape'> +> = (args) => { const [value, setValue] = useState('0'); return ( - + ); }; +ToggleGroupStory.args = { + items: ToggleGroupItems, +}; + ToggleGroupStory.argTypes = { size: { options: Object.values(ButtonSize), diff --git a/src/components/WithLabel.stories.tsx b/src/components/WithLabel.stories.tsx index fc8fa84..9e819bf 100644 --- a/src/components/WithLabel.stories.tsx +++ b/src/components/WithLabel.stories.tsx @@ -9,7 +9,7 @@ import { StoryWrapper } from '.ladle/components'; import styled, { type AnyStyledComponent } from 'styled-components'; import { layoutMixins } from '@/styles/layoutMixins'; -export const WithLabelStory: Story> = (args) => { +export const WithLabelStory: Story[0]> = (args) => { const [firstName, setFirstName] = useState(''); const [lastName, setLastName] = useState(''); diff --git a/src/components/WithReceipt.stories.tsx b/src/components/WithReceipt.stories.tsx index a14589a..e38f7c8 100644 --- a/src/components/WithReceipt.stories.tsx +++ b/src/components/WithReceipt.stories.tsx @@ -3,32 +3,29 @@ import type { Story } from '@ladle/react'; import { Button } from '@/components/Button'; import { WithReceipt } from '@/components/WithReceipt'; -import { type DetailsItem } from './Details'; import { StoryWrapper } from '.ladle/components'; -const items: DetailsItem[] = [ - { - key: 'item-1', - label: 'Item 1', - value: 'Value 1', - }, - { - key: 'item-2', - label: 'Item 2', - value: 'Value 2', - }, - { - key: 'item-3', - label: 'Item 3', - value: 'Value 3', - }, -]; - -export const WithReceiptStory: Story> = (args) => ( +export const WithReceiptStory: Story[0], 'slotReceipt'>> = ( + args +) => (
- + + Receipt Content +
+ } + {...args} + > @@ -36,7 +33,7 @@ export const WithReceiptStory: Story> = (args) => ( ); WithReceiptStory.args = { - items, + hideReceipt: false, }; WithReceiptStory.argTypes = { diff --git a/src/components/WithTooltip.stories.tsx b/src/components/WithTooltip.stories.tsx index 93bd2b3..5058d2c 100644 --- a/src/components/WithTooltip.stories.tsx +++ b/src/components/WithTooltip.stories.tsx @@ -6,7 +6,7 @@ import { tooltipStrings } from '@/constants/tooltips'; import { StoryWrapper } from '.ladle/components'; -export const Tooltip: Story> = (args) => { +export const Tooltip: Story[0]> = (args) => { return ( diff --git a/src/views/PositionTile.stories.tsx b/src/views/PositionTile.stories.tsx index e18008c..58834f5 100644 --- a/src/views/PositionTile.stories.tsx +++ b/src/views/PositionTile.stories.tsx @@ -33,9 +33,11 @@ Styled.PositionInfoContainer = styled.div` PositionTileStory.args = { currentSize: 0.2, - oraclePrice: 1300, + notionalTotal: 1300, postOrderSize: 0.2, stepSizeDecimals: 3, symbol: 'ETH', tickSizeDecimals: 1, + isLoading: false, + showNarrowVariation: false, }; From 1a41ccaf2ab65de07a4f0566469df8ccf75cf4e5 Mon Sep 17 00:00:00 2001 From: Jared Vu Date: Wed, 7 Feb 2024 11:17:54 -0800 Subject: [PATCH 15/19] 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)}} From bd788f22e87fe3779c7f2caad99d3e78d135ecd7 Mon Sep 17 00:00:00 2001 From: Jared Vu Date: Wed, 7 Feb 2024 14:22:12 -0800 Subject: [PATCH 16/19] Restore env format (#288) * restore formatting * copy from prev commit --- public/configs/env.json | 2621 ++++++++++++++++++++------------------- 1 file changed, 1319 insertions(+), 1302 deletions(-) diff --git a/public/configs/env.json b/public/configs/env.json index b94740f..9b6f2ff 100644 --- a/public/configs/env.json +++ b/public/configs/env.json @@ -1,1315 +1,1332 @@ { - "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 + "apps": { + "ios": { + "scheme": "dydx-t-v4" } - }, - "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" - } + }, + "deployments": { + "MAINNET": { + "environments": [ + "dydxprotocol-mainnet" + ], + "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/" + "TESTFLIGHT": { + "environments": [ + "dydxprotocol-mainnet", + "dydxprotocol-testnet" + ], + "default": "dydxprotocol-mainnet" }, - "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" + "TESTNET": { + "environments": [ + "dydxprotocol-testnet" + ], + "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 + "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" } - }, - "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" - } + }, + "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 + } }, - "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-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/", + "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 + } }, - "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-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/", + "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 + } }, - "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-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 + } }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } + "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 + } }, - "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", + "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/", + "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", + "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-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}", + "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/", + "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 + } } - }, - "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 - } - } - } + } } From 5fb2f278daad92ad5fb742dbce4688cc061b5dc7 Mon Sep 17 00:00:00 2001 From: Jared Vu Date: Thu, 8 Feb 2024 06:44:50 -0800 Subject: [PATCH 17/19] Liquid staking language and localization (#289) * :pencil2: Liquid staking language and localization * import nits --- package.json | 2 +- pnpm-lock.yaml | 14 ++++++--- src/hooks/usePotentialMarkets.tsx | 2 +- src/pages/token/Governance.tsx | 2 +- src/pages/token/Token.tsx | 2 +- src/pages/token/staking/StakingPage.tsx | 7 +++-- src/pages/token/staking/StakingPanel.tsx | 2 +- .../token/staking/StrideStakingPanel.tsx | 7 +++-- src/views/dialogs/ExternalLinkDialog.tsx | 3 ++ src/views/dialogs/ExternalNavKeplrDialog.tsx | 31 +++++++++++++++++-- src/views/dialogs/ExternalNavStrideDialog.tsx | 20 +++++++++--- 11 files changed, 71 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 9e3446d..79ec326 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@cosmjs/tendermint-rpc": "^0.32.1", "@dydxprotocol/v4-abacus": "^1.4.2", "@dydxprotocol/v4-client-js": "^1.0.20", - "@dydxprotocol/v4-localization": "^1.1.25", + "@dydxprotocol/v4-localization": "^1.1.26", "@ethersproject/providers": "^5.7.2", "@js-joda/core": "^5.5.3", "@radix-ui/react-accordion": "^1.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41d3607..eac9ab3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,8 +36,8 @@ dependencies: specifier: ^1.0.20 version: 1.0.20 '@dydxprotocol/v4-localization': - specifier: ^1.1.25 - version: 1.1.25 + specifier: ^1.1.26 + version: 1.1.26 '@ethersproject/providers': specifier: ^5.7.2 version: 5.7.2 @@ -1323,8 +1323,8 @@ packages: - utf-8-validate dev: false - /@dydxprotocol/v4-localization@1.1.25: - resolution: {integrity: sha512-84BJMybnZBrRnDpnHlMUcOYT1r0ODtgcdgrjdzTw8b0sViTY6ne9ob690fcn/vQO+6sEdDsdt+08ud0H+ZvyYg==} + /@dydxprotocol/v4-localization@1.1.26: + resolution: {integrity: sha512-u+J1J5Up8McwZOcDaG9GrH/A8p4vD2NU2CT2hPdYyKgEd28XeAYvv7bNAQRKdiBaqTePbbF5uB6TMAQnEGnb1A==} dev: false /@dydxprotocol/v4-proto@4.0.0-dev.0: @@ -8882,7 +8882,7 @@ packages: resolution: {integrity: sha512-WIdaQ8uW1vIbYvNnAVunkC6yxTrneJC7VQ5UUQ0kuw8b0C0A39KTIpoQHCfc8tV7o9vF4niwRhdXEdfAgQEsQQ==} dependencies: cosmos-directory-types: 0.0.6 - node-fetch-native: 1.6.1 + node-fetch-native: 1.6.2 dev: false /cosmos-directory-types@0.0.6: @@ -12892,6 +12892,10 @@ packages: resolution: {integrity: sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==} dev: false + /node-fetch-native@1.6.2: + resolution: {integrity: sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==} + dev: false + /node-fetch@2.6.12: resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} engines: {node: 4.x || >=6.0.0} diff --git a/src/hooks/usePotentialMarkets.tsx b/src/hooks/usePotentialMarkets.tsx index af1a9d8..443900b 100644 --- a/src/hooks/usePotentialMarkets.tsx +++ b/src/hooks/usePotentialMarkets.tsx @@ -88,7 +88,7 @@ export const usePotentialMarketsContext = () => { impactNotional: 10_000, }, 1: { - label: 'Mid-cap', + label: stringGetter({ key: STRING_KEYS.MID_CAP }), initialMarginFraction: 0.1, maintenanceMarginFraction: 0.05, impactNotional: 5_000, diff --git a/src/pages/token/Governance.tsx b/src/pages/token/Governance.tsx index 1c0fe1f..723f0ec 100644 --- a/src/pages/token/Governance.tsx +++ b/src/pages/token/Governance.tsx @@ -19,7 +19,7 @@ export default () => { diff --git a/src/pages/token/Token.tsx b/src/pages/token/Token.tsx index 38cdc88..6471f21 100644 --- a/src/pages/token/Token.tsx +++ b/src/pages/token/Token.tsx @@ -59,7 +59,7 @@ export default () => { ), - label: 'Staking Rewards', // stringGetter({ key: STRING_KEYS.STAKING_REWARDS }), + label: stringGetter({ key: STRING_KEYS.STAKING_REWARDS }), href: TokenRoute.StakingRewards, tag: stringGetter({ key: STRING_KEYS.NEW }), }, diff --git a/src/pages/token/staking/StakingPage.tsx b/src/pages/token/staking/StakingPage.tsx index ff95117..91b9096 100644 --- a/src/pages/token/staking/StakingPage.tsx +++ b/src/pages/token/staking/StakingPage.tsx @@ -5,18 +5,21 @@ import { layoutMixins } from '@/styles/layoutMixins'; import { DetachedSection } from '@/components/ContentSection'; import { ContentSectionHeader } from '@/components/ContentSectionHeader'; +import { useStringGetter } from '@/hooks'; import { StakingPanel } from './StakingPanel'; import { StrideStakingPanel } from './StrideStakingPanel'; import { DYDXBalancePanel } from '../rewards/DYDXBalancePanel'; +import { STRING_KEYS } from '@/constants/localization'; export default () => { + const stringGetter = useStringGetter(); return ( diff --git a/src/pages/token/staking/StakingPanel.tsx b/src/pages/token/staking/StakingPanel.tsx index 4636a9e..1b934c7 100644 --- a/src/pages/token/staking/StakingPanel.tsx +++ b/src/pages/token/staking/StakingPanel.tsx @@ -23,7 +23,7 @@ export const StakingPanel = ({ className }: { className?: string }) => { className={className} slotHeaderContent={ - Stake with Keplr + {stringGetter({ key: STRING_KEYS.STAKE_WITH_KEPLR })} } diff --git a/src/pages/token/staking/StrideStakingPanel.tsx b/src/pages/token/staking/StrideStakingPanel.tsx index 4eecd8e..e100523 100644 --- a/src/pages/token/staking/StrideStakingPanel.tsx +++ b/src/pages/token/staking/StrideStakingPanel.tsx @@ -24,7 +24,7 @@ export const StrideStakingPanel = ({ className }: { className?: string }) => { slotHeaderContent={ - Liquid Stake with Stride + {stringGetter({ key: STRING_KEYS.LIQUID_STAKE_W_STRIDE })} {stringGetter({ key: STRING_KEYS.NEW })} @@ -33,7 +33,10 @@ export const StrideStakingPanel = ({ className }: { className?: string }) => { onClick={() => dispatch(openDialog({ type: DialogTypes.ExternalNavStride }))} > - {`Stake your ${chainTokenLabel} tokens for st${chainTokenLabel} which you can deploy around the ecosystem.`} + {stringGetter({ + key: STRING_KEYS.LIQUID_STAKE_STRIDE_DESCRIPTION, + params: { TOKEN_DENOM: chainTokenLabel }, + })} e.stopPropagation()}> {stringGetter({ key: STRING_KEYS.LEARN_MORE })} → diff --git a/src/views/dialogs/ExternalLinkDialog.tsx b/src/views/dialogs/ExternalLinkDialog.tsx index e7d8648..231cb24 100644 --- a/src/views/dialogs/ExternalLinkDialog.tsx +++ b/src/views/dialogs/ExternalLinkDialog.tsx @@ -15,6 +15,7 @@ type ElementProps = { link: string; linkDescription?: string; title?: ReactNode; + slotContent?: ReactNode; setIsOpen: (open: boolean) => void; }; @@ -24,6 +25,7 @@ export const ExternalLinkDialog = ({ link, linkDescription, title, + slotContent, }: ElementProps) => { const stringGetter = useStringGetter(); return ( @@ -36,6 +38,7 @@ export const ExternalLinkDialog = ({ } > + {slotContent}

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