Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7c1105ce7b |
@@ -6,5 +6,3 @@ VITE_PK_ENCRYPTION_KEY=
|
|||||||
|
|
||||||
VITE_WALLETCONNECT1_BRIDGE=
|
VITE_WALLETCONNECT1_BRIDGE=
|
||||||
VITE_WALLETCONNECT2_PROJECT_ID=
|
VITE_WALLETCONNECT2_PROJECT_ID=
|
||||||
|
|
||||||
VITE_V3_TOKEN_ADDRESS=
|
|
||||||
@@ -33,13 +33,11 @@ jobs:
|
|||||||
AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }}
|
AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }}
|
||||||
BUGSNAG_API_KEY: ${{ secrets.BUGSNAG_API_KEY }}
|
BUGSNAG_API_KEY: ${{ secrets.BUGSNAG_API_KEY }}
|
||||||
STATUS_PAGE_SCRIPT_URI: ${{ secrets.STATUS_PAGE_SCRIPT_URI }}
|
STATUS_PAGE_SCRIPT_URI: ${{ secrets.STATUS_PAGE_SCRIPT_URI }}
|
||||||
IOS_APP_ID: ${{ secrets.IOS_APP_ID }}
|
|
||||||
run: |
|
run: |
|
||||||
pnpm run build
|
pnpm run build
|
||||||
pnpm run build:inject-amplitude
|
pnpm run build:inject-amplitude
|
||||||
pnpm run build:inject-bugsnag
|
pnpm run build:inject-bugsnag
|
||||||
pnpm run build:inject-statuspage
|
pnpm run build:inject-statuspage
|
||||||
sh scripts/inject-app-deeplinks.sh
|
|
||||||
|
|
||||||
- name: Upload to IPFS via web3.storage
|
- name: Upload to IPFS via web3.storage
|
||||||
uses: dydxprotocol/add-to-web3@v1
|
uses: dydxprotocol/add-to-web3@v1
|
||||||
|
|||||||
+3
-4
@@ -10,7 +10,6 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"build:inject-app-deeplinks": "sh scripts/inject-app-deeplinks.sh",
|
|
||||||
"build:inject-amplitude": "node scripts/inject-amplitude.js",
|
"build:inject-amplitude": "node scripts/inject-amplitude.js",
|
||||||
"build:inject-bugsnag": "node scripts/inject-bugsnag.js",
|
"build:inject-bugsnag": "node scripts/inject-bugsnag.js",
|
||||||
"build:inject-statuspage": "node scripts/inject-statuspage.js",
|
"build:inject-statuspage": "node scripts/inject-statuspage.js",
|
||||||
@@ -38,9 +37,9 @@
|
|||||||
"@cosmjs/proto-signing": "^0.31.0",
|
"@cosmjs/proto-signing": "^0.31.0",
|
||||||
"@cosmjs/stargate": "^0.31.0",
|
"@cosmjs/stargate": "^0.31.0",
|
||||||
"@cosmjs/tendermint-rpc": "^0.31.0",
|
"@cosmjs/tendermint-rpc": "^0.31.0",
|
||||||
"@dydxprotocol/v4-abacus": "^0.6.4",
|
"@dydxprotocol/v4-abacus": "^0.5.4",
|
||||||
"@dydxprotocol/v4-client-js": "^0.36.1",
|
"@dydxprotocol/v4-client-js": "^0.36.1",
|
||||||
"@dydxprotocol/v4-localization": "^0.1.24",
|
"@dydxprotocol/v4-localization": "^0.1.11",
|
||||||
"@ethersproject/providers": "^5.7.2",
|
"@ethersproject/providers": "^5.7.2",
|
||||||
"@js-joda/core": "^5.5.3",
|
"@js-joda/core": "^5.5.3",
|
||||||
"@radix-ui/react-collapsible": "^1.0.3",
|
"@radix-ui/react-collapsible": "^1.0.3",
|
||||||
@@ -106,7 +105,7 @@
|
|||||||
"reselect": "^4.1.8",
|
"reselect": "^4.1.8",
|
||||||
"styled-components": "^5.3.11",
|
"styled-components": "^5.3.11",
|
||||||
"use-latest": "^1.2.1",
|
"use-latest": "^1.2.1",
|
||||||
"viem": "^1.12.2",
|
"viem": "^1.1.6",
|
||||||
"wagmi": "^1.3.7"
|
"wagmi": "^1.3.7"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
Generated
+63
-85
@@ -27,14 +27,14 @@ dependencies:
|
|||||||
specifier: ^0.31.0
|
specifier: ^0.31.0
|
||||||
version: 0.31.0
|
version: 0.31.0
|
||||||
'@dydxprotocol/v4-abacus':
|
'@dydxprotocol/v4-abacus':
|
||||||
specifier: ^0.6.4
|
specifier: ^0.5.4
|
||||||
version: 0.6.4
|
version: 0.5.4
|
||||||
'@dydxprotocol/v4-client-js':
|
'@dydxprotocol/v4-client-js':
|
||||||
specifier: ^0.36.1
|
specifier: ^0.36.1
|
||||||
version: 0.36.1
|
version: 0.36.1
|
||||||
'@dydxprotocol/v4-localization':
|
'@dydxprotocol/v4-localization':
|
||||||
specifier: ^0.1.24
|
specifier: ^0.1.11
|
||||||
version: 0.1.24
|
version: 0.1.11
|
||||||
'@ethersproject/providers':
|
'@ethersproject/providers':
|
||||||
specifier: ^5.7.2
|
specifier: ^5.7.2
|
||||||
version: 5.7.2
|
version: 5.7.2
|
||||||
@@ -231,11 +231,11 @@ dependencies:
|
|||||||
specifier: ^1.2.1
|
specifier: ^1.2.1
|
||||||
version: 1.2.1(@types/react@18.2.14)(react@18.2.0)
|
version: 1.2.1(@types/react@18.2.14)(react@18.2.0)
|
||||||
viem:
|
viem:
|
||||||
specifier: ^1.12.2
|
specifier: ^1.1.6
|
||||||
version: 1.12.2(typescript@5.1.3)
|
version: 1.1.6(typescript@5.1.3)
|
||||||
wagmi:
|
wagmi:
|
||||||
specifier: ^1.3.7
|
specifier: ^1.3.7
|
||||||
version: 1.3.7(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(viem@1.12.2)
|
version: 1.3.7(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6)
|
||||||
|
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@babel/core':
|
'@babel/core':
|
||||||
@@ -380,12 +380,12 @@ packages:
|
|||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@adraffy/ens-normalize@1.9.2:
|
/@adraffy/ens-normalize@1.9.0:
|
||||||
resolution: {integrity: sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==}
|
resolution: {integrity: sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@adraffy/ens-normalize@1.9.4:
|
/@adraffy/ens-normalize@1.9.2:
|
||||||
resolution: {integrity: sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw==}
|
resolution: {integrity: sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@ampproject/remapping@2.2.1:
|
/@ampproject/remapping@2.2.1:
|
||||||
@@ -979,8 +979,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==}
|
resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@dydxprotocol/v4-abacus@0.6.4:
|
/@dydxprotocol/v4-abacus@0.5.4:
|
||||||
resolution: {integrity: sha512-eH+/9Q/OnQtwzBwM1BJyXybFPdivGmFQWrxM71MFWGs6uIQGbZX775mpoa8deweSTyQ/QrRLRQ1mP2BPDgBQYg==}
|
resolution: {integrity: sha512-LMwmyXCih2bBdLX3vO5OwbdGWg3oZ8WSGj+4nqr8tn/bn1qCSKdYdZZ9/U20Yir2rMAcoC0jmznMcBwthlSp/w==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@dydxprotocol/v4-client-js@0.36.1:
|
/@dydxprotocol/v4-client-js@0.36.1:
|
||||||
@@ -1010,8 +1010,8 @@ packages:
|
|||||||
- utf-8-validate
|
- utf-8-validate
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@dydxprotocol/v4-localization@0.1.24:
|
/@dydxprotocol/v4-localization@0.1.11:
|
||||||
resolution: {integrity: sha512-zSiu8+/6BWNWZXxe73zUp/UjuLG1Cp5UuhXKtbATqqkeZyVCs01QxbBCTs1MLfgsLh02IrfhXCPHvXnzZyReEw==}
|
resolution: {integrity: sha512-eW88t8KJuDT0fNEgaw615+n3gEYxDZYPeHhdBYquVDXjnkhLNznaH8ftmlLPVPyfu7o5aFeU/cw8ZiqRrf/Stw==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@dydxprotocol/v4-proto@0.2.1:
|
/@dydxprotocol/v4-proto@0.2.1:
|
||||||
@@ -2032,12 +2032,6 @@ packages:
|
|||||||
'@noble/hashes': 1.3.1
|
'@noble/hashes': 1.3.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@noble/curves@1.2.0:
|
|
||||||
resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==}
|
|
||||||
dependencies:
|
|
||||||
'@noble/hashes': 1.3.2
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@noble/ed25519@1.7.3:
|
/@noble/ed25519@1.7.3:
|
||||||
resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==}
|
resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==}
|
||||||
dev: true
|
dev: true
|
||||||
@@ -2055,11 +2049,6 @@ packages:
|
|||||||
engines: {node: '>= 16'}
|
engines: {node: '>= 16'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@noble/hashes@1.3.2:
|
|
||||||
resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==}
|
|
||||||
engines: {node: '>= 16'}
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@noble/secp256k1@1.7.1:
|
/@noble/secp256k1@1.7.1:
|
||||||
resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==}
|
resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==}
|
||||||
|
|
||||||
@@ -4658,7 +4647,7 @@ packages:
|
|||||||
resolution: {integrity: sha512-gYw0ki/EAuV1oSyMxpqandHjnthZjYYy+YWpTAzf8BqfXM3ItcZLpjxfg+3+mXW8HIO+3jw6T9iiqEXsqHaMMw==}
|
resolution: {integrity: sha512-gYw0ki/EAuV1oSyMxpqandHjnthZjYYy+YWpTAzf8BqfXM3ItcZLpjxfg+3+mXW8HIO+3jw6T9iiqEXsqHaMMw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@safe-global/safe-gateway-typescript-sdk': 3.9.0
|
'@safe-global/safe-gateway-typescript-sdk': 3.9.0
|
||||||
viem: 1.12.2(typescript@5.1.3)
|
viem: 1.1.6(typescript@5.1.3)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- bufferutil
|
- bufferutil
|
||||||
- encoding
|
- encoding
|
||||||
@@ -4671,7 +4660,7 @@ packages:
|
|||||||
resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==}
|
resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@safe-global/safe-gateway-typescript-sdk': 3.9.0
|
'@safe-global/safe-gateway-typescript-sdk': 3.9.0
|
||||||
viem: 1.12.2(typescript@5.1.3)
|
viem: 1.1.6(typescript@5.1.3)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- bufferutil
|
- bufferutil
|
||||||
- encoding
|
- encoding
|
||||||
@@ -4692,10 +4681,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==}
|
resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@scure/base@1.1.3:
|
|
||||||
resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==}
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@scure/bip32@1.3.0:
|
/@scure/bip32@1.3.0:
|
||||||
resolution: {integrity: sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q==}
|
resolution: {integrity: sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -4712,14 +4697,6 @@ packages:
|
|||||||
'@scure/base': 1.1.1
|
'@scure/base': 1.1.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@scure/bip32@1.3.2:
|
|
||||||
resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==}
|
|
||||||
dependencies:
|
|
||||||
'@noble/curves': 1.2.0
|
|
||||||
'@noble/hashes': 1.3.2
|
|
||||||
'@scure/base': 1.1.3
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@scure/bip39@1.2.0:
|
/@scure/bip39@1.2.0:
|
||||||
resolution: {integrity: sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg==}
|
resolution: {integrity: sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -4730,7 +4707,7 @@ packages:
|
|||||||
/@scure/bip39@1.2.1:
|
/@scure/bip39@1.2.1:
|
||||||
resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==}
|
resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@noble/hashes': 1.3.2
|
'@noble/hashes': 1.3.1
|
||||||
'@scure/base': 1.1.1
|
'@scure/base': 1.1.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
@@ -5431,12 +5408,6 @@ packages:
|
|||||||
'@types/node': 20.3.1
|
'@types/node': 20.3.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@types/ws@8.5.6:
|
|
||||||
resolution: {integrity: sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==}
|
|
||||||
dependencies:
|
|
||||||
'@types/node': 20.3.1
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@typescript-eslint/eslint-plugin@5.60.0(@typescript-eslint/parser@5.60.0)(eslint@8.43.0)(typescript@5.1.3):
|
/@typescript-eslint/eslint-plugin@5.60.0(@typescript-eslint/parser@5.60.0)(eslint@8.43.0)(typescript@5.1.3):
|
||||||
resolution: {integrity: sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==}
|
resolution: {integrity: sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
@@ -5933,6 +5904,17 @@ packages:
|
|||||||
pretty-format: 27.5.1
|
pretty-format: 27.5.1
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@wagmi/chains@1.2.0(typescript@5.1.3):
|
||||||
|
resolution: {integrity: sha512-dmDRipsE54JfyudOBkuhEexqQWcrZqxn/qiujG8SBzMh/az/AH5xlJSA+j1CPWTx9+QofSMF3B7A4gb6XRmSaQ==}
|
||||||
|
peerDependencies:
|
||||||
|
typescript: '>=5.0.4'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
typescript:
|
||||||
|
optional: true
|
||||||
|
dependencies:
|
||||||
|
typescript: 5.1.3
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@wagmi/chains@1.4.0(typescript@5.1.3):
|
/@wagmi/chains@1.4.0(typescript@5.1.3):
|
||||||
resolution: {integrity: sha512-9HwJrhcZ1TxyrCbE10y7s1eSiSiyfGam7AHIOLYExaOX+vpOZ+MNTt4orFEDbEpz1fxwJDPPI38lanAUix1OSA==}
|
resolution: {integrity: sha512-9HwJrhcZ1TxyrCbE10y7s1eSiSiyfGam7AHIOLYExaOX+vpOZ+MNTt4orFEDbEpz1fxwJDPPI38lanAUix1OSA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -5944,7 +5926,7 @@ packages:
|
|||||||
typescript: 5.1.3
|
typescript: 5.1.3
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@wagmi/connectors@2.6.5(@wagmi/chains@1.4.0)(react@18.2.0)(typescript@5.1.3)(viem@1.12.2):
|
/@wagmi/connectors@2.6.5(@wagmi/chains@1.4.0)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6):
|
||||||
resolution: {integrity: sha512-klF31togMDd0qQqEcLl5cCGxjMbL0RRXQ8I1vxmEa3KdGzw6Z3ICVzX7/bDfnNEZcOW7BKyAnZDq7rCt5jTOiw==}
|
resolution: {integrity: sha512-klF31togMDd0qQqEcLl5cCGxjMbL0RRXQ8I1vxmEa3KdGzw6Z3ICVzX7/bDfnNEZcOW7BKyAnZDq7rCt5jTOiw==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@wagmi/chains': '>=1.3.0'
|
'@wagmi/chains': '>=1.3.0'
|
||||||
@@ -5968,7 +5950,7 @@ packages:
|
|||||||
abitype: 0.8.7(typescript@5.1.3)
|
abitype: 0.8.7(typescript@5.1.3)
|
||||||
eventemitter3: 4.0.7
|
eventemitter3: 4.0.7
|
||||||
typescript: 5.1.3
|
typescript: 5.1.3
|
||||||
viem: 1.12.2(typescript@5.1.3)
|
viem: 1.1.6(typescript@5.1.3)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@react-native-async-storage/async-storage'
|
- '@react-native-async-storage/async-storage'
|
||||||
- bufferutil
|
- bufferutil
|
||||||
@@ -5980,7 +5962,7 @@ packages:
|
|||||||
- zod
|
- zod
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@wagmi/core@1.3.6(@types/react@18.2.14)(react@18.2.0)(typescript@5.1.3)(viem@1.12.2):
|
/@wagmi/core@1.3.6(@types/react@18.2.14)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6):
|
||||||
resolution: {integrity: sha512-TXv9ZlRR5aySfERFuWMuo+lKXC/CoqtxVJZVHPqhK1jY+nldMx3AvrWzzF4CccRaMYcVdvPFepvmxzq2A2VvWg==}
|
resolution: {integrity: sha512-TXv9ZlRR5aySfERFuWMuo+lKXC/CoqtxVJZVHPqhK1jY+nldMx3AvrWzzF4CccRaMYcVdvPFepvmxzq2A2VvWg==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
typescript: '>=5.0.4'
|
typescript: '>=5.0.4'
|
||||||
@@ -5990,11 +5972,11 @@ packages:
|
|||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
'@wagmi/chains': 1.4.0(typescript@5.1.3)
|
'@wagmi/chains': 1.4.0(typescript@5.1.3)
|
||||||
'@wagmi/connectors': 2.6.5(@wagmi/chains@1.4.0)(react@18.2.0)(typescript@5.1.3)(viem@1.12.2)
|
'@wagmi/connectors': 2.6.5(@wagmi/chains@1.4.0)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6)
|
||||||
abitype: 0.8.7(typescript@5.1.3)
|
abitype: 0.8.7(typescript@5.1.3)
|
||||||
eventemitter3: 4.0.7
|
eventemitter3: 4.0.7
|
||||||
typescript: 5.1.3
|
typescript: 5.1.3
|
||||||
viem: 1.12.2(typescript@5.1.3)
|
viem: 1.1.6(typescript@5.1.3)
|
||||||
zustand: 4.4.1(@types/react@18.2.14)(react@18.2.0)
|
zustand: 4.4.1(@types/react@18.2.14)(react@18.2.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@react-native-async-storage/async-storage'
|
- '@react-native-async-storage/async-storage'
|
||||||
@@ -6695,20 +6677,6 @@ packages:
|
|||||||
typescript: 5.1.3
|
typescript: 5.1.3
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/abitype@0.9.8(typescript@5.1.3):
|
|
||||||
resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==}
|
|
||||||
peerDependencies:
|
|
||||||
typescript: '>=5.0.4'
|
|
||||||
zod: ^3 >=3.19.1
|
|
||||||
peerDependenciesMeta:
|
|
||||||
typescript:
|
|
||||||
optional: true
|
|
||||||
zod:
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
typescript: 5.1.3
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/abort-controller@3.0.0:
|
/abort-controller@3.0.0:
|
||||||
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
|
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
|
||||||
engines: {node: '>=6.5'}
|
engines: {node: '>=6.5'}
|
||||||
@@ -10018,12 +9986,12 @@ packages:
|
|||||||
ws: 7.5.9
|
ws: 7.5.9
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/isomorphic-ws@5.0.0(ws@8.13.0):
|
/isomorphic-ws@5.0.0(ws@8.12.0):
|
||||||
resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==}
|
resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
ws: '*'
|
ws: '*'
|
||||||
dependencies:
|
dependencies:
|
||||||
ws: 8.13.0(bufferutil@4.0.7)(utf-8-validate@5.0.10)
|
ws: 8.12.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/it-all@1.0.6:
|
/it-all@1.0.6:
|
||||||
@@ -13552,24 +13520,21 @@ packages:
|
|||||||
vfile-message: 3.1.4
|
vfile-message: 3.1.4
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/viem@1.12.2(typescript@5.1.3):
|
/viem@1.1.6(typescript@5.1.3):
|
||||||
resolution: {integrity: sha512-aCaUCyg72ES+jK4s6tVYOMnOt4if71RwzgiUAUpAuaCgvHFfh9DCnwuEfwkxEZLE2vafOsirgJ3fcn7nsDVQoQ==}
|
resolution: {integrity: sha512-7nK3HMucLr1Yz0QnDXiD6viigKS6QeYD/YhRHpi3Bby/g0hCyZqK8+YJNtp3/Ri64tpl4kaTIeCScJWV2jqXHQ==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
typescript: '>=5.0.4'
|
typescript: '>=5.0.4'
|
||||||
peerDependenciesMeta:
|
|
||||||
typescript:
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
'@adraffy/ens-normalize': 1.9.4
|
'@adraffy/ens-normalize': 1.9.0
|
||||||
'@noble/curves': 1.2.0
|
'@noble/curves': 1.0.0
|
||||||
'@noble/hashes': 1.3.2
|
'@noble/hashes': 1.3.0
|
||||||
'@scure/bip32': 1.3.2
|
'@scure/bip32': 1.3.0
|
||||||
'@scure/bip39': 1.2.1
|
'@scure/bip39': 1.2.0
|
||||||
'@types/ws': 8.5.6
|
'@wagmi/chains': 1.2.0(typescript@5.1.3)
|
||||||
abitype: 0.9.8(typescript@5.1.3)
|
abitype: 0.8.7(typescript@5.1.3)
|
||||||
isomorphic-ws: 5.0.0(ws@8.13.0)
|
isomorphic-ws: 5.0.0(ws@8.12.0)
|
||||||
typescript: 5.1.3
|
typescript: 5.1.3
|
||||||
ws: 8.13.0(bufferutil@4.0.7)(utf-8-validate@5.0.10)
|
ws: 8.12.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- bufferutil
|
- bufferutil
|
||||||
- utf-8-validate
|
- utf-8-validate
|
||||||
@@ -13737,7 +13702,7 @@ packages:
|
|||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/wagmi@1.3.7(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(viem@1.12.2):
|
/wagmi@1.3.7(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6):
|
||||||
resolution: {integrity: sha512-n4Qwby0QB8/JSGjc0gGn4MWZ0BT229agEg6saPGS6VswmPjJLdkLq9qxKn1JptXxPREmb/ZvwHxU++3Z+gQJVA==}
|
resolution: {integrity: sha512-n4Qwby0QB8/JSGjc0gGn4MWZ0BT229agEg6saPGS6VswmPjJLdkLq9qxKn1JptXxPREmb/ZvwHxU++3Z+gQJVA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
react: '>=17.0.0'
|
react: '>=17.0.0'
|
||||||
@@ -13750,12 +13715,12 @@ packages:
|
|||||||
'@tanstack/query-sync-storage-persister': 4.32.6
|
'@tanstack/query-sync-storage-persister': 4.32.6
|
||||||
'@tanstack/react-query': 4.32.6(react-dom@18.2.0)(react@18.2.0)
|
'@tanstack/react-query': 4.32.6(react-dom@18.2.0)(react@18.2.0)
|
||||||
'@tanstack/react-query-persist-client': 4.32.6(@tanstack/react-query@4.32.6)
|
'@tanstack/react-query-persist-client': 4.32.6(@tanstack/react-query@4.32.6)
|
||||||
'@wagmi/core': 1.3.6(@types/react@18.2.14)(react@18.2.0)(typescript@5.1.3)(viem@1.12.2)
|
'@wagmi/core': 1.3.6(@types/react@18.2.14)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6)
|
||||||
abitype: 0.8.7(typescript@5.1.3)
|
abitype: 0.8.7(typescript@5.1.3)
|
||||||
react: 18.2.0
|
react: 18.2.0
|
||||||
typescript: 5.1.3
|
typescript: 5.1.3
|
||||||
use-sync-external-store: 1.2.0(react@18.2.0)
|
use-sync-external-store: 1.2.0(react@18.2.0)
|
||||||
viem: 1.12.2(typescript@5.1.3)
|
viem: 1.1.6(typescript@5.1.3)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@react-native-async-storage/async-storage'
|
- '@react-native-async-storage/async-storage'
|
||||||
- '@types/react'
|
- '@types/react'
|
||||||
@@ -13980,6 +13945,19 @@ packages:
|
|||||||
optional: true
|
optional: true
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/ws@8.12.0:
|
||||||
|
resolution: {integrity: sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==}
|
||||||
|
engines: {node: '>=10.0.0'}
|
||||||
|
peerDependencies:
|
||||||
|
bufferutil: ^4.0.1
|
||||||
|
utf-8-validate: '>=5.0.2'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
bufferutil:
|
||||||
|
optional: true
|
||||||
|
utf-8-validate:
|
||||||
|
optional: true
|
||||||
|
dev: false
|
||||||
|
|
||||||
/ws@8.13.0(bufferutil@4.0.7)(utf-8-validate@5.0.10):
|
/ws@8.13.0(bufferutil@4.0.7)(utf-8-validate@5.0.10):
|
||||||
resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==}
|
resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==}
|
||||||
engines: {node: '>=10.0.0'}
|
engines: {node: '>=10.0.0'}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
"details": [
|
"details": [
|
||||||
{
|
{
|
||||||
"appIDs": [
|
"appIDs": [
|
||||||
"{PLACE_YOUR_APP_ID_HERE}"
|
"75C6UARB5H.exchangeV4.dydx.trading"
|
||||||
],
|
],
|
||||||
"components": [
|
"components": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,834 +0,0 @@
|
|||||||
{
|
|
||||||
"deployments": {
|
|
||||||
"MAINNET": {
|
|
||||||
"environments": [
|
|
||||||
"dydxprotocol-mainnet"
|
|
||||||
],
|
|
||||||
"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-dsrv",
|
|
||||||
"dydxprotocol-testnet-nodefleet",
|
|
||||||
"dydxprotocol-testnet-kingnodes",
|
|
||||||
"dydxprotocol-testnet-liquify"
|
|
||||||
],
|
|
||||||
"default": "dydxprotocol-testnet"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"environments": {
|
|
||||||
"dydxprotocol-dev": {
|
|
||||||
"name": "v4 Dev",
|
|
||||||
"ethereumChainId": "5",
|
|
||||||
"dydxChainId": "dydxprotocol-testnet",
|
|
||||||
"isMainNet": false,
|
|
||||||
"tokens": {
|
|
||||||
"chain": {
|
|
||||||
"name": "DYDX",
|
|
||||||
"denom": "dv4tnt",
|
|
||||||
"image": "/currencies/dydx.png"
|
|
||||||
},
|
|
||||||
"usdc": {
|
|
||||||
"name": "USDC",
|
|
||||||
"denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5",
|
|
||||||
"gasDenom": "uusdc",
|
|
||||||
"image": "/currencies/usdc.png"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"endpoints": {
|
|
||||||
"indexers": [
|
|
||||||
{
|
|
||||||
"api": "http://indexer.v4dev.dydx.exchange",
|
|
||||||
"socket": "wss://indexer.v4dev.dydx.exchange"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"validators": [
|
|
||||||
"http://validator.v4dev.dydx.exchange"
|
|
||||||
],
|
|
||||||
"0xsquid": "https://testnet.api.0xsquid.com",
|
|
||||||
"faucet": "http://faucet.v4dev.dydx.exchange"
|
|
||||||
},
|
|
||||||
"links": {
|
|
||||||
"tos": "https://dydx.exchange/v4-terms",
|
|
||||||
"privacy": "https://dydx.exchange/privacy",
|
|
||||||
"mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}",
|
|
||||||
"blogs": "https://www.dydx.foundation/blog"
|
|
||||||
},
|
|
||||||
"wallets": {
|
|
||||||
"walletconnect": {
|
|
||||||
"client": {
|
|
||||||
"name": "dYdX v4",
|
|
||||||
"description": "dYdX v4 App",
|
|
||||||
"iconUrl": "/logos/dydx-x.png"
|
|
||||||
},
|
|
||||||
"v1": {
|
|
||||||
"bridgeUrl": "wss://api.stage.dydx.exchange/wc/"
|
|
||||||
},
|
|
||||||
"v2": {
|
|
||||||
"projectId": "47559b2ec96c09aed9ff2cb54a31ab0e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"walletSegue": {
|
|
||||||
"callbackUrl": "/walletsegue"
|
|
||||||
},
|
|
||||||
"images": "/wallets/",
|
|
||||||
"signTypedDataAction": "dYdX Chain Onboarding",
|
|
||||||
"signTypedDataDomainName": "dYdX Chain"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dydxprotocol-dev-2": {
|
|
||||||
"name": "v4 Dev 2",
|
|
||||||
"ethereumChainId": "5",
|
|
||||||
"dydxChainId": "dydxprotocol-testnet",
|
|
||||||
"isMainNet": false,
|
|
||||||
"tokens": {
|
|
||||||
"chain": {
|
|
||||||
"name": "DYDX",
|
|
||||||
"denom": "dv4tnt",
|
|
||||||
"image": "/currencies/dydx.png"
|
|
||||||
},
|
|
||||||
"usdc": {
|
|
||||||
"name": "USDC",
|
|
||||||
"denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5",
|
|
||||||
"gasDenom": "uusdc",
|
|
||||||
"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://35.75.227.118"
|
|
||||||
],
|
|
||||||
"0xsquid": "https://testnet.api.0xsquid.com"
|
|
||||||
},
|
|
||||||
"links": {
|
|
||||||
"tos": "https://dydx.exchange/v4-terms",
|
|
||||||
"privacy": "https://dydx.exchange/privacy",
|
|
||||||
"mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}",
|
|
||||||
"blogs": "https://www.dydx.foundation/blog"
|
|
||||||
},
|
|
||||||
"wallets": {
|
|
||||||
"walletconnect": {
|
|
||||||
"client": {
|
|
||||||
"name": "dYdX v4",
|
|
||||||
"description": "dYdX v4 App",
|
|
||||||
"iconUrl": "/logos/dydx-x.png"
|
|
||||||
},
|
|
||||||
"v1": {
|
|
||||||
"bridgeUrl": "wss://api.stage.dydx.exchange/wc/"
|
|
||||||
},
|
|
||||||
"v2": {
|
|
||||||
"projectId": "47559b2ec96c09aed9ff2cb54a31ab0e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"walletSegue": {
|
|
||||||
"callbackUrl": "/walletsegue"
|
|
||||||
},
|
|
||||||
"images": "/wallets/",
|
|
||||||
"signTypedDataAction": "dYdX Chain Onboarding",
|
|
||||||
"signTypedDataDomainName": "dYdX Chain"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dydxprotocol-dev-4": {
|
|
||||||
"name": "v4 Dev 4",
|
|
||||||
"ethereumChainId": "5",
|
|
||||||
"dydxChainId": "dydxprotocol-testnet",
|
|
||||||
"isMainNet": false,
|
|
||||||
"tokens": {
|
|
||||||
"chain": {
|
|
||||||
"name": "DYDX",
|
|
||||||
"denom": "dv4tnt",
|
|
||||||
"image": "/currencies/dydx.png"
|
|
||||||
},
|
|
||||||
"usdc": {
|
|
||||||
"name": "USDC",
|
|
||||||
"denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5",
|
|
||||||
"gasDenom": "uusdc",
|
|
||||||
"image": "/currencies/usdc.png"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"endpoints": {
|
|
||||||
"indexers": [
|
|
||||||
{
|
|
||||||
"api": "http://indexer.v4dev4.dydx.exchange",
|
|
||||||
"socket": "ws://indexer.v4dev4.dydx.exchange"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"validators": [
|
|
||||||
"http://validator.v4dev4.dydx.exchange"
|
|
||||||
],
|
|
||||||
"0xsquid": "https://testnet.api.0xsquid.com"
|
|
||||||
},
|
|
||||||
"links": {
|
|
||||||
"tos": "https://dydx.exchange/v4-terms",
|
|
||||||
"privacy": "https://dydx.exchange/privacy",
|
|
||||||
"mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}",
|
|
||||||
"blogs": "https://www.dydx.foundation/blog"
|
|
||||||
},
|
|
||||||
"wallets": {
|
|
||||||
"walletconnect": {
|
|
||||||
"client": {
|
|
||||||
"name": "dYdX v4",
|
|
||||||
"description": "dYdX v4 App",
|
|
||||||
"iconUrl": "/logos/dydx-x.png"
|
|
||||||
},
|
|
||||||
"v1": {
|
|
||||||
"bridgeUrl": "wss://api.stage.dydx.exchange/wc/"
|
|
||||||
},
|
|
||||||
"v2": {
|
|
||||||
"projectId": "47559b2ec96c09aed9ff2cb54a31ab0e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"walletSegue": {
|
|
||||||
"callbackUrl": "/walletsegue"
|
|
||||||
},
|
|
||||||
"images": "/wallets/",
|
|
||||||
"signTypedDataAction": "dYdX Chain Onboarding",
|
|
||||||
"signTypedDataDomainName": "dYdX Chain"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dydxprotocol-dev-5": {
|
|
||||||
"name": "v4 Dev 5",
|
|
||||||
"ethereumChainId": "5",
|
|
||||||
"dydxChainId": "dydxprotocol-testnet",
|
|
||||||
"isMainNet": false,
|
|
||||||
"tokens": {
|
|
||||||
"chain": {
|
|
||||||
"name": "DYDX",
|
|
||||||
"denom": "dv4tnt",
|
|
||||||
"image": "/currencies/dydx.png"
|
|
||||||
},
|
|
||||||
"usdc": {
|
|
||||||
"name": "USDC",
|
|
||||||
"denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5",
|
|
||||||
"gasDenom": "uusdc",
|
|
||||||
"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"
|
|
||||||
},
|
|
||||||
"links": {
|
|
||||||
"tos": "https://dydx.exchange/v4-terms",
|
|
||||||
"privacy": "https://dydx.exchange/privacy",
|
|
||||||
"mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}",
|
|
||||||
"blogs": "https://www.dydx.foundation/blog"
|
|
||||||
},
|
|
||||||
"wallets": {
|
|
||||||
"walletconnect": {
|
|
||||||
"client": {
|
|
||||||
"name": "dYdX v4",
|
|
||||||
"description": "dYdX v4 App",
|
|
||||||
"iconUrl": "/logos/dydx-x.png"
|
|
||||||
},
|
|
||||||
"v1": {
|
|
||||||
"bridgeUrl": "wss://api.stage.dydx.exchange/wc/"
|
|
||||||
},
|
|
||||||
"v2": {
|
|
||||||
"projectId": "47559b2ec96c09aed9ff2cb54a31ab0e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"walletSegue": {
|
|
||||||
"callbackUrl": "/walletsegue"
|
|
||||||
},
|
|
||||||
"images": "/wallets/",
|
|
||||||
"signTypedDataAction": "dYdX Chain Onboarding",
|
|
||||||
"signTypedDataDomainName": "dYdX Chain"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dydxprotocol-staging": {
|
|
||||||
"name": "v4 Staging",
|
|
||||||
"ethereumChainId": "5",
|
|
||||||
"dydxChainId": "dydxprotocol-testnet",
|
|
||||||
"isMainNet": false,
|
|
||||||
"tokens": {
|
|
||||||
"chain": {
|
|
||||||
"name": "DYDX",
|
|
||||||
"denom": "dv4tnt",
|
|
||||||
"image": "/currencies/dydx.png"
|
|
||||||
},
|
|
||||||
"usdc": {
|
|
||||||
"name": "USDC",
|
|
||||||
"denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5",
|
|
||||||
"gasDenom": "uusdc",
|
|
||||||
"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"
|
|
||||||
},
|
|
||||||
"links": {
|
|
||||||
"tos": "https://dydx.exchange/v4-terms",
|
|
||||||
"privacy": "https://dydx.exchange/privacy",
|
|
||||||
"mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}",
|
|
||||||
"documentation": "https://v4-teacher.vercel.app/",
|
|
||||||
"community": "https://discord.com/invite/dydx",
|
|
||||||
"feedback": "https://docs.google.com/forms/d/e/1FAIpQLSezLsWCKvAYDEb7L-2O4wOON1T56xxro9A2Azvl6IxXHP_15Q/viewform",
|
|
||||||
"blogs": "https://www.dydx.foundation/blog"
|
|
||||||
},
|
|
||||||
"wallets": {
|
|
||||||
"walletconnect": {
|
|
||||||
"client": {
|
|
||||||
"name": "dYdX v4",
|
|
||||||
"description": "dYdX v4 App",
|
|
||||||
"iconUrl": "/logos/dydx-x.png"
|
|
||||||
},
|
|
||||||
"v1": {
|
|
||||||
"bridgeUrl": "wss://api.stage.dydx.exchange/wc/"
|
|
||||||
},
|
|
||||||
"v2": {
|
|
||||||
"projectId": "47559b2ec96c09aed9ff2cb54a31ab0e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"walletSegue": {
|
|
||||||
"callbackUrl": "/walletsegue"
|
|
||||||
},
|
|
||||||
"images": "/wallets/",
|
|
||||||
"signTypedDataAction": "dYdX Chain Onboarding",
|
|
||||||
"signTypedDataDomainName": "dYdX Chain"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dydxprotocol-staging-west": {
|
|
||||||
"name": "v4 Staging West",
|
|
||||||
"ethereumChainId": "5",
|
|
||||||
"dydxChainId": "dydxprotocol-testnet",
|
|
||||||
"isMainNet": false,
|
|
||||||
"tokens": {
|
|
||||||
"chain": {
|
|
||||||
"name": "DYDX",
|
|
||||||
"denom": "dv4tnt",
|
|
||||||
"image": "/currencies/dydx.png"
|
|
||||||
},
|
|
||||||
"usdc": {
|
|
||||||
"name": "USDC",
|
|
||||||
"denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5",
|
|
||||||
"gasDenom": "uusdc",
|
|
||||||
"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"
|
|
||||||
},
|
|
||||||
"links": {
|
|
||||||
"tos": "https://dydx.exchange/v4-terms",
|
|
||||||
"privacy": "https://dydx.exchange/privacy",
|
|
||||||
"mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}",
|
|
||||||
"documentation": "https://v4-teacher.vercel.app/",
|
|
||||||
"community": "https://discord.com/invite/dydx",
|
|
||||||
"feedback": "https://docs.google.com/forms/d/e/1FAIpQLSezLsWCKvAYDEb7L-2O4wOON1T56xxro9A2Azvl6IxXHP_15Q/viewform",
|
|
||||||
"blogs": "https://www.dydx.foundation/blog"
|
|
||||||
},
|
|
||||||
"wallets": {
|
|
||||||
"walletconnect": {
|
|
||||||
"client": {
|
|
||||||
"name": "dYdX v4",
|
|
||||||
"description": "dYdX v4 App",
|
|
||||||
"iconUrl": "/logos/dydx-x.png"
|
|
||||||
},
|
|
||||||
"v1": {
|
|
||||||
"bridgeUrl": "wss://api.stage.dydx.exchange/wc/"
|
|
||||||
},
|
|
||||||
"v2": {
|
|
||||||
"projectId": "47559b2ec96c09aed9ff2cb54a31ab0e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"walletSegue": {
|
|
||||||
"callbackUrl": "/walletsegue"
|
|
||||||
},
|
|
||||||
"images": "/wallets/",
|
|
||||||
"signTypedDataAction": "dYdX Chain Onboarding",
|
|
||||||
"signTypedDataDomainName": "dYdX Chain"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dydxprotocol-testnet": {
|
|
||||||
"name": "v4 Public Testnet",
|
|
||||||
"ethereumChainId": "5",
|
|
||||||
"dydxChainId": "dydx-testnet-3",
|
|
||||||
"isMainNet": false,
|
|
||||||
"tokens": {
|
|
||||||
"chain": {
|
|
||||||
"name": "DYDX",
|
|
||||||
"denom": "dv4tnt",
|
|
||||||
"image": "/currencies/dydx.png"
|
|
||||||
},
|
|
||||||
"usdc": {
|
|
||||||
"name": "USDC",
|
|
||||||
"denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5",
|
|
||||||
"gasDenom": "uusdc",
|
|
||||||
"image": "/currencies/usdc.png"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"endpoints": {
|
|
||||||
"indexers": [
|
|
||||||
{
|
|
||||||
"api": "https://dydx-testnet.imperator.co",
|
|
||||||
"socket": "wss://dydx-testnet.imperator.co"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"validators": [
|
|
||||||
"https://dydx-testnet.nodefleet.org",
|
|
||||||
"https://test-dydx.kingnodes.com",
|
|
||||||
"https://dydx-rpc.liquify.com/api=8878132/dydx"
|
|
||||||
],
|
|
||||||
"0xsquid": "https://testnet.api.squidrouter.com",
|
|
||||||
"faucet": "https://faucet.v4testnet.dydx.exchange"
|
|
||||||
},
|
|
||||||
"links": {
|
|
||||||
"tos": "https://dydx.exchange/v4-terms",
|
|
||||||
"privacy": "https://dydx.exchange/privacy",
|
|
||||||
"mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}",
|
|
||||||
"documentation": "https://v4-teacher.vercel.app/",
|
|
||||||
"community": "https://discord.com/invite/dydx",
|
|
||||||
"feedback": "https://docs.google.com/forms/d/e/1FAIpQLSezLsWCKvAYDEb7L-2O4wOON1T56xxro9A2Azvl6IxXHP_15Q/viewform",
|
|
||||||
"blogs": "https://www.dydx.foundation/blog"
|
|
||||||
},
|
|
||||||
"wallets": {
|
|
||||||
"walletconnect": {
|
|
||||||
"client": {
|
|
||||||
"name": "dYdX v4",
|
|
||||||
"description": "dYdX v4 App",
|
|
||||||
"iconUrl": "/logos/dydx-x.png"
|
|
||||||
},
|
|
||||||
"v1": {
|
|
||||||
"bridgeUrl": "wss://api.stage.dydx.exchange/wc/"
|
|
||||||
},
|
|
||||||
"v2": {
|
|
||||||
"projectId": "47559b2ec96c09aed9ff2cb54a31ab0e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"walletSegue": {
|
|
||||||
"callbackUrl": "/walletsegue"
|
|
||||||
},
|
|
||||||
"images": "/wallets/",
|
|
||||||
"signTypedDataAction": "dYdX V4 Onboarding",
|
|
||||||
"signTypedDataDomainName": "dYdX V4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dydxprotocol-testnet-dydx": {
|
|
||||||
"name": "v4 Public Testnet/dYdX",
|
|
||||||
"ethereumChainId": "5",
|
|
||||||
"dydxChainId": "dydx-testnet-3",
|
|
||||||
"isMainNet": false,
|
|
||||||
"tokens": {
|
|
||||||
"chain": {
|
|
||||||
"name": "DYDX",
|
|
||||||
"denom": "dv4tnt",
|
|
||||||
"image": "/currencies/dydx.png"
|
|
||||||
},
|
|
||||||
"usdc": {
|
|
||||||
"name": "USDC",
|
|
||||||
"denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5",
|
|
||||||
"gasDenom": "uusdc",
|
|
||||||
"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",
|
|
||||||
"faucet": "https://faucet.v4testnet.dydx.exchange"
|
|
||||||
},
|
|
||||||
"links": {
|
|
||||||
"tos": "https://dydx.exchange/v4-terms",
|
|
||||||
"privacy": "https://dydx.exchange/privacy",
|
|
||||||
"statusPage": "https://status.v4testnet.dydx.exchange/",
|
|
||||||
"mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}",
|
|
||||||
"documentation": "https://v4-teacher.vercel.app/",
|
|
||||||
"community": "https://discord.com/invite/dydx",
|
|
||||||
"feedback": "https://docs.google.com/forms/d/e/1FAIpQLSezLsWCKvAYDEb7L-2O4wOON1T56xxro9A2Azvl6IxXHP_15Q/viewform",
|
|
||||||
"blogs": "https://www.dydx.foundation/blog"
|
|
||||||
},
|
|
||||||
"wallets": {
|
|
||||||
"walletconnect": {
|
|
||||||
"client": {
|
|
||||||
"name": "dYdX v4",
|
|
||||||
"description": "dYdX v4 App",
|
|
||||||
"iconUrl": "/logos/dydx-x.png"
|
|
||||||
},
|
|
||||||
"v1": {
|
|
||||||
"bridgeUrl": "wss://api.stage.dydx.exchange/wc/"
|
|
||||||
},
|
|
||||||
"v2": {
|
|
||||||
"projectId": "47559b2ec96c09aed9ff2cb54a31ab0e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"walletSegue": {
|
|
||||||
"callbackUrl": "/walletsegue"
|
|
||||||
},
|
|
||||||
"images": "/wallets/",
|
|
||||||
"signTypedDataAction": "dYdX V4 Onboarding",
|
|
||||||
"signTypedDataDomainName": "dYdX V4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dydxprotocol-testnet-dsrv": {
|
|
||||||
"name": "v4 Public Testnet/DSRV",
|
|
||||||
"ethereumChainId": "5",
|
|
||||||
"dydxChainId": "dydx-testnet-3",
|
|
||||||
"isMainNet": false,
|
|
||||||
"tokens": {
|
|
||||||
"chain": {
|
|
||||||
"name": "DYDX",
|
|
||||||
"denom": "dv4tnt",
|
|
||||||
"image": "/currencies/dydx.png"
|
|
||||||
},
|
|
||||||
"usdc": {
|
|
||||||
"name": "USDC",
|
|
||||||
"denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5",
|
|
||||||
"gasDenom": "uusdc",
|
|
||||||
"image": "/currencies/usdc.png"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"endpoints": {
|
|
||||||
"indexers": [
|
|
||||||
{
|
|
||||||
"api": "https://dydx-testnet.imperator.co",
|
|
||||||
"socket": "wss://dydx-testnet.imperator.co"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"validators": [
|
|
||||||
"https://dydx-testnet-archive.allthatnode.com:26657/XZvMM41hESf8PJrEQiTzbCOMVyFca79R"
|
|
||||||
],
|
|
||||||
"0xsquid": "https://testnet.api.squidrouter.com",
|
|
||||||
"faucet": "https://faucet.v4testnet.dydx.exchange"
|
|
||||||
},
|
|
||||||
"links": {
|
|
||||||
"tos": "https://dydx.exchange/v4-terms",
|
|
||||||
"privacy": "https://dydx.exchange/privacy",
|
|
||||||
"statusPage": "https://status.v4testnet.dydx.exchange/",
|
|
||||||
"mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}",
|
|
||||||
"documentation": "https://v4-teacher.vercel.app/",
|
|
||||||
"community": "https://discord.com/invite/dydx",
|
|
||||||
"feedback": "https://docs.google.com/forms/d/e/1FAIpQLSezLsWCKvAYDEb7L-2O4wOON1T56xxro9A2Azvl6IxXHP_15Q/viewform",
|
|
||||||
"blogs": "https://www.dydx.foundation/blog"
|
|
||||||
},
|
|
||||||
"wallets": {
|
|
||||||
"walletconnect": {
|
|
||||||
"client": {
|
|
||||||
"name": "dYdX v4",
|
|
||||||
"description": "dYdX v4 App",
|
|
||||||
"iconUrl": "/logos/dydx-x.png"
|
|
||||||
},
|
|
||||||
"v1": {
|
|
||||||
"bridgeUrl": "wss://api.stage.dydx.exchange/wc/"
|
|
||||||
},
|
|
||||||
"v2": {
|
|
||||||
"projectId": "47559b2ec96c09aed9ff2cb54a31ab0e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"walletSegue": {
|
|
||||||
"callbackUrl": "/walletsegue"
|
|
||||||
},
|
|
||||||
"images": "/wallets/",
|
|
||||||
"signTypedDataAction": "dYdX V4 Onboarding",
|
|
||||||
"signTypedDataDomainName": "dYdX V4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dydxprotocol-testnet-nodefleet": {
|
|
||||||
"name": "v4 Public Testnet/nodefleet",
|
|
||||||
"ethereumChainId": "5",
|
|
||||||
"dydxChainId": "dydx-testnet-3",
|
|
||||||
"isMainNet": false,
|
|
||||||
"tokens": {
|
|
||||||
"chain": {
|
|
||||||
"name": "DYDX",
|
|
||||||
"denom": "dv4tnt",
|
|
||||||
"image": "/currencies/dydx.png"
|
|
||||||
},
|
|
||||||
"usdc": {
|
|
||||||
"name": "USDC",
|
|
||||||
"denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5",
|
|
||||||
"gasDenom": "uusdc",
|
|
||||||
"image": "/currencies/usdc.png"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"endpoints": {
|
|
||||||
"indexers": [
|
|
||||||
{
|
|
||||||
"api": "https://dydx-testnet.imperator.co",
|
|
||||||
"socket": "wss://dydx-testnet.imperator.co"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"validators": [
|
|
||||||
"https://dydx-testnet.nodefleet.org"
|
|
||||||
],
|
|
||||||
"0xsquid": "https://testnet.api.squidrouter.com",
|
|
||||||
"faucet": "https://faucet.v4testnet.dydx.exchange"
|
|
||||||
},
|
|
||||||
"links": {
|
|
||||||
"tos": "https://dydx.exchange/v4-terms",
|
|
||||||
"privacy": "https://dydx.exchange/privacy",
|
|
||||||
"statusPage": "https://status.v4testnet.dydx.exchange/",
|
|
||||||
"mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}",
|
|
||||||
"documentation": "https://v4-teacher.vercel.app/",
|
|
||||||
"community": "https://discord.com/invite/dydx",
|
|
||||||
"feedback": "https://docs.google.com/forms/d/e/1FAIpQLSezLsWCKvAYDEb7L-2O4wOON1T56xxro9A2Azvl6IxXHP_15Q/viewform",
|
|
||||||
"blogs": "https://www.dydx.foundation/blog"
|
|
||||||
},
|
|
||||||
"wallets": {
|
|
||||||
"walletconnect": {
|
|
||||||
"client": {
|
|
||||||
"name": "dYdX v4",
|
|
||||||
"description": "dYdX v4 App",
|
|
||||||
"iconUrl": "/logos/dydx-x.png"
|
|
||||||
},
|
|
||||||
"v1": {
|
|
||||||
"bridgeUrl": "wss://api.stage.dydx.exchange/wc/"
|
|
||||||
},
|
|
||||||
"v2": {
|
|
||||||
"projectId": "47559b2ec96c09aed9ff2cb54a31ab0e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"walletSegue": {
|
|
||||||
"callbackUrl": "/walletsegue"
|
|
||||||
},
|
|
||||||
"images": "/wallets/",
|
|
||||||
"signTypedDataAction": "dYdX V4 Onboarding",
|
|
||||||
"signTypedDataDomainName": "dYdX V4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dydxprotocol-testnet-kingnodes": {
|
|
||||||
"name": "v4 Public Testnet/KingNodes",
|
|
||||||
"ethereumChainId": "5",
|
|
||||||
"dydxChainId": "dydx-testnet-3",
|
|
||||||
"isMainNet": false,
|
|
||||||
"tokens": {
|
|
||||||
"chain": {
|
|
||||||
"name": "DYDX",
|
|
||||||
"denom": "dv4tnt",
|
|
||||||
"image": "/currencies/dydx.png"
|
|
||||||
},
|
|
||||||
"usdc": {
|
|
||||||
"name": "USDC",
|
|
||||||
"denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5",
|
|
||||||
"gasDenom": "uusdc",
|
|
||||||
"image": "/currencies/usdc.png"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"endpoints": {
|
|
||||||
"indexers": [
|
|
||||||
{
|
|
||||||
"api": "https://dydx-testnet.imperator.co",
|
|
||||||
"socket": "wss://dydx-testnet.imperator.co"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"validators": [
|
|
||||||
"https://test-dydx.kingnodes.com"
|
|
||||||
],
|
|
||||||
"0xsquid": "https://testnet.api.squidrouter.com",
|
|
||||||
"faucet": "https://faucet.v4testnet.dydx.exchange"
|
|
||||||
},
|
|
||||||
"links": {
|
|
||||||
"tos": "https://dydx.exchange/v4-terms",
|
|
||||||
"privacy": "https://dydx.exchange/privacy",
|
|
||||||
"statusPage": "https://status.v4testnet.dydx.exchange/",
|
|
||||||
"mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}",
|
|
||||||
"documentation": "https://v4-teacher.vercel.app/",
|
|
||||||
"community": "https://discord.com/invite/dydx",
|
|
||||||
"feedback": "https://docs.google.com/forms/d/e/1FAIpQLSezLsWCKvAYDEb7L-2O4wOON1T56xxro9A2Azvl6IxXHP_15Q/viewform",
|
|
||||||
"blogs": "https://www.dydx.foundation/blog"
|
|
||||||
},
|
|
||||||
"wallets": {
|
|
||||||
"walletconnect": {
|
|
||||||
"client": {
|
|
||||||
"name": "dYdX v4",
|
|
||||||
"description": "dYdX v4 App",
|
|
||||||
"iconUrl": "/logos/dydx-x.png"
|
|
||||||
},
|
|
||||||
"v1": {
|
|
||||||
"bridgeUrl": "wss://api.stage.dydx.exchange/wc/"
|
|
||||||
},
|
|
||||||
"v2": {
|
|
||||||
"projectId": "47559b2ec96c09aed9ff2cb54a31ab0e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"walletSegue": {
|
|
||||||
"callbackUrl": "/walletsegue"
|
|
||||||
},
|
|
||||||
"images": "/wallets/",
|
|
||||||
"signTypedDataAction": "dYdX V4 Onboarding",
|
|
||||||
"signTypedDataDomainName": "dYdX V4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dydxprotocol-testnet-liquify": {
|
|
||||||
"name": "v4 Public Testnet/Liquify",
|
|
||||||
"ethereumChainId": "5",
|
|
||||||
"dydxChainId": "dydx-testnet-3",
|
|
||||||
"isMainNet": false,
|
|
||||||
"tokens": {
|
|
||||||
"chain": {
|
|
||||||
"name": "DYDX",
|
|
||||||
"denom": "dv4tnt",
|
|
||||||
"image": "/currencies/dydx.png"
|
|
||||||
},
|
|
||||||
"usdc": {
|
|
||||||
"name": "USDC",
|
|
||||||
"denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5",
|
|
||||||
"gasDenom": "uusdc",
|
|
||||||
"image": "/currencies/usdc.png"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"endpoints": {
|
|
||||||
"indexers": [
|
|
||||||
{
|
|
||||||
"api": "https://dydx-testnet.imperator.co",
|
|
||||||
"socket": "wss://dydx-testnet.imperator.co"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"validators": [
|
|
||||||
"https://dydx-rpc.liquify.com/api=8878132/dydx"
|
|
||||||
],
|
|
||||||
"0xsquid": "https://testnet.api.squidrouter.com",
|
|
||||||
"faucet": "https://faucet.v4testnet.dydx.exchange"
|
|
||||||
},
|
|
||||||
"links": {
|
|
||||||
"tos": "https://dydx.exchange/v4-terms",
|
|
||||||
"privacy": "https://dydx.exchange/privacy",
|
|
||||||
"statusPage": "https://status.v4testnet.dydx.exchange/",
|
|
||||||
"mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}",
|
|
||||||
"documentation": "https://v4-teacher.vercel.app/",
|
|
||||||
"community": "https://discord.com/invite/dydx",
|
|
||||||
"feedback": "https://docs.google.com/forms/d/e/1FAIpQLSezLsWCKvAYDEb7L-2O4wOON1T56xxro9A2Azvl6IxXHP_15Q/viewform",
|
|
||||||
"blogs": "https://www.dydx.foundation/blog"
|
|
||||||
},
|
|
||||||
"wallets": {
|
|
||||||
"walletconnect": {
|
|
||||||
"client": {
|
|
||||||
"name": "dYdX v4",
|
|
||||||
"description": "dYdX v4 App",
|
|
||||||
"iconUrl": "/logos/dydx-x.png"
|
|
||||||
},
|
|
||||||
"v1": {
|
|
||||||
"bridgeUrl": "wss://api.stage.dydx.exchange/wc/"
|
|
||||||
},
|
|
||||||
"v2": {
|
|
||||||
"projectId": "47559b2ec96c09aed9ff2cb54a31ab0e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"walletSegue": {
|
|
||||||
"callbackUrl": "/walletsegue"
|
|
||||||
},
|
|
||||||
"images": "/wallets/",
|
|
||||||
"signTypedDataAction": "dYdX V4 Onboarding",
|
|
||||||
"signTypedDataDomainName": "dYdX V4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dydxprotocol-mainet": {
|
|
||||||
"name": "v4",
|
|
||||||
"ethereumChainId": "1",
|
|
||||||
"dydxChainId": "[mainnet chain id]",
|
|
||||||
"isMainNet": true,
|
|
||||||
"tokens": {
|
|
||||||
"comment": "Change according to mainnet release",
|
|
||||||
"chain": {
|
|
||||||
"name": "DYDX",
|
|
||||||
"denom": "dv4tnt",
|
|
||||||
"image": "/currencies/dydx.png"
|
|
||||||
},
|
|
||||||
"usdc": {
|
|
||||||
"name": "USDC",
|
|
||||||
"denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5",
|
|
||||||
"gasDenom": "uusdc",
|
|
||||||
"image": "/currencies/usdc.png"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"endpoints": {
|
|
||||||
"indexers": [
|
|
||||||
{
|
|
||||||
"api": "[REST endpoint]",
|
|
||||||
"socket": "[Websocket endpoint]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"validators": [
|
|
||||||
"[Validator endpoint 1",
|
|
||||||
"[Validator endpoint n]"
|
|
||||||
],
|
|
||||||
"0xsquid": "[0xSquid endpoint for mainnet]"
|
|
||||||
},
|
|
||||||
"links": {
|
|
||||||
"tos": "[HTTP link to TOS]",
|
|
||||||
"privacy": "[HTTP link to Privacy Policy]",
|
|
||||||
"mintscan": "[HTTP link to Mintscan, with {tx_hash} placeholder]",
|
|
||||||
"documentation": "[HTTP link to documentation, can be null]",
|
|
||||||
"community": "[HTTP link to community, can be null]",
|
|
||||||
"feedback": "[HTTP link to feedback form, can be null]",
|
|
||||||
"blogs": "[HTTP link to blogs, can be null]"
|
|
||||||
},
|
|
||||||
"wallets": {
|
|
||||||
"walletconnect": {
|
|
||||||
"client": {
|
|
||||||
"name": "[Name of the app]",
|
|
||||||
"description": "[Description of the app]",
|
|
||||||
"iconUrl": "[Relative URL of the icon URL]"
|
|
||||||
},
|
|
||||||
"v1": {
|
|
||||||
"bridgeUrl": "[Bridge 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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,454 +0,0 @@
|
|||||||
{
|
|
||||||
"1INCH-USD":{
|
|
||||||
"name":"1inch",
|
|
||||||
"tags":[
|
|
||||||
"Defi"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://1inch.io/",
|
|
||||||
"whitepaperLink":"https://github.com/1inch",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/1inch/"
|
|
||||||
},
|
|
||||||
"AAVE-USD":{
|
|
||||||
"name":"Aave",
|
|
||||||
"tags":[
|
|
||||||
"Defi"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://aave.com/",
|
|
||||||
"whitepaperLink":"https://github.com/aave/protocol-v2/blob/master/aave-v2-whitepaper.pdf",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/aave/"
|
|
||||||
},
|
|
||||||
"ADA-USD":{
|
|
||||||
"name":"Cardano",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://cardano.org/",
|
|
||||||
"whitepaperLink":"https://why.cardano.org/en/introduction/motivation/",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/cardano/"
|
|
||||||
},
|
|
||||||
"ALGO-USD":{
|
|
||||||
"name":"Algorand",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://algorand.com/",
|
|
||||||
"whitepaperLink":"https://algorand.com/technology/white-papers",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/algorand/"
|
|
||||||
},
|
|
||||||
"APE-USD":{
|
|
||||||
"name":"ApeCoin",
|
|
||||||
"tags":[
|
|
||||||
|
|
||||||
],
|
|
||||||
"websiteLink":"https://apecoin.com/",
|
|
||||||
"whitepaperLink":"https://apecoin.com/about",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/apecoin-ape/"
|
|
||||||
},
|
|
||||||
"APT-USD":{
|
|
||||||
"name":"Aptos",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://aptoslabs.com/",
|
|
||||||
"whitepaperLink":"https://aptos.dev/aptos-white-paper/",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/aptos/"
|
|
||||||
},
|
|
||||||
"ARB-USD":{
|
|
||||||
"name":"Arbitrum",
|
|
||||||
"tags":[
|
|
||||||
|
|
||||||
],
|
|
||||||
"websiteLink":"https://arbitrum.io/",
|
|
||||||
"whitepaperLink":"https://github.com/OffchainLabs/nitro",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/arbitrum/"
|
|
||||||
},
|
|
||||||
"ATOM-USD":{
|
|
||||||
"name":"Cosmos",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://cosmos.network/",
|
|
||||||
"whitepaperLink":"https://v1.cosmos.network/resources/whitepaper",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/cosmos/"
|
|
||||||
},
|
|
||||||
"AVAX-USD":{
|
|
||||||
"name":"Avalanche",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://www.avalabs.org/",
|
|
||||||
"whitepaperLink":"https://assets.website-files.com/5d80307810123f5ffbb34d6e/6008d7bbf8b10d1eb01e7e16_Avalanche%20Platform%20Whitepaper.pdf",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/avalanche/"
|
|
||||||
},
|
|
||||||
"BCH-USD":{
|
|
||||||
"name":"Bitcoin Cash",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://bitcoincash.org/",
|
|
||||||
"whitepaperLink":"https://bitcoincash.org/",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/bitcoin-cash/"
|
|
||||||
},
|
|
||||||
"BLUR-USD":{
|
|
||||||
"name":"Blur",
|
|
||||||
"tags":[
|
|
||||||
|
|
||||||
],
|
|
||||||
"websiteLink":"https://blur.io/",
|
|
||||||
"whitepaperLink":"https://docs.blur.foundation/",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/blur-token/"
|
|
||||||
},
|
|
||||||
"CELO-USD":{
|
|
||||||
"name":"Celo",
|
|
||||||
"tags":[
|
|
||||||
|
|
||||||
],
|
|
||||||
"websiteLink":"https://celo.org",
|
|
||||||
"whitepaperLink":"https://docs.celo.org",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/celo/"
|
|
||||||
},
|
|
||||||
"BTC-USD":{
|
|
||||||
"name":"Bitcoin",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://bitcoin.org/",
|
|
||||||
"whitepaperLink":"https://bitcoin.org/bitcoin.pdf",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/bitcoin/"
|
|
||||||
},
|
|
||||||
"COMP-USD":{
|
|
||||||
"name":"Compound",
|
|
||||||
"tags":[
|
|
||||||
"Defi"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://compound.finance/",
|
|
||||||
"whitepaperLink":"https://compound.finance/documents/Compound.Whitepaper.pdf",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/compound/"
|
|
||||||
},
|
|
||||||
"CRV-USD":{
|
|
||||||
"name":"Curve",
|
|
||||||
"tags":[
|
|
||||||
"Governance"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://curve.fi/",
|
|
||||||
"whitepaperLink":"https://curve.fi/whitepaper",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/curve-dao-token/"
|
|
||||||
},
|
|
||||||
"DOGE-USD":{
|
|
||||||
"name":"Dogecoin",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://dogecoin.com/",
|
|
||||||
"whitepaperLink":"https://github.com/dogecoin/dogecoin",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/dogecoin/"
|
|
||||||
},
|
|
||||||
"DOT-USD":{
|
|
||||||
"name":"Polkadot",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://polkadot.network/",
|
|
||||||
"whitepaperLink":"https://polkadot.network/PolkaDotPaper.pdf",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/polkadot-new/"
|
|
||||||
},
|
|
||||||
"ENJ-USD":{
|
|
||||||
"name":"Enjin",
|
|
||||||
"tags":[
|
|
||||||
|
|
||||||
],
|
|
||||||
"websiteLink":"https://enjin.io/",
|
|
||||||
"whitepaperLink":"https://cdn.enjin.io/downloads/whitepapers/enjin-coin/en.pdf/",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/enjin-coin/"
|
|
||||||
},
|
|
||||||
"EOS-USD":{
|
|
||||||
"name":"EOS",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://eos.io/",
|
|
||||||
"whitepaperLink":"https://github.com/EOSIO/Documentation/blob/master/TechnicalWhitePaper.md",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/eos/"
|
|
||||||
},
|
|
||||||
"ETC-USD":{
|
|
||||||
"name":"Ethereum Classic",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://ethereumclassic.org/",
|
|
||||||
"whitepaperLink":"https://ethereumclassic.org/why-classic",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/ethereum-classic/"
|
|
||||||
},
|
|
||||||
"ETH-USD":{
|
|
||||||
"name":"Ethereum",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://ethereum.org/",
|
|
||||||
"whitepaperLink":"https://ethereum.org/whitepaper/",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/ethereum/",
|
|
||||||
"displayStepSize":"0.001",
|
|
||||||
"displayTickSize":"0.1"
|
|
||||||
},
|
|
||||||
"FIL-USD":{
|
|
||||||
"name":"Filecoin",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://filecoin.io/",
|
|
||||||
"whitepaperLink":"https://filecoin.io/filecoin.pdf",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/filecoin/"
|
|
||||||
},
|
|
||||||
"HNT-USD":{
|
|
||||||
"name":"Helium",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://www.helium.com",
|
|
||||||
"whitepaperLink":"http://whitepaper.helium.com",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/helium/"
|
|
||||||
},
|
|
||||||
"ICP-USD":{
|
|
||||||
"name":"Internet Computer",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://dfinity.org",
|
|
||||||
"whitepaperLink":"https://dfinity.org/whitepaper.pdf",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/internet-computer/"
|
|
||||||
},
|
|
||||||
"LDO-USD":{
|
|
||||||
"name":"Lido DAO",
|
|
||||||
"tags":[
|
|
||||||
"Defi"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://lido.fi/",
|
|
||||||
"whitepaperLink":"https://lido.fi/static/Lido:Ethereum-Liquid-Staking.pdf",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/lido-dao/"
|
|
||||||
},
|
|
||||||
"LINK-USD":{
|
|
||||||
"name":"Chainlink",
|
|
||||||
"tags":[
|
|
||||||
"Defi"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://chain.link/",
|
|
||||||
"whitepaperLink":"https://link.smartcontract.com/whitepaper",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/chainlink/"
|
|
||||||
},
|
|
||||||
"LTC-USD":{
|
|
||||||
"name":"Litecoin",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://litecoin.org/",
|
|
||||||
"whitepaperLink":"https://litecoin.info/index.php/Main_Page",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/litecoin/"
|
|
||||||
},
|
|
||||||
"MATIC-USD":{
|
|
||||||
"name":"Polygon",
|
|
||||||
"tags":[
|
|
||||||
"Layer 2"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://polygon.technology/",
|
|
||||||
"whitepaperLink":"https://polygon.technology/lightpaper-polygon.pdf",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/polygon/"
|
|
||||||
},
|
|
||||||
"MKR-USD":{
|
|
||||||
"name":"Maker",
|
|
||||||
"tags":[
|
|
||||||
"Governance"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://makerdao.com",
|
|
||||||
"whitepaperLink":"https://makerdao.com/whitepaper",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/maker/"
|
|
||||||
},
|
|
||||||
"NEAR-USD":{
|
|
||||||
"name":"NEAR Protocol",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://near.org",
|
|
||||||
"whitepaperLink":"https://near.org/papers/the-official-near-white-paper/",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/near-protocol/"
|
|
||||||
},
|
|
||||||
"OP-USD":{
|
|
||||||
"name":"Optimism",
|
|
||||||
"tags":[
|
|
||||||
|
|
||||||
],
|
|
||||||
"websiteLink":"https://www.optimism.io/",
|
|
||||||
"whitepaperLink":"https://github.com/ethereum-optimism",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/optimism-ethereum/"
|
|
||||||
},
|
|
||||||
"PEPE-USD":{
|
|
||||||
"name":"Pepe",
|
|
||||||
"tags":[
|
|
||||||
|
|
||||||
],
|
|
||||||
"websiteLink":"https://www.pepe.vip/",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/pepe/"
|
|
||||||
},
|
|
||||||
"RUNE-USD":{
|
|
||||||
"name":"THORChain",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://thorchain.org",
|
|
||||||
"whitepaperLink":"https://whitepaper.io/document/709/thorchain-whitepaper",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/thorchain/"
|
|
||||||
},
|
|
||||||
"SEI-USD":{
|
|
||||||
"name":"Sei",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1",
|
|
||||||
"Defi"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://www.sei.io/",
|
|
||||||
"whitepaperLink":"https://github.com/sei-protocol/sei-chain/blob/3c9576fee3494ce039df684624f918dd8066ba3f/whitepaper/Sei_Whitepaper.pdf",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/sei/"
|
|
||||||
},
|
|
||||||
"SHIB-USD":{
|
|
||||||
"name":"Shiba Inu",
|
|
||||||
"tags":[
|
|
||||||
|
|
||||||
],
|
|
||||||
"websiteLink":"https://shibatoken.com/",
|
|
||||||
"whitepaperLink":"https://docs.shibatoken.com/",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/shiba-inu/"
|
|
||||||
},
|
|
||||||
"SNX-USD":{
|
|
||||||
"name":"Synthetix",
|
|
||||||
"tags":[
|
|
||||||
"Defi"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://synthetix.io/",
|
|
||||||
"whitepaperLink":"https://docs.synthetix.io/litepaper",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/synthetix-network-token/"
|
|
||||||
},
|
|
||||||
"SOL-USD":{
|
|
||||||
"name":"Solana",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://solana.com/",
|
|
||||||
"whitepaperLink":"https://solana.com/solana-whitepaper.pdf",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/solana/"
|
|
||||||
},
|
|
||||||
"SUI-USD":{
|
|
||||||
"name":"Sui",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://sui.io/",
|
|
||||||
"whitepaperLink":"https://github.com/MystenLabs",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/sui/"
|
|
||||||
},
|
|
||||||
"SUSHI-USD":{
|
|
||||||
"name":"Sushi",
|
|
||||||
"tags":[
|
|
||||||
"Defi"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://sushi.com/",
|
|
||||||
"whitepaperLink":"https://docs.sushi.com/",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/sushiswap/"
|
|
||||||
},
|
|
||||||
"TRX-USD":{
|
|
||||||
"name":"TRON",
|
|
||||||
"tags":[
|
|
||||||
"Defi"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://tron.network/",
|
|
||||||
"whitepaperLink":"https://tron.network/static/doc/white_paper_v_2_0.pdf",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/tron/"
|
|
||||||
},
|
|
||||||
"UMA-USD":{
|
|
||||||
"name":"UMA",
|
|
||||||
"tags":[
|
|
||||||
"Defi"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://umaproject.org/",
|
|
||||||
"whitepaperLink":"https://github.com/UMAprotocol/whitepaper",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/uma/"
|
|
||||||
},
|
|
||||||
"UNI-USD":{
|
|
||||||
"name":"Uniswap",
|
|
||||||
"tags":[
|
|
||||||
"Defi"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://uniswap.org/",
|
|
||||||
"whitepaperLink":"https://uniswap.org/whitepaper-v3.pdf",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/uniswap/"
|
|
||||||
},
|
|
||||||
"WLD-USD":{
|
|
||||||
"name":"Worldcoin",
|
|
||||||
"tags":[
|
|
||||||
|
|
||||||
],
|
|
||||||
"websiteLink":"https://worldcoin.org/",
|
|
||||||
"whitepaperLink":"https://whitepaper.worldcoin.org/",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/worldcoin-org/"
|
|
||||||
},
|
|
||||||
"XLM-USD":{
|
|
||||||
"name":"Stellar",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://www.stellar.org/",
|
|
||||||
"whitepaperLink":"https://www.stellar.org/papers/stellar-consensus-protocol",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/stellar/"
|
|
||||||
},
|
|
||||||
"XMR-USD":{
|
|
||||||
"name":"Monero",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://www.getmonero.org/",
|
|
||||||
"whitepaperLink":"https://www.getmonero.org/resources/research-lab/",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/monero/"
|
|
||||||
},
|
|
||||||
"XRP-USD":{
|
|
||||||
"name":"Ripple",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://ripple.com/currency/",
|
|
||||||
"whitepaperLink":"https://github.com/ripple",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/xrp/"
|
|
||||||
},
|
|
||||||
"XTZ-USD":{
|
|
||||||
"name":"Tezos",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://tezos.com",
|
|
||||||
"whitepaperLink":"https://tezos.com/whitepaper.pdf",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/tezos/"
|
|
||||||
},
|
|
||||||
"YFI-USD":{
|
|
||||||
"name":"Yearn",
|
|
||||||
"tags":[
|
|
||||||
"Defi"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://yearn.finance/",
|
|
||||||
"whitepaperLink":"https://docs.yearn.finance/",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/yearn-finance/"
|
|
||||||
},
|
|
||||||
"ZEC-USD":{
|
|
||||||
"name":"Zcash",
|
|
||||||
"tags":[
|
|
||||||
"Layer 1"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://z.cash/",
|
|
||||||
"whitepaperLink":"https://z.cash/technology/",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/zcash/"
|
|
||||||
},
|
|
||||||
"ZRX-USD":{
|
|
||||||
"name":"0x",
|
|
||||||
"tags":[
|
|
||||||
"Defi"
|
|
||||||
],
|
|
||||||
"websiteLink":"https://0x.org/",
|
|
||||||
"whitepaperLink":"https://0x.org/pdfs/0x_white_paper.pdf",
|
|
||||||
"coinMarketCapsLink":"https://coinmarketcap.com/currencies/0x/"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,474 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"id":"c57ca95b47569778a828d19178114f4db188b89b763c899ba0be274e97267d96",
|
|
||||||
"name":"MetaMask",
|
|
||||||
"description":"",
|
|
||||||
"homepage":"https://metamask.io/",
|
|
||||||
"chains":[
|
|
||||||
"eip155:1",
|
|
||||||
"eip155:42161",
|
|
||||||
"eip155:43114"
|
|
||||||
],
|
|
||||||
"versions":[
|
|
||||||
"1"
|
|
||||||
],
|
|
||||||
"app":{
|
|
||||||
"browser":"",
|
|
||||||
"ios":"https://apps.apple.com/us/app/metamask/id1438144202",
|
|
||||||
"android":"https://play.google.com/store/apps/details?id=io.metamask",
|
|
||||||
"mac":"",
|
|
||||||
"windows":"",
|
|
||||||
"linux":""
|
|
||||||
},
|
|
||||||
"mobile":{
|
|
||||||
"native":"metamask:",
|
|
||||||
"universal":"https://metamask.app.link"
|
|
||||||
},
|
|
||||||
"desktop":{
|
|
||||||
"native":"",
|
|
||||||
"universal":""
|
|
||||||
},
|
|
||||||
"metadata":{
|
|
||||||
"shortName":"MetaMask",
|
|
||||||
"colors":{
|
|
||||||
"primary":"rgb(255, 255, 255)",
|
|
||||||
"secondary":""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config":{
|
|
||||||
"comment":"MetaMask",
|
|
||||||
"iosMinVersion":"0",
|
|
||||||
"imageUrl":"https://v4.testnet.dydx.exchange/wallets/metamask.png",
|
|
||||||
"image":"metamask.png",
|
|
||||||
"encoding":"=\"#%/<>?@\\^`{|}:&",
|
|
||||||
"connections":[
|
|
||||||
{
|
|
||||||
"type":"walletConnectV2",
|
|
||||||
"native":"metamask:",
|
|
||||||
"universal":"https://metamask.app.link"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"userFields":{
|
|
||||||
"analyticEvent":"METAMASK"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id":"coinbase-wallet",
|
|
||||||
"name":"Coinbase Wallet",
|
|
||||||
"description":"",
|
|
||||||
"homepage":"https://www.coinbase.com/wallet",
|
|
||||||
"chains":[
|
|
||||||
"eip155:1"
|
|
||||||
],
|
|
||||||
"versions":[
|
|
||||||
"1"
|
|
||||||
],
|
|
||||||
"app":{
|
|
||||||
"browser":"",
|
|
||||||
"ios":"https://apps.apple.com/us/app/coinbase-wallet-nfts-crypto/id1278383455",
|
|
||||||
"android":"https://play.google.com/store/apps/details?id=org.toshi",
|
|
||||||
"mac":"",
|
|
||||||
"windows":"",
|
|
||||||
"linux":""
|
|
||||||
},
|
|
||||||
"mobile":{
|
|
||||||
"native":"cbwallet:",
|
|
||||||
"universal":""
|
|
||||||
},
|
|
||||||
"desktop":{
|
|
||||||
"native":"",
|
|
||||||
"universal":""
|
|
||||||
},
|
|
||||||
"metadata":{
|
|
||||||
"shortName":"Coinbase",
|
|
||||||
"colors":{
|
|
||||||
"primary":"rgb(255, 255, 255)",
|
|
||||||
"secondary":""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config":{
|
|
||||||
"comment":"Coinbase",
|
|
||||||
"iosMinVersion":"1.8.0",
|
|
||||||
"imageUrl":"https://v4.testnet.dydx.exchange/wallets/coinbase-wallet.png",
|
|
||||||
"image":"coinbase-wallet.png",
|
|
||||||
"encoding":"=\"#%/<>?@\\^`{|}:&",
|
|
||||||
"connections":[
|
|
||||||
{
|
|
||||||
"type":"walletSegue",
|
|
||||||
"native":"cbwallet:",
|
|
||||||
"universal":""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"userFields":{
|
|
||||||
"analyticEvent":"COINBASE_WALLET"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id":"9d373b43ad4d2cf190fb1a774ec964a1addf406d6fd24af94ab7596e58c291b2",
|
|
||||||
"name":"imToken",
|
|
||||||
"description":"",
|
|
||||||
"homepage":"https://token.im/",
|
|
||||||
"chains":[
|
|
||||||
"eip155:1"
|
|
||||||
],
|
|
||||||
"versions":[
|
|
||||||
"1"
|
|
||||||
],
|
|
||||||
"app":{
|
|
||||||
"browser":"",
|
|
||||||
"ios":"https://itunes.apple.com/us/app/imtoken2/id1384798940",
|
|
||||||
"android":"https://play.google.com/store/apps/details?id=im.token.app",
|
|
||||||
"mac":"",
|
|
||||||
"windows":"",
|
|
||||||
"linux":""
|
|
||||||
},
|
|
||||||
"mobile":{
|
|
||||||
"native":"imtokenv2:",
|
|
||||||
"universal":""
|
|
||||||
},
|
|
||||||
"desktop":{
|
|
||||||
"native":"",
|
|
||||||
"universal":""
|
|
||||||
},
|
|
||||||
"metadata":{
|
|
||||||
"shortName":"imToken",
|
|
||||||
"colors":{
|
|
||||||
"primary":"rgb(255, 255, 255)",
|
|
||||||
"secondary":""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config":{
|
|
||||||
"comment":"imToken",
|
|
||||||
"iosMinVersion":"0",
|
|
||||||
"imageUrl":"https://v4.testnet.dydx.exchange/wallets/imtoken.png",
|
|
||||||
"image":"imtoken.png",
|
|
||||||
"connections":[
|
|
||||||
{
|
|
||||||
"type":"walletConnect",
|
|
||||||
"native":"imtokenv2:",
|
|
||||||
"universal":""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"userFields":{
|
|
||||||
"analyticEvent":"IMTOKEN"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id":"4622a2b2d6af1c9844944291e5e7351a6aa24cd7b23099efac1b2fd875da31a0",
|
|
||||||
"name":"Trust Wallet",
|
|
||||||
"description":"",
|
|
||||||
"homepage":"https://trustwallet.com/",
|
|
||||||
"chains":[
|
|
||||||
"eip155:1",
|
|
||||||
"eip155:42161",
|
|
||||||
"eip155:43114"
|
|
||||||
],
|
|
||||||
"versions":[
|
|
||||||
"1"
|
|
||||||
],
|
|
||||||
"app":{
|
|
||||||
"browser":"",
|
|
||||||
"ios":"https://apps.apple.com/app/apple-store/id1288339409",
|
|
||||||
"android":"https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp",
|
|
||||||
"mac":"",
|
|
||||||
"windows":"",
|
|
||||||
"linux":""
|
|
||||||
},
|
|
||||||
"mobile":{
|
|
||||||
"native":"trust:",
|
|
||||||
"universal":"https://link.trustwallet.com"
|
|
||||||
},
|
|
||||||
"desktop":{
|
|
||||||
"native":"",
|
|
||||||
"universal":""
|
|
||||||
},
|
|
||||||
"metadata":{
|
|
||||||
"shortName":"Trust",
|
|
||||||
"colors":{
|
|
||||||
"primary":"rgb(51, 117, 187)",
|
|
||||||
"secondary":""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config":{
|
|
||||||
"comment":"Trust Wallet",
|
|
||||||
"iosMinVersion":"0",
|
|
||||||
"encoding":"=\"#%/<>?@\\^`{|}:&",
|
|
||||||
"imageUrl":"https://v4.testnet.dydx.exchange/wallets/trust-wallet.png",
|
|
||||||
"image":"trust-wallet.png",
|
|
||||||
"connections":[
|
|
||||||
{
|
|
||||||
"type":"walletConnectV2",
|
|
||||||
"native":"trust:",
|
|
||||||
"universal":"https://link.trustwallet.com"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"userFields":{
|
|
||||||
"analyticEvent":"TRUST_WALLET"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id":"Zerion",
|
|
||||||
"name":"Zerion",
|
|
||||||
"description":"",
|
|
||||||
"homepage":"https://zerion.io/",
|
|
||||||
"chains":[
|
|
||||||
"eip155:1"
|
|
||||||
],
|
|
||||||
"versions":[
|
|
||||||
"1"
|
|
||||||
],
|
|
||||||
"app":{
|
|
||||||
"browser":"",
|
|
||||||
"ios":"https://apps.apple.com/app/apple-store/id1456732565",
|
|
||||||
"android":"https://play.google.com/store/apps/details?id=io.zerion.android",
|
|
||||||
"mac":"",
|
|
||||||
"windows":"",
|
|
||||||
"linux":""
|
|
||||||
},
|
|
||||||
"mobile":{
|
|
||||||
"native":"zerion:",
|
|
||||||
"universal":""
|
|
||||||
},
|
|
||||||
"desktop":{
|
|
||||||
"native":"",
|
|
||||||
"universal":""
|
|
||||||
},
|
|
||||||
"metadata":{
|
|
||||||
"shortName":"Zerion",
|
|
||||||
"colors":{
|
|
||||||
"primary":"rgb(51, 117, 187)",
|
|
||||||
"secondary":""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config":{
|
|
||||||
"comment":"Zerion Wallet",
|
|
||||||
"iosMinVersion":"0",
|
|
||||||
"encoding":"=\"#%/<>?@\\^`{|}:&",
|
|
||||||
"imageUrl":"https://v4.testnet.dydx.exchange/wallets/zerion.png",
|
|
||||||
"image":"zerion.png",
|
|
||||||
"connections":[
|
|
||||||
{
|
|
||||||
"type":"walletConnectV2",
|
|
||||||
"native":"zerion:",
|
|
||||||
"universal":""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"userFields":{
|
|
||||||
"analyticEvent":"ZERION"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id":"20459438007b75f4f4acb98bf29aa3b800550309646d375da5fd4aac6c2a2c66",
|
|
||||||
"name":"TokenPocket",
|
|
||||||
"description":"",
|
|
||||||
"homepage":"https://tokenpocket.pro/",
|
|
||||||
"chains":[
|
|
||||||
"eip155:1"
|
|
||||||
],
|
|
||||||
"versions":[
|
|
||||||
"1"
|
|
||||||
],
|
|
||||||
"app":{
|
|
||||||
"browser":"",
|
|
||||||
"ios":"https://apps.apple.com/us/app/tokenpocket-trusted-wallet/id1436028697",
|
|
||||||
"android":"https://play.google.com/store/apps/details?id=vip.mytokenpocket",
|
|
||||||
"mac":"",
|
|
||||||
"windows":"",
|
|
||||||
"linux":""
|
|
||||||
},
|
|
||||||
"mobile":{
|
|
||||||
"native":"tpoutside:",
|
|
||||||
"universal":""
|
|
||||||
},
|
|
||||||
"desktop":{
|
|
||||||
"native":"",
|
|
||||||
"universal":""
|
|
||||||
},
|
|
||||||
"metadata":{
|
|
||||||
"shortName":"TokenPocket",
|
|
||||||
"colors":{
|
|
||||||
"primary":"rgb(41, 128, 254)",
|
|
||||||
"secondary":""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config":{
|
|
||||||
"comment":"TokenPocket",
|
|
||||||
"iosMinVersion":"0",
|
|
||||||
"imageUrl":"https://v4.testnet.dydx.exchange/wallets/tokenpocket.png",
|
|
||||||
"image":"tokenpocket.png",
|
|
||||||
"connections":[
|
|
||||||
{
|
|
||||||
"type":"walletConnect",
|
|
||||||
"native":"tpoutside:",
|
|
||||||
"universal":""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"userFields":{
|
|
||||||
"analyticEvent":"TOKEN_POCKET"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id":"1ae92b26df02f0abca6304df07debccd18262fdf5fe82daa81593582dac9a369",
|
|
||||||
"name":"Rainbow",
|
|
||||||
"description":"",
|
|
||||||
"homepage":"https://rainbow.me/",
|
|
||||||
"chains":[
|
|
||||||
"eip155:1"
|
|
||||||
],
|
|
||||||
"versions":[
|
|
||||||
"1"
|
|
||||||
],
|
|
||||||
"app":{
|
|
||||||
"browser":"",
|
|
||||||
"ios":"https://apps.apple.com/us/app/rainbow-ethereum-wallet/id1457119021",
|
|
||||||
"android":"",
|
|
||||||
"mac":"",
|
|
||||||
"windows":"",
|
|
||||||
"linux":""
|
|
||||||
},
|
|
||||||
"mobile":{
|
|
||||||
"native":"rainbow:",
|
|
||||||
"universal":"https://rnbwapp.com"
|
|
||||||
},
|
|
||||||
"desktop":{
|
|
||||||
"native":"",
|
|
||||||
"universal":""
|
|
||||||
},
|
|
||||||
"metadata":{
|
|
||||||
"shortName":"Rainbow",
|
|
||||||
"colors":{
|
|
||||||
"primary":"rgb(0, 30, 89)",
|
|
||||||
"secondary":""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config":{
|
|
||||||
"comment":"Rainbow",
|
|
||||||
"iosMinVersion":"0",
|
|
||||||
"encoding":"=\"#%/<>?@\\^`{|}:&",
|
|
||||||
"backlinked":true,
|
|
||||||
"imageUrl":"https://v4.testnet.dydx.exchange/wallets/rainbow-wallet.png",
|
|
||||||
"image":"rainbow-wallet.png",
|
|
||||||
"connections":[
|
|
||||||
{
|
|
||||||
"type":"walletConnectV2",
|
|
||||||
"native":"rainbow:",
|
|
||||||
"universal":"https://rnbwapp.com"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"userFields":{
|
|
||||||
"analyticEvent":"RAINBOW_WALLET"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id":"09102e7bbbd3f92001eda104abe23803181629f695e8f1b95af96d88ff7d5890",
|
|
||||||
"name":"1inch Wallet",
|
|
||||||
"description":"",
|
|
||||||
"homepage":"https://1inch.io/wallet/",
|
|
||||||
"chains":[
|
|
||||||
"eip155:1",
|
|
||||||
"eip155:56"
|
|
||||||
],
|
|
||||||
"versions":[
|
|
||||||
"1"
|
|
||||||
],
|
|
||||||
"app":{
|
|
||||||
"browser":"",
|
|
||||||
"ios":"https://apps.apple.com/us/app/1inch-defi-wallet/id1546049391",
|
|
||||||
"android":"",
|
|
||||||
"mac":"",
|
|
||||||
"windows":"",
|
|
||||||
"linux":""
|
|
||||||
},
|
|
||||||
"mobile":{
|
|
||||||
"native":"oneinch:",
|
|
||||||
"universal":"https://wallet.1inch.io"
|
|
||||||
},
|
|
||||||
"desktop":{
|
|
||||||
"native":"",
|
|
||||||
"universal":""
|
|
||||||
},
|
|
||||||
"metadata":{
|
|
||||||
"shortName":"1inch",
|
|
||||||
"colors":{
|
|
||||||
"primary":"rgb(31, 36, 46)",
|
|
||||||
"secondary":""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config":{
|
|
||||||
"comment":"1inch",
|
|
||||||
"iosMinVersion":"0",
|
|
||||||
"encoding":"=\"#%/<>?@\\^`{|}:&",
|
|
||||||
"imageUrl":"https://v4.testnet.dydx.exchange/wallets/1inch.png",
|
|
||||||
"image":"1inch.png",
|
|
||||||
"connections":[
|
|
||||||
{
|
|
||||||
"type":"walletConnect",
|
|
||||||
"native":"oneinch:",
|
|
||||||
"universal":"https://wallet.1inch.io"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"userFields":{
|
|
||||||
"analyticEvent":"1INCH"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id":"bae74827272509a6d63ea25514d9c68ad235c14e45e183518c7ded4572a1b0c4",
|
|
||||||
"name":"Huobi Wallet",
|
|
||||||
"description":"",
|
|
||||||
"homepage":"https://huobiwallet.com/",
|
|
||||||
"chains":[
|
|
||||||
"eip155:1"
|
|
||||||
],
|
|
||||||
"versions":[
|
|
||||||
"1"
|
|
||||||
],
|
|
||||||
"app":{
|
|
||||||
"browser":"",
|
|
||||||
"ios":"https://apps.apple.com/us/app/id1433883012",
|
|
||||||
"android":"https://play.google.com/store/apps/details?id=com.huobionchainwallet.gp",
|
|
||||||
"mac":"",
|
|
||||||
"windows":"",
|
|
||||||
"linux":""
|
|
||||||
},
|
|
||||||
"mobile":{
|
|
||||||
"native":"huobiwallet:",
|
|
||||||
"universal":""
|
|
||||||
},
|
|
||||||
"desktop":{
|
|
||||||
"native":"",
|
|
||||||
"universal":""
|
|
||||||
},
|
|
||||||
"metadata":{
|
|
||||||
"shortName":"Huobi",
|
|
||||||
"colors":{
|
|
||||||
"primary":"rgb(45,101,248)",
|
|
||||||
"secondary":""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config":{
|
|
||||||
"comment":"Huobi",
|
|
||||||
"iosMinVersion":"0",
|
|
||||||
"encoding":"=\"#%/<>?@\\^`{|}:&",
|
|
||||||
"imageUrl":"https://v4.testnet.dydx.exchange/wallets/huobi-wallet.png",
|
|
||||||
"image":"huobi-wallet.png",
|
|
||||||
"connections":[
|
|
||||||
{
|
|
||||||
"type":"walletConnect",
|
|
||||||
"native":"huobiwallet:",
|
|
||||||
"universal":""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"userFields":{
|
|
||||||
"analyticEvent":"HUOBI_WALLET"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.8 KiB |
@@ -1,19 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
source="dist/.well-known/apple-app-site-association"
|
|
||||||
if [ ! -f "$source" ]; then
|
|
||||||
echo "Error: $source file not found"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
app_id=$IOS_APP_ID
|
|
||||||
if [ -z "$app_id" ]; then
|
|
||||||
echo "Error: IOS_APP_ID is empty"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
||||||
sed -i '' "s/{PLACE_YOUR_APP_ID_HERE}/$app_id/g" $source
|
|
||||||
else
|
|
||||||
sed -i "s/{PLACE_YOUR_APP_ID_HERE}/$app_id/g" $source
|
|
||||||
fi
|
|
||||||
+4
-2
@@ -67,7 +67,9 @@ const Content = () => {
|
|||||||
<Route path={AppRoute.Trade} element={<TradePage />} />
|
<Route path={AppRoute.Trade} element={<TradePage />} />
|
||||||
</Route>
|
</Route>
|
||||||
<Route path={AppRoute.Markets} element={<MarketsPage />} />
|
<Route path={AppRoute.Markets} element={<MarketsPage />} />
|
||||||
<Route path={AppRoute.Rewards} element={<RewardsPage />} />
|
{import.meta.env.MODE !== 'production' && (
|
||||||
|
<Route path={AppRoute.Rewards} element={<RewardsPage />} />
|
||||||
|
)}
|
||||||
{isTablet && (
|
{isTablet && (
|
||||||
<>
|
<>
|
||||||
<Route path={AppRoute.Alerts} element={<AlertsPage />} />
|
<Route path={AppRoute.Alerts} element={<AlertsPage />} />
|
||||||
@@ -195,7 +197,7 @@ Styled.NotificationsToastArea = styled(NotificationsToastArea)`
|
|||||||
|
|
||||||
Styled.DialogArea = styled.aside`
|
Styled.DialogArea = styled.aside`
|
||||||
position: fixed;
|
position: fixed;
|
||||||
height: 100%;
|
height: 100vh;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
inset: 0;
|
inset: 0;
|
||||||
overflow: clip;
|
overflow: clip;
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ type ElementProps = {
|
|||||||
};
|
};
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
href?: string;
|
href?: string;
|
||||||
onClick?: (e: MouseEvent) => void;
|
onClick?: () => void;
|
||||||
withIcon?: boolean;
|
withIcon?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -37,12 +37,12 @@ export const Link = forwardRef<HTMLAnchorElement, ElementProps & StyleProps>(
|
|||||||
ref={ref}
|
ref={ref}
|
||||||
className={className}
|
className={className}
|
||||||
href={href}
|
href={href}
|
||||||
onClick={(e: MouseEvent) => {
|
onClick={() => {
|
||||||
if (analyticsConfig) {
|
if (analyticsConfig) {
|
||||||
console.log(analyticsConfig);
|
console.log(analyticsConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
onClick?.(e);
|
onClick?.();
|
||||||
}}
|
}}
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ type PanelProps = {
|
|||||||
children?: React.ReactNode;
|
children?: React.ReactNode;
|
||||||
href?: string;
|
href?: string;
|
||||||
onHeaderClick?: () => void;
|
onHeaderClick?: () => void;
|
||||||
onClick?: () => void;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
type PanelStyleProps = {
|
type PanelStyleProps = {
|
||||||
@@ -25,11 +24,10 @@ export const Panel = ({
|
|||||||
children,
|
children,
|
||||||
href,
|
href,
|
||||||
onHeaderClick,
|
onHeaderClick,
|
||||||
onClick,
|
|
||||||
hasSeparator,
|
hasSeparator,
|
||||||
className,
|
className,
|
||||||
}: PanelProps & PanelStyleProps) => (
|
}: PanelProps & PanelStyleProps) => (
|
||||||
<Styled.Panel onClick={onClick}>
|
<Styled.Panel>
|
||||||
{href ? (
|
{href ? (
|
||||||
<Link to={href}>
|
<Link to={href}>
|
||||||
{slotHeader ? (
|
{slotHeader ? (
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ export const MarketTableCell = ({
|
|||||||
slotLeft={
|
slotLeft={
|
||||||
<>
|
<>
|
||||||
{showFavorite && <Icon iconName={IconName.Star} />}
|
{showFavorite && <Icon iconName={IconName.Star} />}
|
||||||
<Styled.AssetIcon symbol={asset?.id} />
|
<Styled.AssetIcon symbol={asset?.symbol} />
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import { STRING_KEYS } from './localization';
|
|||||||
export type Nullable<T> = T | null | undefined;
|
export type Nullable<T> = T | null | undefined;
|
||||||
|
|
||||||
// ------ V4 Protocols ------ //
|
// ------ V4 Protocols ------ //
|
||||||
export const AbacusAppConfig = Abacus.exchange.dydx.abacus.state.manager.AppConfigs;
|
|
||||||
export const IOImplementations = Abacus.exchange.dydx.abacus.utils.IOImplementations;
|
export const IOImplementations = Abacus.exchange.dydx.abacus.utils.IOImplementations;
|
||||||
export const UIImplementations = Abacus.exchange.dydx.abacus.utils.UIImplementations;
|
export const UIImplementations = Abacus.exchange.dydx.abacus.utils.UIImplementations;
|
||||||
export type AbacusDYDXChainTransactionsProtocol = Omit<
|
export type AbacusDYDXChainTransactionsProtocol = Omit<
|
||||||
@@ -70,8 +69,8 @@ export type NetworkConfig = {
|
|||||||
export type ConnectNetworkEvent = CustomEvent<Partial<NetworkConfig>>;
|
export type ConnectNetworkEvent = CustomEvent<Partial<NetworkConfig>>;
|
||||||
|
|
||||||
// ------ State ------
|
// ------ State ------
|
||||||
export type AbacusApiState = Abacus.exchange.dydx.abacus.state.manager.ApiState;
|
export type AbacusApiState = Abacus.exchange.dydx.abacus.state.app.ApiState;
|
||||||
export const AbacusApiStatus = Abacus.exchange.dydx.abacus.state.manager.ApiStatus;
|
export const AbacusApiStatus = Abacus.exchange.dydx.abacus.state.app.ApiStatus;
|
||||||
const abacusApiStatuses = [...AbacusApiStatus.values()];
|
const abacusApiStatuses = [...AbacusApiStatus.values()];
|
||||||
export type AbacusApiStatuses = (typeof abacusApiStatuses)[number];
|
export type AbacusApiStatuses = (typeof abacusApiStatuses)[number];
|
||||||
export const Changes = Abacus.exchange.dydx.abacus.state.changes.Changes;
|
export const Changes = Abacus.exchange.dydx.abacus.state.changes.Changes;
|
||||||
@@ -140,7 +139,7 @@ export type SubaccountTransfers = Abacus.exchange.dydx.abacus.output.SubaccountT
|
|||||||
// ------ Historical PnL ------ //
|
// ------ Historical PnL ------ //
|
||||||
export type SubAccountHistoricalPNL = Abacus.exchange.dydx.abacus.output.SubaccountHistoricalPNL;
|
export type SubAccountHistoricalPNL = Abacus.exchange.dydx.abacus.output.SubaccountHistoricalPNL;
|
||||||
export type SubAccountHistoricalPNLs = Abacus.exchange.dydx.abacus.output.SubaccountHistoricalPNL[];
|
export type SubAccountHistoricalPNLs = Abacus.exchange.dydx.abacus.output.SubaccountHistoricalPNL[];
|
||||||
export const HistoricalPnlPeriod = Abacus.exchange.dydx.abacus.protocols.HistoricalPnlPeriod;
|
export const HistoricalPnlPeriod = Abacus.exchange.dydx.abacus.state.app.HistoricalPnlPeriod;
|
||||||
const historicalPnlPeriod = [...HistoricalPnlPeriod.values()] as const;
|
const historicalPnlPeriod = [...HistoricalPnlPeriod.values()] as const;
|
||||||
export type HistoricalPnlPeriods = (typeof historicalPnlPeriod)[number];
|
export type HistoricalPnlPeriods = (typeof historicalPnlPeriod)[number];
|
||||||
|
|
||||||
@@ -180,6 +179,12 @@ export const AbacusOrderSide = Abacus.exchange.dydx.abacus.output.input.OrderSid
|
|||||||
export const AbacusPositionSide = Abacus.exchange.dydx.abacus.output.PositionSide;
|
export const AbacusPositionSide = Abacus.exchange.dydx.abacus.output.PositionSide;
|
||||||
export type AbacusPositionSides = Abacus.exchange.dydx.abacus.output.PositionSide;
|
export type AbacusPositionSides = Abacus.exchange.dydx.abacus.output.PositionSide;
|
||||||
|
|
||||||
|
export type SubaccountPlaceOrderPayload =
|
||||||
|
Abacus.exchange.dydx.abacus.state.app.V4SubaccountPlaceOrderPayload2;
|
||||||
|
|
||||||
|
export type SubaccountCancelOrderPayload =
|
||||||
|
Abacus.exchange.dydx.abacus.state.app.V4SubaccountCancelOrderPayload2;
|
||||||
|
|
||||||
export type HumanReadablePlaceOrderPayload =
|
export type HumanReadablePlaceOrderPayload =
|
||||||
Abacus.exchange.dydx.abacus.state.manager.HumanReadablePlaceOrderPayload;
|
Abacus.exchange.dydx.abacus.state.manager.HumanReadablePlaceOrderPayload;
|
||||||
export type HumanReadableCancelOrderPayload =
|
export type HumanReadableCancelOrderPayload =
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ export enum DialogTypes {
|
|||||||
ExchangeOffline = 'ExchangeOffline',
|
ExchangeOffline = 'ExchangeOffline',
|
||||||
FillDetails = 'FillDetails',
|
FillDetails = 'FillDetails',
|
||||||
Help = 'Help',
|
Help = 'Help',
|
||||||
ExternalNavKeplr = 'ExternalNavKeplr',
|
|
||||||
MnemonicExport = 'MnemonicExport',
|
MnemonicExport = 'MnemonicExport',
|
||||||
MobileSignIn = 'MobileSignIn',
|
MobileSignIn = 'MobileSignIn',
|
||||||
Onboarding = 'Onboarding',
|
Onboarding = 'Onboarding',
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
import environments from '../../public/configs/env.json';
|
|
||||||
|
|
||||||
// TODO: Update for Mainnet deployment
|
|
||||||
export const AVAILABLE_ENVIRONMENTS =
|
|
||||||
import.meta.env.MODE === 'production'
|
|
||||||
? environments.deployments.TESTNET
|
|
||||||
: environments.deployments.DEV;
|
|
||||||
|
|
||||||
export const CURRENT_ABACUS_DEPLOYMENT = import.meta.env.MODE === 'production' ? 'TESTNET' : 'DEV';
|
|
||||||
export const ENVIRONMENT_CONFIG_MAP = environments.environments;
|
|
||||||
export type DydxNetwork = keyof typeof ENVIRONMENT_CONFIG_MAP;
|
|
||||||
export const DEFAULT_APP_ENVIRONMENT = AVAILABLE_ENVIRONMENTS.default as DydxNetwork;
|
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
import { ENDPOINTS, DEV_ENDPOINTS } from '@dydxprotocol/v4-localization';
|
||||||
|
|
||||||
|
export const NETWORK_ENDPOINTS = import.meta.env.MODE === 'production' ? ENDPOINTS : DEV_ENDPOINTS;
|
||||||
|
|
||||||
|
export const CLIENT_NETWORK_CONFIGS: Record<
|
||||||
|
string,
|
||||||
|
(typeof NETWORK_ENDPOINTS.environments)[number]
|
||||||
|
> = Object.fromEntries(
|
||||||
|
NETWORK_ENDPOINTS.environments.map((environment) => [environment.environment, environment])
|
||||||
|
);
|
||||||
|
|
||||||
|
export const DEFAULT_APP_ENVIRONMENT = NETWORK_ENDPOINTS.defaultEnvironment;
|
||||||
|
|
||||||
|
export enum DydxV4Network {
|
||||||
|
V4Mainnet = 'dydxprotocol-mainnet',
|
||||||
|
V4Staging = 'dydxprotocol-staging',
|
||||||
|
V4Testnet2 = 'dydxprotocol-testnet',
|
||||||
|
V4Local = 'dydxprotocol-dev',
|
||||||
|
}
|
||||||
|
|
||||||
|
export type DydxNetwork = keyof typeof CLIENT_NETWORK_CONFIGS;
|
||||||
|
|
||||||
|
export function isDydxV4Network(network: any): boolean {
|
||||||
|
return CLIENT_NETWORK_CONFIGS[network]?.version === 'v4';
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isValidDydxNetwork(network: any): boolean {
|
||||||
|
return Object.keys(CLIENT_NETWORK_CONFIGS).includes(network);
|
||||||
|
}
|
||||||
@@ -94,10 +94,6 @@ export const tradeTooltips: TooltipStrings = {
|
|||||||
title: stringGetter({ key: TOOLTIP_STRING_KEYS.MAINTENANCE_MARGIN_FRACTION_TITLE }),
|
title: stringGetter({ key: TOOLTIP_STRING_KEYS.MAINTENANCE_MARGIN_FRACTION_TITLE }),
|
||||||
body: stringGetter({ key: TOOLTIP_STRING_KEYS.MAINTENANCE_MARGIN_FRACTION_BODY }),
|
body: stringGetter({ key: TOOLTIP_STRING_KEYS.MAINTENANCE_MARGIN_FRACTION_BODY }),
|
||||||
}),
|
}),
|
||||||
'max-reward': ({ stringGetter }) => ({
|
|
||||||
title: stringGetter({ key: TOOLTIP_STRING_KEYS.MAXIMUM_REWARDS_TITLE }),
|
|
||||||
body: stringGetter({ key: TOOLTIP_STRING_KEYS.MAXIMUM_REWARDS_BODY }),
|
|
||||||
}),
|
|
||||||
'max-withdraw': ({ stringGetter }) => ({
|
'max-withdraw': ({ stringGetter }) => ({
|
||||||
title: stringGetter({ key: TOOLTIP_STRING_KEYS.MAX_WITHDRAW_TITLE }),
|
title: stringGetter({ key: TOOLTIP_STRING_KEYS.MAX_WITHDRAW_TITLE }),
|
||||||
body: stringGetter({ key: TOOLTIP_STRING_KEYS.MAX_WITHDRAW_BODY }),
|
body: stringGetter({ key: TOOLTIP_STRING_KEYS.MAX_WITHDRAW_BODY }),
|
||||||
|
|||||||
+14
-17
@@ -24,8 +24,6 @@ import {
|
|||||||
|
|
||||||
import { isMetaMask } from '@/lib/wallet/providers';
|
import { isMetaMask } from '@/lib/wallet/providers';
|
||||||
|
|
||||||
import { DydxNetwork, ENVIRONMENT_CONFIG_MAP } from './networks';
|
|
||||||
|
|
||||||
// Wallet connection types
|
// Wallet connection types
|
||||||
|
|
||||||
export enum WalletConnectionType {
|
export enum WalletConnectionType {
|
||||||
@@ -268,7 +266,7 @@ export const wallets: Record<WalletType, WalletConfig> = {
|
|||||||
walletconnect2Id: '4622a2b2d6af1c9844944291e5e7351a6aa24cd7b23099efac1b2fd875da31a0',
|
walletconnect2Id: '4622a2b2d6af1c9844944291e5e7351a6aa24cd7b23099efac1b2fd875da31a0',
|
||||||
},
|
},
|
||||||
[WalletType.WalletConnect2]: {
|
[WalletType.WalletConnect2]: {
|
||||||
type: WalletType.WalletConnect2,
|
type: WalletType.WalletConnect,
|
||||||
stringKey: STRING_KEYS.WALLET_CONNECT_2,
|
stringKey: STRING_KEYS.WALLET_CONNECT_2,
|
||||||
icon: WalletConnectIcon,
|
icon: WalletConnectIcon,
|
||||||
connectionTypes: [WalletConnectionType.WalletConnect2],
|
connectionTypes: [WalletConnectionType.WalletConnect2],
|
||||||
@@ -320,21 +318,20 @@ export type WalletConnection = {
|
|||||||
export const COSMOS_DERIVATION_PATH = "m/44'/118'/0'/0/0";
|
export const COSMOS_DERIVATION_PATH = "m/44'/118'/0'/0/0";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description typed data to sign for dYdX Chain onboarding
|
* @description typed data to sign for v4 onboarding
|
||||||
*/
|
*/
|
||||||
export const getSignTypedData = (selectedNetwork: DydxNetwork) =>
|
export const SIGN_TYPED_DATA = {
|
||||||
({
|
primaryType: 'dYdX',
|
||||||
primaryType: 'dYdX',
|
domain: {
|
||||||
domain: {
|
name: 'dYdX V4',
|
||||||
name: ENVIRONMENT_CONFIG_MAP[selectedNetwork].wallets.signTypedDataDomainName,
|
},
|
||||||
},
|
types: {
|
||||||
types: {
|
dYdX: [{ name: 'action', type: 'string' }],
|
||||||
dYdX: [{ name: 'action', type: 'string' }],
|
},
|
||||||
},
|
message: {
|
||||||
message: {
|
action: 'dYdX V4 Onboarding',
|
||||||
action: ENVIRONMENT_CONFIG_MAP[selectedNetwork].wallets.signTypedDataAction,
|
},
|
||||||
},
|
} as const;
|
||||||
} as const);
|
|
||||||
|
|
||||||
export type PrivateInformation = ReturnType<typeof onboarding.deriveHDKeyFromEthereumSignature>;
|
export type PrivateInformation = ReturnType<typeof onboarding.deriveHDKeyFromEthereumSignature>;
|
||||||
|
|
||||||
|
|||||||
@@ -7,14 +7,14 @@ import { formatUnits } from 'viem';
|
|||||||
|
|
||||||
import { USDC_DENOM, DYDX_DENOM } from '@dydxprotocol/v4-client-js';
|
import { USDC_DENOM, DYDX_DENOM } from '@dydxprotocol/v4-client-js';
|
||||||
|
|
||||||
import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks';
|
import { CLIENT_NETWORK_CONFIGS } from '@/constants/networks';
|
||||||
import { QUANTUM_MULTIPLIER } from '@/constants/numbers';
|
import { QUANTUM_MULTIPLIER } from '@/constants/numbers';
|
||||||
import { EvmAddress } from '@/constants/wallets';
|
import { EvmAddress } from '@/constants/wallets';
|
||||||
|
|
||||||
import { convertBech32Address } from '@/lib/addressUtils';
|
import { convertBech32Address } from '@/lib/addressUtils';
|
||||||
import { MustBigNumber } from '@/lib/numbers';
|
import { MustBigNumber } from '@/lib/numbers';
|
||||||
|
|
||||||
import { getBalances, getStakingBalances } from '@/state/accountSelectors';
|
import { getBalances } from '@/state/accountSelectors';
|
||||||
import { getSelectedNetwork } from '@/state/appSelectors';
|
import { getSelectedNetwork } from '@/state/appSelectors';
|
||||||
|
|
||||||
import { useAccounts } from './useAccounts';
|
import { useAccounts } from './useAccounts';
|
||||||
@@ -52,15 +52,16 @@ export const useAccountBalance = ({
|
|||||||
|
|
||||||
const selectedNetwork = useSelector(getSelectedNetwork);
|
const selectedNetwork = useSelector(getSelectedNetwork);
|
||||||
const balances = useSelector(getBalances, shallowEqual);
|
const balances = useSelector(getBalances, shallowEqual);
|
||||||
const evmChainId = Number(ENVIRONMENT_CONFIG_MAP[selectedNetwork].ethereumChainId);
|
const evmChainId = Number(CLIENT_NETWORK_CONFIGS[selectedNetwork].ethereumChainId);
|
||||||
const stakingBalances = useSelector(getStakingBalances, shallowEqual);
|
|
||||||
|
|
||||||
const evmQuery = useBalance({
|
const evmQuery = useBalance({
|
||||||
enabled: Boolean(!isCosmosChain && addressOrDenom?.startsWith('0x')),
|
enabled: Boolean(!isCosmosChain && addressOrDenom?.startsWith('0x')),
|
||||||
address: evmAddress,
|
address: evmAddress,
|
||||||
chainId: typeof chainId === 'number' ? chainId : Number(evmChainId),
|
chainId: typeof chainId === 'number' ? chainId : Number(evmChainId),
|
||||||
token:
|
token:
|
||||||
addressOrDenom === CHAIN_DEFAULT_TOKEN_ADDRESS ? undefined : (addressOrDenom as EvmAddress),
|
addressOrDenom === CHAIN_DEFAULT_TOKEN_ADDRESS
|
||||||
|
? undefined
|
||||||
|
: (addressOrDenom as EvmAddress),
|
||||||
watch: true,
|
watch: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -97,19 +98,13 @@ export const useAccountBalance = ({
|
|||||||
const nativeTokenBalance = MustBigNumber(nativeTokenCoinBalance?.amount)
|
const nativeTokenBalance = MustBigNumber(nativeTokenCoinBalance?.amount)
|
||||||
.div(QUANTUM_MULTIPLIER)
|
.div(QUANTUM_MULTIPLIER)
|
||||||
.toNumber();
|
.toNumber();
|
||||||
|
|
||||||
const usdcCoinBalance = balances?.[USDC_DENOM];
|
const usdcCoinBalance = balances?.[USDC_DENOM];
|
||||||
const usdcBalance = MustBigNumber(usdcCoinBalance?.amount).div(QUANTUM_MULTIPLIER).toNumber();
|
const usdcBalance = MustBigNumber(usdcCoinBalance?.amount).div(QUANTUM_MULTIPLIER).toNumber();
|
||||||
|
|
||||||
const nativeStakingCoinBalanace = stakingBalances?.[DYDX_DENOM];
|
|
||||||
const nativeStakingBalance = MustBigNumber(nativeStakingCoinBalanace?.amount)
|
|
||||||
.div(QUANTUM_MULTIPLIER)
|
|
||||||
.toNumber();
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
balance,
|
balance,
|
||||||
nativeTokenBalance,
|
nativeTokenBalance,
|
||||||
nativeStakingBalance,
|
|
||||||
usdcBalance,
|
usdcBalance,
|
||||||
queryStatus: isCosmosChain ? cosmosQuery.status : evmQuery.status,
|
queryStatus: isCosmosChain ? cosmosQuery.status : evmQuery.status,
|
||||||
isQueryFetching: isCosmosChain ? cosmosQuery.isFetching : evmQuery.fetchStatus === 'fetching',
|
isQueryFetching: isCosmosChain ? cosmosQuery.isFetching : evmQuery.fetchStatus === 'fetching',
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { isDydxV4Network } from '@/constants/networks';
|
||||||
import { WalletType } from '@/constants/wallets';
|
import { WalletType } from '@/constants/wallets';
|
||||||
|
|
||||||
import { isTruthy } from '@/lib/isTruthy';
|
import { isTruthy } from '@/lib/isTruthy';
|
||||||
@@ -10,7 +11,7 @@ export const useDisplayedWallets = () => {
|
|||||||
return [
|
return [
|
||||||
WalletType.MetaMask,
|
WalletType.MetaMask,
|
||||||
|
|
||||||
import.meta.env.MODE !== 'production' && WalletType.Keplr,
|
import.meta.env.MODE !== 'production' && isDydxV4Network(selectedNetwork) && WalletType.Keplr,
|
||||||
|
|
||||||
WalletType.WalletConnect2,
|
WalletType.WalletConnect2,
|
||||||
WalletType.WalletConnect,
|
WalletType.WalletConnect,
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { useDispatch } from 'react-redux';
|
|||||||
|
|
||||||
import { LocalStorageKey } from '@/constants/localStorage';
|
import { LocalStorageKey } from '@/constants/localStorage';
|
||||||
|
|
||||||
import { DEFAULT_APP_ENVIRONMENT, type DydxNetwork } from '@/constants/networks';
|
import { DEFAULT_APP_ENVIRONMENT, DydxNetwork, isValidDydxNetwork } from '@/constants/networks';
|
||||||
|
|
||||||
import { useLocalStorage } from '@/hooks';
|
import { useLocalStorage } from '@/hooks';
|
||||||
|
|
||||||
@@ -18,6 +18,7 @@ export const useInitializePage = () => {
|
|||||||
const [localStorageNetwork] = useLocalStorage<DydxNetwork>({
|
const [localStorageNetwork] = useLocalStorage<DydxNetwork>({
|
||||||
key: LocalStorageKey.SelectedNetwork,
|
key: LocalStorageKey.SelectedNetwork,
|
||||||
defaultValue: DEFAULT_APP_ENVIRONMENT,
|
defaultValue: DEFAULT_APP_ENVIRONMENT,
|
||||||
|
validateFn: isValidDydxNetwork, // backwards compatibility
|
||||||
});
|
});
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { LocalStorageKey } from '@/constants/localStorage';
|
|||||||
import { type TransferNotifcation } from '@/constants/notifications';
|
import { type TransferNotifcation } from '@/constants/notifications';
|
||||||
|
|
||||||
import { useAccounts } from '@/hooks/useAccounts';
|
import { useAccounts } from '@/hooks/useAccounts';
|
||||||
import { STATUS_ERROR_GRACE_PERIOD, useSquid } from '@/hooks/useSquid';
|
import { SQUID_ERROR_TYPES, useSquid } from '@/hooks/useSquid';
|
||||||
import { useLocalStorage } from './useLocalStorage';
|
import { useLocalStorage } from './useLocalStorage';
|
||||||
|
|
||||||
const LocalNotificationsContext = createContext<
|
const LocalNotificationsContext = createContext<
|
||||||
@@ -62,7 +62,6 @@ const useLocalNotificationsContext = () => {
|
|||||||
txHash,
|
txHash,
|
||||||
toChainId,
|
toChainId,
|
||||||
fromChainId,
|
fromChainId,
|
||||||
triggeredAt,
|
|
||||||
status: currentStatus,
|
status: currentStatus,
|
||||||
} of transferNotifications) {
|
} of transferNotifications) {
|
||||||
try {
|
try {
|
||||||
@@ -71,8 +70,8 @@ const useLocalNotificationsContext = () => {
|
|||||||
const status = await squid?.getStatus({ transactionId: txHash, toChainId, fromChainId });
|
const status = await squid?.getStatus({ transactionId: txHash, toChainId, fromChainId });
|
||||||
if (status) statuses[txHash] = status;
|
if (status) statuses[txHash] = status;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// ignore errors for the first 120s since the status might not be available yet
|
// ignore not found errors since the route might not be available yet
|
||||||
if (!triggeredAt || Date.now() - triggeredAt > STATUS_ERROR_GRACE_PERIOD) {
|
if (error?.errors?.length && error.errors[0].errorType !== SQUID_ERROR_TYPES.NotFoundError) {
|
||||||
statuses[txHash] = error;
|
statuses[txHash] = error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,13 +28,15 @@ export const useMarketsData = (
|
|||||||
const allAssets = useSelector(getAssets, shallowEqual) || {};
|
const allAssets = useSelector(getAssets, shallowEqual) || {};
|
||||||
|
|
||||||
const markets = useMemo(() => {
|
const markets = useMemo(() => {
|
||||||
return Object.values(allPerpetualMarkets).map((marketData) => ({
|
return Object.values(allPerpetualMarkets)
|
||||||
asset: allAssets[marketData.assetId],
|
.filter((market) => allAssets[market?.assetId]) // Filter out markets with no asset information
|
||||||
tickSizeDecimals: marketData.configs?.tickSizeDecimals,
|
.map((marketData) => ({
|
||||||
...marketData,
|
asset: allAssets[marketData.assetId],
|
||||||
...marketData.perpetual,
|
tickSizeDecimals: marketData.configs?.tickSizeDecimals,
|
||||||
...marketData.configs,
|
...marketData,
|
||||||
})) as MarketData[];
|
...marketData.perpetual,
|
||||||
|
...marketData.configs,
|
||||||
|
})) as MarketData[];
|
||||||
}, [allPerpetualMarkets, allAssets]);
|
}, [allPerpetualMarkets, allAssets]);
|
||||||
|
|
||||||
const filteredMarkets = useMemo(() => {
|
const filteredMarkets = useMemo(() => {
|
||||||
@@ -43,8 +45,8 @@ export const useMarketsData = (
|
|||||||
if (searchFilter) {
|
if (searchFilter) {
|
||||||
return filtered.filter(
|
return filtered.filter(
|
||||||
({ asset }) =>
|
({ asset }) =>
|
||||||
asset?.name?.toLocaleLowerCase().includes(searchFilter.toLowerCase()) ||
|
asset.name?.toLocaleLowerCase().includes(searchFilter.toLowerCase()) ||
|
||||||
asset?.id?.toLocaleLowerCase().includes(searchFilter.toLowerCase())
|
asset.symbol?.toLocaleLowerCase().includes(searchFilter.toLowerCase())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return filtered;
|
return filtered;
|
||||||
|
|||||||
+10
-5
@@ -2,13 +2,15 @@ import { createContext, useContext, useEffect, useMemo, useState } from 'react';
|
|||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import { Squid } from '@0xsquid/sdk';
|
import { Squid } from '@0xsquid/sdk';
|
||||||
|
|
||||||
import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks';
|
import { CLIENT_NETWORK_CONFIGS, isDydxV4Network } from '@/constants/networks';
|
||||||
|
|
||||||
import { getSelectedNetwork } from '@/state/appSelectors';
|
import { getSelectedNetwork } from '@/state/appSelectors';
|
||||||
|
|
||||||
export const NATIVE_TOKEN_ADDRESS = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
|
export const NATIVE_TOKEN_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
|
||||||
|
|
||||||
export const STATUS_ERROR_GRACE_PERIOD = 120_000;
|
export enum SQUID_ERROR_TYPES {
|
||||||
|
NotFoundError = 'NotFoundError',
|
||||||
|
}
|
||||||
|
|
||||||
const useSquidContext = () => {
|
const useSquidContext = () => {
|
||||||
const selectedNetwork = useSelector(getSelectedNetwork);
|
const selectedNetwork = useSelector(getSelectedNetwork);
|
||||||
@@ -22,7 +24,10 @@ const useSquidContext = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const squid = useMemo(
|
const squid = useMemo(
|
||||||
() => new Squid({ baseUrl: ENVIRONMENT_CONFIG_MAP[selectedNetwork]?.endpoints['0xsquid'] }),
|
() =>
|
||||||
|
isDydxV4Network(selectedNetwork)
|
||||||
|
? new Squid({ baseUrl: CLIENT_NETWORK_CONFIGS[selectedNetwork]?.endpoints['0xsquid'] })
|
||||||
|
: undefined,
|
||||||
[selectedNetwork]
|
[selectedNetwork]
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -36,7 +41,7 @@ const useSquidContext = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
type SquidContextType = ReturnType<typeof useSquidContext>;
|
type SquidContextType = ReturnType<typeof useSquidContext>;
|
||||||
const SquidContext = createContext<SquidContextType | undefined>(undefined);
|
const SquidContext = createContext<SquidContextType>(undefined);
|
||||||
SquidContext.displayName = '0xSquid';
|
SquidContext.displayName = '0xSquid';
|
||||||
|
|
||||||
export const SquidProvider = ({ ...props }) => (
|
export const SquidProvider = ({ ...props }) => (
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import { DepositDialog } from '@/views/dialogs/DepositDialog';
|
|||||||
import { DisconnectDialog } from '@/views/dialogs/DisconnectDialog';
|
import { DisconnectDialog } from '@/views/dialogs/DisconnectDialog';
|
||||||
import { ExchangeOfflineDialog } from '@/views/dialogs/ExchangeOfflineDialog';
|
import { ExchangeOfflineDialog } from '@/views/dialogs/ExchangeOfflineDialog';
|
||||||
import { HelpDialog } from '@/views/dialogs/HelpDialog';
|
import { HelpDialog } from '@/views/dialogs/HelpDialog';
|
||||||
import { ExternalNavKeplrDialog } from '@/views/dialogs/ExternalNavKeplrDialog';
|
|
||||||
import { MnemonicExportDialog } from '@/views/dialogs/MnemonicExportDialog';
|
import { MnemonicExportDialog } from '@/views/dialogs/MnemonicExportDialog';
|
||||||
import { MobileSignInDialog } from '@/views/dialogs/MobileSignInDialog';
|
import { MobileSignInDialog } from '@/views/dialogs/MobileSignInDialog';
|
||||||
import { OnboardingDialog } from '@/views/dialogs/OnboardingDialog';
|
import { OnboardingDialog } from '@/views/dialogs/OnboardingDialog';
|
||||||
@@ -48,7 +47,6 @@ export const DialogManager = () => {
|
|||||||
[DialogTypes.ExchangeOffline]: <ExchangeOfflineDialog {...modalProps} />,
|
[DialogTypes.ExchangeOffline]: <ExchangeOfflineDialog {...modalProps} />,
|
||||||
[DialogTypes.FillDetails]: <FillDetailsDialog {...modalProps} />,
|
[DialogTypes.FillDetails]: <FillDetailsDialog {...modalProps} />,
|
||||||
[DialogTypes.Help]: <HelpDialog {...modalProps} />,
|
[DialogTypes.Help]: <HelpDialog {...modalProps} />,
|
||||||
[DialogTypes.ExternalNavKeplr]: <ExternalNavKeplrDialog {...modalProps} />,
|
|
||||||
[DialogTypes.MnemonicExport]: <MnemonicExportDialog {...modalProps} />,
|
[DialogTypes.MnemonicExport]: <MnemonicExportDialog {...modalProps} />,
|
||||||
[DialogTypes.MobileSignIn]: <MobileSignInDialog {...modalProps} />,
|
[DialogTypes.MobileSignIn]: <MobileSignInDialog {...modalProps} />,
|
||||||
[DialogTypes.Onboarding]: <OnboardingDialog {...modalProps} />,
|
[DialogTypes.Onboarding]: <OnboardingDialog {...modalProps} />,
|
||||||
|
|||||||
@@ -42,11 +42,6 @@ export const HeaderDesktop = () => {
|
|||||||
label: stringGetter({ key: STRING_KEYS.TRADE }),
|
label: stringGetter({ key: STRING_KEYS.TRADE }),
|
||||||
href: AppRoute.Trade,
|
href: AppRoute.Trade,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
value: 'Dv4TNT',
|
|
||||||
label: 'Dv4TNT',
|
|
||||||
href: AppRoute.Rewards,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
value: 'PORTFOLIO',
|
value: 'PORTFOLIO',
|
||||||
label: stringGetter({ key: STRING_KEYS.PORTFOLIO }),
|
label: stringGetter({ key: STRING_KEYS.PORTFOLIO }),
|
||||||
|
|||||||
@@ -403,22 +403,6 @@ class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol {
|
|||||||
const parsedAccountBalances = this.parseToPrimitives(accountBalances);
|
const parsedAccountBalances = this.parseToPrimitives(accountBalances);
|
||||||
callback(JSON.stringify(parsedAccountBalances));
|
callback(JSON.stringify(parsedAccountBalances));
|
||||||
break;
|
break;
|
||||||
case QueryType.RewardsParams:
|
|
||||||
const rewardsParams = await this.compositeClient?.validatorClient.get.getRewardsParams();
|
|
||||||
const parsedRewardsParams = this.parseToPrimitives(rewardsParams);
|
|
||||||
callback(JSON.stringify(parsedRewardsParams));
|
|
||||||
break;
|
|
||||||
case QueryType.GetMarketPrice:
|
|
||||||
const price = await this.compositeClient?.validatorClient.get.getPrice(params.marketId);
|
|
||||||
const parsedPrice = this.parseToPrimitives(price);
|
|
||||||
callback(JSON.stringify(parsedPrice));
|
|
||||||
break;
|
|
||||||
case QueryType.GetDelegations:
|
|
||||||
const delegations =
|
|
||||||
await this.compositeClient?.validatorClient.get.getDelegatorDelegations(params.address);
|
|
||||||
const parseDelegations = this.parseToPrimitives(delegations);
|
|
||||||
callback(JSON.stringify(parseDelegations));
|
|
||||||
break;
|
|
||||||
// Do not implement Transfers (yet)
|
// Do not implement Transfers (yet)
|
||||||
case QueryType.Transfers:
|
case QueryType.Transfers:
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import type { AbacusFileSystemProtocol, FileLocation, Nullable } from '@/constants/abacus';
|
import type { AbacusFileSystemProtocol, FileLocation, Nullable } from '@/constants/abacus';
|
||||||
|
import { NETWORK_ENDPOINTS } from '@/constants/networks';
|
||||||
|
|
||||||
export const ENDPOINTS_PATH =
|
export const ENDPOINTS_PATH =
|
||||||
import.meta.env.MODE === 'production'
|
import.meta.env.MODE === 'production'
|
||||||
@@ -7,6 +8,10 @@ export const ENDPOINTS_PATH =
|
|||||||
|
|
||||||
class AbacusFileSystem implements AbacusFileSystemProtocol {
|
class AbacusFileSystem implements AbacusFileSystemProtocol {
|
||||||
readTextFile(location: FileLocation, path: string): Nullable<string> {
|
readTextFile(location: FileLocation, path: string): Nullable<string> {
|
||||||
|
if (path === ENDPOINTS_PATH) {
|
||||||
|
return JSON.stringify(NETWORK_ENDPOINTS);
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,11 +22,10 @@ import {
|
|||||||
UIImplementations,
|
UIImplementations,
|
||||||
CoroutineTimer,
|
CoroutineTimer,
|
||||||
TransferType,
|
TransferType,
|
||||||
AbacusAppConfig,
|
|
||||||
} from '@/constants/abacus';
|
} from '@/constants/abacus';
|
||||||
|
|
||||||
import { DEFAULT_MARKETID } from '@/constants/markets';
|
import { DEFAULT_MARKETID } from '@/constants/markets';
|
||||||
import { CURRENT_ABACUS_DEPLOYMENT, type DydxNetwork } from '@/constants/networks';
|
import { type DydxNetwork } from '@/constants/networks';
|
||||||
|
|
||||||
import type { RootStore } from '@/state/_store';
|
import type { RootStore } from '@/state/_store';
|
||||||
|
|
||||||
@@ -81,9 +80,8 @@ class AbacusStateManager {
|
|||||||
);
|
);
|
||||||
|
|
||||||
this.stateManager = new AsyncAbacusStateManager(
|
this.stateManager = new AsyncAbacusStateManager(
|
||||||
'',
|
import.meta.env.SHARED_RESOURCES_URI,
|
||||||
CURRENT_ABACUS_DEPLOYMENT,
|
ENDPOINTS_PATH,
|
||||||
AbacusAppConfig.Companion.forWeb,
|
|
||||||
ioImplementations,
|
ioImplementations,
|
||||||
uiImplementations,
|
uiImplementations,
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import type { RootStore } from '@/state/_store';
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
setBalances,
|
setBalances,
|
||||||
setStakingBalances,
|
|
||||||
setFills,
|
setFills,
|
||||||
setFundingPayments,
|
setFundingPayments,
|
||||||
setHistoricalPnl,
|
setHistoricalPnl,
|
||||||
@@ -35,7 +34,6 @@ import { setAssets } from '@/state/assets';
|
|||||||
import { setConfigs } from '@/state/configs';
|
import { setConfigs } from '@/state/configs';
|
||||||
import { setInputs } from '@/state/inputs';
|
import { setInputs } from '@/state/inputs';
|
||||||
import { setHistoricalFundings, setLiveTrades, setMarkets, setOrderbook } from '@/state/perpetuals';
|
import { setHistoricalFundings, setLiveTrades, setMarkets, setOrderbook } from '@/state/perpetuals';
|
||||||
import { isTruthy } from '../isTruthy';
|
|
||||||
|
|
||||||
class AbacusStateNotifier implements AbacusStateNotificationProtocol {
|
class AbacusStateNotifier implements AbacusStateNotificationProtocol {
|
||||||
private store: RootStore | undefined;
|
private store: RootStore | undefined;
|
||||||
@@ -78,19 +76,12 @@ class AbacusStateNotifier implements AbacusStateNotificationProtocol {
|
|||||||
|
|
||||||
if (changes.has(Changes.accountBalances)) {
|
if (changes.has(Changes.accountBalances)) {
|
||||||
if (updatedState.account?.balances) {
|
if (updatedState.account?.balances) {
|
||||||
const balances: Record<string, AccountBalance> = {};
|
const balances: Record<string, AccountBalance> = {}
|
||||||
for (const { k, v } of updatedState.account.balances.toArray()) {
|
for (const { k, v } of updatedState.account.balances.toArray()) {
|
||||||
balances[k] = v;
|
balances[k] = v;
|
||||||
}
|
}
|
||||||
dispatch(setBalances(balances));
|
dispatch(setBalances(balances));
|
||||||
}
|
}
|
||||||
if (updatedState.account?.stakingBalances) {
|
|
||||||
const stakingBalances: Record<string, AccountBalance> = {};
|
|
||||||
for (const { k, v } of updatedState.account.stakingBalances.toArray()) {
|
|
||||||
stakingBalances[k] = v;
|
|
||||||
}
|
|
||||||
dispatch(setStakingBalances(stakingBalances));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changes.has(Changes.configs)) {
|
if (changes.has(Changes.configs)) {
|
||||||
@@ -109,12 +100,10 @@ class AbacusStateNotifier implements AbacusStateNotificationProtocol {
|
|||||||
dispatch(
|
dispatch(
|
||||||
setMarkets({
|
setMarkets({
|
||||||
markets: Object.fromEntries(
|
markets: Object.fromEntries(
|
||||||
(marketIds || updatedState.marketIds()?.toArray() || [])
|
(marketIds || updatedState.marketIds()?.toArray() || []).map((marketId: string) => {
|
||||||
.map((marketId: string) => {
|
const marketData = updatedState.market(marketId);
|
||||||
const marketData = updatedState.market(marketId);
|
return [marketId, marketData];
|
||||||
return [marketId, marketData];
|
})
|
||||||
})
|
|
||||||
.filter(isTruthy)
|
|
||||||
) as Record<string, PerpetualMarket>,
|
) as Record<string, PerpetualMarket>,
|
||||||
update: !!marketIds,
|
update: !!marketIds,
|
||||||
})
|
})
|
||||||
|
|||||||
+2
-34
@@ -10,23 +10,7 @@ import {
|
|||||||
bscTestnet,
|
bscTestnet,
|
||||||
optimism,
|
optimism,
|
||||||
optimismGoerli,
|
optimismGoerli,
|
||||||
base,
|
} from 'wagmi/chains';
|
||||||
baseGoerli,
|
|
||||||
polygon,
|
|
||||||
polygonMumbai,
|
|
||||||
linea,
|
|
||||||
lineaTestnet,
|
|
||||||
mantle,
|
|
||||||
mantleTestnet,
|
|
||||||
moonbeam,
|
|
||||||
moonbaseAlpha,
|
|
||||||
filecoin,
|
|
||||||
filecoinHyperspace,
|
|
||||||
fantom,
|
|
||||||
fantomTestnet,
|
|
||||||
celo,
|
|
||||||
celoAlfajores,
|
|
||||||
} from 'viem/chains';
|
|
||||||
|
|
||||||
import { alchemyProvider } from 'wagmi/providers/alchemy';
|
import { alchemyProvider } from 'wagmi/providers/alchemy';
|
||||||
import { jsonRpcProvider } from 'wagmi/providers/jsonRpc';
|
import { jsonRpcProvider } from 'wagmi/providers/jsonRpc';
|
||||||
@@ -52,26 +36,10 @@ export const WAGMI_SUPPORTED_CHAINS: Chain[] = [
|
|||||||
bscTestnet,
|
bscTestnet,
|
||||||
optimism,
|
optimism,
|
||||||
optimismGoerli,
|
optimismGoerli,
|
||||||
base,
|
|
||||||
baseGoerli,
|
|
||||||
polygon,
|
|
||||||
polygonMumbai,
|
|
||||||
linea,
|
|
||||||
lineaTestnet,
|
|
||||||
mantle,
|
|
||||||
mantleTestnet,
|
|
||||||
moonbeam,
|
|
||||||
moonbaseAlpha,
|
|
||||||
filecoin,
|
|
||||||
filecoinHyperspace,
|
|
||||||
fantom,
|
|
||||||
fantomTestnet,
|
|
||||||
celo,
|
|
||||||
celoAlfajores,
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const { chains, publicClient, webSocketPublicClient } = configureChains(WAGMI_SUPPORTED_CHAINS, [
|
const { chains, publicClient, webSocketPublicClient } = configureChains(WAGMI_SUPPORTED_CHAINS, [
|
||||||
// alchemyProvider({ apiKey: import.meta.env.VITE_ALCHEMY_API_KEY }),
|
alchemyProvider({ apiKey: import.meta.env.VITE_ALCHEMY_API_KEY }),
|
||||||
jsonRpcProvider({
|
jsonRpcProvider({
|
||||||
rpc: (chain) => ({ http: chain.rpcUrls.default.http[0] }),
|
rpc: (chain) => ({ http: chain.rpcUrls.default.http[0] }),
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -29,10 +29,10 @@ export const DYDXBalancePanel = () => {
|
|||||||
|
|
||||||
const { walletType } = useAccounts();
|
const { walletType } = useAccounts();
|
||||||
const canAccountTrade = useSelector(calculateCanAccountTrade, shallowEqual);
|
const canAccountTrade = useSelector(calculateCanAccountTrade, shallowEqual);
|
||||||
const { nativeTokenBalance, nativeStakingBalance } = useAccountBalance();
|
const { nativeTokenBalance } = useAccountBalance();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Panel
|
<Styled.TransfersCard
|
||||||
slotHeader={
|
slotHeader={
|
||||||
<Styled.Header>
|
<Styled.Header>
|
||||||
<Styled.Title>
|
<Styled.Title>
|
||||||
@@ -97,7 +97,7 @@ export const DYDXBalancePanel = () => {
|
|||||||
</Styled.Label>
|
</Styled.Label>
|
||||||
),
|
),
|
||||||
|
|
||||||
value: <Output type={OutputType.Asset} value={nativeStakingBalance} />,
|
value: <Output type={OutputType.Asset} value={undefined} />,
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
@@ -106,17 +106,21 @@ export const DYDXBalancePanel = () => {
|
|||||||
{
|
{
|
||||||
key: 'totalBalance',
|
key: 'totalBalance',
|
||||||
label: 'Total balance',
|
label: 'Total balance',
|
||||||
value: <Output type={OutputType.Asset} value={nativeTokenBalance + nativeStakingBalance} tag="Dv4TNT" />,
|
value: <Output type={OutputType.Asset} value={nativeTokenBalance} tag="Dv4TNT" />,
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
</Styled.Content>
|
</Styled.Content>
|
||||||
</Panel>
|
</Styled.TransfersCard>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const Styled: Record<string, AnyStyledComponent> = {};
|
const Styled: Record<string, AnyStyledComponent> = {};
|
||||||
|
|
||||||
|
Styled.TransfersCard = styled(Panel)`
|
||||||
|
width: 21.25rem;
|
||||||
|
`;
|
||||||
|
|
||||||
Styled.Header = styled.div`
|
Styled.Header = styled.div`
|
||||||
${layoutMixins.spacedRow}
|
${layoutMixins.spacedRow}
|
||||||
padding: 1.25rem 1.5rem 0.5rem;
|
padding: 1.25rem 1.5rem 0.5rem;
|
||||||
@@ -170,15 +174,13 @@ Styled.IconContainer = styled.div`
|
|||||||
|
|
||||||
Styled.WalletAndStakedBalance = styled(Details)`
|
Styled.WalletAndStakedBalance = styled(Details)`
|
||||||
--details-item-backgroundColor: var(--color-layer-6);
|
--details-item-backgroundColor: var(--color-layer-6);
|
||||||
|
|
||||||
grid-template-columns: 1fr 1fr;
|
|
||||||
gap: 0.5rem;
|
gap: 0.5rem;
|
||||||
|
|
||||||
|
|
||||||
> div {
|
> div {
|
||||||
gap: 1rem;
|
gap: 1rem;
|
||||||
|
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
|
width: 8.625rem;
|
||||||
|
|
||||||
border-radius: 0.75em;
|
border-radius: 0.75em;
|
||||||
background-color: var(--color-layer-5);
|
background-color: var(--color-layer-5);
|
||||||
|
|||||||
@@ -1,333 +1,17 @@
|
|||||||
import styled, { AnyStyledComponent } from 'styled-components';
|
import styled, { AnyStyledComponent } from 'styled-components';
|
||||||
import { useDispatch, useSelector } from 'react-redux';
|
|
||||||
|
|
||||||
import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks';
|
|
||||||
import { STRING_KEYS } from '@/constants/localization';
|
|
||||||
import { ButtonAction, ButtonSize, ButtonState, ButtonType } from '@/constants/buttons';
|
|
||||||
import { DialogTypes } from '@/constants/dialogs';
|
|
||||||
|
|
||||||
import { useAccountBalance, useBreakpoints, useStringGetter } from '@/hooks';
|
|
||||||
|
|
||||||
import { breakpoints } from '@/styles';
|
|
||||||
import { layoutMixins } from '@/styles/layoutMixins';
|
import { layoutMixins } from '@/styles/layoutMixins';
|
||||||
|
|
||||||
import { Details } from '@/components/Details';
|
|
||||||
import { Panel } from '@/components/Panel';
|
|
||||||
import { IconName } from '@/components/Icon';
|
|
||||||
import { Button } from '@/components/Button';
|
|
||||||
import { IconButton } from '@/components/IconButton';
|
|
||||||
import { Link } from '@/components/Link';
|
|
||||||
import { Output, OutputType } from '@/components/Output';
|
|
||||||
import { VerticalSeparator } from '@/components/Separator';
|
|
||||||
import { WithReceipt } from '@/components/WithReceipt';
|
|
||||||
|
|
||||||
import { openDialog } from '@/state/dialogs';
|
|
||||||
import { getSelectedNetwork } from '@/state/appSelectors';
|
|
||||||
|
|
||||||
import { DYDXBalancePanel } from './DYDXBalancePanel';
|
import { DYDXBalancePanel } from './DYDXBalancePanel';
|
||||||
|
|
||||||
// TODO: replace placeholder URL with real URLs when avaialble
|
export const RewardsPage = () => (
|
||||||
const GOVERNANCE_HELP_URL = 'https://help.dydx.exchange/';
|
<Styled.Page>
|
||||||
const STAKING_HELP_URL = 'https://help.dydx.exchange/';
|
<DYDXBalancePanel />
|
||||||
|
</Styled.Page>
|
||||||
export const RewardsPage = () => {
|
);
|
||||||
const dispatch = useDispatch();
|
|
||||||
const stringGetter = useStringGetter();
|
|
||||||
const { isTablet, isNotTablet } = useBreakpoints();
|
|
||||||
|
|
||||||
const selectedNetwork = useSelector(getSelectedNetwork);
|
|
||||||
|
|
||||||
// const chainId = Number(ENVIRONMENT_CONFIG_MAP[selectedNetwork].ethereumChainId);
|
|
||||||
|
|
||||||
// const { balance } = useAccountBalance({
|
|
||||||
// addressOrDenom: import.meta.env.VITE_V3_TOKEN_ADDRESS,
|
|
||||||
// assetSymbol: 'DYDX',
|
|
||||||
// chainId,
|
|
||||||
// isCosmosChain: false,
|
|
||||||
// });
|
|
||||||
|
|
||||||
// const tokenBalance = import.meta.env.VITE_V3_TOKEN_ADDRESS ? balance : 0;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Styled.Page>
|
|
||||||
{/* {isNotTablet ? (
|
|
||||||
<Styled.Migrate>
|
|
||||||
<Styled.TwoItemRow>
|
|
||||||
<div>
|
|
||||||
<Styled.MigrateTitle>
|
|
||||||
{stringGetter({ key: STRING_KEYS.MIGRATE })}
|
|
||||||
</Styled.MigrateTitle>
|
|
||||||
<Styled.Description>
|
|
||||||
{stringGetter({ key: STRING_KEYS.MIGRATE_DESCRIPTION })}
|
|
||||||
<Link href={MIGRATE_HELP_URL}>
|
|
||||||
{stringGetter({ key: STRING_KEYS.LEARN_MORE })} →
|
|
||||||
</Link>
|
|
||||||
</Styled.Description>
|
|
||||||
</div>
|
|
||||||
<Styled.MigrateAction>
|
|
||||||
<div>
|
|
||||||
<div>{stringGetter({ key: STRING_KEYS.AVAILABLE_TO_MIGRATE })}</div>
|
|
||||||
<div>
|
|
||||||
<Styled.Token type={OutputType.Asset} value={tokenBalance} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<Button
|
|
||||||
action={tokenBalance ? ButtonAction.Primary : ButtonAction.Base}
|
|
||||||
// type={ButtonType.Link}
|
|
||||||
// href={BRIDGE_URL}
|
|
||||||
disabled
|
|
||||||
>
|
|
||||||
{tokenBalance
|
|
||||||
? `${stringGetter({ key: STRING_KEYS.MIGRATE_NOW })} →`
|
|
||||||
: stringGetter({ key: STRING_KEYS.NO_TOKENS_TO_MIGRATE })}
|
|
||||||
</Button>
|
|
||||||
</Styled.MigrateAction>
|
|
||||||
</Styled.TwoItemRow>
|
|
||||||
</Styled.Migrate>
|
|
||||||
) : (
|
|
||||||
<Styled.MobileMigrateCard
|
|
||||||
slotHeader={
|
|
||||||
<Styled.MobileMigrateHeader>
|
|
||||||
<h3>{stringGetter({ key: STRING_KEYS.MIGRATE })}</h3>
|
|
||||||
<VerticalSeparator />
|
|
||||||
<span>
|
|
||||||
{stringGetter({
|
|
||||||
key: STRING_KEYS.FROM_TO,
|
|
||||||
params: { FROM: <strong>Ethereum</strong>, TO: <strong>dYdX Chain</strong> },
|
|
||||||
})}
|
|
||||||
</span>
|
|
||||||
</Styled.MobileMigrateHeader>
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<Styled.WithReceipt
|
|
||||||
slotReceipt={
|
|
||||||
<Styled.Details
|
|
||||||
items={[
|
|
||||||
{
|
|
||||||
key: 'available-to-migrate',
|
|
||||||
label: stringGetter({ key: STRING_KEYS.AVAILABLE_TO_MIGRATE }),
|
|
||||||
value: <Output type={OutputType.Asset} value={tokenBalance} />,
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<Button
|
|
||||||
action={tokenBalance ? ButtonAction.Primary : ButtonAction.Base}
|
|
||||||
size={ButtonSize.Medium}
|
|
||||||
disabled
|
|
||||||
>
|
|
||||||
{tokenBalance
|
|
||||||
? `${stringGetter({ key: STRING_KEYS.MIGRATE_NOW })} →`
|
|
||||||
: stringGetter({ key: STRING_KEYS.NO_TOKENS_TO_MIGRATE })}
|
|
||||||
</Button>
|
|
||||||
</Styled.WithReceipt>
|
|
||||||
<Styled.LearnMore>
|
|
||||||
{stringGetter({ key: STRING_KEYS.WANT_TO_LEARN })}
|
|
||||||
<Link href={MIGRATE_HELP_URL}>{stringGetter({ key: STRING_KEYS.CLICK_HERE })}</Link>
|
|
||||||
</Styled.LearnMore>
|
|
||||||
</Styled.MobileMigrateCard>
|
|
||||||
)} */}
|
|
||||||
|
|
||||||
<Styled.PanelRow>
|
|
||||||
{isTablet && (
|
|
||||||
<Styled.BalancePanelContainer>
|
|
||||||
<DYDXBalancePanel />
|
|
||||||
</Styled.BalancePanelContainer>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<Styled.Panel
|
|
||||||
slotHeader={<Styled.Title>{stringGetter({ key: STRING_KEYS.GOVERNANCE })}</Styled.Title>}
|
|
||||||
onClick={() => dispatch(openDialog({ type: DialogTypes.ExternalNavKeplr }))}
|
|
||||||
>
|
|
||||||
<Styled.Row>
|
|
||||||
<Styled.Description>
|
|
||||||
{stringGetter({ key: STRING_KEYS.GOVERNANCE_DESCRIPTION })}
|
|
||||||
<Link href={GOVERNANCE_HELP_URL} onClick={(e) => e.stopPropagation()}>
|
|
||||||
{stringGetter({ key: STRING_KEYS.LEARN_MORE })} →
|
|
||||||
</Link>
|
|
||||||
</Styled.Description>
|
|
||||||
{/* TODO: vertically center based on Panel height */}
|
|
||||||
<Styled.IconButton
|
|
||||||
action={ButtonAction.Base}
|
|
||||||
iconName={IconName.Arrow}
|
|
||||||
size={ButtonSize.Small}
|
|
||||||
/>
|
|
||||||
</Styled.Row>
|
|
||||||
</Styled.Panel>
|
|
||||||
|
|
||||||
<Styled.Panel
|
|
||||||
slotHeader={<Styled.Title>{stringGetter({ key: STRING_KEYS.STAKING })}</Styled.Title>}
|
|
||||||
onClick={() => dispatch(openDialog({ type: DialogTypes.ExternalNavKeplr }))}
|
|
||||||
>
|
|
||||||
<Styled.Row>
|
|
||||||
<Styled.Description>
|
|
||||||
{stringGetter({ key: STRING_KEYS.STAKING_DESCRIPTION })}
|
|
||||||
<Link href={STAKING_HELP_URL} onClick={(e) => e.stopPropagation()}>
|
|
||||||
{stringGetter({ key: STRING_KEYS.LEARN_MORE })} →
|
|
||||||
</Link>
|
|
||||||
</Styled.Description>
|
|
||||||
{/* TODO: vertically center based on Panel height */}
|
|
||||||
<Styled.IconButton
|
|
||||||
action={ButtonAction.Base}
|
|
||||||
iconName={IconName.Arrow}
|
|
||||||
size={ButtonSize.Small}
|
|
||||||
/>
|
|
||||||
</Styled.Row>
|
|
||||||
</Styled.Panel>
|
|
||||||
|
|
||||||
{isNotTablet && (
|
|
||||||
<Styled.BalancePanelContainer>
|
|
||||||
<DYDXBalancePanel />
|
|
||||||
</Styled.BalancePanelContainer>
|
|
||||||
)}
|
|
||||||
</Styled.PanelRow>
|
|
||||||
</Styled.Page>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const Styled: Record<string, AnyStyledComponent> = {};
|
const Styled: Record<string, AnyStyledComponent> = {};
|
||||||
|
|
||||||
Styled.Page = styled.div`
|
Styled.Page = styled.div`
|
||||||
${layoutMixins.contentContainerPage}
|
${layoutMixins.centered}
|
||||||
gap: 1.5rem;
|
|
||||||
|
|
||||||
@media ${breakpoints.tablet} {
|
|
||||||
padding: 1rem;
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.Panel = styled(Panel)`
|
|
||||||
padding: 0 1.5rem 1rem;
|
|
||||||
|
|
||||||
@media ${breakpoints.tablet} {
|
|
||||||
max-width: calc(100vw - 2rem);
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.Row = styled.div`
|
|
||||||
${layoutMixins.spacedRow}
|
|
||||||
gap: 1rem;
|
|
||||||
|
|
||||||
align-items: center;
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.Description = styled.div`
|
|
||||||
color: var(--color-text-0);
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: var(--color-text-1);
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.Migrate = styled.section`
|
|
||||||
max-width: min(100vw, var(--content-max-width));
|
|
||||||
|
|
||||||
padding: 1.5rem;
|
|
||||||
|
|
||||||
background-color: var(--color-layer-3);
|
|
||||||
border-radius: 0.875rem;
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.TwoItemRow = styled(Styled.Row)`
|
|
||||||
grid-template-columns: 1fr 1fr;
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.MigrateAction = styled(Styled.TwoItemRow)`
|
|
||||||
padding: 1rem;
|
|
||||||
|
|
||||||
background-color: var(--color-layer-2);
|
|
||||||
border: solid var(--border-width) var(--color-border);
|
|
||||||
border-radius: 0.75rem;
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.Token = styled(Output)`
|
|
||||||
font: var(--font-large-book);
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.PanelRow = styled(Styled.Row)`
|
|
||||||
gap: 1.5rem;
|
|
||||||
max-width: min(100vw, var(--content-max-width));
|
|
||||||
align-items: flex-start;
|
|
||||||
|
|
||||||
> section {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media ${breakpoints.tablet} {
|
|
||||||
grid-auto-flow: row;
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
max-width: auto;
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.BalancePanelContainer = styled.div`
|
|
||||||
width: 21.25rem;
|
|
||||||
|
|
||||||
@media ${breakpoints.tablet} {
|
|
||||||
width: auto;
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.Title = styled.h3`
|
|
||||||
${layoutMixins.inlineRow}
|
|
||||||
padding: 1.25rem 1.5rem 0.5rem;
|
|
||||||
|
|
||||||
font: var(--font-medium-book);
|
|
||||||
color: var(--color-text-2);
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.MigrateTitle = styled(Styled.Title)`
|
|
||||||
padding: 0 0 0.5rem;
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.MobileMigrateCard = styled(Styled.Panel)`
|
|
||||||
${layoutMixins.flexColumn}
|
|
||||||
gap: 1rem;
|
|
||||||
|
|
||||||
align-items: center;
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.MobileMigrateHeader = styled(Styled.Title)`
|
|
||||||
${layoutMixins.inlineRow}
|
|
||||||
gap: 1ch;
|
|
||||||
padding-bottom: 1rem;
|
|
||||||
|
|
||||||
font: var(--font-small-book);
|
|
||||||
color: var(--color-text-0);
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
${layoutMixins.inlineRow}
|
|
||||||
font: var(--font-large-book);
|
|
||||||
color: var(--color-text-2);
|
|
||||||
|
|
||||||
svg {
|
|
||||||
font-size: 1.75rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
span {
|
|
||||||
margin-top: 0.2rem;
|
|
||||||
b {
|
|
||||||
font-weight: var(--fontWeight-book);
|
|
||||||
color: var(--color-text-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.Details = styled(Details)`
|
|
||||||
padding: 0.5rem 1rem;
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.WithReceipt = styled(WithReceipt)`
|
|
||||||
width: 100%;
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.LearnMore = styled(Styled.Description)`
|
|
||||||
${layoutMixins.row}
|
|
||||||
gap: 1ch;
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.IconButton = styled(IconButton)`
|
|
||||||
color: var(--color-text-0);
|
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -12,12 +12,12 @@ import { getCurrentMarketAssetData } from '@/state/assetsSelectors';
|
|||||||
import { getCurrentMarketId } from '@/state/perpetualsSelectors';
|
import { getCurrentMarketId } from '@/state/perpetualsSelectors';
|
||||||
|
|
||||||
export const MarketSelectorAndStats = ({ className }: { className?: string }) => {
|
export const MarketSelectorAndStats = ({ className }: { className?: string }) => {
|
||||||
const { id = '' } = useSelector(getCurrentMarketAssetData, shallowEqual) ?? {};
|
const { symbol = '' } = useSelector(getCurrentMarketAssetData, shallowEqual) ?? {};
|
||||||
const currentMarketId = useSelector(getCurrentMarketId);
|
const currentMarketId = useSelector(getCurrentMarketId);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Styled.Container className={className}>
|
<Styled.Container className={className}>
|
||||||
<MarketsDropdown currentMarketId={currentMarketId} symbol={id} />
|
<MarketsDropdown currentMarketId={currentMarketId} symbol={symbol} />
|
||||||
|
|
||||||
<VerticalSeparator />
|
<VerticalSeparator />
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ export type AccountState = {
|
|||||||
walletType?: WalletType;
|
walletType?: WalletType;
|
||||||
historicalPnlPeriod?: HistoricalPnlPeriods;
|
historicalPnlPeriod?: HistoricalPnlPeriods;
|
||||||
balances?: Record<string, AccountBalance>;
|
balances?: Record<string, AccountBalance>;
|
||||||
stakingBalances?: Record<string, AccountBalance>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const initialState: AccountState = {
|
const initialState: AccountState = {
|
||||||
@@ -155,9 +154,6 @@ export const accountSlice = createSlice({
|
|||||||
setBalances: (state, action: PayloadAction<Record<string, AccountBalance>>) => {
|
setBalances: (state, action: PayloadAction<Record<string, AccountBalance>>) => {
|
||||||
state.balances = action.payload;
|
state.balances = action.payload;
|
||||||
},
|
},
|
||||||
setStakingBalances: (state, action: PayloadAction<Record<string, AccountBalance>>) => {
|
|
||||||
state.stakingBalances = action.payload;
|
|
||||||
},
|
|
||||||
addUncommittedOrderClientId: (state, action: PayloadAction<number>) => {
|
addUncommittedOrderClientId: (state, action: PayloadAction<number>) => {
|
||||||
state.uncommittedOrderClientIds.push(action.payload);
|
state.uncommittedOrderClientIds.push(action.payload);
|
||||||
},
|
},
|
||||||
@@ -183,7 +179,6 @@ export const {
|
|||||||
viewedFills,
|
viewedFills,
|
||||||
viewedOrders,
|
viewedOrders,
|
||||||
setBalances,
|
setBalances,
|
||||||
setStakingBalances,
|
|
||||||
addUncommittedOrderClientId,
|
addUncommittedOrderClientId,
|
||||||
removeUncommittedOrderClientId,
|
removeUncommittedOrderClientId,
|
||||||
} = accountSlice.actions;
|
} = accountSlice.actions;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { createSelector } from 'reselect';
|
|||||||
|
|
||||||
import { SubaccountPosition } from '@/constants/abacus';
|
import { SubaccountPosition } from '@/constants/abacus';
|
||||||
import { OnboardingState, OnboardingSteps } from '@/constants/account';
|
import { OnboardingState, OnboardingSteps } from '@/constants/account';
|
||||||
|
import { isDydxV4Network } from '@/constants/networks';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
getExistingOpenPositions,
|
getExistingOpenPositions,
|
||||||
@@ -11,6 +12,8 @@ import {
|
|||||||
getUncommittedOrderClientIds,
|
getUncommittedOrderClientIds,
|
||||||
} from '@/state/accountSelectors';
|
} from '@/state/accountSelectors';
|
||||||
|
|
||||||
|
import { getSelectedNetwork } from '@/state/appSelectors';
|
||||||
|
|
||||||
export const calculateOnboardingStep = createSelector(
|
export const calculateOnboardingStep = createSelector(
|
||||||
[getOnboardingState, getOnboardingGuards],
|
[getOnboardingState, getOnboardingGuards],
|
||||||
(onboardingState: OnboardingState, onboardingGuards: ReturnType<typeof getOnboardingGuards>) => {
|
(onboardingState: OnboardingState, onboardingGuards: ReturnType<typeof getOnboardingGuards>) => {
|
||||||
@@ -32,9 +35,9 @@ export const calculateOnboardingStep = createSelector(
|
|||||||
* @description calculate whether an account is in a state where they can trade
|
* @description calculate whether an account is in a state where they can trade
|
||||||
*/
|
*/
|
||||||
export const calculateCanAccountTrade = createSelector(
|
export const calculateCanAccountTrade = createSelector(
|
||||||
[getOnboardingState],
|
[getOnboardingState, getSelectedNetwork],
|
||||||
(onboardingState: OnboardingState) => {
|
(onboardingState: OnboardingState, selectedNetwork: string) => {
|
||||||
return onboardingState === OnboardingState.AccountConnected;
|
return onboardingState === OnboardingState.AccountConnected && isDydxV4Network(selectedNetwork);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -337,8 +337,3 @@ export const getUserStats = (state: RootState) => ({
|
|||||||
* @returns user wallet balances
|
* @returns user wallet balances
|
||||||
*/
|
*/
|
||||||
export const getBalances = (state: RootState) => state.account?.balances;
|
export const getBalances = (state: RootState) => state.account?.balances;
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns user wallet staking balances
|
|
||||||
* */
|
|
||||||
export const getStakingBalances = (state: RootState) => state.account?.stakingBalances;
|
|
||||||
|
|||||||
+6
-1
@@ -3,7 +3,11 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit';
|
|||||||
import { AbacusApiState } from '@/constants/abacus';
|
import { AbacusApiState } from '@/constants/abacus';
|
||||||
import { LocalStorageKey } from '@/constants/localStorage';
|
import { LocalStorageKey } from '@/constants/localStorage';
|
||||||
|
|
||||||
import { DEFAULT_APP_ENVIRONMENT, type DydxNetwork } from '@/constants/networks';
|
import {
|
||||||
|
DEFAULT_APP_ENVIRONMENT,
|
||||||
|
isValidDydxNetwork,
|
||||||
|
type DydxNetwork,
|
||||||
|
} from '@/constants/networks';
|
||||||
|
|
||||||
import { getLocalStorage } from '@/lib/localStorage';
|
import { getLocalStorage } from '@/lib/localStorage';
|
||||||
|
|
||||||
@@ -19,6 +23,7 @@ const initialState: AppState = {
|
|||||||
selectedNetwork: getLocalStorage({
|
selectedNetwork: getLocalStorage({
|
||||||
key: LocalStorageKey.SelectedNetwork,
|
key: LocalStorageKey.SelectedNetwork,
|
||||||
defaultValue: DEFAULT_APP_ENVIRONMENT,
|
defaultValue: DEFAULT_APP_ENVIRONMENT,
|
||||||
|
validateFn: isValidDydxNetwork,
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ export const MarketDetails: React.FC = () => {
|
|||||||
const stringGetter = useStringGetter();
|
const stringGetter = useStringGetter();
|
||||||
const { isTablet } = useBreakpoints();
|
const { isTablet } = useBreakpoints();
|
||||||
const { configs, market } = useSelector(getCurrentMarketData, shallowEqual) || {};
|
const { configs, market } = useSelector(getCurrentMarketData, shallowEqual) || {};
|
||||||
const { id, name, resources } = useSelector(getCurrentMarketAssetData, shallowEqual) || {};
|
const { symbol, name, resources } = useSelector(getCurrentMarketAssetData, shallowEqual) || {};
|
||||||
|
|
||||||
if (!configs) return null;
|
if (!configs) return null;
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ export const MarketDetails: React.FC = () => {
|
|||||||
useGrouping
|
useGrouping
|
||||||
value={stepSize}
|
value={stepSize}
|
||||||
type={OutputType.Asset}
|
type={OutputType.Asset}
|
||||||
tag={id}
|
tag={symbol}
|
||||||
fractionDigits={stepSizeDecimals}
|
fractionDigits={stepSizeDecimals}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
@@ -88,7 +88,7 @@ export const MarketDetails: React.FC = () => {
|
|||||||
useGrouping
|
useGrouping
|
||||||
value={minOrderSize}
|
value={minOrderSize}
|
||||||
type={OutputType.Asset}
|
type={OutputType.Asset}
|
||||||
tag={id}
|
tag={symbol}
|
||||||
fractionDigits={stepSizeDecimals}
|
fractionDigits={stepSizeDecimals}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
@@ -132,16 +132,18 @@ export const MarketDetails: React.FC = () => {
|
|||||||
<Styled.Header>
|
<Styled.Header>
|
||||||
<Styled.WrapRow>
|
<Styled.WrapRow>
|
||||||
<Styled.MarketTitle>
|
<Styled.MarketTitle>
|
||||||
<AssetIcon symbol={id} />
|
<AssetIcon symbol={symbol} />
|
||||||
{name}
|
{name}
|
||||||
</Styled.MarketTitle>
|
</Styled.MarketTitle>
|
||||||
{isTablet && <Styled.MarketLinks />}
|
{isTablet && <Styled.MarketLinks />}
|
||||||
</Styled.WrapRow>
|
</Styled.WrapRow>
|
||||||
|
|
||||||
<Styled.MarketDescription>
|
<Styled.MarketDescription>
|
||||||
{primaryDescriptionKey && <p>{stringGetter({ key: `APP.${primaryDescriptionKey}` })}</p>}
|
{primaryDescriptionKey && (
|
||||||
|
<p>{stringGetter({ key: STRING_KEYS[primaryDescriptionKey as StringKey] })}</p>
|
||||||
|
)}
|
||||||
{secondaryDescriptionKey && (
|
{secondaryDescriptionKey && (
|
||||||
<p>{stringGetter({ key: `APP.${secondaryDescriptionKey}` })}</p>
|
<p>{stringGetter({ key: STRING_KEYS[secondaryDescriptionKey as StringKey] })}</p>
|
||||||
)}
|
)}
|
||||||
</Styled.MarketDescription>
|
</Styled.MarketDescription>
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ const defaultMarketStatistics = Object.values(MarketStats);
|
|||||||
export const MarketStatsDetails = ({ showMidMarketPrice = true }: ElementProps) => {
|
export const MarketStatsDetails = ({ showMidMarketPrice = true }: ElementProps) => {
|
||||||
const stringGetter = useStringGetter();
|
const stringGetter = useStringGetter();
|
||||||
const { isTablet } = useBreakpoints();
|
const { isTablet } = useBreakpoints();
|
||||||
const { id = '' } = useSelector(getCurrentMarketAssetData, shallowEqual) ?? {};
|
const { symbol = '' } = useSelector(getCurrentMarketAssetData, shallowEqual) ?? {};
|
||||||
const { tickSizeDecimals } = useSelector(getCurrentMarketConfig, shallowEqual) ?? {};
|
const { tickSizeDecimals } = useSelector(getCurrentMarketConfig, shallowEqual) ?? {};
|
||||||
const midMarketPrice = useSelector(getCurrentMarketMidMarketPrice);
|
const midMarketPrice = useSelector(getCurrentMarketMidMarketPrice);
|
||||||
const lastMidMarketPrice = useRef(midMarketPrice);
|
const lastMidMarketPrice = useRef(midMarketPrice);
|
||||||
@@ -116,7 +116,7 @@ export const MarketStatsDetails = ({ showMidMarketPrice = true }: ElementProps)
|
|||||||
<Styled.Output
|
<Styled.Output
|
||||||
type={OutputType.Number}
|
type={OutputType.Number}
|
||||||
value={value}
|
value={value}
|
||||||
tag={id}
|
tag={symbol}
|
||||||
fractionDigits={LARGE_TOKEN_DECIMALS}
|
fractionDigits={LARGE_TOKEN_DECIMALS}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -60,12 +60,12 @@ const MarketsDropdownContent = ({ onRowAction }: { onRowAction?: (market: string
|
|||||||
columnKey: 'market',
|
columnKey: 'market',
|
||||||
getCellValue: (row) => row.market,
|
getCellValue: (row) => row.market,
|
||||||
label: stringGetter({ key: STRING_KEYS.MARKET }),
|
label: stringGetter({ key: STRING_KEYS.MARKET }),
|
||||||
renderCell: ({ assetId, id }) => (
|
renderCell: ({ asset }) => (
|
||||||
<Styled.MarketName isFavorited={false}>
|
<Styled.MarketName isFavorited={false}>
|
||||||
{/* TRCL-1693 <Icon iconName={IconName.Star} /> */}
|
{/* TRCL-1693 <Icon iconName={IconName.Star} /> */}
|
||||||
<AssetIcon symbol={assetId} />
|
<AssetIcon symbol={asset.symbol} />
|
||||||
<h2>{id}</h2>
|
<h2>{asset.name}</h2>
|
||||||
<Tag>{assetId}</Tag>
|
<Tag>{asset.symbol}</Tag>
|
||||||
</Styled.MarketName>
|
</Styled.MarketName>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ export const PositionInfo = ({ showNarrowVariation }: { showNarrowVariation?: bo
|
|||||||
const isLoading = useSelector(calculateIsAccountLoading);
|
const isLoading = useSelector(calculateIsAccountLoading);
|
||||||
|
|
||||||
const { stepSizeDecimals, tickSizeDecimals } = currentMarketConfigs || {};
|
const { stepSizeDecimals, tickSizeDecimals } = currentMarketConfigs || {};
|
||||||
const { id } = currentMarketAssetData || {};
|
const { symbol } = currentMarketAssetData || {};
|
||||||
const { type: dialogType } = activeDialog || {};
|
const { type: dialogType } = activeDialog || {};
|
||||||
const { type: tradeBoxDialogType } = activeTradeBoxDialog || {};
|
const { type: tradeBoxDialogType } = activeTradeBoxDialog || {};
|
||||||
|
|
||||||
@@ -188,7 +188,7 @@ export const PositionInfo = ({ showNarrowVariation }: { showNarrowVariation?: bo
|
|||||||
label: STRING_KEYS.LIQUIDATION_PRICE,
|
label: STRING_KEYS.LIQUIDATION_PRICE,
|
||||||
tooltip: 'liquidation-price',
|
tooltip: 'liquidation-price',
|
||||||
tooltipParams: {
|
tooltipParams: {
|
||||||
SYMBOL: id || '',
|
SYMBOL: symbol || '',
|
||||||
},
|
},
|
||||||
fractionDigits: tickSizeDecimals,
|
fractionDigits: tickSizeDecimals,
|
||||||
hasInvalidNewValue: Boolean(newLeverageIsInvalid),
|
hasInvalidNewValue: Boolean(newLeverageIsInvalid),
|
||||||
@@ -326,7 +326,7 @@ export const PositionInfo = ({ showNarrowVariation }: { showNarrowVariation?: bo
|
|||||||
notionalTotal={notionalTotal?.current}
|
notionalTotal={notionalTotal?.current}
|
||||||
postOrderSize={size?.postOrder}
|
postOrderSize={size?.postOrder}
|
||||||
stepSizeDecimals={stepSizeDecimals}
|
stepSizeDecimals={stepSizeDecimals}
|
||||||
symbol={id || undefined}
|
symbol={symbol || undefined}
|
||||||
tickSizeDecimals={tickSizeDecimals}
|
tickSizeDecimals={tickSizeDecimals}
|
||||||
showNarrowVariation={showNarrowVariation}
|
showNarrowVariation={showNarrowVariation}
|
||||||
isLoading={isLoading}
|
isLoading={isLoading}
|
||||||
@@ -370,7 +370,7 @@ export const PositionInfo = ({ showNarrowVariation }: { showNarrowVariation?: bo
|
|||||||
notionalTotal={notionalTotal?.current}
|
notionalTotal={notionalTotal?.current}
|
||||||
postOrderSize={size?.postOrder}
|
postOrderSize={size?.postOrder}
|
||||||
stepSizeDecimals={stepSizeDecimals}
|
stepSizeDecimals={stepSizeDecimals}
|
||||||
symbol={id || undefined}
|
symbol={symbol || undefined}
|
||||||
tickSizeDecimals={tickSizeDecimals}
|
tickSizeDecimals={tickSizeDecimals}
|
||||||
isLoading={isLoading}
|
isLoading={isLoading}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -53,15 +53,6 @@ export const TransferStatusToast = ({
|
|||||||
|
|
||||||
if (!status) return <LoadingDots size={3} />;
|
if (!status) return <LoadingDots size={3} />;
|
||||||
|
|
||||||
const statusString =
|
|
||||||
type === 'deposit'
|
|
||||||
? status?.squidTransactionStatus === 'success'
|
|
||||||
? STRING_KEYS.DEPOSIT_COMPLETE
|
|
||||||
: STRING_KEYS.DEPOSIT_STATUS
|
|
||||||
: status?.squidTransactionStatus === 'success'
|
|
||||||
? STRING_KEYS.WITHDRAW_COMPLETE
|
|
||||||
: STRING_KEYS.WITHDRAW_STATUS;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Styled.Root open={open} onOpenChange={setOpen}>
|
<Styled.Root open={open} onOpenChange={setOpen}>
|
||||||
<WithReceipt
|
<WithReceipt
|
||||||
@@ -76,7 +67,7 @@ export const TransferStatusToast = ({
|
|||||||
<Styled.BridgingStatus>
|
<Styled.BridgingStatus>
|
||||||
<Styled.Status>
|
<Styled.Status>
|
||||||
{stringGetter({
|
{stringGetter({
|
||||||
key: statusString,
|
key: type === 'deposit' ? STRING_KEYS.DEPOSIT_STATUS : STRING_KEYS.WITHDRAW_STATUS,
|
||||||
params: {
|
params: {
|
||||||
AMOUNT_USD: <Styled.InlineOutput type={OutputType.Fiat} value={toAmount} />,
|
AMOUNT_USD: <Styled.InlineOutput type={OutputType.Fiat} value={toAmount} />,
|
||||||
ESTIMATED_DURATION: (
|
ESTIMATED_DURATION: (
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ export const TransferStatusSteps = ({ status }: ElementProps) => {
|
|||||||
label: stringGetter({
|
label: stringGetter({
|
||||||
key: type === 'deposit' ? STRING_KEYS.DEPOSIT_TO_CHAIN : STRING_KEYS.WITHDRAW_TO_CHAIN,
|
key: type === 'deposit' ? STRING_KEYS.DEPOSIT_TO_CHAIN : STRING_KEYS.WITHDRAW_TO_CHAIN,
|
||||||
params: {
|
params: {
|
||||||
CHAIN: type === 'deposit' ? 'dYdX' : status?.toChain?.chainData?.chainName,
|
CHAIN: status?.toChain?.chainData?.chainName,
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
step: TransferStatusStep.ToChain,
|
step: TransferStatusStep.ToChain,
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ export const DepthChart = ({
|
|||||||
// Chart data
|
// Chart data
|
||||||
|
|
||||||
const orderbook = useSelector(getCurrentMarketOrderbook, shallowEqual);
|
const orderbook = useSelector(getCurrentMarketOrderbook, shallowEqual);
|
||||||
const { id = '' } = useSelector(getCurrentMarketAssetData, shallowEqual) ?? {};
|
const { symbol = '' } = useSelector(getCurrentMarketAssetData, shallowEqual) ?? {};
|
||||||
const { stepSizeDecimals, tickSizeDecimals } =
|
const { stepSizeDecimals, tickSizeDecimals } =
|
||||||
useSelector(getCurrentMarketConfig, shallowEqual) ?? {};
|
useSelector(getCurrentMarketConfig, shallowEqual) ?? {};
|
||||||
|
|
||||||
@@ -393,7 +393,7 @@ export const DepthChart = ({
|
|||||||
? chartPointAtPointer.size
|
? chartPointAtPointer.size
|
||||||
: tooltipData!.nearestDatum?.datum.depth
|
: tooltipData!.nearestDatum?.datum.depth
|
||||||
}
|
}
|
||||||
tag={id}
|
tag={symbol}
|
||||||
accentColor={
|
accentColor={
|
||||||
{
|
{
|
||||||
[DepthChartSeries.Asks]: 'var(--color-negative)',
|
[DepthChartSeries.Asks]: 'var(--color-negative)',
|
||||||
@@ -476,7 +476,7 @@ export const DepthChart = ({
|
|||||||
type={OutputType.Asset}
|
type={OutputType.Asset}
|
||||||
value={chartPointAtPointer.size}
|
value={chartPointAtPointer.size}
|
||||||
fractionDigits={stepSizeDecimals}
|
fractionDigits={stepSizeDecimals}
|
||||||
tag={id}
|
tag={symbol}
|
||||||
useGrouping={false}
|
useGrouping={false}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
@@ -543,7 +543,7 @@ export const DepthChart = ({
|
|||||||
type={OutputType.Asset}
|
type={OutputType.Asset}
|
||||||
value={nearestDatum?.datum.depth}
|
value={nearestDatum?.datum.depth}
|
||||||
fractionDigits={stepSizeDecimals}
|
fractionDigits={stepSizeDecimals}
|
||||||
tag={id}
|
tag={symbol}
|
||||||
useGrouping={false}
|
useGrouping={false}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ type ElementProps = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const ClosePositionDialog = ({ setIsOpen }: ElementProps) => {
|
export const ClosePositionDialog = ({ setIsOpen }: ElementProps) => {
|
||||||
const { id } = useSelector(getCurrentMarketAssetData, shallowEqual) ?? {};
|
const { symbol } = useSelector(getCurrentMarketAssetData, shallowEqual) ?? {};
|
||||||
const { isTablet } = useBreakpoints();
|
const { isTablet } = useBreakpoints();
|
||||||
const stringGetter = useStringGetter();
|
const stringGetter = useStringGetter();
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ export const ClosePositionDialog = ({ setIsOpen }: ElementProps) => {
|
|||||||
} = {
|
} = {
|
||||||
[MobilePlaceOrderSteps.EditOrder]: {
|
[MobilePlaceOrderSteps.EditOrder]: {
|
||||||
title: <CloseOrderHeader />,
|
title: <CloseOrderHeader />,
|
||||||
slotIcon: <AssetIcon symbol={id} />,
|
slotIcon: <AssetIcon symbol={symbol} />,
|
||||||
},
|
},
|
||||||
[MobilePlaceOrderSteps.PreviewOrder]: {
|
[MobilePlaceOrderSteps.PreviewOrder]: {
|
||||||
title: (
|
title: (
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import { MustBigNumber } from '@/lib/numbers';
|
|||||||
|
|
||||||
type ElementProps = {
|
type ElementProps = {
|
||||||
fillId: string;
|
fillId: string;
|
||||||
setIsOpen: (open: boolean) => void;
|
setIsOpen?: (open: boolean) => void;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const FillDetailsDialog = ({ fillId, setIsOpen }: ElementProps) => {
|
export const FillDetailsDialog = ({ fillId, setIsOpen }: ElementProps) => {
|
||||||
@@ -94,7 +94,7 @@ export const FillDetailsDialog = ({ fillId, setIsOpen }: ElementProps) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<DetailsDialog
|
<DetailsDialog
|
||||||
slotIcon={<Styled.AssetIcon symbol={asset.id} />}
|
slotIcon={<Styled.AssetIcon symbol={asset.symbol} />}
|
||||||
title={resources.typeStringKey && stringGetter({ key: resources.typeStringKey })}
|
title={resources.typeStringKey && stringGetter({ key: resources.typeStringKey })}
|
||||||
items={detailItems}
|
items={detailItems}
|
||||||
setIsOpen={setIsOpen}
|
setIsOpen={setIsOpen}
|
||||||
|
|||||||
@@ -194,7 +194,7 @@ export const OrderDetailsDialog = ({ orderId, setIsOpen }: ElementProps) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<DetailsDialog
|
<DetailsDialog
|
||||||
slotIcon={<Styled.AssetIcon symbol={asset.id} />}
|
slotIcon={<Styled.AssetIcon symbol={asset.symbol} />}
|
||||||
title={!resources.typeStringKey ? '' : stringGetter({ key: resources.typeStringKey })}
|
title={!resources.typeStringKey ? '' : stringGetter({ key: resources.typeStringKey })}
|
||||||
slotFooter={
|
slotFooter={
|
||||||
isAccountViewOnly ? null : isOrderStatusClearable(status) ? (
|
isAccountViewOnly ? null : isOrderStatusClearable(status) ? (
|
||||||
|
|||||||
@@ -1,107 +0,0 @@
|
|||||||
import styled, { type AnyStyledComponent } from 'styled-components';
|
|
||||||
|
|
||||||
import { ButtonAction, ButtonSize, ButtonType } from '@/constants/buttons';
|
|
||||||
import { STRING_KEYS } from '@/constants/localization';
|
|
||||||
import { useBreakpoints, useStringGetter } from '@/hooks';
|
|
||||||
|
|
||||||
import { Button } from '@/components/Button';
|
|
||||||
import { Dialog, DialogPlacement } from '@/components/Dialog';
|
|
||||||
import { IconName } from '@/components/Icon';
|
|
||||||
import { IconButton } from '@/components/IconButton';
|
|
||||||
|
|
||||||
import { layoutMixins } from '@/styles/layoutMixins';
|
|
||||||
|
|
||||||
type ElementProps = {
|
|
||||||
setIsOpen: (open: boolean) => void;
|
|
||||||
};
|
|
||||||
|
|
||||||
// TODO: replace placeholder URL with real URLs when avaialble
|
|
||||||
const KEPLR_DASHBOARD_URL = 'https://testnet.keplr.app/';
|
|
||||||
const HELP_URL = 'https://help.dydx.exchange/en/articles/2921366-how-do-i-create-an-account-or-sign-up';
|
|
||||||
|
|
||||||
export const ExternalNavKeplrDialog = ({ setIsOpen }: ElementProps) => {
|
|
||||||
const stringGetter = useStringGetter();
|
|
||||||
const { isTablet } = useBreakpoints();
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Dialog
|
|
||||||
isOpen
|
|
||||||
setIsOpen={setIsOpen}
|
|
||||||
title={stringGetter({ key: STRING_KEYS.HAVE_YOU_EXPORTED })}
|
|
||||||
placement={isTablet ? DialogPlacement.FullScreen : DialogPlacement.Default}
|
|
||||||
>
|
|
||||||
<Styled.Content>
|
|
||||||
<Styled.Button type={ButtonType.Link} size={ButtonSize.XLarge} href={KEPLR_DASHBOARD_URL}>
|
|
||||||
<span>
|
|
||||||
{stringGetter({
|
|
||||||
key: STRING_KEYS.NAVIGATE_TO_KEPLR,
|
|
||||||
params: {
|
|
||||||
STRONG_YES: <strong>{stringGetter({ key: STRING_KEYS.YES })}</strong>,
|
|
||||||
},
|
|
||||||
})}
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<Styled.IconButton
|
|
||||||
action={ButtonAction.Base}
|
|
||||||
iconName={IconName.Arrow}
|
|
||||||
size={ButtonSize.XSmall}
|
|
||||||
/>
|
|
||||||
</Styled.Button>
|
|
||||||
|
|
||||||
<Styled.Button type={ButtonType.Link} size={ButtonSize.XLarge} href={HELP_URL}>
|
|
||||||
<span>
|
|
||||||
{stringGetter({
|
|
||||||
key: STRING_KEYS.LEARN_TO_EXPORT,
|
|
||||||
params: {
|
|
||||||
STRONG_NO: <strong>{stringGetter({ key: STRING_KEYS.NO })}</strong>,
|
|
||||||
},
|
|
||||||
})}
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<Styled.IconButton
|
|
||||||
action={ButtonAction.Base}
|
|
||||||
iconName={IconName.Arrow}
|
|
||||||
size={ButtonSize.XSmall}
|
|
||||||
/>
|
|
||||||
</Styled.Button>
|
|
||||||
</Styled.Content>
|
|
||||||
</Dialog>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const Styled: Record<string, AnyStyledComponent> = {};
|
|
||||||
|
|
||||||
Styled.TextToggle = styled.div`
|
|
||||||
${layoutMixins.stickyFooter}
|
|
||||||
color: var(--color-accent);
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
margin-top: auto;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.Content = styled.div`
|
|
||||||
${layoutMixins.stickyArea0}
|
|
||||||
--stickyArea0-bottomHeight: 2rem;
|
|
||||||
--stickyArea0-bottomGap: 1rem;
|
|
||||||
--stickyArea0-totalInsetBottom: 0.5rem;
|
|
||||||
|
|
||||||
${layoutMixins.flexColumn}
|
|
||||||
gap: 1rem;
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.Button = styled(Button)`
|
|
||||||
--button-font: var(--font-base-book);
|
|
||||||
--button-padding: 0 1.5rem;
|
|
||||||
|
|
||||||
gap: 0;
|
|
||||||
|
|
||||||
justify-content: space-between;
|
|
||||||
`;
|
|
||||||
|
|
||||||
Styled.IconButton = styled(IconButton)`
|
|
||||||
color: var(--color-text-0);
|
|
||||||
`;
|
|
||||||
@@ -9,8 +9,8 @@ import { AlertType } from '@/constants/alerts';
|
|||||||
import { AnalyticsEvent } from '@/constants/analytics';
|
import { AnalyticsEvent } from '@/constants/analytics';
|
||||||
import { ButtonAction } from '@/constants/buttons';
|
import { ButtonAction } from '@/constants/buttons';
|
||||||
import { STRING_KEYS } from '@/constants/localization';
|
import { STRING_KEYS } from '@/constants/localization';
|
||||||
import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks';
|
import { CLIENT_NETWORK_CONFIGS } from '@/constants/networks';
|
||||||
import { DydxAddress, getSignTypedData } from '@/constants/wallets';
|
import { DydxAddress, SIGN_TYPED_DATA } from '@/constants/wallets';
|
||||||
|
|
||||||
import { useAccounts, useBreakpoints, useDydxClient, useStringGetter } from '@/hooks';
|
import { useAccounts, useBreakpoints, useDydxClient, useStringGetter } from '@/hooks';
|
||||||
import { useMatchingEvmNetwork } from '@/hooks/useMatchingEvmNetwork';
|
import { useMatchingEvmNetwork } from '@/hooks/useMatchingEvmNetwork';
|
||||||
@@ -55,7 +55,7 @@ export const GenerateKeys = ({
|
|||||||
// 1. Switch network
|
// 1. Switch network
|
||||||
const selectedNetwork = useSelector(getSelectedNetwork);
|
const selectedNetwork = useSelector(getSelectedNetwork);
|
||||||
|
|
||||||
const chainId = Number(ENVIRONMENT_CONFIG_MAP[selectedNetwork].ethereumChainId);
|
const chainId = Number(CLIENT_NETWORK_CONFIGS[selectedNetwork].ethereumChainId);
|
||||||
|
|
||||||
const { isMatchingNetwork, matchNetwork, isSwitchingNetwork } = useMatchingEvmNetwork({
|
const { isMatchingNetwork, matchNetwork, isSwitchingNetwork } = useMatchingEvmNetwork({
|
||||||
chainId,
|
chainId,
|
||||||
@@ -85,11 +85,10 @@ export const GenerateKeys = ({
|
|||||||
EvmDerivedAccountStatus.Derived,
|
EvmDerivedAccountStatus.Derived,
|
||||||
].includes(status);
|
].includes(status);
|
||||||
|
|
||||||
const signTypedData = getSignTypedData(selectedNetwork);
|
|
||||||
const { signTypedDataAsync } = useSignTypedData({
|
const { signTypedDataAsync } = useSignTypedData({
|
||||||
...signTypedData,
|
...SIGN_TYPED_DATA,
|
||||||
domain: {
|
domain: {
|
||||||
...signTypedData.domain,
|
...SIGN_TYPED_DATA.domain,
|
||||||
chainId,
|
chainId,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -166,8 +165,8 @@ export const GenerateKeys = ({
|
|||||||
{[
|
{[
|
||||||
{
|
{
|
||||||
status: EvmDerivedAccountStatus.Deriving,
|
status: EvmDerivedAccountStatus.Deriving,
|
||||||
title: stringGetter({ key: STRING_KEYS.GENERATE_DYDX_WALLET }),
|
title: stringGetter({ key: STRING_KEYS.GENERATE_COSMOS_WALLET }),
|
||||||
description: stringGetter({ key: STRING_KEYS.VERIFY_WALLET_OWNERSHIP }),
|
description: stringGetter({ key: STRING_KEYS.GENERATE_COSMOS_WALLET }),
|
||||||
},
|
},
|
||||||
status === EvmDerivedAccountStatus.EnsuringDeterminism && {
|
status === EvmDerivedAccountStatus.EnsuringDeterminism && {
|
||||||
status: EvmDerivedAccountStatus.EnsuringDeterminism,
|
status: EvmDerivedAccountStatus.EnsuringDeterminism,
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { shallowEqual, useSelector } from 'react-redux';
|
|||||||
import styled, { AnyStyledComponent, css } from 'styled-components';
|
import styled, { AnyStyledComponent, css } from 'styled-components';
|
||||||
|
|
||||||
import { TradeInputField } from '@/constants/abacus';
|
import { TradeInputField } from '@/constants/abacus';
|
||||||
import { STRING_KEYS, StringKey } from '@/constants/localization';
|
import { STRING_KEYS } from '@/constants/localization';
|
||||||
import { TradeTypes, TRADE_TYPE_STRINGS, MobilePlaceOrderSteps } from '@/constants/trade';
|
import { TradeTypes, TRADE_TYPE_STRINGS, MobilePlaceOrderSteps } from '@/constants/trade';
|
||||||
|
|
||||||
import { useBreakpoints, useStringGetter } from '@/hooks';
|
import { useBreakpoints, useStringGetter } from '@/hooks';
|
||||||
@@ -31,7 +31,7 @@ type ElementProps = {
|
|||||||
export const TradeDialog = ({ isOpen, setIsOpen, slotTrigger }: ElementProps) => {
|
export const TradeDialog = ({ isOpen, setIsOpen, slotTrigger }: ElementProps) => {
|
||||||
const { isMobile } = useBreakpoints();
|
const { isMobile } = useBreakpoints();
|
||||||
const stringGetter = useStringGetter();
|
const stringGetter = useStringGetter();
|
||||||
const { id } = useSelector(getCurrentMarketAssetData, shallowEqual) ?? {};
|
const { symbol } = useSelector(getCurrentMarketAssetData, shallowEqual) ?? {};
|
||||||
const currentTradeData = useSelector(getInputTradeData, shallowEqual);
|
const currentTradeData = useSelector(getInputTradeData, shallowEqual);
|
||||||
const { type } = currentTradeData || {};
|
const { type } = currentTradeData || {};
|
||||||
const selectedTradeType = getSelectedTradeType(type);
|
const selectedTradeType = getSelectedTradeType(type);
|
||||||
@@ -40,9 +40,9 @@ export const TradeDialog = ({ isOpen, setIsOpen, slotTrigger }: ElementProps) =>
|
|||||||
const allTradeTypeItems = typeOptions?.toArray()?.map(({ type, stringKey }) => ({
|
const allTradeTypeItems = typeOptions?.toArray()?.map(({ type, stringKey }) => ({
|
||||||
value: type,
|
value: type,
|
||||||
label: stringGetter({
|
label: stringGetter({
|
||||||
key: stringKey as StringKey,
|
key: stringKey,
|
||||||
}),
|
}),
|
||||||
slotBefore: <AssetIcon symbol={id} />,
|
slotBefore: <AssetIcon symbol={symbol} />,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const [currentStep, setCurrentStep] = useState<MobilePlaceOrderSteps>(
|
const [currentStep, setCurrentStep] = useState<MobilePlaceOrderSteps>(
|
||||||
|
|||||||
@@ -217,6 +217,7 @@ export const DepositForm = ({ onDeposit, onError }: DepositFormProps) => {
|
|||||||
!requestPayload.data ||
|
!requestPayload.data ||
|
||||||
!requestPayload.value ||
|
!requestPayload.value ||
|
||||||
!requestPayload.gasLimit ||
|
!requestPayload.gasLimit ||
|
||||||
|
!requestPayload.gasPrice ||
|
||||||
!requestPayload.routeType
|
!requestPayload.routeType
|
||||||
) {
|
) {
|
||||||
throw new Error('Missing request payload');
|
throw new Error('Missing request payload');
|
||||||
|
|||||||
@@ -168,19 +168,6 @@ export const DepositButtonAndReceipt = ({
|
|||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
|
||||||
key: 'estimatedRouteDuration',
|
|
||||||
label: <span>{stringGetter({ key: STRING_KEYS.ESTIMATED_TIME })}</span>,
|
|
||||||
value: typeof summary?.estimatedRouteDuration === 'number' && (
|
|
||||||
<Output
|
|
||||||
type={OutputType.Text}
|
|
||||||
value={stringGetter({
|
|
||||||
key: STRING_KEYS.X_MINUTES_LOWERCASED,
|
|
||||||
params: { X: Math.round(summary?.estimatedRouteDuration / 60) },
|
|
||||||
})}
|
|
||||||
/>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const isFormValid = !isDisabled && !isEditingSlippage;
|
const isFormValid = !isDisabled && !isEditingSlippage;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import styled, { type AnyStyledComponent } from 'styled-components';
|
|||||||
|
|
||||||
import { ButtonAction, ButtonType } from '@/constants/buttons';
|
import { ButtonAction, ButtonType } from '@/constants/buttons';
|
||||||
import { STRING_KEYS } from '@/constants/localization';
|
import { STRING_KEYS } from '@/constants/localization';
|
||||||
import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks';
|
import { CLIENT_NETWORK_CONFIGS } from '@/constants/networks';
|
||||||
import { useAccounts, useStringGetter, useSubaccount } from '@/hooks';
|
import { useAccounts, useStringGetter, useSubaccount } from '@/hooks';
|
||||||
import { layoutMixins } from '@/styles/layoutMixins';
|
import { layoutMixins } from '@/styles/layoutMixins';
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ export const TestnetDepositForm = ({ onDeposit, onError }: DepositFormProps) =>
|
|||||||
key: STRING_KEYS.CREDITED_WITH,
|
key: STRING_KEYS.CREDITED_WITH,
|
||||||
params: {
|
params: {
|
||||||
AMOUNT_USD:
|
AMOUNT_USD:
|
||||||
ENVIRONMENT_CONFIG_MAP[selectedNetwork].ethereumChainId === 'dydxprotocol-testnet'
|
CLIENT_NETWORK_CONFIGS[selectedNetwork].ethereumChainId === 'dydxprotocol-testnet'
|
||||||
? 1000
|
? 1000
|
||||||
: 100,
|
: 100,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import styled, { type AnyStyledComponent } from 'styled-components';
|
|||||||
import type { NumberFormatValues } from 'react-number-format';
|
import type { NumberFormatValues } from 'react-number-format';
|
||||||
import { shallowEqual, useSelector } from 'react-redux';
|
import { shallowEqual, useSelector } from 'react-redux';
|
||||||
import { TESTNET_CHAIN_ID } from '@dydxprotocol/v4-client-js';
|
import { TESTNET_CHAIN_ID } from '@dydxprotocol/v4-client-js';
|
||||||
import { isAddress } from 'viem';
|
|
||||||
|
|
||||||
import { TransferInputField, TransferInputTokenResource, TransferType } from '@/constants/abacus';
|
import { TransferInputField, TransferInputTokenResource, TransferType } from '@/constants/abacus';
|
||||||
import { AlertType } from '@/constants/alerts';
|
import { AlertType } from '@/constants/alerts';
|
||||||
@@ -27,7 +26,6 @@ import { Link } from '@/components/Link';
|
|||||||
import { OutputType } from '@/components/Output';
|
import { OutputType } from '@/components/Output';
|
||||||
import { Tag } from '@/components/Tag';
|
import { Tag } from '@/components/Tag';
|
||||||
import { WithDetailsReceipt } from '@/components/WithDetailsReceipt';
|
import { WithDetailsReceipt } from '@/components/WithDetailsReceipt';
|
||||||
import { Icon, IconName } from '@/components/Icon';
|
|
||||||
|
|
||||||
import { ChainSelectMenu } from '@/views/forms/AccountManagementForms/ChainSelectMenu';
|
import { ChainSelectMenu } from '@/views/forms/AccountManagementForms/ChainSelectMenu';
|
||||||
|
|
||||||
@@ -61,8 +59,6 @@ export const WithdrawForm = () => {
|
|||||||
resources,
|
resources,
|
||||||
} = useSelector(getTransferInputs, shallowEqual) || {};
|
} = useSelector(getTransferInputs, shallowEqual) || {};
|
||||||
|
|
||||||
const isValidAddress = toAddress && isAddress(toAddress);
|
|
||||||
|
|
||||||
const toToken = useMemo(
|
const toToken = useMemo(
|
||||||
() => (token ? resources?.tokenResources?.get(token) : undefined),
|
() => (token ? resources?.tokenResources?.get(token) : undefined),
|
||||||
[token, resources]
|
[token, resources]
|
||||||
@@ -183,6 +179,7 @@ export const WithdrawForm = () => {
|
|||||||
|
|
||||||
const onSelectChain = useCallback((chain: string) => {
|
const onSelectChain = useCallback((chain: string) => {
|
||||||
if (chain) {
|
if (chain) {
|
||||||
|
abacusStateManager.clearTransferInputValues();
|
||||||
abacusStateManager.setTransferValue({
|
abacusStateManager.setTransferValue({
|
||||||
field: TransferInputField.chain,
|
field: TransferInputField.chain,
|
||||||
value: chain,
|
value: chain,
|
||||||
@@ -193,6 +190,7 @@ export const WithdrawForm = () => {
|
|||||||
|
|
||||||
const onSelectToken = useCallback((token: TransferInputTokenResource) => {
|
const onSelectToken = useCallback((token: TransferInputTokenResource) => {
|
||||||
if (token) {
|
if (token) {
|
||||||
|
abacusStateManager.clearTransferInputValues();
|
||||||
abacusStateManager.setTransferValue({
|
abacusStateManager.setTransferValue({
|
||||||
field: TransferInputField.token,
|
field: TransferInputField.token,
|
||||||
value: token.address,
|
value: token.address,
|
||||||
@@ -267,12 +265,7 @@ export const WithdrawForm = () => {
|
|||||||
placeholder={stringGetter({ key: STRING_KEYS.ADDRESS })}
|
placeholder={stringGetter({ key: STRING_KEYS.ADDRESS })}
|
||||||
onChange={onChangeAddress}
|
onChange={onChangeAddress}
|
||||||
value={toAddress || ''}
|
value={toAddress || ''}
|
||||||
label={
|
label={stringGetter({ key: STRING_KEYS.DESTINATION })}
|
||||||
<span>
|
|
||||||
{stringGetter({ key: STRING_KEYS.DESTINATION })}{' '}
|
|
||||||
{isValidAddress ? <Styled.CheckIcon iconName={IconName.Check} /> : null}
|
|
||||||
</span>
|
|
||||||
}
|
|
||||||
/>
|
/>
|
||||||
<ChainSelectMenu
|
<ChainSelectMenu
|
||||||
label={stringGetter({ key: STRING_KEYS.NETWORK })}
|
label={stringGetter({ key: STRING_KEYS.NETWORK })}
|
||||||
@@ -349,10 +342,3 @@ Styled.TransactionInfo = styled.span`
|
|||||||
Styled.FormInputButton = styled(Button)`
|
Styled.FormInputButton = styled(Button)`
|
||||||
${formMixins.inputInnerButton}
|
${formMixins.inputInnerButton}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
Styled.CheckIcon = styled(Icon)`
|
|
||||||
margin: 0 1ch;
|
|
||||||
|
|
||||||
color: var(--color-positive);
|
|
||||||
font-size: 0.625rem;
|
|
||||||
`;
|
|
||||||
|
|||||||
@@ -1,19 +1,14 @@
|
|||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { shallowEqual, useSelector } from 'react-redux';
|
import { shallowEqual, useSelector } from 'react-redux';
|
||||||
import styled, { type AnyStyledComponent } from 'styled-components';
|
import styled, { type AnyStyledComponent } from 'styled-components';
|
||||||
import { formatUnits } from 'viem';
|
|
||||||
|
|
||||||
import { TransferInputTokenResource } from '@/constants/abacus';
|
import { TransferInputTokenResource } from '@/constants/abacus';
|
||||||
import { ButtonAction, ButtonShape, ButtonSize, ButtonType } from '@/constants/buttons';
|
import { ButtonAction, ButtonShape, ButtonSize, ButtonType } from '@/constants/buttons';
|
||||||
import { STRING_KEYS } from '@/constants/localization';
|
import { STRING_KEYS } from '@/constants/localization';
|
||||||
import { NumberSign } from '@/constants/numbers';
|
import { NumberSign } from '@/constants/numbers';
|
||||||
|
|
||||||
import { formatSeconds } from '@/lib/timeUtils';
|
|
||||||
|
|
||||||
import { layoutMixins } from '@/styles/layoutMixins';
|
|
||||||
|
|
||||||
import { useStringGetter } from '@/hooks';
|
import { useStringGetter } from '@/hooks';
|
||||||
import { useAccountBalance } from '@/hooks/useAccountBalance';
|
import { useAccountBalance } from '@/hooks/useAccountBalance';
|
||||||
|
import { layoutMixins } from '@/styles/layoutMixins';
|
||||||
|
|
||||||
import { Button } from '@/components/Button';
|
import { Button } from '@/components/Button';
|
||||||
|
|
||||||
@@ -21,7 +16,6 @@ import { Details, DetailsItem } from '@/components/Details';
|
|||||||
import { DiffOutput } from '@/components/DiffOutput';
|
import { DiffOutput } from '@/components/DiffOutput';
|
||||||
import { Icon, IconName } from '@/components/Icon';
|
import { Icon, IconName } from '@/components/Icon';
|
||||||
import { Output, OutputType } from '@/components/Output';
|
import { Output, OutputType } from '@/components/Output';
|
||||||
import { Tag } from '@/components/Tag';
|
|
||||||
import { ToggleButton } from '@/components/ToggleButton';
|
import { ToggleButton } from '@/components/ToggleButton';
|
||||||
import { WithReceipt } from '@/components/WithReceipt';
|
import { WithReceipt } from '@/components/WithReceipt';
|
||||||
|
|
||||||
@@ -55,14 +49,22 @@ export const WithdrawButtonAndReceipt = ({
|
|||||||
const [isEditingSlippage, setIsEditingSlipapge] = useState(false);
|
const [isEditingSlippage, setIsEditingSlipapge] = useState(false);
|
||||||
const stringGetter = useStringGetter();
|
const stringGetter = useStringGetter();
|
||||||
|
|
||||||
|
// TODO: uncomment when we have a way to get token amount estimate from abacus
|
||||||
|
// const { balance, queryStatus } = useAccountBalance({
|
||||||
|
// addressOrDenom: withdrawToken?.address || undefined,
|
||||||
|
// assetSymbol: withdrawToken?.symbol || undefined,
|
||||||
|
// chainId: withdrawChain ? parseInt(withdrawChain) : undefined,
|
||||||
|
// decimals: withdrawToken?.decimals || undefined,
|
||||||
|
// isCosmosChain: false,
|
||||||
|
// });
|
||||||
|
|
||||||
|
// const balanceBN = MustBigNumber(balance);
|
||||||
|
// const newBalance =
|
||||||
|
// // toAmountMin && withdrawToken && parseUnits(toAmountMin, withdrawToken.decimals).toString();
|
||||||
|
|
||||||
const { leverage } = useSelector(getSubaccount, shallowEqual) || {};
|
const { leverage } = useSelector(getSubaccount, shallowEqual) || {};
|
||||||
const { summary, requestPayload } = useSelector(getTransferInputs, shallowEqual) || {};
|
const { summary, requestPayload } = useSelector(getTransferInputs, shallowEqual) || {};
|
||||||
|
|
||||||
const toAmount =
|
|
||||||
summary?.toAmount &&
|
|
||||||
withdrawToken?.decimals &&
|
|
||||||
formatUnits(BigInt(summary.toAmount), withdrawToken?.decimals);
|
|
||||||
|
|
||||||
const feeSubitems: DetailsItem[] = [];
|
const feeSubitems: DetailsItem[] = [];
|
||||||
|
|
||||||
if (typeof summary?.gasFee === 'number') {
|
if (typeof summary?.gasFee === 'number') {
|
||||||
@@ -96,27 +98,9 @@ export const WithdrawButtonAndReceipt = ({
|
|||||||
),
|
),
|
||||||
subitems: feeSubitems,
|
subitems: feeSubitems,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
key: 'wallet',
|
|
||||||
label: (
|
|
||||||
<span>
|
|
||||||
{stringGetter({ key: STRING_KEYS.AMOUNT_RECEIVED })}{' '}
|
|
||||||
{withdrawToken && <Tag>{withdrawToken?.symbol}</Tag>}
|
|
||||||
</span>
|
|
||||||
),
|
|
||||||
value: (
|
|
||||||
<Styled.DiffOutput
|
|
||||||
type={OutputType.Asset}
|
|
||||||
value={'0'}
|
|
||||||
newValue={toAmount}
|
|
||||||
sign={NumberSign.Positive}
|
|
||||||
withDiff={Boolean(toAmount)}
|
|
||||||
/>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
key: 'leverage',
|
key: 'leverage',
|
||||||
label: <span>{stringGetter({ key: STRING_KEYS.ACCOUNT_LEVERAGE })}</span>,
|
label: <span>{stringGetter({ key: STRING_KEYS.LEVERAGE })}</span>,
|
||||||
value: (
|
value: (
|
||||||
<Styled.DiffOutput
|
<Styled.DiffOutput
|
||||||
type={OutputType.Multiple}
|
type={OutputType.Multiple}
|
||||||
@@ -153,19 +137,25 @@ export const WithdrawButtonAndReceipt = ({
|
|||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
// TODO: uncomment when we have a way to get token amount estimate from abacus
|
||||||
key: 'estimatedRouteDuration',
|
// {
|
||||||
label: <span>{stringGetter({ key: STRING_KEYS.ESTIMATED_TIME })}</span>,
|
// key: 'wallet',
|
||||||
value: typeof summary?.estimatedRouteDuration === 'number' && (
|
// label: (
|
||||||
<Output
|
// <span>
|
||||||
type={OutputType.Text}
|
// {stringGetter({ key: STRING_KEYS.WALLET })}{' '}
|
||||||
value={stringGetter({
|
// {withdrawToken && <Tag>{withdrawToken?.symbol}</Tag>}
|
||||||
key: STRING_KEYS.X_MINUTES_LOWERCASED,
|
// </span>
|
||||||
params: { X: Math.round(summary?.estimatedRouteDuration / 60) },
|
// ),
|
||||||
})}
|
// value: (
|
||||||
/>
|
// <Styled.DiffOutput
|
||||||
),
|
// type={OutputType.Asset}
|
||||||
},
|
// value={balanceBN?.toString()}
|
||||||
|
// newValue={newBalance}
|
||||||
|
// sign={NumberSign.Negative}
|
||||||
|
// withDiff={Boolean(balance !== newBalance)}
|
||||||
|
// />
|
||||||
|
// ),
|
||||||
|
// },
|
||||||
];
|
];
|
||||||
|
|
||||||
const isFormValid = !isDisabled && !isEditingSlippage;
|
const isFormValid = !isDisabled && !isEditingSlippage;
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ export const ClosePositionForm = ({
|
|||||||
const { closePosition } = useSubaccount();
|
const { closePosition } = useSubaccount();
|
||||||
|
|
||||||
const market = useSelector(getCurrentMarketId);
|
const market = useSelector(getCurrentMarketId);
|
||||||
const { id } = useSelector(getCurrentMarketAssetData, shallowEqual) || {};
|
const { symbol } = useSelector(getCurrentMarketAssetData, shallowEqual) || {};
|
||||||
const { stepSizeDecimals } = useSelector(getCurrentMarketConfig, shallowEqual) || {};
|
const { stepSizeDecimals } = useSelector(getCurrentMarketConfig, shallowEqual) || {};
|
||||||
const { size: sizeData, summary } = useSelector(getInputClosePositionData, shallowEqual) || {};
|
const { size: sizeData, summary } = useSelector(getInputClosePositionData, shallowEqual) || {};
|
||||||
const { size, percent } = sizeData || {};
|
const { size, percent } = sizeData || {};
|
||||||
@@ -193,7 +193,7 @@ export const ClosePositionForm = ({
|
|||||||
label={
|
label={
|
||||||
<>
|
<>
|
||||||
{stringGetter({ key: STRING_KEYS.AMOUNT })}
|
{stringGetter({ key: STRING_KEYS.AMOUNT })}
|
||||||
{id && <Tag>{id}</Tag>}
|
{symbol && <Tag>{symbol}</Tag>}
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
decimals={stepSizeDecimals || TOKEN_DECIMALS}
|
decimals={stepSizeDecimals || TOKEN_DECIMALS}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { layoutMixins } from '@/styles/layoutMixins';
|
|||||||
import { formMixins } from '@/styles/formMixins';
|
import { formMixins } from '@/styles/formMixins';
|
||||||
|
|
||||||
import { TradeInputField } from '@/constants/abacus';
|
import { TradeInputField } from '@/constants/abacus';
|
||||||
import { STRING_KEYS, StringKey } from '@/constants/localization';
|
import { STRING_KEYS } from '@/constants/localization';
|
||||||
import { INTEGER_DECIMALS } from '@/constants/numbers';
|
import { INTEGER_DECIMALS } from '@/constants/numbers';
|
||||||
import { TimeUnitShort } from '@/constants/time';
|
import { TimeUnitShort } from '@/constants/time';
|
||||||
import { GOOD_TIL_TIME_TIMESCALE_STRINGS } from '@/constants/trade';
|
import { GOOD_TIL_TIME_TIMESCALE_STRINGS } from '@/constants/trade';
|
||||||
@@ -29,12 +29,12 @@ export const AdvancedTradeOptions = () => {
|
|||||||
const currentTradeFormConfig = useSelector(getInputTradeOptions, shallowEqual);
|
const currentTradeFormConfig = useSelector(getInputTradeOptions, shallowEqual);
|
||||||
const inputTradeData = useSelector(getInputTradeData, shallowEqual);
|
const inputTradeData = useSelector(getInputTradeData, shallowEqual);
|
||||||
|
|
||||||
const { execution, goodTil, postOnly, reduceOnly, timeInForce } = inputTradeData || {};
|
const { execution, goodUntil, postOnly, reduceOnly, timeInForce } = inputTradeData || {};
|
||||||
|
|
||||||
const { executionOptions, needsGoodUntil, needsPostOnly, needsReduceOnly, timeInForceOptions } =
|
const { executionOptions, needsGoodUntil, needsPostOnly, needsReduceOnly, timeInForceOptions } =
|
||||||
currentTradeFormConfig || {};
|
currentTradeFormConfig || {};
|
||||||
|
|
||||||
const { duration, unit } = goodTil || {};
|
const { duration, unit } = goodUntil || {};
|
||||||
|
|
||||||
const needsExecution = executionOptions || needsPostOnly || needsReduceOnly;
|
const needsExecution = executionOptions || needsPostOnly || needsReduceOnly;
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ export const AdvancedTradeOptions = () => {
|
|||||||
<Styled.SelectItem
|
<Styled.SelectItem
|
||||||
key={type}
|
key={type}
|
||||||
value={type}
|
value={type}
|
||||||
label={stringGetter({ key: stringKey as StringKey })}
|
label={stringGetter({ key: stringKey })}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</Styled.SelectMenu>
|
</Styled.SelectMenu>
|
||||||
@@ -76,7 +76,7 @@ export const AdvancedTradeOptions = () => {
|
|||||||
onChange={({ value }: NumberFormatValues) => {
|
onChange={({ value }: NumberFormatValues) => {
|
||||||
abacusStateManager.setTradeValue({
|
abacusStateManager.setTradeValue({
|
||||||
value: Number(value),
|
value: Number(value),
|
||||||
field: TradeInputField.goodTilDuration,
|
field: TradeInputField.goodUntilDuration,
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
value={duration ?? ''}
|
value={duration ?? ''}
|
||||||
@@ -86,7 +86,7 @@ export const AdvancedTradeOptions = () => {
|
|||||||
onValueChange={(goodTilTimeTimescale: string) => {
|
onValueChange={(goodTilTimeTimescale: string) => {
|
||||||
abacusStateManager.setTradeValue({
|
abacusStateManager.setTradeValue({
|
||||||
value: goodTilTimeTimescale,
|
value: goodTilTimeTimescale,
|
||||||
field: TradeInputField.goodTilUnit,
|
field: TradeInputField.goodUntilUnit,
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@@ -121,7 +121,7 @@ export const AdvancedTradeOptions = () => {
|
|||||||
<Styled.SelectItem
|
<Styled.SelectItem
|
||||||
key={type}
|
key={type}
|
||||||
value={type}
|
value={type}
|
||||||
label={stringGetter({ key: stringKey as StringKey })}
|
label={stringGetter({ key: stringKey })}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</Styled.SelectMenu>
|
</Styled.SelectMenu>
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import { TRADE_TYPE_STRINGS, MobilePlaceOrderSteps } from '@/constants/trade';
|
|||||||
|
|
||||||
import { useStringGetter } from '@/hooks';
|
import { useStringGetter } from '@/hooks';
|
||||||
|
|
||||||
import { AssetIcon } from '@/components/AssetIcon';
|
|
||||||
import { Button } from '@/components/Button';
|
import { Button } from '@/components/Button';
|
||||||
import { Output, OutputType, ShowSign } from '@/components/Output';
|
import { Output, OutputType, ShowSign } from '@/components/Output';
|
||||||
import { WithDetailsReceipt } from '@/components/WithDetailsReceipt';
|
import { WithDetailsReceipt } from '@/components/WithDetailsReceipt';
|
||||||
@@ -63,7 +62,7 @@ export const PlaceOrderButtonAndReceipt = ({
|
|||||||
const selectedTradeType = getSelectedTradeType(type);
|
const selectedTradeType = getSelectedTradeType(type);
|
||||||
const selectedOrderSide = getSelectedOrderSide(side);
|
const selectedOrderSide = getSelectedOrderSide(side);
|
||||||
|
|
||||||
const { fee, price: expectedPrice, total, reward } = summary || {};
|
const { fee, price: expectedPrice, total } = summary || {};
|
||||||
|
|
||||||
const items = [
|
const items = [
|
||||||
{
|
{
|
||||||
@@ -80,17 +79,6 @@ export const PlaceOrderButtonAndReceipt = ({
|
|||||||
label: stringGetter({ key: STRING_KEYS.FEE }),
|
label: stringGetter({ key: STRING_KEYS.FEE }),
|
||||||
value: <Output type={OutputType.Fiat} value={fee} useGrouping />,
|
value: <Output type={OutputType.Fiat} value={fee} useGrouping />,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
key: 'max-reward',
|
|
||||||
label: (
|
|
||||||
<>
|
|
||||||
{stringGetter({ key: STRING_KEYS.MAXIMUM_REWARDS })}
|
|
||||||
{/* <AssetIcon symbol="DYDX" /> */}
|
|
||||||
</>
|
|
||||||
),
|
|
||||||
value: <Output type={OutputType.Asset} value={reward} useGrouping tag={reward ? "Dv4TNT" : ''} />,
|
|
||||||
tooltip: 'max-reward',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
key: 'total',
|
key: 'total',
|
||||||
label: stringGetter({ key: STRING_KEYS.TOTAL }),
|
label: stringGetter({ key: STRING_KEYS.TOTAL }),
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ type ElementProps = {
|
|||||||
export const PositionPreview = ({ showNarrowVariation }: ElementProps) => {
|
export const PositionPreview = ({ showNarrowVariation }: ElementProps) => {
|
||||||
const stringGetter = useStringGetter();
|
const stringGetter = useStringGetter();
|
||||||
|
|
||||||
const { id } = useSelector(getCurrentMarketAssetData, shallowEqual) || {};
|
const { symbol } = useSelector(getCurrentMarketAssetData, shallowEqual) || {};
|
||||||
const { configs, oraclePrice } = useSelector(getCurrentMarketData, shallowEqual) || {};
|
const { configs, oraclePrice } = useSelector(getCurrentMarketData, shallowEqual) || {};
|
||||||
const { size: positionSize } = useSelector(getCurrentMarketPositionData, shallowEqual) || {};
|
const { size: positionSize } = useSelector(getCurrentMarketPositionData, shallowEqual) || {};
|
||||||
const { stepSizeDecimals, tickSizeDecimals } = configs || {};
|
const { stepSizeDecimals, tickSizeDecimals } = configs || {};
|
||||||
@@ -29,12 +29,12 @@ export const PositionPreview = ({ showNarrowVariation }: ElementProps) => {
|
|||||||
return (
|
return (
|
||||||
<Styled.PositionPreviewContainer>
|
<Styled.PositionPreviewContainer>
|
||||||
<Styled.YourPosition>
|
<Styled.YourPosition>
|
||||||
{!showNarrowVariation && <AssetIcon symbol={id} />}
|
{!showNarrowVariation && <AssetIcon symbol={symbol} />}
|
||||||
<span>
|
<span>
|
||||||
{stringGetter({
|
{stringGetter({
|
||||||
key: STRING_KEYS.YOUR_MARKET_POSITION,
|
key: STRING_KEYS.YOUR_MARKET_POSITION,
|
||||||
params: {
|
params: {
|
||||||
MARKET: showNarrowVariation ? '' : <strong>{id ?? ''}</strong>,
|
MARKET: showNarrowVariation ? '' : <strong>{symbol ?? ''}</strong>,
|
||||||
},
|
},
|
||||||
})}
|
})}
|
||||||
</span>
|
</span>
|
||||||
@@ -44,7 +44,7 @@ export const PositionPreview = ({ showNarrowVariation }: ElementProps) => {
|
|||||||
oraclePrice={oraclePrice}
|
oraclePrice={oraclePrice}
|
||||||
postOrderSize={positionSize?.postOrder}
|
postOrderSize={positionSize?.postOrder}
|
||||||
stepSizeDecimals={stepSizeDecimals}
|
stepSizeDecimals={stepSizeDecimals}
|
||||||
symbol={id || undefined}
|
symbol={symbol || undefined}
|
||||||
tickSizeDecimals={tickSizeDecimals}
|
tickSizeDecimals={tickSizeDecimals}
|
||||||
showNarrowVariation={showNarrowVariation}
|
showNarrowVariation={showNarrowVariation}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ export const TradeSizeInputs = () => {
|
|||||||
const stringGetter = useStringGetter();
|
const stringGetter = useStringGetter();
|
||||||
const { isTablet } = useBreakpoints();
|
const { isTablet } = useBreakpoints();
|
||||||
|
|
||||||
const { id } = useSelector(getCurrentMarketAssetData, shallowEqual) || {};
|
const { symbol } = useSelector(getCurrentMarketAssetData, shallowEqual) || {};
|
||||||
const inputTradeSizeData = useSelector(getInputTradeSizeData, shallowEqual);
|
const inputTradeSizeData = useSelector(getInputTradeSizeData, shallowEqual);
|
||||||
const currentTradeInputOptions = useSelector(getInputTradeOptions, shallowEqual);
|
const currentTradeInputOptions = useSelector(getInputTradeOptions, shallowEqual);
|
||||||
|
|
||||||
@@ -94,7 +94,7 @@ export const TradeSizeInputs = () => {
|
|||||||
shape={ButtonShape.Square}
|
shape={ButtonShape.Square}
|
||||||
>
|
>
|
||||||
<Icon iconName={IconName.Trade} />
|
<Icon iconName={IconName.Trade} />
|
||||||
{showUSDCInputOnTablet ? 'USD' : id}
|
{showUSDCInputOnTablet ? 'USD' : symbol}
|
||||||
</Styled.ToggleButton>
|
</Styled.ToggleButton>
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -105,10 +105,10 @@ export const TradeSizeInputs = () => {
|
|||||||
onInput={onSizeInput}
|
onInput={onSizeInput}
|
||||||
label={
|
label={
|
||||||
<>
|
<>
|
||||||
<WithTooltip tooltip="order-amount" stringParams={{ SYMBOL: id ?? '' }} side="right">
|
<WithTooltip tooltip="order-amount" stringParams={{ SYMBOL: symbol ?? '' }} side="right">
|
||||||
{stringGetter({ key: STRING_KEYS.AMOUNT })}
|
{stringGetter({ key: STRING_KEYS.AMOUNT })}
|
||||||
</WithTooltip>
|
</WithTooltip>
|
||||||
{id && <Tag>{id}</Tag>}
|
{symbol && <Tag>{symbol}</Tag>}
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
slotRight={isTablet && inputToggleButton}
|
slotRight={isTablet && inputToggleButton}
|
||||||
@@ -126,7 +126,11 @@ export const TradeSizeInputs = () => {
|
|||||||
decimals={tickSizeDecimals || USD_DECIMALS}
|
decimals={tickSizeDecimals || USD_DECIMALS}
|
||||||
label={
|
label={
|
||||||
<>
|
<>
|
||||||
<WithTooltip tooltip="order-amount-usd" stringParams={{ SYMBOL: id ?? '' }} side="right">
|
<WithTooltip
|
||||||
|
tooltip="order-amount-usd"
|
||||||
|
stringParams={{ SYMBOL: symbol ?? '' }}
|
||||||
|
side="right"
|
||||||
|
>
|
||||||
{stringGetter({ key: STRING_KEYS.AMOUNT })}
|
{stringGetter({ key: STRING_KEYS.AMOUNT })}
|
||||||
</WithTooltip>
|
</WithTooltip>
|
||||||
<Tag>USD</Tag>
|
<Tag>USD</Tag>
|
||||||
|
|||||||
@@ -11,13 +11,9 @@ import { TransferInputField, TransferType } from '@/constants/abacus';
|
|||||||
import { AlertType } from '@/constants/alerts';
|
import { AlertType } from '@/constants/alerts';
|
||||||
import { ButtonShape, ButtonSize } from '@/constants/buttons';
|
import { ButtonShape, ButtonSize } from '@/constants/buttons';
|
||||||
import { STRING_KEYS } from '@/constants/localization';
|
import { STRING_KEYS } from '@/constants/localization';
|
||||||
import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks';
|
import { CLIENT_NETWORK_CONFIGS } from '@/constants/networks';
|
||||||
import { NumberSign, QUANTUM_MULTIPLIER } from '@/constants/numbers';
|
import { NumberSign, QUANTUM_MULTIPLIER } from '@/constants/numbers';
|
||||||
import {
|
import { DYDX_CHAIN_ASSET_COIN_DENOM, DYDX_CHAIN_ASSET_TAGS, DydxChainAsset } from '@/constants/wallets';
|
||||||
DYDX_CHAIN_ASSET_COIN_DENOM,
|
|
||||||
DYDX_CHAIN_ASSET_TAGS,
|
|
||||||
DydxChainAsset,
|
|
||||||
} from '@/constants/wallets';
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
useAccountBalance,
|
useAccountBalance,
|
||||||
@@ -64,11 +60,7 @@ export const TransferForm = ({
|
|||||||
const stringGetter = useStringGetter();
|
const stringGetter = useStringGetter();
|
||||||
const { freeCollateral } = useSelector(getSubaccount, shallowEqual) || {};
|
const { freeCollateral } = useSelector(getSubaccount, shallowEqual) || {};
|
||||||
const { dydxAddress } = useAccounts();
|
const { dydxAddress } = useAccounts();
|
||||||
const {
|
const { address: recipientAddress, size, fee } = useSelector(getTransferInputs, shallowEqual) || {};
|
||||||
address: recipientAddress,
|
|
||||||
size,
|
|
||||||
fee,
|
|
||||||
} = useSelector(getTransferInputs, shallowEqual) || {};
|
|
||||||
const { transfer } = useSubaccount();
|
const { transfer } = useSubaccount();
|
||||||
const { nativeTokenBalance, usdcBalance } = useAccountBalance();
|
const { nativeTokenBalance, usdcBalance } = useAccountBalance();
|
||||||
const { selectedNetwork } = useSelectedNetwork();
|
const { selectedNetwork } = useSelectedNetwork();
|
||||||
@@ -201,7 +193,7 @@ export const TransferForm = ({
|
|||||||
|
|
||||||
const networkOptions = [
|
const networkOptions = [
|
||||||
{
|
{
|
||||||
chainId: ENVIRONMENT_CONFIG_MAP[selectedNetwork].dydxChainId,
|
chainId: CLIENT_NETWORK_CONFIGS[selectedNetwork].dydxChainId,
|
||||||
label: (
|
label: (
|
||||||
<Styled.InlineRow>
|
<Styled.InlineRow>
|
||||||
<AssetIcon symbol="DYDX" /> {stringGetter({ key: STRING_KEYS.DYDX_CHAIN })}
|
<AssetIcon symbol="DYDX" /> {stringGetter({ key: STRING_KEYS.DYDX_CHAIN })}
|
||||||
@@ -291,7 +283,7 @@ export const TransferForm = ({
|
|||||||
/>
|
/>
|
||||||
<Styled.NetworkSelectMenu
|
<Styled.NetworkSelectMenu
|
||||||
label={stringGetter({ key: STRING_KEYS.NETWORK })}
|
label={stringGetter({ key: STRING_KEYS.NETWORK })}
|
||||||
value={ENVIRONMENT_CONFIG_MAP[selectedNetwork].dydxChainId}
|
value={CLIENT_NETWORK_CONFIGS[selectedNetwork].dydxChainId}
|
||||||
slotTriggerAfter={null}
|
slotTriggerAfter={null}
|
||||||
>
|
>
|
||||||
{networkOptions.map(({ chainId, label }) => (
|
{networkOptions.map(({ chainId, label }) => (
|
||||||
|
|||||||
@@ -129,13 +129,15 @@ export const useGlobalCommands = (): MenuConfig<string, string> => {
|
|||||||
{
|
{
|
||||||
value: NavItems.NavigateToMarket,
|
value: NavItems.NavigateToMarket,
|
||||||
label: 'Navigate to Market',
|
label: 'Navigate to Market',
|
||||||
subitems: joinedPerpetualMarketsAndAssets.map(({ market = '', name = '', id = '' }) => ({
|
subitems: joinedPerpetualMarketsAndAssets.map(
|
||||||
value: market,
|
({ market = '', name = '', symbol = '' }) => ({
|
||||||
slotBefore: <AssetIcon symbol={id} />,
|
value: market, // `${market}|${name}`,
|
||||||
label: name,
|
slotBefore: <AssetIcon symbol={symbol} />,
|
||||||
tag: id,
|
label: name,
|
||||||
onSelect: () => navigate(`/trade/${market}`),
|
tag: symbol, // <abbr>{symbol}</abbr>,
|
||||||
})),
|
onSelect: () => navigate(`/trade/${market}`),
|
||||||
|
})
|
||||||
|
),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import { type MenuItem } from '@/constants/menus';
|
import { type MenuItem } from '@/constants/menus';
|
||||||
import {
|
import { type DydxNetwork, NETWORK_ENDPOINTS } from '@/constants/networks';
|
||||||
AVAILABLE_ENVIRONMENTS,
|
import { useStringGetter } from '@/hooks';
|
||||||
type DydxNetwork,
|
|
||||||
ENVIRONMENT_CONFIG_MAP,
|
|
||||||
} from '@/constants/networks';
|
|
||||||
|
|
||||||
export const useNetworks = (): MenuItem<DydxNetwork>[] =>
|
export const useNetworks = (): MenuItem<DydxNetwork>[] => {
|
||||||
(AVAILABLE_ENVIRONMENTS.environments as DydxNetwork[]).map((dydxNetwork) => ({
|
const stringGetter = useStringGetter();
|
||||||
key: dydxNetwork,
|
|
||||||
label: ENVIRONMENT_CONFIG_MAP[dydxNetwork].name,
|
return NETWORK_ENDPOINTS.environments.map(({ stringKey, environment }) => ({
|
||||||
value: dydxNetwork,
|
key: environment,
|
||||||
|
label: stringGetter({ key: stringKey }),
|
||||||
|
value: environment,
|
||||||
}));
|
}));
|
||||||
|
};
|
||||||
|
|||||||
@@ -89,8 +89,8 @@ const getFillsTableColumnDef = ({
|
|||||||
label: `${stringGetter({ key: STRING_KEYS.TYPE })} / ${stringGetter({
|
label: `${stringGetter({ key: STRING_KEYS.TYPE })} / ${stringGetter({
|
||||||
key: STRING_KEYS.AMOUNT,
|
key: STRING_KEYS.AMOUNT,
|
||||||
})}`,
|
})}`,
|
||||||
renderCell: ({ resources, size, stepSizeDecimals, asset: { id } }) => (
|
renderCell: ({ resources, size, stepSizeDecimals, asset: { symbol } }) => (
|
||||||
<TableCell stacked slotLeft={<Styled.AssetIcon symbol={id} />}>
|
<TableCell stacked slotLeft={<Styled.AssetIcon symbol={symbol} />}>
|
||||||
<span>
|
<span>
|
||||||
{resources.typeStringKey ? stringGetter({ key: resources.typeStringKey }) : null}
|
{resources.typeStringKey ? stringGetter({ key: resources.typeStringKey }) : null}
|
||||||
</span>
|
</span>
|
||||||
@@ -161,7 +161,7 @@ const getFillsTableColumnDef = ({
|
|||||||
}[orderSide],
|
}[orderSide],
|
||||||
})}
|
})}
|
||||||
</Styled.Side>
|
</Styled.Side>
|
||||||
<Output type={OutputType.Text} value={asset.id} />
|
<Output type={OutputType.Text} value={asset.symbol} />
|
||||||
</Styled.TableCell>
|
</Styled.TableCell>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
@@ -325,7 +325,9 @@ export const FillsTable = ({
|
|||||||
if (hasUnseenFillUpdates) dispatch(viewedFills());
|
if (hasUnseenFillUpdates) dispatch(viewedFills());
|
||||||
}, [hasUnseenFillUpdates]);
|
}, [hasUnseenFillUpdates]);
|
||||||
|
|
||||||
const symbol = currentMarket ? allAssets[allPerpetualMarkets[currentMarket]?.assetId]?.id : null;
|
const symbol = currentMarket
|
||||||
|
? allAssets[allPerpetualMarkets[currentMarket]?.assetId]?.symbol
|
||||||
|
: null;
|
||||||
|
|
||||||
const fillsData = fills.map((fill: SubaccountFill) =>
|
const fillsData = fills.map((fill: SubaccountFill) =>
|
||||||
getHydratedTradingData({
|
getHydratedTradingData({
|
||||||
|
|||||||
@@ -12,10 +12,7 @@ import { MarketTableCell } from '@/components/Table/MarketTableCell';
|
|||||||
import { Output, OutputType } from '@/components/Output';
|
import { Output, OutputType } from '@/components/Output';
|
||||||
import { Table, TableCell, type ColumnDef } from '@/components/Table';
|
import { Table, TableCell, type ColumnDef } from '@/components/Table';
|
||||||
|
|
||||||
import {
|
import { getCurrentMarketFundingPayments, getSubaccountFundingPayments } from '@/state/accountSelectors';
|
||||||
getCurrentMarketFundingPayments,
|
|
||||||
getSubaccountFundingPayments,
|
|
||||||
} from '@/state/accountSelectors';
|
|
||||||
import { getAssets } from '@/state/assetsSelectors';
|
import { getAssets } from '@/state/assetsSelectors';
|
||||||
import { getPerpetualMarkets } from '@/state/perpetualsSelectors';
|
import { getPerpetualMarkets } from '@/state/perpetualsSelectors';
|
||||||
|
|
||||||
@@ -114,7 +111,7 @@ export const FundingPaymentsTable = ({
|
|||||||
type={OutputType.Asset}
|
type={OutputType.Asset}
|
||||||
value={Math.abs(positionSize)}
|
value={Math.abs(positionSize)}
|
||||||
fractionDigits={stepSizeDecimals}
|
fractionDigits={stepSizeDecimals}
|
||||||
tag={asset.id}
|
tag={asset.symbol}
|
||||||
/>
|
/>
|
||||||
<Styled.Output
|
<Styled.Output
|
||||||
type={OutputType.Text}
|
type={OutputType.Text}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ export const LiveTrades = ({ className, histogramSide = 'left' }: StyleProps) =>
|
|||||||
const currentMarketConfig = useSelector(getCurrentMarketConfig, shallowEqual);
|
const currentMarketConfig = useSelector(getCurrentMarketConfig, shallowEqual);
|
||||||
const currentMarketLiveTrades = useSelector(getCurrentMarketLiveTrades, shallowEqual) || [];
|
const currentMarketLiveTrades = useSelector(getCurrentMarketLiveTrades, shallowEqual) || [];
|
||||||
|
|
||||||
const { id = '' } = currentMarketAssetData ?? {};
|
const { symbol = '' } = currentMarketAssetData ?? {};
|
||||||
const { stepSizeDecimals, tickSizeDecimals } = currentMarketConfig || {};
|
const { stepSizeDecimals, tickSizeDecimals } = currentMarketConfig || {};
|
||||||
|
|
||||||
const rows = currentMarketLiveTrades.map(
|
const rows = currentMarketLiveTrades.map(
|
||||||
@@ -84,7 +84,7 @@ export const LiveTrades = ({ className, histogramSide = 'left' }: StyleProps) =>
|
|||||||
columnKey: 'size',
|
columnKey: 'size',
|
||||||
getCellValue: (row: RowData) => row.size,
|
getCellValue: (row: RowData) => row.size,
|
||||||
label: stringGetter({ key: STRING_KEYS.SIZE }),
|
label: stringGetter({ key: STRING_KEYS.SIZE }),
|
||||||
tag: id,
|
tag: symbol,
|
||||||
renderCell: (row: RowData) => (
|
renderCell: (row: RowData) => (
|
||||||
<Styled.SizeOutput
|
<Styled.SizeOutput
|
||||||
type={OutputType.Asset}
|
type={OutputType.Asset}
|
||||||
@@ -111,7 +111,7 @@ export const LiveTrades = ({ className, histogramSide = 'left' }: StyleProps) =>
|
|||||||
},
|
},
|
||||||
!isTablet && timeColumn,
|
!isTablet && timeColumn,
|
||||||
].filter(isTruthy);
|
].filter(isTruthy);
|
||||||
}, [stepSizeDecimals, tickSizeDecimals, id, histogramSide, stringGetter]);
|
}, [stepSizeDecimals, tickSizeDecimals, symbol, histogramSide, stringGetter]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Styled.LiveTradesTable
|
<Styled.LiveTradesTable
|
||||||
|
|||||||
@@ -37,7 +37,9 @@ export const MarketsTable = ({ className }: { className?: string }) => {
|
|||||||
columnKey: 'market',
|
columnKey: 'market',
|
||||||
getCellValue: (row) => row.market,
|
getCellValue: (row) => row.market,
|
||||||
label: stringGetter({ key: STRING_KEYS.MARKET }),
|
label: stringGetter({ key: STRING_KEYS.MARKET }),
|
||||||
renderCell: ({ asset, id }) => <Styled.MarketTableCell asset={asset} marketId={id} />,
|
renderCell: ({ asset, id }) => (
|
||||||
|
<Styled.MarketTableCell asset={asset} marketId={id} />
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
columnKey: 'price',
|
columnKey: 'price',
|
||||||
@@ -142,7 +144,7 @@ export const MarketsTable = ({ className }: { className?: string }) => {
|
|||||||
fractionDigits={LARGE_TOKEN_DECIMALS}
|
fractionDigits={LARGE_TOKEN_DECIMALS}
|
||||||
type={OutputType.Number}
|
type={OutputType.Number}
|
||||||
value={row.openInterest}
|
value={row.openInterest}
|
||||||
tag={row.asset?.id}
|
tag={row.asset?.symbol}
|
||||||
/>
|
/>
|
||||||
<Output
|
<Output
|
||||||
type={OutputType.Fiat}
|
type={OutputType.Fiat}
|
||||||
|
|||||||
@@ -72,13 +72,13 @@ const getPositionsTableColumnDef = ({
|
|||||||
getCellValue: (row) => row.id,
|
getCellValue: (row) => row.id,
|
||||||
label: stringGetter({ key: STRING_KEYS.DETAILS }),
|
label: stringGetter({ key: STRING_KEYS.DETAILS }),
|
||||||
renderCell: ({ id, asset, leverage, resources, size }) => (
|
renderCell: ({ id, asset, leverage, resources, size }) => (
|
||||||
<TableCell stacked slotLeft={<Styled.AssetIcon symbol={asset?.id} />}>
|
<TableCell stacked slotLeft={<Styled.AssetIcon symbol={asset?.symbol} />}>
|
||||||
<Styled.HighlightOutput
|
<Styled.HighlightOutput
|
||||||
type={OutputType.Asset}
|
type={OutputType.Asset}
|
||||||
value={size?.current}
|
value={size?.current}
|
||||||
fractionDigits={TOKEN_DECIMALS}
|
fractionDigits={TOKEN_DECIMALS}
|
||||||
showSign={ShowSign.None}
|
showSign={ShowSign.None}
|
||||||
tag={asset?.id}
|
tag={asset?.symbol}
|
||||||
/>
|
/>
|
||||||
<Styled.InlineRow>
|
<Styled.InlineRow>
|
||||||
<Styled.PositionSide>
|
<Styled.PositionSide>
|
||||||
|
|||||||
Reference in New Issue
Block a user