diff --git a/.env.example b/.env.example index 0fc4cd6e5..115c5985a 100644 --- a/.env.example +++ b/.env.example @@ -19,9 +19,6 @@ VITE_METADATA_SERVICE_URI= VITE_FUNKIT_API_KEY= -# Restricted Locales that should not be supported on app deployment. ex: VITE_APP_RESTRICTED_LOCALES=zh-CN,ru,en -VITE_APP_RESTRICTED_LOCALES= - # URL for the qrcode that is generated within the modal share pnl analytics VITE_SHARE_PNL_ANALYTICS_URL= diff --git a/README.md b/README.md index 534f2e48a..a490d7c91 100644 --- a/README.md +++ b/README.md @@ -66,9 +66,6 @@ This will automatically open your default browser at `http://localhost:61000`. Add or modify the relevant endpoints, links and options in `/public/configs/v1/env.json`. -NOTE: There exists a deprecated file `/public/configs/env.json`. If you have users running older mobile versions you may -need to keep feature flags between the two files in sync but may otherwise ignore it. - You'll need to provide a Wallet Connect project id to enable onboarding and wallet connection: - Create a project on https://cloud.walletconnect.com/app diff --git a/package.json b/package.json index 5bd0c517d..b14af89fe 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ }, "scripts": { "dev": "cp ./template.html ./index.html && vite", - "build": "pnpm run build:set-last-commit-and-tag && pnpm run build:generate-entry-points && tsc && vite build", + "build": "pnpm run build:set-last-commit-and-tag && pnpm run build:generate-entry-points && tsc && NODE_OPTIONS='--max-old-space-size=6144' vite build", "build:inject-app-deeplinks": "sh scripts/inject-app-deeplinks.sh", "build:inject-amplitude": "node scripts/inject-amplitude.js", "build:inject-google-tag-manager": "node scripts/inject-google-tag-manager.js", @@ -60,7 +60,6 @@ "@dydxprotocol/v4-localization": "^1.1.257", "@dydxprotocol/v4-proto": "^7.0.0-dev.0", "@emotion/is-prop-valid": "^1.3.0", - "@ethersproject/providers": "^5.7.2", "@funkit/connect": "^4.0.2", "@hugocxl/react-to-image": "^0.0.9", "@js-joda/core": "^5.5.3", @@ -96,7 +95,7 @@ "@reduxjs/toolkit": "^2.2.5", "@scure/bip32": "^1.3.0", "@scure/bip39": "^1.2.0", - "@skip-go/client": "0.10.3", + "@skip-go/client": "0.15.5", "@solana/web3.js": "^1.93.0", "@statsig/js-client": "1.4.0", "@statsig/react-bindings": "1.4.0", @@ -122,7 +121,6 @@ "color": "^4.2.3", "cosmjs-types": "^0.9.0", "crypto-js": "^4.1.1", - "ethers": "^6.6.1", "export-to-csv": "^1.2.3", "fast-json-stable-stringify": "^2.1.0", "graz": "^0.1.19", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c540f961e..bc4a752d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,9 +44,6 @@ dependencies: '@emotion/is-prop-valid': specifier: ^1.3.0 version: 1.3.0 - '@ethersproject/providers': - specifier: ^5.7.2 - version: 5.7.2 '@funkit/connect': specifier: ^4.0.2 version: 4.0.2(@ethersproject/address@5.7.0)(@ethersproject/networks@5.7.1)(@ethersproject/solidity@5.7.0)(@tanstack/react-query@5.37.1)(@types/react@18.3.3)(babel-plugin-macros@3.1.0)(hardhat@2.22.13)(react-dom@18.2.0)(react@18.2.0)(typescript@5.7.2)(viem@2.16.2)(wagmi@2.10.9) @@ -153,8 +150,8 @@ dependencies: specifier: ^1.2.0 version: 1.2.1 '@skip-go/client': - specifier: 0.10.3 - version: 0.10.3(@types/react@18.3.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.7.2) + specifier: 0.15.5 + version: 0.15.5(@solana/web3.js@1.93.2)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.2.0)(starknet@6.11.0)(viem@2.16.2) '@solana/web3.js': specifier: ^1.93.0 version: 1.93.2 @@ -230,9 +227,6 @@ dependencies: crypto-js: specifier: ^4.1.1 version: 4.1.1 - ethers: - specifier: ^6.6.1 - version: 6.6.1 export-to-csv: specifier: ^1.2.3 version: 1.2.3 @@ -241,7 +235,7 @@ dependencies: version: 2.1.0 graz: specifier: ^0.1.19 - version: 0.1.19(@cosmjs/amino@0.32.3)(@cosmjs/cosmwasm-stargate@0.32.4)(@cosmjs/launchpad@0.27.1)(@cosmjs/proto-signing@0.32.3)(@cosmjs/stargate@0.32.3)(@cosmjs/tendermint-rpc@0.32.3)(@leapwallet/cosmos-social-login-capsule-provider@0.0.39)(@types/react@18.3.3)(axios@1.6.7)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0) + version: 0.1.19(@cosmjs/amino@0.32.3)(@cosmjs/cosmwasm-stargate@0.32.4)(@cosmjs/launchpad@0.27.1)(@cosmjs/proto-signing@0.32.3)(@cosmjs/stargate@0.32.3)(@cosmjs/tendermint-rpc@0.32.3)(@leapwallet/cosmos-social-login-capsule-provider@0.0.39)(@types/react@18.3.3)(axios@1.6.7)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(starknet@6.11.0) jsdom: specifier: ^24.1.0 version: 24.1.0 @@ -301,7 +295,7 @@ dependencies: version: 3.4.1(tailwindcss@3.4.6) typia: specifier: ^7.1.0 - version: 7.1.0(@samchon/openapi@2.0.1)(typescript@5.7.2) + version: 7.1.0(@samchon/openapi@2.2.1)(typescript@5.7.2) unionize: specifier: ^3.1.0 version: 3.1.0 @@ -330,7 +324,7 @@ devDependencies: version: 4.0.2(@types/node@20.12.13)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.7.2) '@ryoppippi/unplugin-typia': specifier: npm:@jsr/ryoppippi__unplugin-typia@^1.1.0 - version: /@jsr/ryoppippi__unplugin-typia@1.1.0(@samchon/openapi@2.0.1)(@types/node@20.12.13)(rollup@2.79.1)(tsx@4.7.1) + version: /@jsr/ryoppippi__unplugin-typia@1.1.0(@samchon/openapi@2.2.1)(@types/node@20.12.13)(rollup@2.79.1)(tsx@4.7.1) '@testing-library/webdriverio': specifier: ^3.2.1 version: 3.2.1(webdriverio@8.36.1) @@ -2649,10 +2643,6 @@ packages: - fp-ts dev: false - /@chain-registry/types@0.50.34: - resolution: {integrity: sha512-CMhHOOiICw/mHHJNqiqbwlwrAnexGsmVdtTv0IdV0NphxfkqzvUomiUpQsHnU0hjjLoFPxoe8atMNIMJs9v4vg==} - dev: false - /@coinbase/wallet-sdk@3.9.3: resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} dependencies: @@ -2662,7 +2652,7 @@ packages: eth-block-tracker: 7.1.0 eth-json-rpc-filters: 6.0.1 eventemitter3: 5.0.1 - keccak: 3.0.3 + keccak: 3.0.4 preact: 10.17.0 sha.js: 2.4.11 transitivePeerDependencies: @@ -2675,7 +2665,7 @@ packages: buffer: 6.0.3 clsx: 1.2.1 eventemitter3: 5.0.1 - keccak: 3.0.3 + keccak: 3.0.4 preact: 10.17.0 sha.js: 2.4.11 dev: false @@ -2686,7 +2676,7 @@ packages: buffer: 6.0.3 clsx: 1.2.1 eventemitter3: 5.0.1 - keccak: 3.0.3 + keccak: 3.0.4 preact: 10.17.0 sha.js: 2.4.11 dev: false @@ -2901,26 +2891,6 @@ packages: '@cosmjs/utils': 0.32.4 dev: false - /@cosmjs/cosmwasm-stargate@0.31.3: - resolution: {integrity: sha512-Uv9TmCn3650gdFeZm7SEfUZF3uX3lfJfFhXOk6I2ZLr/FrKximnlb+vwAfZaZnWYvlA7qrKtHIjeRNHvT23zcw==} - dependencies: - '@cosmjs/amino': 0.31.3 - '@cosmjs/crypto': 0.31.3 - '@cosmjs/encoding': 0.31.3 - '@cosmjs/math': 0.31.3 - '@cosmjs/proto-signing': 0.31.3 - '@cosmjs/stargate': 0.31.3 - '@cosmjs/tendermint-rpc': 0.31.3 - '@cosmjs/utils': 0.31.3 - cosmjs-types: 0.8.0 - long: 4.0.0 - pako: 2.1.0 - transitivePeerDependencies: - - bufferutil - - debug - - utf-8-validate - dev: false - /@cosmjs/cosmwasm-stargate@0.32.4: resolution: {integrity: sha512-Fuo9BGEiB+POJ5WeRyBGuhyKR1ordvxZGLPuPosFJOH9U0gKMgcjwKMCgAlWFkMlHaTB+tNdA8AifWiHrI7VgA==} dependencies: @@ -3215,7 +3185,7 @@ packages: '@cosmjs/socket': 0.32.4 '@cosmjs/stream': 0.32.4 '@cosmjs/utils': 0.32.4 - axios: 1.6.7 + axios: 1.7.7 readonly-date: 1.0.0 xstream: 11.14.0 transitivePeerDependencies: @@ -3234,7 +3204,7 @@ packages: '@cosmjs/socket': 0.32.4 '@cosmjs/stream': 0.32.4 '@cosmjs/utils': 0.32.4 - axios: 1.6.7 + axios: 1.7.7 readonly-date: 1.0.0 xstream: 11.14.0 transitivePeerDependencies: @@ -4677,18 +4647,6 @@ packages: deprecated: Use @eslint/object-schema instead dev: true - /@initia/initia-registry-types@0.0.21: - resolution: {integrity: sha512-bYo0umADPq/qWAXzgISiETtiKj38EInp+CZLcr82Y3YwY4YdmFQvpu1/Tf4HsFGIcHvin4JB2PR03NPpKvOkbg==} - dependencies: - zod: 3.23.8 - dev: false - - /@initia/initia-registry@0.2.1: - resolution: {integrity: sha512-iCGGHy6gDsyJsdAEq7prxl3168POqZmUoIuWibz044oVTWHrfN97rjf5YJEq9XLwKrELkZISynqgEXhlwK7WOw==} - dependencies: - '@initia/initia-registry-types': 0.0.21 - dev: false - /@injectivelabs/core-proto-ts@0.0.21: resolution: {integrity: sha512-RBxSkRBCty60R/l55/D1jsSW0Aof5dyGFhCFdN3A010KjMv/SzZGGr+6DZPY/hflyFeaJzDv/VTopCymKNRBvQ==} dependencies: @@ -5077,7 +5035,7 @@ packages: resolution: {integrity: sha512-7dqNYwG8gCt4hfg5PKgM7xLEcgSBcx/UgC92OMnhMmvAnq11QzDFPrxUkNR/u5kn17WWLZ8beZ4A3Qrz4pZcmQ==} dev: false - /@jsr/ryoppippi__unplugin-typia@1.1.0(@samchon/openapi@2.0.1)(@types/node@20.12.13)(rollup@2.79.1)(tsx@4.7.1): + /@jsr/ryoppippi__unplugin-typia@1.1.0(@samchon/openapi@2.2.1)(@types/node@20.12.13)(rollup@2.79.1)(tsx@4.7.1): resolution: {integrity: sha512-/Azs26dk4J/Lq9nkNCRIC0A0CbOnRnt2RWSKEcGSbhk2Vh3zKut2uyqiwjy7EJccSAnbwZ3fmrYltMiaiyV14A==, tarball: https://npm.jsr.io/~/11/@jsr/ryoppippi__unplugin-typia/1.1.0.tgz} dependencies: '@rollup/pluginutils': 5.1.3(rollup@2.79.1) @@ -5090,7 +5048,7 @@ packages: pkg-types: 1.2.1 type-fest: 4.30.0 typescript: 5.6.3 - typia: 7.1.0(@samchon/openapi@2.0.1)(typescript@5.6.3) + typia: 7.1.0(@samchon/openapi@2.2.1)(typescript@5.6.3) unplugin: 1.16.0 vite: 6.0.3(@types/node@20.12.13)(tsx@4.7.1) transitivePeerDependencies: @@ -5165,15 +5123,6 @@ packages: resolution: {integrity: sha512-wpBYFvd98tIOEnU2wEdA+EileyEUTQwONRF4bZzRz5IPUewhe+sV2VHVFx/Bwps14CcB7Ka/U90LjdTfcPoIGw==} dev: false - /@keplr-wallet/types@0.11.64: - resolution: {integrity: sha512-GgzeLDHHfZFyne3O7UIfFHj/uYqVbxAZI31RbBwt460OBbvwQzjrlZwvJW3vieWRAgxKSITjzEDBl2WneFTQdQ==} - dependencies: - axios: 0.27.2 - long: 4.0.0 - transitivePeerDependencies: - - debug - dev: false - /@keplr-wallet/types@0.12.12: resolution: {integrity: sha512-fo6b8j9EXnJukGvZorifJWEm1BPIrvaTLuu5PqaU5k1ANDasm/FL1NaUuaTBVvhRjINtvVXqYpW/rVUinA9MBA==} dependencies: @@ -5186,6 +5135,15 @@ packages: long: 4.0.0 dev: false + /@keplr-wallet/types@0.12.162(starknet@6.11.0): + resolution: {integrity: sha512-3xZq0xbaAmGWL02HYqYunMENXOaEckWeNpQpfPw2w2f59XDw+HQcruVgJ/2F5a28UUByYTOZDhHwjA2Vod7H8Q==} + peerDependencies: + starknet: ^6 + dependencies: + long: 4.0.0 + starknet: 6.11.0 + dev: false + /@keplr-wallet/unit@0.12.121: resolution: {integrity: sha512-zshS9bd9Y9FJY7d54ZqrUUXY1BAFhD1ClLyeGpeXGk0SSOPPmHk6/j2f14Uk6zUZzb5iAtloBTZ4g2fGdQIiSQ==} dependencies: @@ -5194,6 +5152,16 @@ packages: utility-types: 3.10.0 dev: false + /@keplr-wallet/unit@0.12.162(starknet@6.11.0): + resolution: {integrity: sha512-l/XCTCQTFicnFDQoMl4BPYVmDWVXlZulHe6UPB1yaisK4hi2HpC56AuY0UNNecwCbRu3ztVJJdC+Ht9G2AJbfA==} + dependencies: + '@keplr-wallet/types': 0.12.162(starknet@6.11.0) + big-integer: 1.6.52 + utility-types: 3.10.0 + transitivePeerDependencies: + - starknet + dev: false + /@ladle/react-context@1.0.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-xVQ8siyOEQG6e4Knibes1uA3PTyXnqiMmfSmd5pIbkzeDty8NCBtYHhTXSlfmcDNEsw/G8OzNWo4VbyQAVDl2A==} peerDependencies: @@ -5767,6 +5735,12 @@ packages: '@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/curves@1.4.0: resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} dependencies: @@ -6101,7 +6075,6 @@ packages: dependencies: is-glob: 4.0.3 micromatch: 4.0.5 - napi-wasm: 1.1.3 dev: false bundledDependencies: - napi-wasm @@ -9673,12 +9646,8 @@ packages: - encoding dev: false - /@samchon/openapi@2.0.1: - resolution: {integrity: sha512-Vw/iaxqrWVIXlGuwsLPb7hCZUmhBm/ez0aCP3e/8hPWuA9+0sEWAODrvyyrR8elMzK6uXrRRK9a6KibTQ/jHPw==} - - /@scure/base@1.1.5: - resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} - dev: false + /@samchon/openapi@2.2.1: + resolution: {integrity: sha512-4UExzjnJvrtgrTikD9CJ+vI5bTVCZhFUrzpnZYgF/mUPREK4fJ8m+E0xtM8TC8B/CNWyo/8XvghXHSwRcbBDLw==} /@scure/base@1.1.9: resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} @@ -9697,7 +9666,7 @@ packages: dependencies: '@noble/curves': 1.1.0 '@noble/hashes': 1.3.3 - '@scure/base': 1.1.5 + '@scure/base': 1.1.9 dev: false /@scure/bip32@1.3.2: @@ -9727,7 +9696,7 @@ packages: resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} dependencies: '@noble/hashes': 1.3.3 - '@scure/base': 1.1.5 + '@scure/base': 1.1.9 dev: false /@scure/bip39@1.3.0: @@ -9737,6 +9706,13 @@ packages: '@scure/base': 1.1.9 dev: false + /@scure/starknet@1.0.0: + resolution: {integrity: sha512-o5J57zY0f+2IL/mq8+AYJJ4Xpc1fOtDhr+mFQKbHnYFmm3WQrC+8zj2HEgxak1a+x86mhmBC1Kq305KUpVf0wg==} + dependencies: + '@noble/curves': 1.3.0 + '@noble/hashes': 1.3.3 + dev: false + /@sentry/core@5.30.0: resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} engines: {node: '>=6'} @@ -9856,8 +9832,11 @@ packages: '@sinonjs/commons': 3.0.1 dev: false - /@skip-go/client@0.10.3(@types/react@18.3.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.7.2): - resolution: {integrity: sha512-7sA4abXuIB8bHYcM/cdUKqWOsduVq3ORrIehRGgZOJdQsztYEnsrUdqGCtN4PLuPc9VIlXhAXueejiaySAGjig==} + /@skip-go/client@0.15.5(@solana/web3.js@1.93.2)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.2.0)(starknet@6.11.0)(viem@2.16.2): + resolution: {integrity: sha512-BYTCO/SSYhXJjzChVwPge/U2TctxGd8g3JSN0HNbLVkUnj3g5bXvsOL+WB/bQQ0D/4K+1tVQVJs3r98HDxzCxw==} + peerDependencies: + '@solana/web3.js': ^1.95.8 + viem: 2.x dependencies: '@cosmjs/amino': 0.32.4 '@cosmjs/cosmwasm-stargate': 0.32.4 @@ -9866,30 +9845,26 @@ packages: '@cosmjs/proto-signing': 0.32.4 '@cosmjs/stargate': 0.32.4 '@cosmjs/tendermint-rpc': 0.32.4 - '@initia/initia-registry': 0.2.1 '@injectivelabs/core-proto-ts': 0.0.21 '@injectivelabs/sdk-ts': 1.14.5(@types/react@18.3.3)(react-dom@18.2.0)(react@18.2.0) - '@keplr-wallet/unit': 0.12.121 + '@keplr-wallet/unit': 0.12.162(starknet@6.11.0) '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.93.2) '@solana/web3.js': 1.93.2 - axios: 1.6.7 - chain-registry: 1.69.60 - cosmjs-types: 0.8.0 - keccak256: 1.0.6 - kujira.js: 0.9.162 + axios: 1.7.7 + cosmjs-types: 0.9.0 + create-hash: 1.2.0 + keccak: 3.0.4 viem: 2.16.2(typescript@5.7.2) transitivePeerDependencies: - '@types/react' - bufferutil - debug - - encoding - graphql-ws - react - react-dom + - starknet - subscriptions-transport-ws - - typescript - utf-8-validate - - zod dev: false /@smithy/abort-controller@3.1.5: @@ -10453,6 +10428,10 @@ packages: '@stablelib/wipe': 1.0.1 dev: false + /@starknet-io/types-js@0.7.10: + resolution: {integrity: sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w==} + dev: false + /@statsig/client-core@1.4.0: resolution: {integrity: sha512-ICz/4DyjMhp9H5GwLTrVUzWqfrO6Bm0RFx1wDd+KGnYx9g6Iwu3FKny5FRybnPSKW47jWidc+FpUi2kQ5AGPqw==} dev: false @@ -11055,10 +11034,6 @@ packages: resolution: {integrity: sha512-W6hyZux6TrtKfF2I9XNLVcsFr4xRr0T+S6hrJ9nDkhA2vzsFPIEAbnY4vgb6v2yKXQ9MJVcbLsARNlMfg4EVtQ==} dev: true - /@types/google-protobuf@3.15.12: - resolution: {integrity: sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ==} - dev: false - /@types/hast@3.0.4: resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} dependencies: @@ -13227,6 +13202,16 @@ packages: jsonparse: 1.3.1 through: 2.3.8 + /abi-wan-kanabi@2.2.3: + resolution: {integrity: sha512-JlqiAl9CPvTm5kKG0QXmVCWNWoC/XyRMOeT77cQlbxXWllgjf6SqUmaNqFon72C2o5OSZids+5FvLdsw6dvWaw==} + hasBin: true + dependencies: + ansicolors: 0.3.2 + cardinal: 2.1.1 + fs-extra: 10.1.0 + yargs: 17.7.2 + dev: false + /abitype@0.10.3(typescript@5.7.2): resolution: {integrity: sha512-tRN+7XIa7J9xugdbRzFv/95ka5ivR/sRe01eiWvM0HWWjHuigSZEACgKa0sj4wGuekTDtghCx+5Izk/cOi78pQ==} peerDependencies: @@ -13491,6 +13476,10 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + /ansicolors@0.3.2: + resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + dev: false + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -14519,6 +14508,14 @@ packages: multiformats: 9.9.0 dev: true + /cardinal@2.1.1: + resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} + hasBin: true + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 + dev: false + /cbor-web@8.1.0: resolution: {integrity: sha512-2hWHHMVrfffgoEmsAUh8vCxHoLa1vgodtC73+C5cSarkJlwTapnqAzcHINlP6Ej0DXuP4OmmJ9LF+JaNM5Lj/g==} engines: {node: '>=12.19'} @@ -14546,12 +14543,6 @@ packages: type-detect: 4.1.0 dev: true - /chain-registry@1.69.60: - resolution: {integrity: sha512-uh8b/RsxP9QfwxPKldcZronEnU/BRYNRxDcCCW4chyr3vxBbGoXkCk2PtK6JgPV53W4CukhcxNgawzhKO2YnEw==} - dependencies: - '@chain-registry/types': 0.50.34 - dev: false - /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -16745,7 +16736,6 @@ packages: /eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) @@ -16958,7 +16948,7 @@ packages: create-hash: 1.2.0 create-hmac: 1.1.7 hash.js: 1.1.7 - keccak: 3.0.3 + keccak: 3.0.4 pbkdf2: 3.1.2 randombytes: 2.1.0 safe-buffer: 5.2.1 @@ -16987,6 +16977,7 @@ packages: /ethereumjs-abi@0.6.8: resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + deprecated: This library has been deprecated and usage is discouraged. dependencies: bn.js: 4.12.0 ethereumjs-util: 6.2.1 @@ -17382,6 +17373,13 @@ packages: web-streams-polyfill: 3.2.1 dev: true + /fetch-cookie@3.0.1: + resolution: {integrity: sha512-ZGXe8Y5Z/1FWqQ9q/CrJhkUD73DyBU9VF0hBQmEO/wPHe4A9PKTjplFDLeFX8aOsYypZUcX5Ji/eByn3VCVO3Q==} + dependencies: + set-cookie-parser: 2.6.0 + tough-cookie: 4.1.4 + dev: false + /fetch-retry@5.0.6: resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} dev: false @@ -17624,6 +17622,15 @@ packages: resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} dev: true + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + /fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} @@ -17760,6 +17767,12 @@ packages: engines: {node: '>=16'} dev: true + /get-starknet-core@4.0.0: + resolution: {integrity: sha512-6pLmidQZkC3wZsrHY99grQHoGpuuXqkbSP65F8ov1/JsEI8DDLkhsAuLCKFzNOK56cJp+f1bWWfTJ57e9r5eqQ==} + dependencies: + '@starknet-io/types-js': 0.7.10 + dev: false + /get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} @@ -18029,7 +18042,7 @@ packages: resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - /graz@0.1.19(@cosmjs/amino@0.32.3)(@cosmjs/cosmwasm-stargate@0.32.4)(@cosmjs/launchpad@0.27.1)(@cosmjs/proto-signing@0.32.3)(@cosmjs/stargate@0.32.3)(@cosmjs/tendermint-rpc@0.32.3)(@leapwallet/cosmos-social-login-capsule-provider@0.0.39)(@types/react@18.3.3)(axios@1.6.7)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0): + /graz@0.1.19(@cosmjs/amino@0.32.3)(@cosmjs/cosmwasm-stargate@0.32.4)(@cosmjs/launchpad@0.27.1)(@cosmjs/proto-signing@0.32.3)(@cosmjs/stargate@0.32.3)(@cosmjs/tendermint-rpc@0.32.3)(@leapwallet/cosmos-social-login-capsule-provider@0.0.39)(@types/react@18.3.3)(axios@1.6.7)(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0)(starknet@6.11.0): resolution: {integrity: sha512-KaRQJ7HTQp3vbX/bG2Oc9T3t/KyaIuU5dLoGU2QNFirNjIpRbhkBtCll9Li5A6+zw3O9bHkbZ1aUaKfuVyBS8w==} hasBin: true peerDependencies: @@ -18051,7 +18064,7 @@ packages: '@cosmsnap/snapper': 0.1.31 '@dao-dao/cosmiframe': 0.1.0(@cosmjs/amino@0.32.3)(@cosmjs/proto-signing@0.32.3) '@keplr-wallet/cosmos': 0.12.121 - '@keplr-wallet/types': 0.12.121 + '@keplr-wallet/types': 0.12.162(starknet@6.11.0) '@leapwallet/cosmos-social-login-capsule-provider': 0.0.39(@cosmjs/encoding@0.32.3)(@cosmjs/proto-signing@0.32.3)(fp-ts@2.16.8) '@metamask/providers': 12.0.0 '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react-native@0.74.3)(react@18.2.0) @@ -18085,6 +18098,7 @@ packages: - immer - react-dom - react-native + - starknet - supports-color - utf-8-validate dev: false @@ -18165,7 +18179,7 @@ packages: immutable: 4.3.7 io-ts: 1.10.4 json-stream-stringify: 3.1.6 - keccak: 3.0.3 + keccak: 3.0.4 lodash: 4.17.21 mnemonist: 0.38.5 mocha: 10.3.0 @@ -19431,6 +19445,15 @@ packages: engines: {node: '>=0.10.0'} dev: false + /isomorphic-fetch@3.0.0: + resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + whatwg-fetch: 3.6.20 + transitivePeerDependencies: + - encoding + dev: false + /isomorphic-timers-promises@1.0.1: resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} engines: {node: '>=10'} @@ -19934,7 +19957,6 @@ packages: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - dev: true /jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} @@ -19959,11 +19981,11 @@ packages: dependencies: bn.js: 5.2.1 buffer: 6.0.3 - keccak: 3.0.3 + keccak: 3.0.4 dev: false - /keccak@3.0.3: - resolution: {integrity: sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==} + /keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} engines: {node: '>=10.0.0'} requiresBuild: true dependencies: @@ -20045,26 +20067,6 @@ packages: - supports-color dev: true - /kujira.js@0.9.162: - resolution: {integrity: sha512-zhH6baskDKn5OPIkYY9db+2poaFQ6cJ+gyN5EcKd1Bo7SYCR6HtIFG+FQrfkVG/Hy4UBW/RBNRbuqgNuWgYcTg==} - dependencies: - '@cosmjs/cosmwasm-stargate': 0.31.3 - '@cosmjs/launchpad': 0.27.1 - '@cosmjs/stargate': 0.31.3 - '@ethersproject/bignumber': 5.7.0 - '@keplr-wallet/types': 0.11.64 - '@types/google-protobuf': 3.15.12 - chain-registry: 1.69.60 - cosmjs-types: 0.8.0 - long: 4.0.0 - text-encoding: 0.7.0 - yarn: 1.22.22 - transitivePeerDependencies: - - bufferutil - - debug - - utf-8-validate - dev: false - /ky@0.33.3: resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==} engines: {node: '>=14.16'} @@ -20448,6 +20450,10 @@ packages: dependencies: js-tokens: 4.0.0 + /lossless-json@4.0.2: + resolution: {integrity: sha512-+z0EaLi2UcWi8MZRxA5iTb6m4Ys4E80uftGY+yG5KNFJb5EceQXOhdW/pWJZ8m97s26u7yZZAYMcKWNztSZssA==} + dev: false + /loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: @@ -21756,10 +21762,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - /napi-wasm@1.1.3: - resolution: {integrity: sha512-h/4nMGsHjZDCYmQVNODIrYACVJ+I9KItbG+0si6W/jSjdA9JbWDoU4LLeMXVcEQGHjttI2tuXqDrbGF7qkUHHg==} - dev: false - /native-abort-controller@1.0.4(abort-controller@3.0.0): resolution: {integrity: sha512-zp8yev7nxczDJMoP6pDxyD20IU0T22eX8VwN2ztDccKvSZhRaV33yP1BGwKSZfXuqWUzsXopVFjBdau9OOAwMQ==} peerDependencies: @@ -22961,7 +22963,7 @@ packages: /prometheus-query@3.4.0: resolution: {integrity: sha512-PGNwYVjXxenfj2PR4FKEUv5O4XO8ciHT92GX83J5ZJm5ki3YzLLiv+TfbmQSUxvHcXofLg9PYH6CBCSplcvr9g==} dependencies: - axios: 1.6.7 + axios: 1.7.7 transitivePeerDependencies: - debug dev: false @@ -23839,6 +23841,12 @@ packages: strip-indent: 3.0.0 dev: true + /redeyed@2.1.1: + resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} + dependencies: + esprima: 4.0.1 + dev: false + /redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} @@ -24887,6 +24895,26 @@ packages: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} dev: false + /starknet@6.11.0: + resolution: {integrity: sha512-u50KrGDi9fbu1Ogu7ynwF/tSeFlp3mzOg1/Y5x50tYFICImo3OfY4lOz9OtYDk404HK4eUujKkhov9tG7GAKlg==} + dependencies: + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + '@scure/starknet': 1.0.0 + abi-wan-kanabi: 2.2.3 + fetch-cookie: 3.0.1 + get-starknet-core: 4.0.0 + isomorphic-fetch: 3.0.0 + lossless-json: 4.0.2 + pako: 2.1.0 + starknet-types-07: /@starknet-io/types-js@0.7.10 + ts-mixer: 6.0.4 + url-join: 4.0.1 + transitivePeerDependencies: + - encoding + dev: false + /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -25197,6 +25225,7 @@ packages: /sudo-prompt@9.2.1: resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dev: false /superstruct@1.0.4: @@ -25369,11 +25398,6 @@ packages: resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} dev: false - /text-encoding@0.7.0: - resolution: {integrity: sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==} - deprecated: no longer maintained - dev: false - /text-extensions@2.4.0: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} @@ -25582,6 +25606,10 @@ packages: tslib: 2.6.2 dev: false + /ts-mixer@6.0.4: + resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} + dev: false + /ts-morph@24.0.0: resolution: {integrity: sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==} dependencies: @@ -25609,7 +25637,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.12.13 - acorn: 8.11.3 + acorn: 8.14.0 acorn-walk: 8.3.3 arg: 4.1.3 create-require: 1.1.1 @@ -25852,14 +25880,14 @@ packages: engines: {node: '>=14.17'} hasBin: true - /typia@7.1.0(@samchon/openapi@2.0.1)(typescript@5.6.3): + /typia@7.1.0(@samchon/openapi@2.2.1)(typescript@5.6.3): resolution: {integrity: sha512-pG3H1KNIo3/Cd0VssdE+badLYnLnAQ7QtdYldqzqzXIDWG+Ve5fl0H4vQ/j+d1+rOAuurxfZ5bsCcw83SiYDVw==} hasBin: true peerDependencies: '@samchon/openapi': '>=2.0.1 <3.0.0' typescript: '>=4.8.0 <5.8.0' dependencies: - '@samchon/openapi': 2.0.1 + '@samchon/openapi': 2.2.1 commander: 10.0.1 comment-json: 4.2.5 inquirer: 8.2.6 @@ -25868,14 +25896,14 @@ packages: typescript: 5.6.3 dev: true - /typia@7.1.0(@samchon/openapi@2.0.1)(typescript@5.7.2): + /typia@7.1.0(@samchon/openapi@2.2.1)(typescript@5.7.2): resolution: {integrity: sha512-pG3H1KNIo3/Cd0VssdE+badLYnLnAQ7QtdYldqzqzXIDWG+Ve5fl0H4vQ/j+d1+rOAuurxfZ5bsCcw83SiYDVw==} hasBin: true peerDependencies: '@samchon/openapi': '>=2.0.1 <3.0.0' typescript: '>=4.8.0 <5.8.0' dependencies: - '@samchon/openapi': 2.0.1 + '@samchon/openapi': 2.2.1 commander: 10.0.1 comment-json: 4.2.5 inquirer: 8.2.6 @@ -26071,7 +26099,6 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} requiresBuild: true - dev: true /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} @@ -26186,6 +26213,10 @@ packages: punycode: 2.3.1 dev: true + /url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + dev: false + /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: @@ -27672,13 +27703,6 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /yarn@1.22.22: - resolution: {integrity: sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==} - engines: {node: '>=4.0.0'} - hasBin: true - requiresBuild: true - dev: false - /yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} requiresBuild: true diff --git a/public/configs/env.json b/public/configs/env.json deleted file mode 100644 index 643c30602..000000000 --- a/public/configs/env.json +++ /dev/null @@ -1,1413 +0,0 @@ -{ - "notes": "THIS FILE IS MOSTLY DEPRECATED BUT OLDER MOBILE VERSIONS STILL EXPECT IT. This means that any FF updates still apply.", - "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", - "dydxprotocol-staging-forced-update" - ], - "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/", - "geo": "https://api.dydx.exchange/v4/geo", - "faucet": "https://faucet.v4dev.dydx.exchange" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "mintscan": "https://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://mintscan.io/dydx-testnet", - "documentation": "https://docs.dydx.exchange/", - "community": "https://discord.com/invite/dydx", - "vipsChannel": "https://discord.com/channels/724804754382782534/1289241014460088351", - "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", - "withdrawalGateLearnMore": "https://help.dydx.exchange/en/articles/8981384-withdrawals-on-dydx-chain#h_23e97bc665" - }, - "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, - "withdrawalSafetyEnabled": true, - "CCTPWithdrawalOnly": true - } - }, - "dydxprotocol-dev-2": { - "name": "v4 Dev 2", - "ethereumChainId": "11155111", - "dydxChainId": "dydxprotocol-testnet", - "chainName": "dYdX Chain", - "chainLogo": "/dydx-chain.png", - "squidIntegratorId": "dYdX-api", - "isMainNet": false, - "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/", - "geo": "https://api.dydx.exchange/v4/geo" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "mintscan": "https://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://mintscan.io/dydx-testnet", - "documentation": "https://docs.dydx.exchange/", - "community": "https://discord.com/invite/dydx", - "vipsChannel": "https://discord.com/channels/724804754382782534/1289241014460088351", - "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", - "withdrawalGateLearnMore": "https://help.dydx.exchange/en/articles/8981384-withdrawals-on-dydx-chain#h_23e97bc665" - }, - "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, - "withdrawalSafetyEnabled": true, - "CCTPWithdrawalOnly": 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" - } - }, - "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/", - "geo": "https://api.dydx.exchange/v4/geo", - "faucet": "https://faucet.v4dev4.dydx.exchange" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "mintscan": "https://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://mintscan.io/dydx-testnet", - "documentation": "https://docs.dydx.exchange/", - "community": "https://discord.com/invite/dydx", - "vipsChannel": "https://discord.com/channels/724804754382782534/1289241014460088351", - "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", - "withdrawalGateLearnMore": "https://help.dydx.exchange/en/articles/8981384-withdrawals-on-dydx-chain#h_23e97bc665" - }, - "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, - "withdrawalSafetyEnabled": true, - "CCTPWithdrawalOnly": 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/", - "geo": "https://api.dydx.exchange/v4/geo" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "mintscan": "https://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://mintscan.io/dydx-testnet", - "documentation": "https://docs.dydx.exchange/", - "community": "https://discord.com/invite/dydx", - "vipsChannel": "https://discord.com/channels/724804754382782534/1289241014460088351", - "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", - "withdrawalGateLearnMore": "https://help.dydx.exchange/en/articles/8981384-withdrawals-on-dydx-chain#h_23e97bc665" - }, - "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, - "withdrawalSafetyEnabled": true, - "CCTPWithdrawalOnly": 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/", - "geo": "https://api.dydx.exchange/v4/geo" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "mintscan": "https://mintscan.io/dydx-testnet/txs/{tx_hash}", - "documentation": "https://docs.dydx.exchange/", - "community": "https://discord.com/invite/dydx", - "vipsChannel": "https://discord.com/channels/724804754382782534/1289241014460088351", - "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://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", - "withdrawalGateLearnMore": "https://help.dydx.exchange/en/articles/8981384-withdrawals-on-dydx-chain#h_23e97bc665" - }, - "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, - "withdrawalSafetyEnabled": true, - "CCTPWithdrawalOnly": 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/", - "geo": "https://api.dydx.exchange/v4/geo" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "mintscan": "https://mintscan.io/dydx-testnet/txs/{tx_hash}", - "mintscanBase": "https://mintscan.io/dydx-testnet", - "documentation": "https://v4-teacher.vercel.app/", - "community": "https://discord.com/invite/dydx", - "vipsChannel": "https://discord.com/channels/724804754382782534/1289241014460088351", - "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", - "withdrawalGateLearnMore": "https://help.dydx.exchange/en/articles/8981384-withdrawals-on-dydx-chain#h_23e97bc665" - }, - "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" - }, - "android": { - "minimalVersion": "1.1", - "build": 40000, - "url": "https://play.google.com/store/apps/details?id=trade.opsdao.dydxchain&pli=1" - } - }, - "governance": { - "newMarketProposal": { - "initialDepositAmount": 10000000, - "delayBlocks": 900, - "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" - } - }, - "featureFlags": { - "reduceOnlySupported": true, - "withdrawalSafetyEnabled": true, - "CCTPWithdrawalOnly": 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/", - "geo": "https://api.dydx.exchange/v4/geo" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "mintscan": "https://mintscan.io/dydx-testnet/txs/{tx_hash}", - "documentation": "https://docs.dydx.exchange/", - "community": "https://discord.com/invite/dydx", - "vipsChannel": "https://discord.com/channels/724804754382782534/1289241014460088351", - "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://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", - "withdrawalGateLearnMore": "https://help.dydx.exchange/en/articles/8981384-withdrawals-on-dydx-chain#h_23e97bc665" - }, - "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, - "withdrawalSafetyEnabled": true, - "CCTPWithdrawalOnly": 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/", - "geo": "https://api.dydx.exchange/v4/geo", - "faucet": "https://faucet.v4testnet.dydx.exchange" - }, - "links": { - "tos": "https://dydx.exchange/v4-terms", - "privacy": "https://dydx.exchange/privacy", - "mintscan": "https://mintscan.io/dydx-testnet/txs/{tx_hash}", - "documentation": "https://docs.dydx.exchange/", - "community": "https://discord.com/invite/dydx", - "vipsChannel": "https://discord.com/channels/724804754382782534/1289241014460088351", - "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://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", - "withdrawalGateLearnMore": "https://help.dydx.exchange/en/articles/8981384-withdrawals-on-dydx-chain#h_23e97bc665" - }, - "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": true, - "withdrawalSafetyEnabled": true, - "CCTPWithdrawalOnly": true - } - }, - "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/", - "geo": "https://api.dydx.exchange/v4/geo", - "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://mintscan.io/dydx-testnet/txs/{tx_hash}", - "documentation": "https://docs.dydx.exchange/", - "community": "https://discord.com/invite/dydx", - "vipsChannel": "https://discord.com/channels/724804754382782534/1289241014460088351", - "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://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", - "withdrawalGateLearnMore": "https://help.dydx.exchange/en/articles/8981384-withdrawals-on-dydx-chain#h_23e97bc665" - }, - "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": true, - "withdrawalSafetyEnabled": true, - "CCTPWithdrawalOnly": true - } - }, - "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/", - "geo": "https://api.dydx.exchange/v4/geo", - "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://mintscan.io/dydx-testnet/txs/{tx_hash}", - "documentation": "https://docs.dydx.exchange/", - "community": "https://discord.com/invite/dydx", - "vipsChannel": "https://discord.com/channels/724804754382782534/1289241014460088351", - "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://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", - "withdrawalGateLearnMore": "https://help.dydx.exchange/en/articles/8981384-withdrawals-on-dydx-chain#h_23e97bc665" - }, - "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": true, - "withdrawalSafetyEnabled": true, - "CCTPWithdrawalOnly": true - } - }, - "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/", - "geo": "https://api.dydx.exchange/v4/geo", - "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://mintscan.io/dydx-testnet/txs/{tx_hash}", - "documentation": "https://docs.dydx.exchange/", - "community": "https://discord.com/invite/dydx", - "vipsChannel": "https://discord.com/channels/724804754382782534/1289241014460088351", - "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://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", - "withdrawalGateLearnMore": "https://help.dydx.exchange/en/articles/8981384-withdrawals-on-dydx-chain#h_23e97bc665" - }, - "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": true, - "withdrawalSafetyEnabled": true, - "CCTPWithdrawalOnly": true - } - }, - "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/", - "geo": "https://api.dydx.exchange/v4/geo", - "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://mintscan.io/dydx-testnet/txs/{tx_hash}", - "documentation": "https://docs.dydx.exchange/", - "community": "https://discord.com/invite/dydx", - "vipsChannel": "https://discord.com/channels/724804754382782534/1289241014460088351", - "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://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", - "withdrawalGateLearnMore": "https://help.dydx.exchange/en/articles/8981384-withdrawals-on-dydx-chain#h_23e97bc665" - }, - "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": true, - "withdrawalSafetyEnabled": true, - "CCTPWithdrawalOnly": true - } - }, - "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/", - "geo": "https://api.dydx.exchange/v4/geo", - "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://mintscan.io/dydx-testnet/txs/{tx_hash}", - "mintscanBase": "https://mintscan.io/dydx-testnet", - "documentation": "https://docs.dydx.exchange/", - "community": "https://discord.com/invite/dydx", - "vipsChannel": "https://discord.com/channels/724804754382782534/1289241014460088351", - "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", - "withdrawalGateLearnMore": "https://help.dydx.exchange/en/articles/8981384-withdrawals-on-dydx-chain#h_23e97bc665" - }, - "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": true, - "withdrawalSafetyEnabled": true, - "CCTPWithdrawalOnly": true - } - }, - "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/", - "geo": "https://api.dydx.exchange/v4/geo", - "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://mintscan.io/dydx-testnet/txs/{tx_hash}", - "documentation": "https://docs.dydx.exchange/", - "community": "https://discord.com/invite/dydx", - "vipsChannel": "https://discord.com/channels/724804754382782534/1289241014460088351", - "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://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", - "withdrawalGateLearnMore": "https://help.dydx.exchange/en/articles/8981384-withdrawals-on-dydx-chain#h_23e97bc665" - }, - "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": true, - "withdrawalSafetyEnabled": true, - "CCTPWithdrawalOnly": true - } - }, - "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]", - "geo": "[geo 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]", - "vipsChannel": "[HTTP link to vips channel, 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]", - "withdrawalGateLearnMore": "[HTTP link to withdrawal gate 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, - "withdrawalSafetyEnabled": false - } - } - } -} diff --git a/public/configs/v1/env.json b/public/configs/v1/env.json index 49163bd64..b3adf4e1b 100644 --- a/public/configs/v1/env.json +++ b/public/configs/v1/env.json @@ -1,7 +1,8 @@ { "apps": { "ios": { - "scheme": "dydx-t-v4" + "scheme": "dydx-t-v4", + "appGroup": "group.exchange.dydx.v4" } }, "tokens": { diff --git a/src/App.tsx b/src/App.tsx index 3b6b430b4..3adea2af5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -46,6 +46,7 @@ import { RestrictionWarning } from './components/RestrictionWarning'; import { DialogTypes } from './constants/dialogs'; import { funkitConfig, funkitTheme } from './constants/funkit'; import { LocalStorageKey } from './constants/localStorage'; +import { SkipProvider } from './hooks/transfers/skipClient'; import { useAnalytics } from './hooks/useAnalytics'; import { useBreakpoints } from './hooks/useBreakpoints'; import { useCommandMenu } from './hooks/useCommandMenu'; @@ -226,6 +227,7 @@ const providers = [ wrapProvider(DydxProvider), wrapProvider(AccountsProvider), wrapProvider(SubaccountProvider), + wrapProvider(SkipProvider), wrapProvider(LocalNotificationsProvider), wrapProvider(NotificationsProvider), wrapProvider(DialogAreaProvider), diff --git a/src/components/Dialog.tsx b/src/components/Dialog.tsx index d9d434f71..5f8a73618 100644 --- a/src/components/Dialog.tsx +++ b/src/components/Dialog.tsx @@ -11,10 +11,11 @@ import { Title, Trigger, } from '@radix-ui/react-dialog'; -import styled, { css, keyframes } from 'styled-components'; +import styled, { css } from 'styled-components'; import tw from 'twin.macro'; import { useDialogArea } from '@/hooks/useDialogArea'; +import { useResizeObserver } from '@/hooks/useResizeObserver'; import breakpoints from '@/styles/breakpoints'; import { layoutMixins } from '@/styles/layoutMixins'; @@ -100,6 +101,12 @@ export const Dialog = ({ className, }: DialogProps) => { const closeButtonRef = useRef(null); + const ref = useRef(null); + + const { height = 0 } = useResizeObserver({ + ref, + box: 'border-box', + }); return ( @@ -117,66 +124,69 @@ export const Dialog = ({ e.preventDefault(); } }} + $height={height} $stacked={stacked} $withAnimation={withAnimation} > - {slotHeaderAbove} - {stacked ? ( - <$StackedHeaderTopRow $withBorder={hasHeaderBorder} $withBlur={hasHeaderBlur}> - {onBack && <$BackButton onClick={onBack} />} - - {slotIcon} - - {!preventClose && withClose && ( - <$Close ref={closeButtonRef} $absolute={stacked}> - - - )} - - {title && <$Title>{title}} - - {description && <$Description>{description}} - - {slotHeaderInner} - - ) : slotHeader ? ( -
- {!preventClose && withClose && ( - <$Close ref={closeButtonRef} $absolute> - - - )} - {slotHeader} -
- ) : ( - <$Header $withBorder={hasHeaderBorder} $withBlur={hasHeaderBlur}> -
- {onBack && } - - {slotIcon && ( -
- {slotIcon} -
+ <$InnerContainer ref={ref} placement={placement}> + {slotHeaderAbove} + {stacked ? ( + <$StackedHeaderTopRow $withBorder={hasHeaderBorder} $withBlur={hasHeaderBlur}> + {onBack && <$BackButton onClick={onBack} />} + + {slotIcon} + + {!preventClose && withClose && ( + <$Close ref={closeButtonRef} $absolute={stacked}> + + )} {title && <$Title>{title}} + {description && <$Description>{description}} + + {slotHeaderInner} + + ) : slotHeader ? ( +
{!preventClose && withClose && ( - <$Close ref={closeButtonRef}> + <$Close ref={closeButtonRef} $absolute> )} + {slotHeader}
+ ) : ( + <$Header $withBorder={hasHeaderBorder} $withBlur={hasHeaderBlur}> +
+ {onBack && } + + {slotIcon && ( +
+ {slotIcon} +
+ )} + + {title && <$Title>{title}} - {description && <$Description>{description}} + {!preventClose && withClose && ( + <$Close ref={closeButtonRef}> + + + )} +
- {slotHeaderInner} - - )} + {description && <$Description>{description}} - <$Content>{children} + {slotHeaderInner} + + )} - {slotFooter && <$Footer $withBorder={hasFooterBorder}>{slotFooter}} + <$Content>{children} + + {slotFooter && <$Footer $withBorder={hasFooterBorder}>{slotFooter}} + @@ -196,6 +206,7 @@ const $Overlay = styled(Overlay)` const $Container = styled(Content)<{ placement: DialogPlacement; + $height?: number; $stacked?: boolean; $withAnimation?: boolean; }>` @@ -255,24 +266,28 @@ const $Container = styled(Content)<{ outline: none; - ${({ placement, $withAnimation }) => + ${({ placement, $height, $withAnimation }) => ({ [DialogPlacement.Default]: css` inset: var(--dialog-inset); margin: auto; max-width: var(--dialog-width); - height: fit-content; max-height: var(--dialog-height); + ${$withAnimation + ? css` + height: ${$height ? `${$height}px` : 'fit-content'}; + transition: height 0.25s ease-in-out; + ` + : css` + height: fit-content; + `} + display: flex; flex-direction: column; border-radius: var(--dialog-radius); - /* clip-path: inset( - calc(-1 * var(--border-width)) round calc(var(--dialog-radius) + var(--border-width)) - ); - overflow-clip-margin: var(--border-width); */ @media ${breakpoints.mobile} { top: calc(var(--dialog-inset) * 2); @@ -284,94 +299,18 @@ const $Container = styled(Content)<{ border-bottom-left-radius: 0; border-bottom-right-radius: 0; - - /* Hack (uneven border-radius causes overflow issues) */ - /* top: auto; - bottom: calc(-1 * var(--dialog-radius)); - padding-bottom: var(--dialog-radius); */ } - - ${$withAnimation && - css` - @media (prefers-reduced-motion: no-preference) { - &[data-state='open'] { - animation: ${keyframes` - from { - opacity: 0; - } - 0.01% { - max-height: 0; - } - `} 0.15s var(--ease-out-expo); - } - - &[data-state='closed'] { - animation: ${keyframes` - to { - opacity: 0; - scale: 0.9; - max-height: 0; - } - `} 0.15s; - } - } - `} `, [DialogPlacement.Sidebar]: css` --dialog-width: var(--sidebar-width); + height: 100%; @media ${breakpoints.notMobile} { max-width: var(--dialog-width); margin-left: auto; } - - ${$withAnimation && - css` - @media (prefers-reduced-motion: no-preference) { - &[data-state='open'] { - animation: ${keyframes` - from { - translate: 100% 0; - opacity: 0; - } - `} 0.15s var(--ease-out-expo); - } - - &[data-state='closed'] { - animation: ${keyframes` - to { - translate: 100% 0; - opacity: 0; - } - `} 0.15s var(--ease-out-expo); - } - } - `} - `, - [DialogPlacement.Inline]: css` - ${$withAnimation && - css` - @media (prefers-reduced-motion: no-preference) { - &[data-state='open'] { - animation: ${keyframes` - from { - scale: 0.99; - opacity: 0; - } - `} 0.15s var(--ease-out-expo); - } - - &[data-state='closed'] { - animation: ${keyframes` - to { - scale: 0.99; - opacity: 0; - } - `} 0.15s var(--ease-out-expo); - } - } - `} `, + [DialogPlacement.Inline]: css``, [DialogPlacement.FullScreen]: css` --dialog-width: 100vw; --dialog-height: 100vh; @@ -388,6 +327,25 @@ const $Container = styled(Content)<{ `} `; +const $InnerContainer = styled.div<{ placement: DialogPlacement }>` + ${({ placement }) => + ({ + [DialogPlacement.Default]: css``, + [DialogPlacement.Sidebar]: css` + ${layoutMixins.flexColumn} + height: 100%; + `, + [DialogPlacement.Inline]: css` + ${layoutMixins.flexColumn} + height: 100%; + `, + [DialogPlacement.FullScreen]: css` + ${layoutMixins.flexColumn} + height: 100%; + `, + })[placement]} +`; + const $Header = styled.header<{ $withBorder: boolean; $withBlur: boolean }>` ${layoutMixins.stickyHeader} diff --git a/src/constants/analytics.ts b/src/constants/analytics.ts index 52c31560f..35c0da9fc 100644 --- a/src/constants/analytics.ts +++ b/src/constants/analytics.ts @@ -336,6 +336,7 @@ export const AnalyticsEvents = unionize( assetSymbol?: string; assetName?: string; }>(), + WebsocketParseError: ofType<{ message: string }>(), // vaults ClickViewVaultFromPositionCard: ofType<{}>(), diff --git a/src/constants/dialogs.ts b/src/constants/dialogs.ts index 28c3018af..15b8c5f44 100644 --- a/src/constants/dialogs.ts +++ b/src/constants/dialogs.ts @@ -85,6 +85,7 @@ export type UnlimitedAnnouncementDialogProps = {}; export type UnstakeDialogProps = {}; export type VaultDepositWithdrawDialogProps = { initialType?: 'DEPOSIT' | 'WITHDRAW' }; export type WithdrawDialogProps = {}; +export type DepositDialog2Props = {}; export type WithdrawalGatedDialogProps = { transferType: 'withdrawal' | 'transfer'; estimatedUnblockTime?: string | null; @@ -108,6 +109,8 @@ export const DialogTypes = unionize( ConfirmPendingDeposit: ofType(), Criteria: ofType(), Deposit: ofType(), + /* TODO: rename Deposit2 to Deposit once old deposit flow is deprecated */ + Deposit2: ofType(), DisconnectWallet: ofType(), DisplaySettings: ofType(), ExchangeOffline: ofType(), diff --git a/src/hooks/transfers/skipClient.tsx b/src/hooks/transfers/skipClient.tsx index b458ee9c9..d922662ed 100644 --- a/src/hooks/transfers/skipClient.tsx +++ b/src/hooks/transfers/skipClient.tsx @@ -32,10 +32,7 @@ const useSkipClientContext = () => { useEndpointsConfig(); const { compositeClient } = useDydxClient(); const selectedDydxChainId = useAppSelector(getSelectedDydxChainId); - // reactQuery only accepts serializable objects/values, so we return a string id - // so any useQuery that uses the skipClient can use that id as a query key - // to ensure it has the most up-to-date skipClient - const { skipClient, skipClientId } = useMemo( + const { skipClient, skipInstanceId } = useMemo( () => ({ skipClient: new SkipClient({ endpointOptions: { @@ -53,7 +50,7 @@ const useSkipClientContext = () => { }, registryTypes: [[TYPE_URL_MSG_WITHDRAW_FROM_SUBACCOUNT, MsgWithdrawFromSubaccount]], }), - skipClientId: crypto.randomUUID(), + skipInstanceId: crypto.randomUUID(), }), [ compositeClient?.network.validatorConfig.restEndpoint, @@ -65,5 +62,5 @@ const useSkipClientContext = () => { validators, ] ); - return { skipClient, skipClientId }; + return { skipClient, skipInstanceId }; }; diff --git a/src/hooks/transfers/useTransfers.tsx b/src/hooks/transfers/useTransfers.tsx index 637d9531b..a4263591f 100644 --- a/src/hooks/transfers/useTransfers.tsx +++ b/src/hooks/transfers/useTransfers.tsx @@ -65,7 +65,7 @@ export const assetsQueryFn = async (skipClient: SkipClient) => { }; export const useTransfers = () => { - const { skipClient, skipClientId } = useSkipClient(); + const { skipClient } = useSkipClient(); const { dydxAddress, sourceAccount } = useAccounts(); const selectedDydxChainId = useAppSelector(getSelectedDydxChainId); @@ -87,14 +87,14 @@ export const useTransfers = () => { const debouncedAmountBN = useMemo(() => MustBigNumber(debouncedAmount), [debouncedAmount]); const chainsQuery = useQuery({ - queryKey: ['transferEligibleChains', skipClientId], + queryKey: ['transferEligibleChains'], queryFn: () => chainsQueryFn(skipClient), refetchOnWindowFocus: false, refetchOnMount: false, refetchOnReconnect: false, }); const assetsQuery = useQuery({ - queryKey: ['transferEligibleAssets', skipClientId], + queryKey: ['transferEligibleAssets'], queryFn: () => assetsQueryFn(skipClient), refetchOnWindowFocus: false, refetchOnMount: false, diff --git a/src/hooks/useAffiliatesLeaderboard.ts b/src/hooks/useAffiliatesLeaderboard.ts index f8587813f..9443ed59e 100644 --- a/src/hooks/useAffiliatesLeaderboard.ts +++ b/src/hooks/useAffiliatesLeaderboard.ts @@ -25,10 +25,12 @@ export const useAffiliatesLeaderboard = () => { }); const data = await response.json(); - return data?.affiliateList?.map((stat: IAffiliateStats, i: number) => ({ - ...stat, - rank: i + 1, - })); + return data?.affiliateList + ?.filter((stat: IAffiliateStats) => Boolean(stat.affiliateReferralCode)) + ?.map((stat: IAffiliateStats, i: number) => ({ + ...stat, + rank: i + 1, + })); } catch (error) { log('useAffiliateLeaderboard', error, { endpoint }); throw error; diff --git a/src/hooks/useIsMounted.ts b/src/hooks/useIsMounted.ts new file mode 100644 index 000000000..e4443d60a --- /dev/null +++ b/src/hooks/useIsMounted.ts @@ -0,0 +1,19 @@ +import { useCallback, useEffect, useRef } from 'react'; + +/** + * @description Custom hook that determines if the component is currently mounted. + * @url https://usehooks-ts.com/react-hook/use-is-mounted + */ +export function useIsMounted(): () => boolean { + const isMounted = useRef(false); + + useEffect(() => { + isMounted.current = true; + + return () => { + isMounted.current = false; + }; + }, []); + + return useCallback(() => isMounted.current, []); +} diff --git a/src/hooks/usePrefetchedQueries.ts b/src/hooks/usePrefetchedQueries.ts index 960352888..350f70d60 100644 --- a/src/hooks/usePrefetchedQueries.ts +++ b/src/hooks/usePrefetchedQueries.ts @@ -2,19 +2,23 @@ import { useEffect } from 'react'; import { appQueryClient } from '@/state/appQueryClient'; +import { testFlags } from '@/lib/testFlags'; + import { useSkipClient } from './transfers/skipClient'; import { assetsQueryFn, chainsQueryFn } from './transfers/useTransfers'; export const usePrefetchedQueries = () => { - const { skipClient, skipClientId } = useSkipClient(); + const { skipClient } = useSkipClient(); useEffect(() => { + if (!testFlags.showNewDepositFlow) return; + appQueryClient.prefetchQuery({ - queryKey: ['transferEligibleChains', skipClientId], + queryKey: ['transferEligibleChains'], queryFn: () => chainsQueryFn(skipClient), }); appQueryClient.prefetchQuery({ - queryKey: ['transferEligibleAssets', skipClientId], + queryKey: ['transferEligibleAssets'], queryFn: () => assetsQueryFn(skipClient), }); - }, [skipClient, skipClientId]); + }, [skipClient]); }; diff --git a/src/hooks/useResizeObserver.ts b/src/hooks/useResizeObserver.ts new file mode 100644 index 000000000..49a09d957 --- /dev/null +++ b/src/hooks/useResizeObserver.ts @@ -0,0 +1,101 @@ +import { RefObject, useEffect, useRef, useState } from 'react'; + +import { useIsMounted } from './useIsMounted'; + +type Size = { + width: number | undefined; + height: number | undefined; +}; + +type UseResizeObserverOptions = { + ref: RefObject; + onResize?: (size: Size) => void; + box?: 'border-box' | 'content-box' | 'device-pixel-content-box'; +}; + +const initialSize: Size = { + width: undefined, + height: undefined, +}; + +/** + * @description Custom hook that observes the size of an element using the ResizeObserver API. + * @url https://usehooks-ts.com/react-hook/use-resize-observer + */ +export function useResizeObserver( + options: UseResizeObserverOptions +): Size { + const { ref, box = 'content-box' } = options; + const [{ width, height }, setSize] = useState(initialSize); + const isMounted = useIsMounted(); + const previousSize = useRef({ ...initialSize }); + const onResize = useRef<((size: Size) => void) | undefined>(undefined); + onResize.current = options.onResize; + + useEffect(() => { + if (!ref.current) return; + + if (typeof window === 'undefined' || !('ResizeObserver' in window)) return; + + const observer = new ResizeObserver(([entry]) => { + const boxProp = + box === 'border-box' + ? 'borderBoxSize' + : box === 'device-pixel-content-box' + ? 'devicePixelContentBoxSize' + : 'contentBoxSize'; + + const newWidth = extractSize(entry!, boxProp, 'inlineSize'); + const newHeight = extractSize(entry!, boxProp, 'blockSize'); + + const hasChanged = + previousSize.current.width !== newWidth || previousSize.current.height !== newHeight; + + if (hasChanged) { + const newSize: Size = { width: newWidth, height: newHeight }; + previousSize.current.width = newWidth; + previousSize.current.height = newHeight; + + if (onResize.current) { + onResize.current(newSize); + } else { + if (isMounted()) { + setSize(newSize); + } + } + } + }); + + observer.observe(ref.current, { box }); + + // eslint-disable-next-line consistent-return + return () => { + observer.disconnect(); + }; + }, [box, ref, isMounted]); + + return { width, height }; +} + +type BoxSizesKey = keyof Pick< + ResizeObserverEntry, + 'borderBoxSize' | 'contentBoxSize' | 'devicePixelContentBoxSize' +>; + +function extractSize( + entry: ResizeObserverEntry, + box: BoxSizesKey, + sizeType: keyof ResizeObserverSize +): number | undefined { + if (!entry[box]) { + if (box === 'contentBoxSize') { + return entry.contentRect[sizeType === 'inlineSize' ? 'width' : 'height']; + } + return undefined; + } + + return Array.isArray(entry[box]) + ? entry[box][0][sizeType] + : // @ts-ignore Support Firefox's non-standard behavior + (entry[box][sizeType] as number); +} diff --git a/src/layout/DialogManager.tsx b/src/layout/DialogManager.tsx index d9dd3c5bd..ce4d7bbe8 100644 --- a/src/layout/DialogManager.tsx +++ b/src/layout/DialogManager.tsx @@ -14,6 +14,7 @@ import { ClosePositionDialog } from '@/views/dialogs/ClosePositionDialog'; import { ComplianceConfigDialog } from '@/views/dialogs/ComplianceConfigDialog'; import { ConfirmPendingDepositDialog } from '@/views/dialogs/ConfirmPendingDepositDialog'; import { DepositDialog } from '@/views/dialogs/DepositDialog'; +import { DepositDialog2 } from '@/views/dialogs/DepositDialog2/DepositDialog2'; import { FillDetailsDialog } from '@/views/dialogs/DetailsDialog/FillDetailsDialog'; import { OrderDetailsDialog } from '@/views/dialogs/DetailsDialog/OrderDetailsDialog'; import { DisconnectDialog } from '@/views/dialogs/DisconnectDialog'; @@ -81,6 +82,7 @@ export const DialogManager = React.memo(() => { ComplianceConfig: (args) => , ConfirmPendingDeposit: (args) => , Deposit: (args) => , + Deposit2: (args) => , DisconnectWallet: (args) => , DisplaySettings: (args) => , ExchangeOffline: (args) => , diff --git a/src/layout/Header/HeaderDesktop.tsx b/src/layout/Header/HeaderDesktop.tsx index b8ca7b5ba..bed64d4f6 100644 --- a/src/layout/Header/HeaderDesktop.tsx +++ b/src/layout/Header/HeaderDesktop.tsx @@ -40,6 +40,7 @@ import { openDialog } from '@/state/dialogs'; import { isTruthy } from '@/lib/isTruthy'; import { MustBigNumber } from '@/lib/numbers'; +import { testFlags } from '@/lib/testFlags'; export const HeaderDesktop = () => { const stringGetter = useStringGetter(); @@ -195,7 +196,15 @@ export const HeaderDesktop = () => { ? ButtonAction.Secondary : ButtonAction.Primary } - onClick={() => dispatch(openDialog(DialogTypes.Deposit({})))} + onClick={() => { + dispatch( + openDialog( + testFlags.showNewDepositFlow + ? DialogTypes.Deposit2({}) + : DialogTypes.Deposit({}) + ) + ); + }} state={{ isDisabled: !dydxAccounts }} > {stringGetter({ key: STRING_KEYS.DEPOSIT })} diff --git a/src/lib/abacus/stateNotification.ts b/src/lib/abacus/stateNotification.ts index 56612c335..d35ed69f0 100644 --- a/src/lib/abacus/stateNotification.ts +++ b/src/lib/abacus/stateNotification.ts @@ -16,6 +16,7 @@ import type { } from '@/constants/abacus'; import { Changes } from '@/constants/abacus'; import { NUM_PARENT_SUBACCOUNTS } from '@/constants/account'; +import { AnalyticsEvents } from '@/constants/analytics'; import { timeUnits } from '@/constants/time'; import { type RootStore } from '@/state/_store'; @@ -44,6 +45,7 @@ import { setLatestOrder, updateFilledOrders, updateOrders } from '@/state/localO import { updateNotifications } from '@/state/notifications'; import { setHistoricalFundings, setLiveTrades, setMarkets, setOrderbook } from '@/state/perpetuals'; +import { track } from '../analytics/analytics'; import { isTruthy } from '../isTruthy'; class AbacusStateNotifier implements AbacusStateNotificationProtocol { @@ -267,8 +269,11 @@ class AbacusStateNotifier implements AbacusStateNotificationProtocol { } errorsEmitted(errors: ParsingErrors) { + const arr = errors.toArray(); + + track(AnalyticsEvents.WebsocketParseError({ message: arr.map((a) => a.message).join(', ') })); // eslint-disable-next-line no-console - console.error('parse errors', errors.toArray()); + console.error('parse errors', arr); } apiStateChanged(apiState: AbacusApiState) { diff --git a/src/lib/testFlags.ts b/src/lib/testFlags.ts index 704e83b8c..dc4499797 100644 --- a/src/lib/testFlags.ts +++ b/src/lib/testFlags.ts @@ -65,6 +65,10 @@ class TestFlags { get useAbacusTs() { return isDev; } + + get showNewDepositFlow() { + return !!this.queryParams.deposit_rewrite; + } } export const testFlags = new TestFlags(); diff --git a/src/views/dialogs/DepositDialog.tsx b/src/views/dialogs/DepositDialog.tsx index 268fd8192..636c4bf4c 100644 --- a/src/views/dialogs/DepositDialog.tsx +++ b/src/views/dialogs/DepositDialog.tsx @@ -56,6 +56,7 @@ export const DepositDialog = ({ return ( ) => { + const { isMobile } = useBreakpoints(); + const stringGetter = useStringGetter(); + + return ( + + New deposit flow goes here! + + ); +}; diff --git a/src/views/forms/AccountManagementFormsNew/WithdrawForm/WithdrawForm.tsx b/src/views/forms/AccountManagementFormsNew/WithdrawForm/WithdrawForm.tsx index 25710ca4f..4fcefc9e5 100644 --- a/src/views/forms/AccountManagementFormsNew/WithdrawForm/WithdrawForm.tsx +++ b/src/views/forms/AccountManagementFormsNew/WithdrawForm/WithdrawForm.tsx @@ -2,10 +2,10 @@ import type { ChangeEvent, FormEvent } from 'react'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { TYPE_URL_MSG_WITHDRAW_FROM_SUBACCOUNT } from '@dydxprotocol/v4-client-js'; -import { parseUnits } from 'ethers'; import type { NumberFormatValues } from 'react-number-format'; import { shallowEqual } from 'react-redux'; import styled from 'styled-components'; +import { parseUnits } from 'viem'; import { AutoSweepConfig } from '@/constants/abacus'; import { AlertType } from '@/constants/alerts'; @@ -180,7 +180,7 @@ export const WithdrawForm = () => { }, recipient: dydxAddress, assetId: 0, - quantums: parseUnits(debouncedAmount, usdcDecimals), + quantums: parseUnits(debouncedAmount, usdcDecimals).toString(), }), msgTypeURL: TYPE_URL_MSG_WITHDRAW_FROM_SUBACCOUNT, }, diff --git a/src/views/menus/NotificationsMenu.tsx b/src/views/menus/NotificationsMenu.tsx index f8bdb5227..e59bd19c7 100644 --- a/src/views/menus/NotificationsMenu.tsx +++ b/src/views/menus/NotificationsMenu.tsx @@ -135,7 +135,7 @@ export const NotificationsMenu = ({ return ( <$ComboboxDialogMenu - withOverlay={false} + withOverlay={!isTablet} withItemBorders isOpen={isMenuOpen || placement === DialogPlacement.Inline} setIsOpen={setIsMenuOpen}