Compare commits
69
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ced248345d | ||
|
|
2cb3b55a3b | ||
|
|
3acc0e2401 | ||
|
|
c734556eb4 | ||
|
|
792ff1fc1f | ||
|
|
3740a97d7e | ||
|
|
20350ae2cf | ||
|
|
50e93dad64 | ||
|
|
c87c4bbc91 | ||
|
|
00679c75f2 | ||
|
|
7fe722dad0 | ||
|
|
0d8a74dfd0 | ||
|
|
928b899c46 | ||
|
|
72d93bb568 | ||
|
|
db75261cd5 | ||
|
|
66fbe28cf0 | ||
|
|
9f3b8ecade | ||
|
|
cd13c61e90 | ||
|
|
246577f401 | ||
|
|
503ca26f68 | ||
|
|
13e374a6bb | ||
|
|
bed411040c | ||
|
|
d0173f15b2 | ||
|
|
106b040977 | ||
|
|
bf84b04a30 | ||
|
|
9f442698a4 | ||
|
|
d1265a6af7 | ||
|
|
313eff1c95 | ||
|
|
7f949a276c | ||
|
|
76a53dc7e3 | ||
|
|
72821dd183 | ||
|
|
40d2e033e0 | ||
|
|
e6d0b6ac1f | ||
|
|
99161497fe | ||
|
|
bf6ab32230 | ||
|
|
28bcb4ada1 | ||
|
|
5812c8858d | ||
|
|
abf146895d | ||
|
|
4476e6c6d1 | ||
|
|
d967000e8f | ||
|
|
91d3d97399 | ||
|
|
ca700aa103 | ||
|
|
265bf7fb35 | ||
|
|
7a5c6f3a25 | ||
|
|
91e3460e9d | ||
|
|
cf0c45aaa5 | ||
|
|
bf63f9d46d | ||
|
|
023a83e0f7 | ||
|
|
4f6ed1eadf | ||
|
|
85e293f3ec | ||
|
|
7b15d2db10 | ||
|
|
b1b9695998 | ||
|
|
6b8b33a78b | ||
|
|
4fd0f6819a | ||
|
|
5032d87f98 | ||
|
|
b15d9cb7dc | ||
|
|
6aa7cc5bab | ||
|
|
c37f9ebe66 | ||
|
|
768b3b29f0 | ||
|
|
378946f22b | ||
|
|
523598645a | ||
|
|
a9267de653 | ||
|
|
ce22da1c9a | ||
|
|
2460a62a3e | ||
|
|
f37a8720a2 | ||
|
|
f5fe3cc18d | ||
|
|
288f075cac | ||
|
|
ca46861fd8 | ||
|
|
2cb6ede492 |
@@ -0,0 +1,16 @@
|
|||||||
|
name: 'Check if branch is shorter than 52 chars'
|
||||||
|
on: pull_request
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
branch-naming-rules:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
# echo "branches that are longer than 51 chars can't be parsed by kubernetes to create previews. Each app has prefix of it's name like: 'governance-' (12 chars), what leaves 51 max branch length"
|
||||||
|
# current parsable length: $( git rev-parse --abbrev-ref HEAD | sed -r s/[^a-zA-Z0-9]+/-/g | sed -r s/^-+\|-+$//g | wc -c)
|
||||||
|
- uses: deepakputhraya/action-branch-name@master
|
||||||
|
with:
|
||||||
|
# regex: '([a-z])+\/([a-z])+' # Regex the branch should match. This example enforces grouping
|
||||||
|
# allowed_prefixes: 'feature,stable,fix' # All branches should start with the given prefix
|
||||||
|
# ignore: master,develop # Ignore exactly matching branch names from convention
|
||||||
|
min_length: 1 # Min length of the branch name
|
||||||
|
max_length: 51 # Max length of the branch name
|
||||||
@@ -105,7 +105,7 @@ jobs:
|
|||||||
affected="$(yarn nx print-affected --base=${{ env.NX_BASE }} --head=${{ env.NX_HEAD }} --select=projects)"
|
affected="$(yarn nx print-affected --base=${{ env.NX_BASE }} --head=${{ env.NX_HEAD }} --select=projects)"
|
||||||
echo -n "Affected projects: $affected"
|
echo -n "Affected projects: $affected"
|
||||||
|
|
||||||
branch_slug="$(echo ${{ github.head_ref || github.ref_name }} | sed -r s/[^a-zA-Z0-9]+/-/g | sed -r s/^-+\|-+$//g )"
|
branch_slug="$(echo ${{ github.head_ref || github.ref_name }} | sed -r s/[^a-zA-Z0-9]+/-/g | sed -r s/^-+\|-+$//g | cut -c 1-50 )"
|
||||||
projects_e2e=""
|
projects_e2e=""
|
||||||
preview_governance="not deployed"
|
preview_governance="not deployed"
|
||||||
preview_trading="not deployed"
|
preview_trading="not deployed"
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
elif [[ "${{ github.ref }}" =~ .*develop$ ]]; then
|
elif [[ "${{ github.ref }}" =~ .*develop$ ]]; then
|
||||||
envName="stagnet3"
|
envName="stagnet1"
|
||||||
fi
|
fi
|
||||||
bucketName="${{ matrix.app }}.${envName}.${domain}"
|
bucketName="${{ matrix.app }}.${envName}.${domain}"
|
||||||
echo BUCKET_NAME=${bucketName} >> $GITHUB_ENV
|
echo BUCKET_NAME=${bucketName} >> $GITHUB_ENV
|
||||||
|
|||||||
@@ -7,5 +7,4 @@ __generated___
|
|||||||
|
|
||||||
apps/static/src/assets/devnet-tranches.json
|
apps/static/src/assets/devnet-tranches.json
|
||||||
apps/static/src/assets/mainnet-tranches.json
|
apps/static/src/assets/mainnet-tranches.json
|
||||||
apps/static/src/assets/stagnet3-tranches.json
|
|
||||||
apps/static/src/assets/testnet-tranches.json
|
apps/static/src/assets/testnet-tranches.json
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
NX_CHAIN_EXPLORER_URL=https://explorer.vega.trading/.netlify/functions/chain-explorer-api
|
NX_CHAIN_EXPLORER_URL=https://explorer.vega.trading/.netlify/functions/chain-explorer-api
|
||||||
NX_TENDERMINT_URL=https://mainnet-observer-proxy01.ops.vega.xyz/
|
NX_TENDERMINT_URL=https://mainnet-observer-proxy01.ops.vega.xyz/
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://mainnet-observer-proxy01.ops.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://mainnet-observer-proxy01.ops.vega.xyz/websocket
|
||||||
NX_VEGA_URL=https://api.vega.xyz/query
|
NX_VEGA_URL=https://api.vega.community/graphql
|
||||||
NX_VEGA_ENV=MAINNET
|
NX_VEGA_ENV=MAINNET
|
||||||
NX_BLOCK_EXPLORER=https://be.explorer.vega.xyz/rest
|
NX_BLOCK_EXPLORER=https://be.explorer.vega.xyz/rest
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
# App configuration variables
|
|
||||||
NX_CHAIN_EXPLORER_URL=https://explorer.vega.trading/.netlify/functions/chain-explorer-api
|
|
||||||
NX_TENDERMINT_URL=https://tm.n00.stagnet3.vega.xyz
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n00.stagnet3.vega.xyz/websocket
|
|
||||||
NX_VEGA_URL=https://api.stagnet3.vega.xyz/graphql
|
|
||||||
NX_VEGA_ENV=STAGNET3
|
|
||||||
NX_BLOCK_EXPLORER=https://be.stagnet3.vega.xyz/rest
|
|
||||||
|
|
||||||
# App flags
|
|
||||||
NX_EXPLORER_ASSETS=1
|
|
||||||
NX_EXPLORER_GENESIS=1
|
|
||||||
NX_EXPLORER_GOVERNANCE=1
|
|
||||||
NX_EXPLORER_MARKETS=1
|
|
||||||
NX_EXPLORER_ORACLES=1
|
|
||||||
NX_EXPLORER_TXS_LIST=0
|
|
||||||
NX_EXPLORER_NETWORK_PARAMETERS=1
|
|
||||||
NX_EXPLORER_PARTIES=1
|
|
||||||
NX_EXPLORER_VALIDATORS=1
|
|
||||||
@@ -10,6 +10,8 @@
|
|||||||
"governance.proposal.updateMarket.minVoterBalance",
|
"governance.proposal.updateMarket.minVoterBalance",
|
||||||
"governance.proposal.updateNetParam.minProposerBalance",
|
"governance.proposal.updateNetParam.minProposerBalance",
|
||||||
"governance.proposal.updateNetParam.minVoterBalance",
|
"governance.proposal.updateNetParam.minVoterBalance",
|
||||||
|
"governance.proposal.updateAsset.minProposerBalance",
|
||||||
|
"governance.proposal.updateAsset.minVoterBalance",
|
||||||
"reward.staking.delegation.maxPayoutPerEpoch",
|
"reward.staking.delegation.maxPayoutPerEpoch",
|
||||||
"reward.staking.delegation.maxPayoutPerParticipant",
|
"reward.staking.delegation.maxPayoutPerParticipant",
|
||||||
"reward.staking.delegation.minimumValidatorStake",
|
"reward.staking.delegation.minimumValidatorStake",
|
||||||
@@ -19,9 +21,6 @@
|
|||||||
"validators.delegation.minAmount"
|
"validators.delegation.minAmount"
|
||||||
],
|
],
|
||||||
"fiveDecimal": [
|
"fiveDecimal": [
|
||||||
"governance.proposal.updateAsset.minProposerBalance",
|
|
||||||
"governance.proposal.updateAsset.minVoterBalance",
|
|
||||||
"governance.proposal.updateAsset.requiredParticipation",
|
|
||||||
"market.fee.factors.infrastructureFee",
|
"market.fee.factors.infrastructureFee",
|
||||||
"market.fee.factors.makerFee",
|
"market.fee.factors.makerFee",
|
||||||
"market.liquidity.bondPenaltyParameter",
|
"market.liquidity.bondPenaltyParameter",
|
||||||
@@ -77,6 +76,7 @@
|
|||||||
"governance.proposal.updateNetParam.requiredMajority",
|
"governance.proposal.updateNetParam.requiredMajority",
|
||||||
"governance.proposal.updateNetParam.requiredParticipation",
|
"governance.proposal.updateNetParam.requiredParticipation",
|
||||||
"governance.proposal.updateMarket.minProposerEquityLikeShare",
|
"governance.proposal.updateMarket.minProposerEquityLikeShare",
|
||||||
|
"governance.proposal.updateAsset.requiredParticipation",
|
||||||
"validators.vote.required"
|
"validators.vote.required"
|
||||||
],
|
],
|
||||||
"duration": [
|
"duration": [
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ context('Network parameters page', { tags: '@smoke' }, function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should list each network parameter displayed as a currency value with four decimals - in the correct format', function () {
|
it.skip('should list each network parameter displayed as a currency value with four decimals - in the correct format', function () {
|
||||||
cy.get_network_parameters().then((network_parameters) => {
|
cy.get_network_parameters().then((network_parameters) => {
|
||||||
network_parameters = Object.entries(network_parameters);
|
network_parameters = Object.entries(network_parameters);
|
||||||
network_parameters.forEach((network_parameter) => {
|
network_parameters.forEach((network_parameter) => {
|
||||||
|
|||||||
+13
-8
@@ -1,13 +1,18 @@
|
|||||||
NX_TENDERMINT_URL=https://tm.n00.stagnet3.vega.xyz
|
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n00.stagnet3.vega.xyz/websocket
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/stagnet3/vegawallet-stagnet3.toml
|
|
||||||
NX_VEGA_NETWORKS='{"STAGNET1":"https://stagnet1.token.vega.xyz", "STAGNET3":"https://stagnet3.explorer.vega.xyz","VALIDATOR_TESTNET":"https://validator-testnet.fairground.wtf","TESTNET":"https://token.fairground.wtf","MAINNET":"https://token.vega.xyz"}'
|
|
||||||
NX_VEGA_ENV=STAGNET3
|
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
|
||||||
NX_HOSTED_WALLET_URL=https://wallet.testnet.vega.xyz
|
NX_HOSTED_WALLET_URL=https://wallet.testnet.vega.xyz
|
||||||
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/stagnet1/vegawallet-stagnet1.toml
|
||||||
|
NX_VEGA_ENV=STAGNET1
|
||||||
|
NX_VEGA_EXPLORER_URL=https://stagnet1.explorer.vega.xyz
|
||||||
|
NX_VEGA_TOKEN_URL=https://stagnet1.governance.vega.xyz
|
||||||
|
NX_VEGA_WALLET_URL=http://localhost:1789
|
||||||
|
NX_TENDERMINT_URL=https://tm.n01.stagnet1.vega.xyz
|
||||||
|
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n01.stagnet1.vega.xyz/websocket
|
||||||
|
NX_BLOCK_EXPLORER=https://be.stagnet1.vega.xyz/rest
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_BLOCK_EXPLORER=https://be.stagnet3.vega.xyz/rest
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_VEGA_GOVERNANCE_URL=https://stagnet1.governance.vega.xyz
|
||||||
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.jsoo
|
||||||
|
|
||||||
# App flags
|
# App flags
|
||||||
NX_EXPLORER_ASSETS=1
|
NX_EXPLORER_ASSETS=1
|
||||||
|
|||||||
@@ -4,14 +4,7 @@ NX_TENDERMINT_WEBSOCKET_URL=wss://localhost:26617/websocket
|
|||||||
NX_VEGA_ENV=CUSTOM
|
NX_VEGA_ENV=CUSTOM
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
||||||
|
NX_VEGA_EXPLORER_URL=/
|
||||||
|
|
||||||
# App flags
|
# App flags
|
||||||
NX_EXPLORER_ASSETS=1
|
|
||||||
NX_EXPLORER_GENESIS=1
|
|
||||||
NX_EXPLORER_GOVERNANCE=1
|
|
||||||
NX_EXPLORER_MARKETS=1
|
|
||||||
NX_EXPLORER_ORACLES=1
|
|
||||||
NX_EXPLORER_TXS_LIST=0
|
NX_EXPLORER_TXS_LIST=0
|
||||||
NX_EXPLORER_NETWORK_PARAMETERS=1
|
|
||||||
NX_EXPLORER_PARTIES=1
|
|
||||||
NX_EXPLORER_VALIDATORS=1
|
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-inter
|
|||||||
NX_VEGA_ENV=DEVNET
|
NX_VEGA_ENV=DEVNET
|
||||||
NX_BLOCK_EXPLORER=https://be.devnet1.vega.xyz/rest
|
NX_BLOCK_EXPLORER=https://be.devnet1.vega.xyz/rest
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_VEGA_GOVERNANCE_URL=https://dev.token.vega.xyz
|
NX_VEGA_GOVERNANCE_URL=https://dev.governance.vega.xyz
|
||||||
NX_VEGA_URL=https://api.devnet1.vega.xyz/graphql
|
NX_VEGA_URL=https://api.devnet1.vega.xyz/graphql
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/devnet1/vegawallet-devnet1.toml
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/devnet1/vegawallet-devnet1.toml
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
||||||
|
NX_VEGA_EXPLORER_URL=/
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
NX_TENDERMINT_URL=https://be.explorer.vega.xyz
|
NX_TENDERMINT_URL=https://be.vega.community
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.explorer.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.vega.community/websocket
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks/master/mainnet1/mainnet1.toml
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks/master/mainnet1/mainnet1.toml
|
||||||
NX_VEGA_ENV=MAINNET
|
NX_VEGA_ENV=MAINNET
|
||||||
NX_BLOCK_EXPLORER=https://be.explorer.vega.xyz/rest/
|
NX_BLOCK_EXPLORER=https://be.vega.community/rest/
|
||||||
NX_ETHERSCAN_URL=https://etherscan.io
|
NX_ETHERSCAN_URL=https://etherscan.io
|
||||||
NX_VEGA_GOVERNANCE_URL=https://token.vega.xyz
|
NX_VEGA_GOVERNANCE_URL=https://governance.vega.xyz
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/mainnet/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/mainnet/announcements.json
|
||||||
|
NX_VEGA_EXPLORER_URL=https://explorer.vega.xyz/
|
||||||
|
|||||||
@@ -1,14 +1 @@
|
|||||||
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
# .env is stagnet1, so there are no overrides required
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
|
||||||
NX_HOSTED_WALLET_URL=https://wallet.testnet.vega.xyz
|
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/stagnet1/vegawallet-stagnet1.toml
|
|
||||||
NX_VEGA_ENV=STAGNET1
|
|
||||||
NX_VEGA_EXPLORER_URL=https://stagnet1.explorer.vega.xyz
|
|
||||||
NX_VEGA_TOKEN_URL=https://stagnet1.token.vega.xyz
|
|
||||||
NX_VEGA_WALLET_URL=http://localhost:1789
|
|
||||||
NX_TENDERMINT_URL=https://tm.n01.stagnet1.vega.xyz
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n01.stagnet1.vega.xyz/websocket
|
|
||||||
NX_BLOCK_EXPLORER=https://be.stagnet1.vega.xyz/rest
|
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
|
||||||
NX_VEGA_GOVERNANCE_URL=https://stagnet1.token.vega.xyz
|
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
NX_TENDERMINT_URL=https://tm.n00.stagnet3.vega.xyz
|
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.stagnet3.vega.xyz/websocket
|
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/stagnet3/vegawallet-stagnet3.toml
|
|
||||||
NX_VEGA_ENV=STAGNET3
|
|
||||||
NX_BLOCK_EXPLORER=https://be.stagnet3.vega.xyz/rest
|
|
||||||
NX_VEGA_GOVERNANCE_URL=https://stagnet3.token.vega.xyz
|
|
||||||
NX_VEGA_REPO_URL=https://github.com/vegaprotocol/vega-dev-releases/releases/
|
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
|
||||||
@@ -7,5 +7,6 @@ NX_VEGA_ENV=TESTNET
|
|||||||
NX_VEGA_URL=https://api.n07.testnet.vega.xyz/graphql
|
NX_VEGA_URL=https://api.n07.testnet.vega.xyz/graphql
|
||||||
NX_HOSTED_WALLET_URL=https://wallet.testnet.vega.xyz
|
NX_HOSTED_WALLET_URL=https://wallet.testnet.vega.xyz
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_VEGA_GOVERNANCE_URL=https://token.fairground.wtf
|
NX_VEGA_GOVERNANCE_URL=https://governance.fairground.wtf
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
||||||
|
NX_VEGA_EXPLORER_URL=https://explorer.fairground.wtf
|
||||||
|
|||||||
@@ -11,3 +11,4 @@ NX_VEGA_GOVERNANCE_URL=https://validator-testnet.governance.vega.xyz
|
|||||||
NX_TENDERMINT_URL=https://tm-be.validators-testnet.vega.rocks
|
NX_TENDERMINT_URL=https://tm-be.validators-testnet.vega.rocks
|
||||||
NX_BLOCK_EXPLORER=https://be.validators-testnet.vega.rocks/rest
|
NX_BLOCK_EXPLORER=https://be.validators-testnet.vega.rocks/rest
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.validators-testnet.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.validators-testnet.vega.xyz/websocket
|
||||||
|
NX_VEGA_EXPLORER_URL=https://validator-testnet.explorer.vega.xyz/
|
||||||
@@ -5,3 +5,4 @@ NX_VEGA_ENV=CUSTOM
|
|||||||
NX_BLOCK_EXPLORER=
|
NX_BLOCK_EXPLORER=
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
||||||
|
NX_VEGA_EXPLORER_URL=/
|
||||||
@@ -35,12 +35,11 @@ Example configurations are provided here:
|
|||||||
- [Devnet](./.env.devnet)
|
- [Devnet](./.env.devnet)
|
||||||
- [Capsule](./.env.capsule)
|
- [Capsule](./.env.capsule)
|
||||||
- [Testnet](./.env.testnet)
|
- [Testnet](./.env.testnet)
|
||||||
- [Stagnet3](./.env.stagnet3)
|
|
||||||
|
|
||||||
For convenience, you can boot the app injecting one of the configurations above by running:
|
For convenience, you can boot the app injecting one of the configurations above by running:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yarn nx run explorer:serve --env={env} # e.g. stagnet3
|
yarn nx run explorer:serve --env={env} # e.g. stagnet1
|
||||||
```
|
```
|
||||||
|
|
||||||
There are a few different configuration options offered for this app:
|
There are a few different configuration options offered for this app:
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ export type AssetBalanceProps = {
|
|||||||
assetId: string;
|
assetId: string;
|
||||||
price: string;
|
price: string;
|
||||||
showAssetLink?: boolean;
|
showAssetLink?: boolean;
|
||||||
|
showAssetSymbol?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -16,18 +17,21 @@ const AssetBalance = ({
|
|||||||
assetId,
|
assetId,
|
||||||
price,
|
price,
|
||||||
showAssetLink = true,
|
showAssetLink = true,
|
||||||
|
showAssetSymbol = false,
|
||||||
}: AssetBalanceProps) => {
|
}: AssetBalanceProps) => {
|
||||||
const { data: asset } = useAssetDataProvider(assetId);
|
const { data: asset, loading } = useAssetDataProvider(assetId);
|
||||||
|
|
||||||
const label =
|
const label =
|
||||||
asset && asset.decimals
|
!loading && asset && asset.decimals
|
||||||
? addDecimalsFormatNumber(price, asset.decimals)
|
? addDecimalsFormatNumber(price, asset.decimals)
|
||||||
: price;
|
: price;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="inline-block">
|
<div className="inline-block">
|
||||||
<span>{label}</span>{' '}
|
<span>{label}</span>{' '}
|
||||||
{showAssetLink && asset?.id ? <AssetLink assetId={assetId} /> : null}
|
{showAssetLink && asset?.id ? (
|
||||||
|
<AssetLink showAssetSymbol={showAssetSymbol} assetId={assetId} />
|
||||||
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -13,11 +13,17 @@ const DEFAULT_DECIMALS = 18;
|
|||||||
* the governance asset first, which is set by a network parameter
|
* the governance asset first, which is set by a network parameter
|
||||||
*/
|
*/
|
||||||
const GovernanceAssetBalance = ({ price }: GovernanceAssetBalanceProps) => {
|
const GovernanceAssetBalance = ({ price }: GovernanceAssetBalanceProps) => {
|
||||||
const { data } = useExplorerGovernanceAssetQuery();
|
const { data, loading } = useExplorerGovernanceAssetQuery();
|
||||||
|
|
||||||
if (data && data.networkParameter?.value) {
|
if (!loading && data && data.networkParameter?.value) {
|
||||||
const governanceAssetId = data.networkParameter.value;
|
const governanceAssetId = data.networkParameter.value;
|
||||||
return <AssetBalance price={price} assetId={governanceAssetId} />;
|
return (
|
||||||
|
<AssetBalance
|
||||||
|
price={price}
|
||||||
|
showAssetSymbol={true}
|
||||||
|
assetId={governanceAssetId}
|
||||||
|
/>
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
return (
|
return (
|
||||||
<div className="inline-block">
|
<div className="inline-block">
|
||||||
|
|||||||
@@ -14,11 +14,72 @@ import {
|
|||||||
SettlementAssetInfoPanel,
|
SettlementAssetInfoPanel,
|
||||||
} from '@vegaprotocol/market-info';
|
} from '@vegaprotocol/market-info';
|
||||||
import { MarketInfoTable } from '@vegaprotocol/market-info';
|
import { MarketInfoTable } from '@vegaprotocol/market-info';
|
||||||
import { Link } from 'react-router-dom';
|
import type { DataSourceDefinition } from '@vegaprotocol/types';
|
||||||
|
import isEqual from 'lodash/isEqual';
|
||||||
|
|
||||||
export const MarketDetails = ({ market }: { market: MarketInfoWithData }) => {
|
export const MarketDetails = ({ market }: { market: MarketInfoWithData }) => {
|
||||||
if (!market) return null;
|
if (!market) return null;
|
||||||
|
|
||||||
|
const settlementData =
|
||||||
|
market.tradableInstrument.instrument.product.dataSourceSpecForSettlementData
|
||||||
|
.data;
|
||||||
|
const terminationData =
|
||||||
|
market.tradableInstrument.instrument.product
|
||||||
|
.dataSourceSpecForTradingTermination.data;
|
||||||
|
|
||||||
|
const getSigners = (data: DataSourceDefinition) => {
|
||||||
|
if (data.sourceType.__typename === 'DataSourceDefinitionExternal') {
|
||||||
|
const signers = data.sourceType.sourceType.signers || [];
|
||||||
|
|
||||||
|
return signers.map(({ signer }, i) => {
|
||||||
|
return (
|
||||||
|
(signer.__typename === 'ETHAddress' && signer.address) ||
|
||||||
|
(signer.__typename === 'PubKey' && signer.key)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
};
|
||||||
|
|
||||||
|
const oraclePanels = isEqual(
|
||||||
|
getSigners(settlementData),
|
||||||
|
getSigners(terminationData)
|
||||||
|
)
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
title: t('Settlement Oracle'),
|
||||||
|
content: (
|
||||||
|
<OracleInfoPanel
|
||||||
|
noBorder={false}
|
||||||
|
market={market}
|
||||||
|
type="settlementData"
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: t('Termination Oracle'),
|
||||||
|
content: (
|
||||||
|
<OracleInfoPanel
|
||||||
|
noBorder={false}
|
||||||
|
market={market}
|
||||||
|
type="termination"
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
{
|
||||||
|
title: t('Oracle'),
|
||||||
|
content: (
|
||||||
|
<OracleInfoPanel
|
||||||
|
noBorder={false}
|
||||||
|
market={market}
|
||||||
|
type="settlementData"
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
const panels = [
|
const panels = [
|
||||||
{
|
{
|
||||||
title: t('Key details'),
|
title: t('Key details'),
|
||||||
@@ -96,25 +157,7 @@ export const MarketDetails = ({ market }: { market: MarketInfoWithData }) => {
|
|||||||
<LiquidityPriceRangeInfoPanel market={market} noBorder={false} />
|
<LiquidityPriceRangeInfoPanel market={market} noBorder={false} />
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
...oraclePanels,
|
||||||
title: t('Oracle'),
|
|
||||||
content: (
|
|
||||||
<OracleInfoPanel noBorder={false} market={market}>
|
|
||||||
<Link
|
|
||||||
className="text-xs hover:underline"
|
|
||||||
to={`/oracles#${market.tradableInstrument.instrument.product.dataSourceSpecForSettlementData.id}`}
|
|
||||||
>
|
|
||||||
{t('View settlement data oracle specification')}
|
|
||||||
</Link>
|
|
||||||
<Link
|
|
||||||
className="text-xs hover:underline"
|
|
||||||
to={`/oracles#${market.tradableInstrument.instrument.product.dataSourceSpecForTradingTermination.id}`}
|
|
||||||
>
|
|
||||||
{t('View termination oracle specification')}
|
|
||||||
</Link>
|
|
||||||
</OracleInfoPanel>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
];
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export const PageHeader = ({
|
|||||||
copy = false,
|
copy = false,
|
||||||
className,
|
className,
|
||||||
}: PageHeaderProps) => {
|
}: PageHeaderProps) => {
|
||||||
const titleClasses = 'text-4xl xl:text-5xl uppercase font-alpha calt';
|
const titleClasses = 'text-xl uppercase font-alpha calt';
|
||||||
return (
|
return (
|
||||||
<header className={className}>
|
<header className={className}>
|
||||||
<span className={`${titleClasses} block`}>{prefix}</span>
|
<span className={`${titleClasses} block`}>{prefix}</span>
|
||||||
|
|||||||
@@ -12,7 +12,10 @@ import { useLayoutEffect, useMemo, useRef, useState } from 'react';
|
|||||||
import type { RowClickedEvent } from 'ag-grid-community';
|
import type { RowClickedEvent } from 'ag-grid-community';
|
||||||
import { getDateTimeFormat } from '@vegaprotocol/utils';
|
import { getDateTimeFormat } from '@vegaprotocol/utils';
|
||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { NetworkParams, useNetworkParams } from '@vegaprotocol/react-helpers';
|
import {
|
||||||
|
NetworkParams,
|
||||||
|
useNetworkParams,
|
||||||
|
} from '@vegaprotocol/network-parameters';
|
||||||
import { ProposalStateMapping } from '@vegaprotocol/types';
|
import { ProposalStateMapping } from '@vegaprotocol/types';
|
||||||
import BigNumber from 'bignumber.js';
|
import BigNumber from 'bignumber.js';
|
||||||
import { DApp, TOKEN_PROPOSAL, useLinks } from '@vegaprotocol/environment';
|
import { DApp, TOKEN_PROPOSAL, useLinks } from '@vegaprotocol/environment';
|
||||||
|
|||||||
+1
-1
@@ -30,7 +30,7 @@ export const BundleExists = ({
|
|||||||
// Note if this is wrong, the wrong decoder will be used which will give incorrect data
|
// Note if this is wrong, the wrong decoder will be used which will give incorrect data
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="w-auto max-w-lg border-2 border-solid border-vega-light-100 dark:border-vega-dark-200 p-5 mt-5">
|
<div className="w-auto h-10 max-w-lg border-2 border-solid border-vega-light-100 dark:border-vega-dark-200 p-5 mt-5">
|
||||||
<IconForBundleStatus status={status} />
|
<IconForBundleStatus status={status} />
|
||||||
<h1 className="text-xl pb-1">
|
<h1 className="text-xl pb-1">
|
||||||
{status === 'STATUS_ENABLED'
|
{status === 'STATUS_ENABLED'
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
export { TxList } from './tx-list';
|
|
||||||
export { TxOrderType } from './tx-order-type';
|
export { TxOrderType } from './tx-order-type';
|
||||||
export { TxsInfiniteList } from './txs-infinite-list';
|
export { TxsInfiniteList } from './txs-infinite-list';
|
||||||
export { TxsInfiniteListItem } from './txs-infinite-list-item';
|
export { TxsInfiniteListItem } from './txs-infinite-list-item';
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
|
||||||
import type { TendermintUnconfirmedTransactionsResponse } from '../../routes/txs/tendermint-unconfirmed-transactions-response.d';
|
|
||||||
|
|
||||||
interface TxsProps {
|
|
||||||
data: TendermintUnconfirmedTransactionsResponse | undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const TxList = ({ data }: TxsProps) => {
|
|
||||||
if (!data) {
|
|
||||||
return <div>{t('Awaiting transactions')}</div>;
|
|
||||||
}
|
|
||||||
|
|
||||||
return <div>{JSON.stringify(data, null, ' ')}</div>;
|
|
||||||
};
|
|
||||||
@@ -7,7 +7,7 @@ import { toHex } from '../search/detect-search';
|
|||||||
import { ChainResponseCode } from './details/chain-response-code/chain-reponse.code';
|
import { ChainResponseCode } from './details/chain-response-code/chain-reponse.code';
|
||||||
import isNumber from 'lodash/isNumber';
|
import isNumber from 'lodash/isNumber';
|
||||||
|
|
||||||
const TRUNCATE_LENGTH = 5;
|
const TRUNCATE_LENGTH = 10;
|
||||||
|
|
||||||
export const TxsInfiniteListItem = ({
|
export const TxsInfiniteListItem = ({
|
||||||
hash,
|
hash,
|
||||||
@@ -34,10 +34,10 @@ export const TxsInfiniteListItem = ({
|
|||||||
className="flex items-center h-full border-t border-neutral-600 dark:border-neutral-800 txs-infinite-list-item grid grid-cols-10 py-2"
|
className="flex items-center h-full border-t border-neutral-600 dark:border-neutral-800 txs-infinite-list-item grid grid-cols-10 py-2"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
className="text-sm col-span-10 xl:col-span-3 leading-none"
|
className="text-sm col-span-10 md:col-span-3 leading-none"
|
||||||
data-testid="tx-hash"
|
data-testid="tx-hash"
|
||||||
>
|
>
|
||||||
<span className="xl:hidden uppercase text-vega-dark-300">
|
<span className="md:hidden uppercase text-vega-dark-300">
|
||||||
ID:
|
ID:
|
||||||
</span>
|
</span>
|
||||||
<TruncatedLink
|
<TruncatedLink
|
||||||
@@ -48,10 +48,10 @@ export const TxsInfiniteListItem = ({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
className="text-sm col-span-10 xl:col-span-3 leading-none"
|
className="text-sm col-span-10 md:col-span-3 leading-none"
|
||||||
data-testid="pub-key"
|
data-testid="pub-key"
|
||||||
>
|
>
|
||||||
<span className="xl:hidden uppercase text-vega-dark-300">
|
<span className="md:hidden uppercase text-vega-dark-300">
|
||||||
By:
|
By:
|
||||||
</span>
|
</span>
|
||||||
<TruncatedLink
|
<TruncatedLink
|
||||||
@@ -61,14 +61,14 @@ export const TxsInfiniteListItem = ({
|
|||||||
endChars={TRUNCATE_LENGTH}
|
endChars={TRUNCATE_LENGTH}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-sm col-span-5 xl:col-span-2 leading-none flex items-center">
|
<div className="text-sm col-span-5 md:col-span-2 leading-none flex items-center">
|
||||||
<TxOrderType orderType={type} command={command} />
|
<TxOrderType orderType={type} command={command} />
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
className="text-sm col-span-3 xl:col-span-1 leading-none flex items-center"
|
className="text-sm col-span-3 md:col-span-1 leading-none flex items-center"
|
||||||
data-testid="tx-block"
|
data-testid="tx-block"
|
||||||
>
|
>
|
||||||
<span className="xl:hidden uppercase text-vega-dark-300">
|
<span className="md:hidden uppercase text-vega-dark-300">
|
||||||
Block:
|
Block:
|
||||||
</span>
|
</span>
|
||||||
<TruncatedLink
|
<TruncatedLink
|
||||||
@@ -79,10 +79,10 @@ export const TxsInfiniteListItem = ({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
className="text-sm col-span-2 xl:col-span-1 leading-none flex items-center"
|
className="text-sm col-span-2 md:col-span-1 leading-none flex items-center"
|
||||||
data-testid="tx-success"
|
data-testid="tx-success"
|
||||||
>
|
>
|
||||||
<span className="xl:hidden uppercase text-vega-dark-300">
|
<span className="md:hidden uppercase text-vega-dark-300">
|
||||||
Success:
|
Success:
|
||||||
</span>
|
</span>
|
||||||
{isNumber(code) ? (
|
{isNumber(code) ? (
|
||||||
|
|||||||
@@ -64,9 +64,7 @@ describe('Txs infinite list', () => {
|
|||||||
error={Error('test error!')}
|
error={Error('test error!')}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
expect(
|
expect(screen.getByText('Cannot fetch transaction')).toBeInTheDocument();
|
||||||
screen.getByText('Cannot fetch transaction: Error: test error!')
|
|
||||||
).toBeInTheDocument();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('item renders data of n length into list of n length', () => {
|
it('item renders data of n length into list of n length', () => {
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ const NOOP = () => {};
|
|||||||
const Item = ({ index, style, isLoading, error }: ItemProps) => {
|
const Item = ({ index, style, isLoading, error }: ItemProps) => {
|
||||||
let content;
|
let content;
|
||||||
if (error) {
|
if (error) {
|
||||||
content = t(`Cannot fetch transaction: ${error}`);
|
content = t(`Cannot fetch transaction`);
|
||||||
} else if (isLoading) {
|
} else if (isLoading) {
|
||||||
content = <Loader />;
|
content = <Loader />;
|
||||||
} else {
|
} else {
|
||||||
@@ -68,7 +68,7 @@ export const TxsInfiniteList = ({
|
|||||||
className,
|
className,
|
||||||
}: TxsInfiniteListProps) => {
|
}: TxsInfiniteListProps) => {
|
||||||
const { screenSize } = useScreenDimensions();
|
const { screenSize } = useScreenDimensions();
|
||||||
const isStacked = ['xs', 'sm', 'md', 'lg'].includes(screenSize);
|
const isStacked = ['xs', 'sm'].includes(screenSize);
|
||||||
|
|
||||||
if (!txs) {
|
if (!txs) {
|
||||||
if (!areTxsLoading) {
|
if (!areTxsLoading) {
|
||||||
@@ -95,15 +95,15 @@ export const TxsInfiniteList = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={className} data-testid="transactions-list">
|
<div className={className} data-testid="transactions-list">
|
||||||
<div className="xl:grid grid-cols-10 w-full mb-3 hidden text-vega-dark-300 uppercase">
|
<div className="lg:grid grid-cols-10 w-full mb-3 hidden text-vega-dark-300 uppercase">
|
||||||
<div className="col-span-3">
|
<div className="col-span-3">
|
||||||
<span className="hidden xl:inline">Transaction </span>
|
<span className="hidden xl:inline">{t('Transaction')} </span>
|
||||||
<span>ID</span>
|
<span>ID</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-span-3">Submitted By</div>
|
<div className="col-span-3">{t('Submitted By')}</div>
|
||||||
<div className="col-span-2">Type</div>
|
<div className="col-span-2">{t('Type')}</div>
|
||||||
<div className="col-span-1">Block</div>
|
<div className="col-span-1">{t('Block')}</div>
|
||||||
<div className="col-span-1">Success</div>
|
<div className="col-span-1">{t('Success')}</div>
|
||||||
</div>
|
</div>
|
||||||
<div data-testid="infinite-scroll-wrapper">
|
<div data-testid="infinite-scroll-wrapper">
|
||||||
<InfiniteLoader
|
<InfiniteLoader
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { Routes } from '../../routes/route-names';
|
import { Routes } from '../../routes/route-names';
|
||||||
import { RenderFetched } from '../render-fetched';
|
|
||||||
import { TruncatedLink } from '../truncate/truncated-link';
|
import { TruncatedLink } from '../truncate/truncated-link';
|
||||||
import { TxOrderType } from './tx-order-type';
|
import { TxOrderType } from './tx-order-type';
|
||||||
import { Table, TableRow, TableCell } from '../table';
|
import { Table, TableRow, TableCell } from '../table';
|
||||||
@@ -9,7 +8,7 @@ import type { BlockExplorerTransactions } from '../../routes/types/block-explore
|
|||||||
import isNumber from 'lodash/isNumber';
|
import isNumber from 'lodash/isNumber';
|
||||||
import { ChainResponseCode } from './details/chain-response-code/chain-reponse.code';
|
import { ChainResponseCode } from './details/chain-response-code/chain-reponse.code';
|
||||||
import { getTxsDataUrl } from '../../hooks/use-txs-data';
|
import { getTxsDataUrl } from '../../hooks/use-txs-data';
|
||||||
import { Loader } from '@vegaprotocol/ui-toolkit';
|
import { AsyncRenderer, Loader } from '@vegaprotocol/ui-toolkit';
|
||||||
import EmptyList from '../empty-list/empty-list';
|
import EmptyList from '../empty-list/empty-list';
|
||||||
|
|
||||||
interface TxsPerBlockProps {
|
interface TxsPerBlockProps {
|
||||||
@@ -27,7 +26,7 @@ export const TxsPerBlock = ({ blockHeight, txCount }: TxsPerBlockProps) => {
|
|||||||
} = useFetch<BlockExplorerTransactions>(url);
|
} = useFetch<BlockExplorerTransactions>(url);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<RenderFetched error={error} loading={loading} className="text-body-large">
|
<AsyncRenderer data={data} error={error} loading={!!loading}>
|
||||||
{data && data.transactions.length > 0 ? (
|
{data && data.transactions.length > 0 ? (
|
||||||
<div className="overflow-x-auto whitespace-nowrap mb-28">
|
<div className="overflow-x-auto whitespace-nowrap mb-28">
|
||||||
<Table>
|
<Table>
|
||||||
@@ -95,6 +94,6 @@ export const TxsPerBlock = ({ blockHeight, txCount }: TxsPerBlockProps) => {
|
|||||||
label={t('0 transactions')}
|
label={t('0 transactions')}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</RenderFetched>
|
</AsyncRenderer>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -144,12 +144,12 @@ afterEach(() => {
|
|||||||
describe('Block', () => {
|
describe('Block', () => {
|
||||||
it('renders error state if error is present', async () => {
|
it('renders error state if error is present', async () => {
|
||||||
(useFetch as jest.Mock).mockReturnValue({
|
(useFetch as jest.Mock).mockReturnValue({
|
||||||
state: { data: null, loading: false, error: 'asd' },
|
state: { data: null, loading: false, error: new Error('asd') },
|
||||||
});
|
});
|
||||||
render(renderComponent());
|
render(renderComponent());
|
||||||
|
|
||||||
expect(screen.getByText(`BLOCK ${blockId}`)).toBeInTheDocument();
|
expect(screen.getByText(`BLOCK ${blockId}`)).toBeInTheDocument();
|
||||||
expect(screen.getByText('Error retrieving data')).toBeInTheDocument();
|
expect(screen.getByText('Something went wrong: asd')).toBeInTheDocument();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('renders loading state if present', async () => {
|
it('renders loading state if present', async () => {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import React from 'react';
|
|
||||||
import { Link, useParams } from 'react-router-dom';
|
import { Link, useParams } from 'react-router-dom';
|
||||||
import { DATA_SOURCES } from '../../../config';
|
import { DATA_SOURCES } from '../../../config';
|
||||||
import { getDateTimeFormat } from '@vegaprotocol/utils';
|
import { getDateTimeFormat } from '@vegaprotocol/utils';
|
||||||
@@ -12,9 +11,8 @@ import {
|
|||||||
TableCell,
|
TableCell,
|
||||||
} from '../../../components/table';
|
} from '../../../components/table';
|
||||||
import { TxsPerBlock } from '../../../components/txs/txs-per-block';
|
import { TxsPerBlock } from '../../../components/txs/txs-per-block';
|
||||||
import { Button } from '@vegaprotocol/ui-toolkit';
|
import { AsyncRenderer, Button } from '@vegaprotocol/ui-toolkit';
|
||||||
import { Routes } from '../../route-names';
|
import { Routes } from '../../route-names';
|
||||||
import { RenderFetched } from '../../../components/render-fetched';
|
|
||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { useFetch } from '@vegaprotocol/react-helpers';
|
import { useFetch } from '@vegaprotocol/react-helpers';
|
||||||
import { NodeLink } from '../../../components/links';
|
import { NodeLink } from '../../../components/links';
|
||||||
@@ -34,7 +32,7 @@ const Block = () => {
|
|||||||
return (
|
return (
|
||||||
<section>
|
<section>
|
||||||
<RouteTitle data-testid="block-header">{t(`BLOCK ${block}`)}</RouteTitle>
|
<RouteTitle data-testid="block-header">{t(`BLOCK ${block}`)}</RouteTitle>
|
||||||
<RenderFetched error={error} loading={loading}>
|
<AsyncRenderer data={blockData} error={error} loading={!!loading}>
|
||||||
<>
|
<>
|
||||||
<div className="grid grid-cols-2 gap-2 mb-8">
|
<div className="grid grid-cols-2 gap-2 mb-8">
|
||||||
<Link
|
<Link
|
||||||
@@ -123,7 +121,7 @@ const Block = () => {
|
|||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
</RenderFetched>
|
</AsyncRenderer>
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { useFetch } from '@vegaprotocol/react-helpers';
|
import { useFetch } from '@vegaprotocol/react-helpers';
|
||||||
import { RouteTitle } from '../../components/route-title';
|
import { RouteTitle } from '../../components/route-title';
|
||||||
import { Loader, SyntaxHighlighter } from '@vegaprotocol/ui-toolkit';
|
import { AsyncRenderer, SyntaxHighlighter } from '@vegaprotocol/ui-toolkit';
|
||||||
import { DATA_SOURCES } from '../../config';
|
import { DATA_SOURCES } from '../../config';
|
||||||
import type { TendermintGenesisResponse } from './tendermint-genesis-response';
|
import type { TendermintGenesisResponse } from './tendermint-genesis-response';
|
||||||
import { useDocumentTitle } from '../../hooks/use-document-title';
|
import { useDocumentTitle } from '../../hooks/use-document-title';
|
||||||
@@ -10,21 +10,26 @@ const Genesis = () => {
|
|||||||
useDocumentTitle(['Genesis']);
|
useDocumentTitle(['Genesis']);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
state: { data: genesis, loading },
|
state: { data, loading, error },
|
||||||
} = useFetch<TendermintGenesisResponse>(
|
} = useFetch<TendermintGenesisResponse>(
|
||||||
`${DATA_SOURCES.tendermintUrl}/genesis`
|
`${DATA_SOURCES.tendermintUrl}/genesis`
|
||||||
);
|
);
|
||||||
if (!genesis?.result.genesis) {
|
|
||||||
if (loading) {
|
|
||||||
return <Loader />;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return (
|
return (
|
||||||
<section>
|
<>
|
||||||
<RouteTitle data-testid="genesis-header">{t('Genesis')}</RouteTitle>
|
<RouteTitle data-testid="genesis-header">{t('Genesis')}</RouteTitle>
|
||||||
<SyntaxHighlighter data={genesis?.result.genesis} />
|
<AsyncRenderer
|
||||||
|
data={data}
|
||||||
|
error={error}
|
||||||
|
loading={!!loading}
|
||||||
|
loadingMessage={t('Loading genesis information...')}
|
||||||
|
errorMessage={t('Could not fetch genesis data')}
|
||||||
|
>
|
||||||
|
<section>
|
||||||
|
<SyntaxHighlighter data={data?.result.genesis} />
|
||||||
</section>
|
</section>
|
||||||
|
</AsyncRenderer>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { proposalsDataProvider } from '@vegaprotocol/proposals';
|
import { proposalsDataProvider } from '@vegaprotocol/proposals';
|
||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { useDataProvider } from '@vegaprotocol/react-helpers';
|
import { useDataProvider } from '@vegaprotocol/data-provider';
|
||||||
import { AsyncRenderer } from '@vegaprotocol/ui-toolkit';
|
import { AsyncRenderer } from '@vegaprotocol/ui-toolkit';
|
||||||
import { ProposalsTable } from '../../components/proposals/proposals-table';
|
import { ProposalsTable } from '../../components/proposals/proposals-table';
|
||||||
import { RouteTitle } from '../../components/route-title';
|
import { RouteTitle } from '../../components/route-title';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { useDataProvider } from '@vegaprotocol/react-helpers';
|
import { useDataProvider } from '@vegaprotocol/data-provider';
|
||||||
import { AsyncRenderer, Button } from '@vegaprotocol/ui-toolkit';
|
import { AsyncRenderer, Button } from '@vegaprotocol/ui-toolkit';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router-dom';
|
||||||
@@ -49,6 +49,7 @@ export const MarketPage = () => {
|
|||||||
/>
|
/>
|
||||||
<AsyncRenderer
|
<AsyncRenderer
|
||||||
noDataMessage={t('This chain has no markets')}
|
noDataMessage={t('This chain has no markets')}
|
||||||
|
errorMessage={t('Could not fetch market') + ' ' + marketId}
|
||||||
data={data}
|
data={data}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
error={error}
|
error={error}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { marketsProvider } from '@vegaprotocol/market-list';
|
|||||||
import { RouteTitle } from '../../components/route-title';
|
import { RouteTitle } from '../../components/route-title';
|
||||||
import { AsyncRenderer } from '@vegaprotocol/ui-toolkit';
|
import { AsyncRenderer } from '@vegaprotocol/ui-toolkit';
|
||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { useDataProvider } from '@vegaprotocol/react-helpers';
|
import { useDataProvider } from '@vegaprotocol/data-provider';
|
||||||
import { MarketsTable } from '../../components/markets/markets-table';
|
import { MarketsTable } from '../../components/markets/markets-table';
|
||||||
|
|
||||||
export const MarketsPage = () => {
|
export const MarketsPage = () => {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { render, screen } from '@testing-library/react';
|
import { render, screen } from '@testing-library/react';
|
||||||
import type { NetworkParamsQuery } from '@vegaprotocol/react-helpers';
|
import type { NetworkParamsQuery } from '@vegaprotocol/network-parameters';
|
||||||
import { NetworkParametersTable } from './network-parameters';
|
import { NetworkParametersTable } from './network-parameters';
|
||||||
|
|
||||||
describe('NetworkParametersTable', () => {
|
describe('NetworkParametersTable', () => {
|
||||||
|
|||||||
@@ -13,14 +13,15 @@ import {
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { RouteTitle } from '../../components/route-title';
|
import { RouteTitle } from '../../components/route-title';
|
||||||
import orderBy from 'lodash/orderBy';
|
import orderBy from 'lodash/orderBy';
|
||||||
import { useNetworkParamsQuery } from '@vegaprotocol/react-helpers';
|
import { useNetworkParamsQuery } from '@vegaprotocol/network-parameters';
|
||||||
import type { NetworkParamsQuery } from '@vegaprotocol/react-helpers';
|
import type { NetworkParamsQuery } from '@vegaprotocol/network-parameters';
|
||||||
import { useScrollToLocation } from '../../hooks/scroll-to-location';
|
import { useScrollToLocation } from '../../hooks/scroll-to-location';
|
||||||
import { useDocumentTitle } from '../../hooks/use-document-title';
|
import { useDocumentTitle } from '../../hooks/use-document-title';
|
||||||
|
|
||||||
const PERCENTAGE_PARAMS = [
|
const PERCENTAGE_PARAMS = [
|
||||||
'governance.proposal.asset.requiredMajority',
|
'governance.proposal.asset.requiredMajority',
|
||||||
'governance.proposal.asset.requiredParticipation',
|
'governance.proposal.asset.requiredParticipation',
|
||||||
|
'governance.proposal.updateAsset.requiredParticipation',
|
||||||
'governance.proposal.freeform.requiredMajority',
|
'governance.proposal.freeform.requiredMajority',
|
||||||
'governance.proposal.freeform.requiredParticipation',
|
'governance.proposal.freeform.requiredParticipation',
|
||||||
'governance.proposal.market.requiredMajority',
|
'governance.proposal.market.requiredMajority',
|
||||||
@@ -53,6 +54,8 @@ const BIG_NUMBER_PARAMS = [
|
|||||||
'governance.proposal.asset.minProposerBalance',
|
'governance.proposal.asset.minProposerBalance',
|
||||||
'governance.proposal.market.minProposerBalance',
|
'governance.proposal.market.minProposerBalance',
|
||||||
'governance.proposal.market.minVoterBalance',
|
'governance.proposal.market.minVoterBalance',
|
||||||
|
'governance.proposal.updateAsset.minProposerBalance',
|
||||||
|
'governance.proposal.updateAsset.minVoterBalance',
|
||||||
];
|
];
|
||||||
|
|
||||||
export const NetworkParameterRow = ({
|
export const NetworkParameterRow = ({
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Loader, SyntaxHighlighter } from '@vegaprotocol/ui-toolkit';
|
import { AsyncRenderer, SyntaxHighlighter } from '@vegaprotocol/ui-toolkit';
|
||||||
import { RouteTitle } from '../../../components/route-title';
|
import { RouteTitle } from '../../../components/route-title';
|
||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { useExplorerOracleSpecsQuery } from '../__generated__/Oracles';
|
import { useExplorerOracleSpecsQuery } from '../__generated__/Oracles';
|
||||||
@@ -8,7 +8,7 @@ import { useScrollToLocation } from '../../../hooks/scroll-to-location';
|
|||||||
import filter from 'recursive-key-filter';
|
import filter from 'recursive-key-filter';
|
||||||
|
|
||||||
const Oracles = () => {
|
const Oracles = () => {
|
||||||
const { data, loading } = useExplorerOracleSpecsQuery();
|
const { data, loading, error } = useExplorerOracleSpecsQuery();
|
||||||
|
|
||||||
useDocumentTitle(['Oracles']);
|
useDocumentTitle(['Oracles']);
|
||||||
useScrollToLocation();
|
useScrollToLocation();
|
||||||
@@ -16,7 +16,18 @@ const Oracles = () => {
|
|||||||
return (
|
return (
|
||||||
<section>
|
<section>
|
||||||
<RouteTitle data-testid="oracle-specs-heading">{t('Oracles')}</RouteTitle>
|
<RouteTitle data-testid="oracle-specs-heading">{t('Oracles')}</RouteTitle>
|
||||||
{loading ? <Loader /> : null}
|
<AsyncRenderer
|
||||||
|
data={data}
|
||||||
|
loading={loading}
|
||||||
|
error={error}
|
||||||
|
loadingMessage={t('Loading oracle data...')}
|
||||||
|
errorMessage={t('Oracle data could not be loaded')}
|
||||||
|
noDataMessage={t('No oracles found')}
|
||||||
|
noDataCondition={(data) =>
|
||||||
|
!data?.oracleSpecsConnection?.edges ||
|
||||||
|
data.oracleSpecsConnection.edges?.length === 0
|
||||||
|
}
|
||||||
|
>
|
||||||
{data?.oracleSpecsConnection?.edges
|
{data?.oracleSpecsConnection?.edges
|
||||||
? data.oracleSpecsConnection.edges.map((o) => {
|
? data.oracleSpecsConnection.edges.map((o) => {
|
||||||
const id = o?.node.dataSourceSpec.spec.id;
|
const id = o?.node.dataSourceSpec.spec.id;
|
||||||
@@ -38,6 +49,7 @@ const Oracles = () => {
|
|||||||
);
|
);
|
||||||
})
|
})
|
||||||
: null}
|
: null}
|
||||||
|
</AsyncRenderer>
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
import { RouteTitle } from '../../../components/route-title';
|
import { RouteTitle } from '../../../components/route-title';
|
||||||
import { RenderFetched } from '../../../components/render-fetched';
|
|
||||||
import { truncateByChars } from '@vegaprotocol/utils';
|
import { truncateByChars } from '@vegaprotocol/utils';
|
||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { useDocumentTitle } from '../../../hooks/use-document-title';
|
import { useDocumentTitle } from '../../../hooks/use-document-title';
|
||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router-dom';
|
||||||
import { useExplorerOracleSpecByIdQuery } from '../__generated__/Oracles';
|
import { useExplorerOracleSpecByIdQuery } from '../__generated__/Oracles';
|
||||||
import { OracleDetails } from '../components/oracle';
|
import { OracleDetails } from '../components/oracle';
|
||||||
import { SyntaxHighlighter } from '@vegaprotocol/ui-toolkit';
|
import { AsyncRenderer, SyntaxHighlighter } from '@vegaprotocol/ui-toolkit';
|
||||||
import filter from 'recursive-key-filter';
|
import filter from 'recursive-key-filter';
|
||||||
import { TruncateInline } from '../../../components/truncate/truncate';
|
import { TruncateInline } from '../../../components/truncate/truncate';
|
||||||
|
|
||||||
@@ -27,7 +26,14 @@ export const Oracle = () => {
|
|||||||
{t(`Oracle `)}
|
{t(`Oracle `)}
|
||||||
<TruncateInline startChars={5} endChars={5} text={id || '1'} />
|
<TruncateInline startChars={5} endChars={5} text={id || '1'} />
|
||||||
</RouteTitle>
|
</RouteTitle>
|
||||||
<RenderFetched error={error} loading={loading}>
|
<AsyncRenderer
|
||||||
|
data={data}
|
||||||
|
error={error}
|
||||||
|
loading={loading}
|
||||||
|
noDataCondition={(data) => !data?.oracleSpec}
|
||||||
|
errorMessage={t('Could not load oracle data')}
|
||||||
|
loadingMessage={t('Loading oracle data...')}
|
||||||
|
>
|
||||||
{data?.oracleSpec ? (
|
{data?.oracleSpec ? (
|
||||||
<div id={id} key={id} className="mb-10">
|
<div id={id} key={id} className="mb-10">
|
||||||
<OracleDetails
|
<OracleDetails
|
||||||
@@ -44,7 +50,7 @@ export const Oracle = () => {
|
|||||||
) : (
|
) : (
|
||||||
<span></span>
|
<span></span>
|
||||||
)}
|
)}
|
||||||
</RenderFetched>
|
</AsyncRenderer>
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -48,6 +48,13 @@ query ExplorerPartyAssets($partyId: ID!) {
|
|||||||
}
|
}
|
||||||
stakingSummary {
|
stakingSummary {
|
||||||
currentStakeAvailable
|
currentStakeAvailable
|
||||||
|
linkings(pagination: { first: 100 }) {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
amount
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
accountsConnection {
|
accountsConnection {
|
||||||
edges {
|
edges {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ export type ExplorerPartyAssetsQueryVariables = Types.Exact<{
|
|||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
|
||||||
export type ExplorerPartyAssetsQuery = { __typename?: 'Query', partiesConnection?: { __typename?: 'PartyConnection', edges: Array<{ __typename?: 'PartyEdge', node: { __typename?: 'Party', id: string, delegationsConnection?: { __typename?: 'DelegationsConnection', edges?: Array<{ __typename?: 'DelegationEdge', node: { __typename?: 'Delegation', amount: string, epoch: number, node: { __typename?: 'Node', id: string, name: string } } } | null> | null } | null, stakingSummary: { __typename?: 'StakingSummary', currentStakeAvailable: string }, accountsConnection?: { __typename?: 'AccountsConnection', edges?: Array<{ __typename?: 'AccountEdge', node: { __typename?: 'AccountBalance', type: Types.AccountType, balance: string, asset: { __typename?: 'Asset', name: string, id: string, decimals: number, symbol: string, source: { __typename: 'BuiltinAsset' } | { __typename: 'ERC20', contractAddress: string } }, market?: { __typename?: 'Market', id: string, decimalPlaces: number, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', name: string, product: { __typename?: 'Future', quoteName: string } } } } | null } } | null> | null } | null } }> } | null };
|
export type ExplorerPartyAssetsQuery = { __typename?: 'Query', partiesConnection?: { __typename?: 'PartyConnection', edges: Array<{ __typename?: 'PartyEdge', node: { __typename?: 'Party', id: string, delegationsConnection?: { __typename?: 'DelegationsConnection', edges?: Array<{ __typename?: 'DelegationEdge', node: { __typename?: 'Delegation', amount: string, epoch: number, node: { __typename?: 'Node', id: string, name: string } } } | null> | null } | null, stakingSummary: { __typename?: 'StakingSummary', currentStakeAvailable: string, linkings: { __typename?: 'StakesConnection', edges?: Array<{ __typename?: 'StakeLinkingEdge', node: { __typename?: 'StakeLinking', amount: string } } | null> | null } }, accountsConnection?: { __typename?: 'AccountsConnection', edges?: Array<{ __typename?: 'AccountEdge', node: { __typename?: 'AccountBalance', type: Types.AccountType, balance: string, asset: { __typename?: 'Asset', name: string, id: string, decimals: number, symbol: string, source: { __typename: 'BuiltinAsset' } | { __typename: 'ERC20', contractAddress: string } }, market?: { __typename?: 'Market', id: string, decimalPlaces: number, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', name: string, product: { __typename?: 'Future', quoteName: string } } } } | null } } | null> | null } | null } }> } | null };
|
||||||
|
|
||||||
export const ExplorerPartyAssetsAccountsFragmentDoc = gql`
|
export const ExplorerPartyAssetsAccountsFragmentDoc = gql`
|
||||||
fragment ExplorerPartyAssetsAccounts on AccountBalance {
|
fragment ExplorerPartyAssetsAccounts on AccountBalance {
|
||||||
@@ -64,6 +64,13 @@ export const ExplorerPartyAssetsDocument = gql`
|
|||||||
}
|
}
|
||||||
stakingSummary {
|
stakingSummary {
|
||||||
currentStakeAvailable
|
currentStakeAvailable
|
||||||
|
linkings(pagination: {first: 100}) {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
amount
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
accountsConnection {
|
accountsConnection {
|
||||||
edges {
|
edges {
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
import { useParams } from 'react-router-dom';
|
||||||
|
import { toNonHex } from '../../../../components/search/detect-search';
|
||||||
|
import { PageHeader } from '../../../../components/page-header';
|
||||||
|
import { useDocumentTitle } from '../../../../hooks/use-document-title';
|
||||||
|
|
||||||
|
import { PartyAccounts } from '../components/party-accounts';
|
||||||
|
|
||||||
|
const PartyAccountsByAsset = () => {
|
||||||
|
const { party } = useParams<{ party: string }>();
|
||||||
|
|
||||||
|
useDocumentTitle(['Public keys', party || '-']);
|
||||||
|
const partyId = toNonHex(party ? party : '');
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section>
|
||||||
|
<PageHeader title={t('Balances by asset')} />
|
||||||
|
|
||||||
|
<PartyAccounts partyId={partyId} />
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export { PartyAccountsByAsset };
|
||||||
@@ -1,32 +1,9 @@
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
import { AccountManager } from '@vegaprotocol/accounts';
|
||||||
import get from 'lodash/get';
|
import { useCallback } from 'react';
|
||||||
import AssetBalance from '../../../../components/asset-balance/asset-balance';
|
import { useAssetDetailsDialogStore } from '@vegaprotocol/assets';
|
||||||
import { AssetLink, MarketLink } from '../../../../components/links';
|
|
||||||
import { Table, TableRow } from '../../../../components/table';
|
|
||||||
import type * as Schema from '@vegaprotocol/types';
|
|
||||||
import type { ExplorerPartyAssetsAccountsFragment } from '../__generated__/Party-assets';
|
|
||||||
|
|
||||||
const accountTypeString: Record<Schema.AccountType, string> = {
|
|
||||||
ACCOUNT_TYPE_BOND: t('Bond'),
|
|
||||||
ACCOUNT_TYPE_EXTERNAL: t('External'),
|
|
||||||
ACCOUNT_TYPE_FEES_INFRASTRUCTURE: t('Fees (Infrastructure)'),
|
|
||||||
ACCOUNT_TYPE_FEES_LIQUIDITY: t('Fees (Liquidity)'),
|
|
||||||
ACCOUNT_TYPE_FEES_MAKER: t('Fees (Maker)'),
|
|
||||||
ACCOUNT_TYPE_GENERAL: t('General'),
|
|
||||||
ACCOUNT_TYPE_GLOBAL_INSURANCE: t('Global Insurance Pool'),
|
|
||||||
ACCOUNT_TYPE_GLOBAL_REWARD: t('Global Reward Pool'),
|
|
||||||
ACCOUNT_TYPE_INSURANCE: t('Insurance'),
|
|
||||||
ACCOUNT_TYPE_MARGIN: t('Margin'),
|
|
||||||
ACCOUNT_TYPE_PENDING_TRANSFERS: t('Pending Transfers'),
|
|
||||||
ACCOUNT_TYPE_REWARD_LP_RECEIVED_FEES: t('Reward - LP Fees received'),
|
|
||||||
ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES: t('Reward - Maker fees paid'),
|
|
||||||
ACCOUNT_TYPE_REWARD_MAKER_RECEIVED_FEES: t('Reward - Maker fees received'),
|
|
||||||
ACCOUNT_TYPE_REWARD_MARKET_PROPOSERS: t('Reward - Market proposers'),
|
|
||||||
ACCOUNT_TYPE_SETTLEMENT: t('Settlement'),
|
|
||||||
};
|
|
||||||
|
|
||||||
interface PartyAccountsProps {
|
interface PartyAccountsProps {
|
||||||
accounts: ExplorerPartyAssetsAccountsFragment[];
|
partyId: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -34,49 +11,22 @@ interface PartyAccountsProps {
|
|||||||
* probably do with sorting by asset, and then within asset, by type with general
|
* probably do with sorting by asset, and then within asset, by type with general
|
||||||
* appearing first and... tbd
|
* appearing first and... tbd
|
||||||
*/
|
*/
|
||||||
export const PartyAccounts = ({ accounts }: PartyAccountsProps) => {
|
export const PartyAccounts = ({ partyId }: PartyAccountsProps) => {
|
||||||
return (
|
const { open: openAssetDetailsDialog } = useAssetDetailsDialogStore();
|
||||||
<Table className="max-w-5xl min-w-fit">
|
const onClickAsset = useCallback(
|
||||||
<thead>
|
(assetId?: string) => {
|
||||||
<TableRow modifier="bordered" className="font-mono">
|
assetId && openAssetDetailsDialog(assetId);
|
||||||
<td>{t('Type')}</td>
|
},
|
||||||
<td>{t('Market')}</td>
|
[openAssetDetailsDialog]
|
||||||
<td className="text-right pr-2">{t('Balance')}</td>
|
);
|
||||||
<td>{t('Asset')}</td>
|
|
||||||
</TableRow>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{accounts.map((account) => {
|
|
||||||
const m = get(account, 'market.tradableInstrument.instrument.name');
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<TableRow
|
<div className="block min-h-44 h-60 4 w-full border-red-800 relative">
|
||||||
key={`pa-${account.asset.id}-${account.type}`}
|
<AccountManager
|
||||||
title={account.asset.name}
|
partyId={partyId}
|
||||||
id={`${accountTypeString[account.type]} ${m ? ` - ${m}` : ''}`}
|
onClickAsset={onClickAsset}
|
||||||
>
|
isReadOnly={true}
|
||||||
<td className="text-md">{accountTypeString[account.type]}</td>
|
|
||||||
<td className="text-md">
|
|
||||||
{account.market?.id ? (
|
|
||||||
<MarketLink id={account.market?.id} />
|
|
||||||
) : (
|
|
||||||
<p>-</p>
|
|
||||||
)}
|
|
||||||
</td>
|
|
||||||
<td className="text-md text-right pr-2">
|
|
||||||
<AssetBalance
|
|
||||||
assetId={account.asset.id}
|
|
||||||
price={account.balance}
|
|
||||||
showAssetLink={false}
|
|
||||||
/>
|
/>
|
||||||
</td>
|
</div>
|
||||||
<td className="text-md">
|
|
||||||
<AssetLink assetId={account.asset.id} asDialog={true} />
|
|
||||||
</td>
|
|
||||||
</TableRow>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</tbody>
|
|
||||||
</Table>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,63 @@
|
|||||||
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
import { Routes } from '../../../../routes/route-names';
|
||||||
|
import { Button, Icon, Loader } from '@vegaprotocol/ui-toolkit';
|
||||||
|
import { PartyBlock } from './party-block';
|
||||||
|
import type { AccountFields } from '@vegaprotocol/accounts';
|
||||||
|
|
||||||
|
export interface PartyBlockAccountProps {
|
||||||
|
partyId: string;
|
||||||
|
accountData: AccountFields[] | null;
|
||||||
|
accountLoading: boolean;
|
||||||
|
accountError?: Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays an overview of a party's assets. This uses existing data
|
||||||
|
* providers to structure the details by asset, rather than looking at
|
||||||
|
* it by account. The assumption is that this is a more natural way to
|
||||||
|
* get an idea of the assets and activity of a party.
|
||||||
|
*/
|
||||||
|
export const PartyBlockAccounts = ({
|
||||||
|
partyId,
|
||||||
|
accountData,
|
||||||
|
accountLoading,
|
||||||
|
accountError,
|
||||||
|
}: PartyBlockAccountProps) => {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
const shouldShowActionButton =
|
||||||
|
accountData && accountData.length > 0 && !accountLoading && !accountError;
|
||||||
|
|
||||||
|
const action = shouldShowActionButton ? (
|
||||||
|
<Button
|
||||||
|
size="sm"
|
||||||
|
onClick={() => navigate(`/${Routes.PARTIES}/${partyId}/assets`)}
|
||||||
|
>
|
||||||
|
{t('Show all')}
|
||||||
|
</Button>
|
||||||
|
) : null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<PartyBlock title={t('Assets')} action={action}>
|
||||||
|
{accountData && accountData.length > 0 ? (
|
||||||
|
<p>
|
||||||
|
{accountData.length} {t('assets, including')}{' '}
|
||||||
|
{accountData
|
||||||
|
.map((a) => a.asset.symbol)
|
||||||
|
.slice(0, 3)
|
||||||
|
.join(', ')}
|
||||||
|
</p>
|
||||||
|
) : accountLoading && !accountError ? (
|
||||||
|
<Loader size="small" />
|
||||||
|
) : accountData && accountData.length === 0 ? (
|
||||||
|
<p>{t('No accounts found')}</p>
|
||||||
|
) : (
|
||||||
|
<p>
|
||||||
|
<Icon className="mr-1" name="error" />
|
||||||
|
<span className="text-sm">{t('Could not load assets')}</span>
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</PartyBlock>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
import { useExplorerPartyAssetsQuery } from '../__generated__/Party-assets';
|
||||||
|
import GovernanceAssetBalance from '../../../../components/asset-balance/governance-asset-balance';
|
||||||
|
import {
|
||||||
|
Icon,
|
||||||
|
KeyValueTable,
|
||||||
|
KeyValueTableRow,
|
||||||
|
Loader,
|
||||||
|
} from '@vegaprotocol/ui-toolkit';
|
||||||
|
import { PartyBlock } from './party-block';
|
||||||
|
import BigNumber from 'bignumber.js';
|
||||||
|
|
||||||
|
export interface PartyBlockStakeProps {
|
||||||
|
partyId: string;
|
||||||
|
accountLoading: boolean;
|
||||||
|
accountError?: Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays an overview of a single party's staking balance, importantly maintaining'
|
||||||
|
* the same height before and after the details are loaded in.
|
||||||
|
*
|
||||||
|
* Unlike PartyBlockAccounts there is not action button in the title of this block as
|
||||||
|
* there is no page for it to link to currently. That's a future task.
|
||||||
|
*/
|
||||||
|
export const PartyBlockStake = ({
|
||||||
|
partyId,
|
||||||
|
accountLoading,
|
||||||
|
accountError,
|
||||||
|
}: PartyBlockStakeProps) => {
|
||||||
|
const partyRes = useExplorerPartyAssetsQuery({
|
||||||
|
// Don't cache data for this query, party information can move quite quickly
|
||||||
|
fetchPolicy: 'network-only',
|
||||||
|
variables: { partyId: partyId },
|
||||||
|
skip: !partyId,
|
||||||
|
});
|
||||||
|
|
||||||
|
const p = partyRes.data?.partiesConnection?.edges[0].node;
|
||||||
|
|
||||||
|
const linkedLength = p?.stakingSummary?.linkings?.edges?.length;
|
||||||
|
const linkedStake =
|
||||||
|
linkedLength && linkedLength > 0
|
||||||
|
? p?.stakingSummary?.linkings?.edges
|
||||||
|
?.reduce((total, e) => {
|
||||||
|
return new BigNumber(total).plus(
|
||||||
|
new BigNumber(e?.node.amount || 0)
|
||||||
|
);
|
||||||
|
}, new BigNumber(0))
|
||||||
|
.toString()
|
||||||
|
: '0';
|
||||||
|
|
||||||
|
return (
|
||||||
|
<PartyBlock title={t('Staking')}>
|
||||||
|
{p?.stakingSummary.currentStakeAvailable ? (
|
||||||
|
<KeyValueTable>
|
||||||
|
<KeyValueTableRow noBorder={true}>
|
||||||
|
<div>{t('Available stake')}</div>
|
||||||
|
<div>
|
||||||
|
<GovernanceAssetBalance
|
||||||
|
price={p.stakingSummary.currentStakeAvailable}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</KeyValueTableRow>
|
||||||
|
<KeyValueTableRow noBorder={true}>
|
||||||
|
<div>{t('Active stake')}</div>
|
||||||
|
<div>
|
||||||
|
<GovernanceAssetBalance price={linkedStake || '0'} />
|
||||||
|
</div>
|
||||||
|
</KeyValueTableRow>
|
||||||
|
</KeyValueTable>
|
||||||
|
) : accountLoading && !accountError ? (
|
||||||
|
<Loader size="small" />
|
||||||
|
) : !accountError ? (
|
||||||
|
<p>{t('No staking balance')}</p>
|
||||||
|
) : (
|
||||||
|
<p>
|
||||||
|
<Icon className="mr-1" name="error" />
|
||||||
|
<span className="text-sm">{t('Could not load stake details')}</span>
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</PartyBlock>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
import type { ReactNode } from 'react';
|
||||||
|
|
||||||
|
export interface PartyBlockProps {
|
||||||
|
children: ReactNode;
|
||||||
|
title: string;
|
||||||
|
action?: ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function PartyBlock({ children, title, action }: PartyBlockProps) {
|
||||||
|
return (
|
||||||
|
<div className="border-2 min-h-[138px] border-solid border-vega-light-100 dark:border-vega-dark-200 p-5 mt-5">
|
||||||
|
<div
|
||||||
|
className="flex flex-col md:flex-row gap-1 justify-between content-start mb-2"
|
||||||
|
data-testid="page-title"
|
||||||
|
>
|
||||||
|
<h3 className="font-semibold text-lg">{title}</h3>
|
||||||
|
|
||||||
|
{action ? action : null}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{children}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,24 +1,26 @@
|
|||||||
import { getNodes } from '@vegaprotocol/utils';
|
|
||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { useScreenDimensions } from '@vegaprotocol/react-helpers';
|
import { useScreenDimensions } from '@vegaprotocol/react-helpers';
|
||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
import { useParams } from 'react-router-dom';
|
import { useNavigate, useParams } from 'react-router-dom';
|
||||||
import { SubHeading } from '../../../components/sub-heading';
|
import { SubHeading } from '../../../components/sub-heading';
|
||||||
import { Panel } from '../../../components/panel';
|
|
||||||
import { toNonHex } from '../../../components/search/detect-search';
|
import { toNonHex } from '../../../components/search/detect-search';
|
||||||
import { useTxsData } from '../../../hooks/use-txs-data';
|
import { useTxsData } from '../../../hooks/use-txs-data';
|
||||||
import { TxsInfiniteList } from '../../../components/txs';
|
import { TxsInfiniteList } from '../../../components/txs';
|
||||||
import { PageHeader } from '../../../components/page-header';
|
import { PageHeader } from '../../../components/page-header';
|
||||||
import { useExplorerPartyAssetsQuery } from './__generated__/Party-assets';
|
|
||||||
import type { ExplorerPartyAssetsAccountsFragment } from './__generated__/Party-assets';
|
|
||||||
import { useDocumentTitle } from '../../../hooks/use-document-title';
|
import { useDocumentTitle } from '../../../hooks/use-document-title';
|
||||||
import GovernanceAssetBalance from '../../../components/asset-balance/governance-asset-balance';
|
import { Icon, Intent, Notification, Splash } from '@vegaprotocol/ui-toolkit';
|
||||||
import { PartyAccounts } from './components/party-accounts';
|
import { aggregatedAccountsDataProvider } from '@vegaprotocol/accounts';
|
||||||
|
import { PartyBlockStake } from './components/party-block-stake';
|
||||||
|
import { PartyBlockAccounts } from './components/party-block-accounts';
|
||||||
|
import { isValidPartyId } from './components/party-id-error';
|
||||||
|
import { useDataProvider } from '@vegaprotocol/data-provider';
|
||||||
|
|
||||||
const Party = () => {
|
const Party = () => {
|
||||||
const { party } = useParams<{ party: string }>();
|
const { party } = useParams<{ party: string }>();
|
||||||
|
|
||||||
useDocumentTitle(['Public keys', party || '-']);
|
useDocumentTitle(['Public keys', party || '-']);
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const partyId = toNonHex(party ? party : '');
|
const partyId = toNonHex(party ? party : '');
|
||||||
const { isMobile } = useScreenDimensions();
|
const { isMobile } = useScreenDimensions();
|
||||||
const visibleChars = useMemo(() => (isMobile ? 10 : 14), [isMobile]);
|
const visibleChars = useMemo(() => (isMobile ? 10 : 14), [isMobile]);
|
||||||
@@ -28,61 +30,58 @@ const Party = () => {
|
|||||||
filters,
|
filters,
|
||||||
});
|
});
|
||||||
|
|
||||||
const partyRes = useExplorerPartyAssetsQuery({
|
const variables = useMemo(() => ({ partyId }), [partyId]);
|
||||||
// Don't cache data for this query, party information can move quite quickly
|
const {
|
||||||
fetchPolicy: 'network-only',
|
data: AccountData,
|
||||||
variables: { partyId: partyId },
|
loading: AccountLoading,
|
||||||
skip: !party,
|
error: AccountError,
|
||||||
|
} = useDataProvider({
|
||||||
|
dataProvider: aggregatedAccountsDataProvider,
|
||||||
|
variables,
|
||||||
});
|
});
|
||||||
|
|
||||||
const p = partyRes.data?.partiesConnection?.edges[0].node;
|
if (!isValidPartyId(partyId)) {
|
||||||
|
return (
|
||||||
|
<div className="max-w-sm mx-auto">
|
||||||
|
<Notification
|
||||||
|
message={t('Invalid party ID')}
|
||||||
|
intent={Intent.Danger}
|
||||||
|
buttonProps={{
|
||||||
|
text: t('Go back'),
|
||||||
|
action: () => navigate(-1),
|
||||||
|
className: 'py-1',
|
||||||
|
size: 'sm',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const header = p?.id ? (
|
return (
|
||||||
|
<section>
|
||||||
<PageHeader
|
<PageHeader
|
||||||
title={p.id}
|
title={partyId}
|
||||||
copy
|
copy
|
||||||
truncateStart={visibleChars}
|
truncateStart={visibleChars}
|
||||||
truncateEnd={visibleChars}
|
truncateEnd={visibleChars}
|
||||||
/>
|
/>
|
||||||
) : (
|
|
||||||
<Panel>
|
|
||||||
<p>No data found for public key {party}</p>
|
|
||||||
</Panel>
|
|
||||||
);
|
|
||||||
|
|
||||||
const staking = (
|
<div className="grid md:grid-flow-col grid-flow-row md:space-x-4 grid-cols-1 md:grid-cols-2 w-full">
|
||||||
<section>
|
<PartyBlockAccounts
|
||||||
{p?.stakingSummary?.currentStakeAvailable ? (
|
accountError={AccountError}
|
||||||
<div className="mt-4 leading-3">
|
accountLoading={AccountLoading}
|
||||||
<strong className="font-semibold">{t('Staking Balance: ')}</strong>
|
accountData={AccountData}
|
||||||
<GovernanceAssetBalance
|
partyId={partyId}
|
||||||
price={p.stakingSummary.currentStakeAvailable}
|
/>
|
||||||
|
<PartyBlockStake
|
||||||
|
accountError={AccountError}
|
||||||
|
accountLoading={AccountLoading}
|
||||||
|
partyId={partyId}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
|
||||||
</section>
|
|
||||||
);
|
|
||||||
|
|
||||||
const accounts = getNodes<ExplorerPartyAssetsAccountsFragment>(
|
|
||||||
p?.accountsConnection
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<section>
|
|
||||||
<h1
|
|
||||||
className="font-alpha calt uppercase font-xl mb-4 text-vega-dark-100 dark:text-vega-light-100"
|
|
||||||
data-testid="parties-header"
|
|
||||||
>
|
|
||||||
{t('Public key')}
|
|
||||||
</h1>
|
|
||||||
{partyRes.data ? (
|
|
||||||
<>
|
|
||||||
{header}
|
|
||||||
<SubHeading>{t('Asset data')}</SubHeading>
|
|
||||||
{accounts ? <PartyAccounts accounts={accounts} /> : null}
|
|
||||||
{staking}
|
|
||||||
|
|
||||||
<SubHeading>{t('Transactions')}</SubHeading>
|
<SubHeading>{t('Transactions')}</SubHeading>
|
||||||
|
{!error && txsData ? (
|
||||||
<TxsInfiniteList
|
<TxsInfiniteList
|
||||||
hasMoreTxs={hasMoreTxs}
|
hasMoreTxs={hasMoreTxs}
|
||||||
areTxsLoading={loading}
|
areTxsLoading={loading}
|
||||||
@@ -91,8 +90,12 @@ const Party = () => {
|
|||||||
error={error}
|
error={error}
|
||||||
className="mb-28"
|
className="mb-28"
|
||||||
/>
|
/>
|
||||||
</>
|
) : (
|
||||||
) : null}
|
<Splash>
|
||||||
|
<Icon name="error" className="mr-1" />
|
||||||
|
{t('Could not load transaction list for party')}
|
||||||
|
</Splash>
|
||||||
|
)}
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import { Outlet } from 'react-router-dom';
|
||||||
|
|
||||||
|
const PartiesSubPage = () => {
|
||||||
|
return <Outlet />;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PartiesSubPage;
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import { DATA_SOURCES } from '../../config';
|
|
||||||
import type { TendermintUnconfirmedTransactionsResponse } from '../txs/tendermint-unconfirmed-transactions-response.d';
|
|
||||||
import { TxList } from '../../components/txs';
|
|
||||||
import { RouteTitle } from '../../components/route-title';
|
|
||||||
import { t } from '@vegaprotocol/i18n';
|
|
||||||
import { useFetch } from '@vegaprotocol/react-helpers';
|
|
||||||
import { useDocumentTitle } from '../../hooks/use-document-title';
|
|
||||||
|
|
||||||
const PendingTxs = () => {
|
|
||||||
const {
|
|
||||||
state: { data: unconfirmedTransactions },
|
|
||||||
} = useFetch<TendermintUnconfirmedTransactionsResponse>(
|
|
||||||
`${DATA_SOURCES.tendermintUrl}/unconfirmed_txs`
|
|
||||||
);
|
|
||||||
|
|
||||||
useDocumentTitle(['Pending transactions']);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<section>
|
|
||||||
<RouteTitle data-testid="unconfirmed-transactions-header">
|
|
||||||
{t('Unconfirmed transactions')}
|
|
||||||
</RouteTitle>
|
|
||||||
<br />
|
|
||||||
<div>{t(`Number: ${unconfirmedTransactions?.result?.n_txs || 0}`)}</div>
|
|
||||||
<br />
|
|
||||||
<div>
|
|
||||||
<br />
|
|
||||||
<TxList data={unconfirmedTransactions} />
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export { PendingTxs };
|
|
||||||
@@ -14,7 +14,6 @@ import { Block } from './blocks/id';
|
|||||||
import { Blocks } from './blocks/home';
|
import { Blocks } from './blocks/home';
|
||||||
import { Tx } from './txs/id';
|
import { Tx } from './txs/id';
|
||||||
import { TxsList } from './txs/home';
|
import { TxsList } from './txs/home';
|
||||||
import { PendingTxs } from './pending';
|
|
||||||
import flags from '../config/flags';
|
import flags from '../config/flags';
|
||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { Routes } from './route-names';
|
import { Routes } from './route-names';
|
||||||
@@ -29,6 +28,7 @@ import compact from 'lodash/compact';
|
|||||||
import { AssetLink, MarketLink } from '../components/links';
|
import { AssetLink, MarketLink } from '../components/links';
|
||||||
import { truncateMiddle } from '@vegaprotocol/ui-toolkit';
|
import { truncateMiddle } from '@vegaprotocol/ui-toolkit';
|
||||||
import { remove0x } from '@vegaprotocol/utils';
|
import { remove0x } from '@vegaprotocol/utils';
|
||||||
|
import { PartyAccountsByAsset } from './parties/id/accounts';
|
||||||
|
|
||||||
export type Navigable = {
|
export type Navigable = {
|
||||||
path: string;
|
path: string;
|
||||||
@@ -75,6 +75,11 @@ const partiesRoutes: Route[] = flags.parties
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: ':party',
|
path: ':party',
|
||||||
|
element: <Party />,
|
||||||
|
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
index: true,
|
||||||
element: <PartySingle />,
|
element: <PartySingle />,
|
||||||
handle: {
|
handle: {
|
||||||
breadcrumb: (params: Params<string>) => (
|
breadcrumb: (params: Params<string>) => (
|
||||||
@@ -84,6 +89,30 @@ const partiesRoutes: Route[] = flags.parties
|
|||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'assets',
|
||||||
|
element: <Party />,
|
||||||
|
handle: {
|
||||||
|
breadcrumb: (params: Params<string>) => (
|
||||||
|
<Link to={linkTo(Routes.PARTIES, params.party)}>
|
||||||
|
{truncateMiddle(params.party as string)}
|
||||||
|
</Link>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
index: true,
|
||||||
|
element: <PartyAccountsByAsset />,
|
||||||
|
handle: {
|
||||||
|
breadcrumb: () => {
|
||||||
|
return t('Assets');
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
@@ -237,17 +266,6 @@ export const routerConfig: Route[] = [
|
|||||||
breadcrumb: () => <Link to={Routes.TX}>{t('Transactions')}</Link>,
|
breadcrumb: () => <Link to={Routes.TX}>{t('Transactions')}</Link>,
|
||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
{
|
|
||||||
path: 'pending',
|
|
||||||
element: <PendingTxs />,
|
|
||||||
handle: {
|
|
||||||
breadcrumb: () => (
|
|
||||||
<Link to={linkTo(Routes.TX, 'pending')}>
|
|
||||||
{t('Pending transactions')}
|
|
||||||
</Link>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
path: ':txHash',
|
path: ':txHash',
|
||||||
element: <Tx />,
|
element: <Tx />,
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ interface TxDetailsProps {
|
|||||||
|
|
||||||
export const txDetailsTruncateLength = 30;
|
export const txDetailsTruncateLength = 30;
|
||||||
|
|
||||||
export const TxDetails = ({ txData, pubKey, className }: TxDetailsProps) => {
|
export const TxDetails = ({ txData, pubKey }: TxDetailsProps) => {
|
||||||
if (!txData) {
|
if (!txData) {
|
||||||
return <>{t('Awaiting Block Explorer transaction details')}</>;
|
return <>{t('Awaiting Block Explorer transaction details')}</>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import {
|
|||||||
} from '@vegaprotocol/environment';
|
} from '@vegaprotocol/environment';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { NodeStatus, NodeStatusMapping } from '@vegaprotocol/types';
|
import { NodeStatus, NodeStatusMapping } from '@vegaprotocol/types';
|
||||||
|
import { PartyLink } from '../../components/links';
|
||||||
|
|
||||||
type RateProps = {
|
type RateProps = {
|
||||||
value: BigNumber | number | undefined;
|
value: BigNumber | number | undefined;
|
||||||
@@ -191,7 +192,9 @@ export const ValidatorsPage = () => {
|
|||||||
<KeyValueTable>
|
<KeyValueTable>
|
||||||
<KeyValueTableRow>
|
<KeyValueTableRow>
|
||||||
<div>{t('ID')}</div>
|
<div>{t('ID')}</div>
|
||||||
<div className="break-all text-xs">{v.id}</div>
|
<div className="break-all text-xs font-mono">
|
||||||
|
{v.id}
|
||||||
|
</div>
|
||||||
</KeyValueTableRow>
|
</KeyValueTableRow>
|
||||||
<KeyValueTableRow>
|
<KeyValueTableRow>
|
||||||
<div>{t('Status')}</div>
|
<div>{t('Status')}</div>
|
||||||
@@ -218,12 +221,14 @@ export const ValidatorsPage = () => {
|
|||||||
</div>
|
</div>
|
||||||
</KeyValueTableRow>
|
</KeyValueTableRow>
|
||||||
<KeyValueTableRow>
|
<KeyValueTableRow>
|
||||||
<div>{t('Public key')}</div>
|
<div>{t('Key')}</div>
|
||||||
<div className="break-all text-xs">{v.pubkey}</div>
|
<div className="break-all text-xs">
|
||||||
|
<PartyLink id={v.pubkey} />
|
||||||
|
</div>
|
||||||
</KeyValueTableRow>
|
</KeyValueTableRow>
|
||||||
<KeyValueTableRow>
|
<KeyValueTableRow>
|
||||||
<div>{t('Ethereum address')}</div>
|
<div>{t('Ethereum address')}</div>
|
||||||
<div className="break-all text-xs">
|
<div className="break-all text-xs font-mono">
|
||||||
<EtherscanLink address={v.ethereumAddress} />{' '}
|
<EtherscanLink address={v.ethereumAddress} />{' '}
|
||||||
<CopyWithTooltip text={v.ethereumAddress}>
|
<CopyWithTooltip text={v.ethereumAddress}>
|
||||||
<button title={t('Copy address to clipboard')}>
|
<button title={t('Copy address to clipboard')}>
|
||||||
@@ -234,7 +239,9 @@ export const ValidatorsPage = () => {
|
|||||||
</KeyValueTableRow>
|
</KeyValueTableRow>
|
||||||
<KeyValueTableRow>
|
<KeyValueTableRow>
|
||||||
<div>{t('Tendermint public key')}</div>
|
<div>{t('Tendermint public key')}</div>
|
||||||
<div className="break-all text-xs">{v.tmPubkey}</div>
|
<div className="break-all text-xs font-mono">
|
||||||
|
{v.tmPubkey}
|
||||||
|
</div>
|
||||||
</KeyValueTableRow>
|
</KeyValueTableRow>
|
||||||
|
|
||||||
<KeyValueTableRow>
|
<KeyValueTableRow>
|
||||||
|
|||||||
@@ -32,6 +32,11 @@
|
|||||||
line-height: calc(min(var(--ag-line-height, 26px), 26px) - 4px);
|
line-height: calc(min(var(--ag-line-height, 26px), 26px) - 4px);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.vega-ag-grid .ag-row {
|
||||||
|
border-width: 1px 0;
|
||||||
|
border-bottom: 1px solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
/* Light variables */
|
/* Light variables */
|
||||||
.ag-theme-balham {
|
.ag-theme-balham {
|
||||||
--ag-background-color: theme(colors.white);
|
--ag-background-color: theme(colors.white);
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ NX_LOCAL_PROVIDER_URL=http://localhost:8545/
|
|||||||
NX_ETH_LOCAL_PROVIDER_URL=http://localhost:8545/
|
NX_ETH_LOCAL_PROVIDER_URL=http://localhost:8545/
|
||||||
NX_VEGA_WALLET_URL=http://localhost:1789
|
NX_VEGA_WALLET_URL=http://localhost:1789
|
||||||
NX_VEGA_DOCS_URL=https://docs.vega.xyz/mainnet
|
NX_VEGA_DOCS_URL=https://docs.vega.xyz/mainnet
|
||||||
NX_TRANCHES_SERVICE_URL=https://tranches-stagnet3-k8s.ops.vega.xyz
|
NX_TRANCHES_SERVICE_URL=https://tranches-stagnet1-k8s.ops.vega.xyz
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
||||||
NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72
|
NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72
|
||||||
@@ -30,6 +30,6 @@ CYPRESS_TRUNCATED_VEGA_PUBLIC_KEY2=7f9cf0…c25535
|
|||||||
CYPRESS_VEGA_ENV=CUSTOM
|
CYPRESS_VEGA_ENV=CUSTOM
|
||||||
CYPRESS_VEGA_PUBLIC_KEY=02eceaba4df2bef76ea10caf728d8a099a2aa846cced25737cccaa9812342f65
|
CYPRESS_VEGA_PUBLIC_KEY=02eceaba4df2bef76ea10caf728d8a099a2aa846cced25737cccaa9812342f65
|
||||||
CYPRESS_VEGA_PUBLIC_KEY2=7f9cf07d3a9905b1a61a1069f7a758855da428bc0f4a97de87f48644bfc25535
|
CYPRESS_VEGA_PUBLIC_KEY2=7f9cf07d3a9905b1a61a1069f7a758855da428bc0f4a97de87f48644bfc25535
|
||||||
CYPRESS_VEGA_TOKEN_URL=https://token.fairground.wtf
|
CYPRESS_VEGA_TOKEN_URL=https://governance.fairground.wtf
|
||||||
CYPRESS_VEGA_WALLET_URL=http://localhost:1789
|
CYPRESS_VEGA_WALLET_URL=http://localhost:1789
|
||||||
CYPRESS_VEGA_WALLET_API_TOKEN=
|
CYPRESS_VEGA_WALLET_API_TOKEN=
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
NX_VEGA_ENV=MAINNET
|
NX_VEGA_ENV=MAINNET
|
||||||
NX_VEGA_URL=https://api.vega.xyz/query
|
NX_VEGA_URL=https://api.vega.community/graphql
|
||||||
NX_ETHEREUM_PROVIDER_URL=https://mainnet.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
NX_ETHEREUM_PROVIDER_URL=https://mainnet.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
||||||
NX_ETHERSCAN_URL=https://etherscan.io
|
NX_ETHERSCAN_URL=https://etherscan.io
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
# App configuration variables
|
|
||||||
NX_VEGA_ENV=STAGNET3
|
|
||||||
NX_VEGA_URL=https://api.stagnet3.vega.xyz/graphql
|
|
||||||
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
"name": "Token test market",
|
"name": "Token test market",
|
||||||
"code": "Token.24h",
|
"code": "Token.24h",
|
||||||
"future": {
|
"future": {
|
||||||
"settlementAsset": "fBTC",
|
"settlementAsset": "73174a6fb1d5802ba0ac7bd7ab79e0a3a4837b262de0a4e80815a55442692bd0",
|
||||||
"quoteName": "fBTC",
|
"quoteName": "fBTC",
|
||||||
"dataSourceSpecForSettlementData": {
|
"dataSourceSpecForSettlementData": {
|
||||||
"external": {
|
"external": {
|
||||||
|
|||||||
@@ -2,14 +2,14 @@ import {
|
|||||||
navigateTo,
|
navigateTo,
|
||||||
waitForSpinner,
|
waitForSpinner,
|
||||||
navigation,
|
navigation,
|
||||||
|
turnTelemetryOff,
|
||||||
} from '../../support/common.functions';
|
} from '../../support/common.functions';
|
||||||
import {
|
import {
|
||||||
convertUnixTimestampToDateformat,
|
|
||||||
createRawProposal,
|
createRawProposal,
|
||||||
createTenDigitUnixTimeStampForSpecifiedDays,
|
createTenDigitUnixTimeStampForSpecifiedDays,
|
||||||
enterUniqueFreeFormProposalBody,
|
enterUniqueFreeFormProposalBody,
|
||||||
generateFreeFormProposalTitle,
|
generateFreeFormProposalTitle,
|
||||||
getGovernanceProposalDateFormatForSpecifiedDays,
|
getDateFormatForSpecifiedDays,
|
||||||
getProposalIdFromList,
|
getProposalIdFromList,
|
||||||
getProposalInformationFromTable,
|
getProposalInformationFromTable,
|
||||||
getSubmittedProposalFromProposalList,
|
getSubmittedProposalFromProposalList,
|
||||||
@@ -23,6 +23,7 @@ import { ensureSpecifiedUnstakedTokensAreAssociated } from '../../../../governan
|
|||||||
import { ethereumWalletConnect } from '../../../../governance-e2e/src/support/wallet-eth.functions';
|
import { ethereumWalletConnect } from '../../../../governance-e2e/src/support/wallet-eth.functions';
|
||||||
import { vegaWalletSetSpecifiedApprovalAmount } from '../../../../governance-e2e/src/support/wallet-teardown.functions';
|
import { vegaWalletSetSpecifiedApprovalAmount } from '../../../../governance-e2e/src/support/wallet-teardown.functions';
|
||||||
import type { testFreeformProposal } from '../../support/common-interfaces';
|
import type { testFreeformProposal } from '../../support/common-interfaces';
|
||||||
|
import { formatDateWithLocalTimezone } from '@vegaprotocol/utils';
|
||||||
|
|
||||||
const proposalVoteProgressForPercentage =
|
const proposalVoteProgressForPercentage =
|
||||||
'[data-testid="vote-progress-indicator-percentage-for"]';
|
'[data-testid="vote-progress-indicator-percentage-for"]';
|
||||||
@@ -49,6 +50,8 @@ describe(
|
|||||||
});
|
});
|
||||||
|
|
||||||
beforeEach('visit proposals tab', function () {
|
beforeEach('visit proposals tab', function () {
|
||||||
|
cy.clearLocalStorage();
|
||||||
|
turnTelemetryOff();
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
@@ -98,20 +101,22 @@ describe(
|
|||||||
getSubmittedProposalFromProposalList(proposalTitle).within(() =>
|
getSubmittedProposalFromProposalList(proposalTitle).within(() =>
|
||||||
cy.get(viewProposalButton).click()
|
cy.get(viewProposalButton).click()
|
||||||
);
|
);
|
||||||
convertUnixTimestampToDateformat(proposalTimeStamp).then(
|
cy.wrap(
|
||||||
(closingDate) => {
|
formatDateWithLocalTimezone(new Date(proposalTimeStamp * 1000))
|
||||||
|
).then((closingDate) => {
|
||||||
getProposalInformationFromTable('Closes on')
|
getProposalInformationFromTable('Closes on')
|
||||||
.contains(closingDate)
|
.contains(closingDate)
|
||||||
.should('be.visible');
|
.should('be.visible');
|
||||||
}
|
});
|
||||||
);
|
cy.wrap(
|
||||||
getGovernanceProposalDateFormatForSpecifiedDays(0).then(
|
formatDateWithLocalTimezone(
|
||||||
(proposalDate) => {
|
new Date(createTenDigitUnixTimeStampForSpecifiedDays(0) * 1000)
|
||||||
|
)
|
||||||
|
).then((proposalDate) => {
|
||||||
getProposalInformationFromTable('Proposed on')
|
getProposalInformationFromTable('Proposed on')
|
||||||
.contains(proposalDate)
|
.contains(proposalDate)
|
||||||
.should('be.visible');
|
.should('be.visible');
|
||||||
}
|
});
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Newly created proposal details - shows default status set to fail', function () {
|
it('Newly created proposal details - shows default status set to fail', function () {
|
||||||
@@ -154,8 +159,7 @@ describe(
|
|||||||
cy.getByTestId('vote-buttons').contains('against').should('be.visible');
|
cy.getByTestId('vote-buttons').contains('against').should('be.visible');
|
||||||
cy.getByTestId('vote-buttons').contains('for').should('be.visible');
|
cy.getByTestId('vote-buttons').contains('for').should('be.visible');
|
||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
getGovernanceProposalDateFormatForSpecifiedDays(0, 'shortMonth').then(
|
getDateFormatForSpecifiedDays(0).then((votedDate) => {
|
||||||
(votedDate) => {
|
|
||||||
// 3001-VOTE-051
|
// 3001-VOTE-051
|
||||||
// 3001-VOTE-093
|
// 3001-VOTE-093
|
||||||
cy.contains('You voted:')
|
cy.contains('You voted:')
|
||||||
@@ -164,8 +168,7 @@ describe(
|
|||||||
.siblings()
|
.siblings()
|
||||||
.contains(votedDate)
|
.contains(votedDate)
|
||||||
.should('be.visible');
|
.should('be.visible');
|
||||||
}
|
});
|
||||||
);
|
|
||||||
cy.get(proposalVoteProgressForPercentage) // 3001-VOTE-072
|
cy.get(proposalVoteProgressForPercentage) // 3001-VOTE-072
|
||||||
.contains('100.00%')
|
.contains('100.00%')
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
@@ -217,9 +220,9 @@ describe(
|
|||||||
vegaWalletSetSpecifiedApprovalAmount('1000');
|
vegaWalletSetSpecifiedApprovalAmount('1000');
|
||||||
createRawProposal();
|
createRawProposal();
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
getSubmittedProposalFromProposalList(rawProposal.rationale.title)
|
getSubmittedProposalFromProposalList(
|
||||||
.as('submittedProposal')
|
rawProposal.rationale.title
|
||||||
.within(() => cy.get(viewProposalButton).click());
|
).within(() => cy.get(viewProposalButton).click());
|
||||||
});
|
});
|
||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
// 3001-VOTE-079
|
// 3001-VOTE-079
|
||||||
@@ -237,9 +240,9 @@ describe(
|
|||||||
);
|
);
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
getSubmittedProposalFromProposalList(rawProposal.rationale.title)
|
getSubmittedProposalFromProposalList(
|
||||||
.as('submittedProposal')
|
rawProposal.rationale.title
|
||||||
.within(() => cy.get(viewProposalButton).click());
|
).within(() => cy.get(viewProposalButton).click());
|
||||||
});
|
});
|
||||||
cy.get(proposalVoteProgressForPercentage)
|
cy.get(proposalVoteProgressForPercentage)
|
||||||
.contains('100.00%')
|
.contains('100.00%')
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import {
|
import {
|
||||||
navigateTo,
|
navigateTo,
|
||||||
navigation,
|
navigation,
|
||||||
|
turnTelemetryOff,
|
||||||
waitForSpinner,
|
waitForSpinner,
|
||||||
} from '../../support/common.functions';
|
} from '../../support/common.functions';
|
||||||
import {
|
import {
|
||||||
@@ -16,6 +17,7 @@ import {
|
|||||||
import { ethereumWalletConnect } from '../../support/wallet-eth.functions';
|
import { ethereumWalletConnect } from '../../support/wallet-eth.functions';
|
||||||
import { vegaWalletSetSpecifiedApprovalAmount } from '../../support/wallet-teardown.functions';
|
import { vegaWalletSetSpecifiedApprovalAmount } from '../../support/wallet-teardown.functions';
|
||||||
|
|
||||||
|
const proposalListItem = '[data-testid="proposals-list-item"]';
|
||||||
const closedProposals = '[data-testid="closed-proposals"]';
|
const closedProposals = '[data-testid="closed-proposals"]';
|
||||||
const proposalStatus = '[data-testid="proposal-status"]';
|
const proposalStatus = '[data-testid="proposal-status"]';
|
||||||
const viewProposalButton = '[data-testid="view-proposal-btn"]';
|
const viewProposalButton = '[data-testid="view-proposal-btn"]';
|
||||||
@@ -35,6 +37,8 @@ context(
|
|||||||
});
|
});
|
||||||
|
|
||||||
beforeEach('visit proposals', function () {
|
beforeEach('visit proposals', function () {
|
||||||
|
cy.clearLocalStorage();
|
||||||
|
turnTelemetryOff();
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
@@ -51,7 +55,8 @@ context(
|
|||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.get(closedProposals).within(() => {
|
cy.get(closedProposals).within(() => {
|
||||||
cy.contains(proposalTitle)
|
cy.contains(proposalTitle)
|
||||||
.parentsUntil('[data-testid="proposals-list-item"]')
|
.parentsUntil(proposalListItem)
|
||||||
|
.last()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(proposalStatus).should('have.text', 'Enacted ');
|
cy.get(proposalStatus).should('have.text', 'Enacted ');
|
||||||
cy.get(viewProposalButton).click();
|
cy.get(viewProposalButton).click();
|
||||||
@@ -78,7 +83,8 @@ context(
|
|||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.get(openProposals).within(() => {
|
cy.get(openProposals).within(() => {
|
||||||
cy.contains(proposalTitle)
|
cy.contains(proposalTitle)
|
||||||
.parentsUntil('[data-testid="proposals-list-item"]')
|
.parentsUntil(proposalListItem)
|
||||||
|
.last()
|
||||||
.within(() => cy.get(viewProposalButton).click());
|
.within(() => cy.get(viewProposalButton).click());
|
||||||
});
|
});
|
||||||
getProposalInformationFromTable('State')
|
getProposalInformationFromTable('State')
|
||||||
@@ -111,7 +117,8 @@ context(
|
|||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.get(openProposals, { timeout: 6000 }).within(() => {
|
cy.get(openProposals, { timeout: 6000 }).within(() => {
|
||||||
cy.contains(proposalTitle)
|
cy.contains(proposalTitle)
|
||||||
.parentsUntil('[data-testid="proposals-list-item"]')
|
.parentsUntil(proposalListItem)
|
||||||
|
.last()
|
||||||
.within(() => cy.get(viewProposalButton).click());
|
.within(() => cy.get(viewProposalButton).click());
|
||||||
});
|
});
|
||||||
getProposalInformationFromTable('State')
|
getProposalInformationFromTable('State')
|
||||||
@@ -133,7 +140,8 @@ context(
|
|||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.get(openProposals).within(() => {
|
cy.get(openProposals).within(() => {
|
||||||
cy.contains(proposalTitle)
|
cy.contains(proposalTitle)
|
||||||
.parentsUntil('[data-testid="proposals-list-item"]')
|
.parentsUntil(proposalListItem)
|
||||||
|
.last()
|
||||||
.within(() => cy.get(viewProposalButton).click());
|
.within(() => cy.get(viewProposalButton).click());
|
||||||
});
|
});
|
||||||
getProposalInformationFromTable('State')
|
getProposalInformationFromTable('State')
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import {
|
|||||||
navigateTo,
|
navigateTo,
|
||||||
navigation,
|
navigation,
|
||||||
closeDialog,
|
closeDialog,
|
||||||
|
turnTelemetryOff,
|
||||||
} from '../../support/common.functions';
|
} from '../../support/common.functions';
|
||||||
import {
|
import {
|
||||||
clickOnValidatorFromList,
|
clickOnValidatorFromList,
|
||||||
@@ -84,6 +85,8 @@ context(
|
|||||||
});
|
});
|
||||||
|
|
||||||
beforeEach('visit governance tab', function () {
|
beforeEach('visit governance tab', function () {
|
||||||
|
cy.clearLocalStorage();
|
||||||
|
turnTelemetryOff();
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import {
|
|||||||
closeDialog,
|
closeDialog,
|
||||||
navigateTo,
|
navigateTo,
|
||||||
navigation,
|
navigation,
|
||||||
|
turnTelemetryOff,
|
||||||
waitForSpinner,
|
waitForSpinner,
|
||||||
} from '../../support/common.functions';
|
} from '../../support/common.functions';
|
||||||
import {
|
import {
|
||||||
@@ -76,6 +77,8 @@ context(
|
|||||||
});
|
});
|
||||||
|
|
||||||
beforeEach('visit governance tab', function () {
|
beforeEach('visit governance tab', function () {
|
||||||
|
cy.clearLocalStorage();
|
||||||
|
turnTelemetryOff();
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
@@ -304,7 +307,10 @@ context(
|
|||||||
cy.get('dd').eq(0).should('have.text', 'Test market 1');
|
cy.get('dd').eq(0).should('have.text', 'Test market 1');
|
||||||
cy.get('dd').eq(1).should('have.text', 'TEST.24h');
|
cy.get('dd').eq(1).should('have.text', 'TEST.24h');
|
||||||
cy.get('dd').eq(2).should('not.be.empty');
|
cy.get('dd').eq(2).should('not.be.empty');
|
||||||
cy.get('dd').eq(2).invoke('text').as('EnactedMarketId');
|
cy.get('dd')
|
||||||
|
.eq(2)
|
||||||
|
.invoke('text')
|
||||||
|
.as('EnactedMarketId', { type: 'static' });
|
||||||
});
|
});
|
||||||
cy.get('@EnactedMarketId').then((marketId) => {
|
cy.get('@EnactedMarketId').then((marketId) => {
|
||||||
cy.VegaWalletSubmitLiquidityProvision(String(marketId), '1');
|
cy.VegaWalletSubmitLiquidityProvision(String(marketId), '1');
|
||||||
@@ -322,6 +328,7 @@ context(
|
|||||||
cy.get('@EnactedMarketId').then((marketId) => {
|
cy.get('@EnactedMarketId').then((marketId) => {
|
||||||
cy.contains(String(marketId))
|
cy.contains(String(marketId))
|
||||||
.parentsUntil(proposalListItem)
|
.parentsUntil(proposalListItem)
|
||||||
|
.last()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.getByTestId(viewProposalBtn).click();
|
cy.getByTestId(viewProposalBtn).click();
|
||||||
});
|
});
|
||||||
@@ -375,7 +382,9 @@ context(
|
|||||||
cy.get(newProposalSubmitButton).should('be.visible').click();
|
cy.get(newProposalSubmitButton).should('be.visible').click();
|
||||||
// cannot submit a proposal with ERC20 address already in use
|
// cannot submit a proposal with ERC20 address already in use
|
||||||
cy.contains('Proposal rejected', proposalTimeout).should('be.visible');
|
cy.contains('Proposal rejected', proposalTimeout).should('be.visible');
|
||||||
cy.getByTestId('dialog-content').within(() => {
|
cy.getByTestId('dialog-content')
|
||||||
|
.last()
|
||||||
|
.within(() => {
|
||||||
cy.get('p').should(
|
cy.get('p').should(
|
||||||
'have.text',
|
'have.text',
|
||||||
'PROPOSAL_ERROR_ERC20_ADDRESS_ALREADY_IN_USE'
|
'PROPOSAL_ERROR_ERC20_ADDRESS_ALREADY_IN_USE'
|
||||||
@@ -385,6 +394,7 @@ context(
|
|||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
cy.contains(proposalTitle)
|
cy.contains(proposalTitle)
|
||||||
.parentsUntil(proposalListItem)
|
.parentsUntil(proposalListItem)
|
||||||
|
.last()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.getByTestId(viewProposalBtn).click();
|
cy.getByTestId(viewProposalBtn).click();
|
||||||
});
|
});
|
||||||
@@ -422,6 +432,7 @@ context(
|
|||||||
cy.get(proposalType)
|
cy.get(proposalType)
|
||||||
.contains('Update asset')
|
.contains('Update asset')
|
||||||
.parentsUntil(proposalListItem)
|
.parentsUntil(proposalListItem)
|
||||||
|
.last()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(proposalDetails).should('contain.text', assetId); // 3001-VOTE-029
|
cy.get(proposalDetails).should('contain.text', assetId); // 3001-VOTE-029
|
||||||
cy.getByTestId(viewProposalBtn).click();
|
cy.getByTestId(viewProposalBtn).click();
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import type { testFreeformProposal } from '../../support/common-interfaces';
|
|||||||
import {
|
import {
|
||||||
navigateTo,
|
navigateTo,
|
||||||
navigation,
|
navigation,
|
||||||
|
turnTelemetryOff,
|
||||||
waitForSpinner,
|
waitForSpinner,
|
||||||
} from '../../support/common.functions';
|
} from '../../support/common.functions';
|
||||||
import {
|
import {
|
||||||
@@ -35,6 +36,8 @@ describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
beforeEach('visit proposals tab', function () {
|
beforeEach('visit proposals tab', function () {
|
||||||
|
cy.clearLocalStorage();
|
||||||
|
turnTelemetryOff();
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
@@ -59,7 +62,10 @@ describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
|||||||
cy.get(openProposals).within(() => {
|
cy.get(openProposals).within(() => {
|
||||||
cy.get(proposalClosingDate).first().should('contain.text', 'year');
|
cy.get(proposalClosingDate).first().should('contain.text', 'year');
|
||||||
cy.get(proposalClosingDate).should('contain.text', 'months');
|
cy.get(proposalClosingDate).should('contain.text', 'months');
|
||||||
cy.get(proposalClosingDate).last().should('contain.text', 'days');
|
cy.get(proposalClosingDate)
|
||||||
|
.last()
|
||||||
|
.invoke('text')
|
||||||
|
.should('match', /days|minutes/);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
navigateTo,
|
navigateTo,
|
||||||
navigation,
|
navigation,
|
||||||
|
turnTelemetryOff,
|
||||||
waitForSpinner,
|
waitForSpinner,
|
||||||
} from '../../support/common.functions';
|
} from '../../support/common.functions';
|
||||||
import {
|
import {
|
||||||
@@ -25,9 +26,11 @@ const rewardsTimeOut = { timeout: 60000 };
|
|||||||
|
|
||||||
context('rewards - flow', { tags: '@slow' }, function () {
|
context('rewards - flow', { tags: '@slow' }, function () {
|
||||||
before('set up environment to allow rewards', function () {
|
before('set up environment to allow rewards', function () {
|
||||||
|
cy.clearLocalStorage();
|
||||||
|
turnTelemetryOff();
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
depositAsset(vegaAssetAddress, '1000');
|
depositAsset(vegaAssetAddress, '1000', 18);
|
||||||
cy.validatorsSelfDelegate();
|
cy.validatorsSelfDelegate();
|
||||||
ethereumWalletConnect();
|
ethereumWalletConnect();
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
@@ -56,7 +59,7 @@ context('rewards - flow', { tags: '@slow' }, function () {
|
|||||||
cy.getByTestId(rewardsTable)
|
cy.getByTestId(rewardsTable)
|
||||||
.first()
|
.first()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.getByTestId('asset').should('have.text', 'Vega');
|
cy.getByTestId('asset', rewardsTimeOut).should('have.text', 'Vega');
|
||||||
cy.getByTestId('ACCOUNT_TYPE_GLOBAL_REWARD').should('have.text', '1');
|
cy.getByTestId('ACCOUNT_TYPE_GLOBAL_REWARD').should('have.text', '1');
|
||||||
cy.getByTestId('ACCOUNT_TYPE_FEES_INFRASTRUCTURE').should(
|
cy.getByTestId('ACCOUNT_TYPE_FEES_INFRASTRUCTURE').should(
|
||||||
'have.text',
|
'have.text',
|
||||||
@@ -93,13 +96,13 @@ context('rewards - flow', { tags: '@slow' }, function () {
|
|||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get('h2').first().should('contain.text', 'EPOCH');
|
cy.get('h2').first().should('contain.text', 'EPOCH');
|
||||||
cy.getByTestId('individual-rewards-asset').should('have.text', 'Vega');
|
cy.getByTestId('individual-rewards-asset').should('have.text', 'Vega');
|
||||||
cy.getByTestId('ACCOUNT_TYPE_GLOBAL_REWARD')
|
cy.getByTestId('ACCOUNT_TYPE_GLOBAL_REWARD', rewardsTimeOut)
|
||||||
.should('contain.text', '0.1177')
|
.should('contain.text', '0.4415')
|
||||||
.and('contain.text', '(11.7733%)');
|
.and('contain.text', '(44.15%)');
|
||||||
cy.getByTestId('ACCOUNT_TYPE_FEES_INFRASTRUCTURE')
|
cy.getByTestId('ACCOUNT_TYPE_FEES_INFRASTRUCTURE')
|
||||||
.should('contain.text', '0.0001')
|
.should('contain.text', '0.0004')
|
||||||
.and('contain.text', '(11.7733%)');
|
.and('contain.text', '(44.15%)');
|
||||||
cy.getByTestId('total').should('have.text', '0.1179');
|
cy.getByTestId('total').should('have.text', '0.4419');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ context(
|
|||||||
beforeEach(
|
beforeEach(
|
||||||
'teardown wallet & drill into a specific validator',
|
'teardown wallet & drill into a specific validator',
|
||||||
function () {
|
function () {
|
||||||
cy.clearAllLocalStorage();
|
cy.clearLocalStorage();
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import {
|
|||||||
waitForSpinner,
|
waitForSpinner,
|
||||||
navigateTo,
|
navigateTo,
|
||||||
navigation,
|
navigation,
|
||||||
|
turnTelemetryOff,
|
||||||
} from '../../support/common.functions';
|
} from '../../support/common.functions';
|
||||||
import {
|
import {
|
||||||
stakingPageAssociateTokens,
|
stakingPageAssociateTokens,
|
||||||
@@ -53,6 +54,8 @@ context(
|
|||||||
beforeEach(
|
beforeEach(
|
||||||
'teardown wallet & drill into a specific validator',
|
'teardown wallet & drill into a specific validator',
|
||||||
function () {
|
function () {
|
||||||
|
cy.clearLocalStorage();
|
||||||
|
turnTelemetryOff();
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
@@ -90,8 +93,13 @@ context(
|
|||||||
|
|
||||||
verifyEthWalletTotalAssociatedBalance('2.0');
|
verifyEthWalletTotalAssociatedBalance('2.0');
|
||||||
|
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet)
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 2.0);
|
.first()
|
||||||
|
.within(() => {
|
||||||
|
cy.get(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
2.0
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
cy.get(vegaWalletUnstakedBalance, txTimeout).should('contain', 2.0);
|
cy.get(vegaWalletUnstakedBalance, txTimeout).should('contain', 2.0);
|
||||||
@@ -128,7 +136,9 @@ context(
|
|||||||
stakingPageAssociateTokens('1001', { approve: true });
|
stakingPageAssociateTokens('1001', { approve: true });
|
||||||
verifyEthWalletAssociatedBalance('1,001.00');
|
verifyEthWalletAssociatedBalance('1,001.00');
|
||||||
verifyEthWalletTotalAssociatedBalance('1,001.00');
|
verifyEthWalletTotalAssociatedBalance('1,001.00');
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet)
|
||||||
|
.last()
|
||||||
|
.within(() => {
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should(
|
cy.get(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
'contain',
|
'contain',
|
||||||
'1,001.00'
|
'1,001.00'
|
||||||
@@ -138,15 +148,25 @@ context(
|
|||||||
|
|
||||||
it('Able to disassociate a partial amount of tokens currently associated', function () {
|
it('Able to disassociate a partial amount of tokens currently associated', function () {
|
||||||
stakingPageAssociateTokens('2');
|
stakingPageAssociateTokens('2');
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet)
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 2.0);
|
.first()
|
||||||
|
.within(() => {
|
||||||
|
cy.get(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
2.0
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
cy.get('button').contains('Select a validator to nominate').click();
|
cy.get('button').contains('Select a validator to nominate').click();
|
||||||
stakingPageDisassociateTokens('1');
|
stakingPageDisassociateTokens('1');
|
||||||
verifyEthWalletAssociatedBalance('1.0');
|
verifyEthWalletAssociatedBalance('1.0');
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet)
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 1.0);
|
.first()
|
||||||
|
.within(() => {
|
||||||
|
cy.get(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
1.0
|
||||||
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -155,25 +175,39 @@ context(
|
|||||||
const warningText =
|
const warningText =
|
||||||
'Warning: Any tokens that have been nominated to a node will sacrifice rewards they are due for the current epoch. If you do not wish to sacrifice these, you should remove stake from a node at the end of an epoch before disassociation.';
|
'Warning: Any tokens that have been nominated to a node will sacrifice rewards they are due for the current epoch. If you do not wish to sacrifice these, you should remove stake from a node at the end of an epoch before disassociation.';
|
||||||
stakingPageAssociateTokens('2');
|
stakingPageAssociateTokens('2');
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet)
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 2.0);
|
.first()
|
||||||
|
.within(() => {
|
||||||
|
cy.get(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
2.0
|
||||||
|
);
|
||||||
});
|
});
|
||||||
cy.get('button').contains('Select a validator to nominate').click();
|
cy.get('button').contains('Select a validator to nominate').click();
|
||||||
cy.get(ethWalletDissociateButton).click();
|
cy.get(ethWalletDissociateButton).click();
|
||||||
cy.get(disassociationWarning).should('contain', warningText);
|
cy.get(disassociationWarning).should('contain', warningText);
|
||||||
stakingPageDisassociateAllTokens();
|
stakingPageDisassociateAllTokens();
|
||||||
cy.get(ethWalletContainer).within(() => {
|
cy.get(ethWalletContainer)
|
||||||
|
.first()
|
||||||
|
.within(() => {
|
||||||
cy.contains(vegaWalletPublicKeyShort, { timeout: 20000 }).should(
|
cy.contains(vegaWalletPublicKeyShort, { timeout: 20000 }).should(
|
||||||
'not.exist'
|
'not.exist'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
cy.get(ethWalletContainer).within(() => {
|
cy.get(ethWalletContainer)
|
||||||
|
.first()
|
||||||
|
.within(() => {
|
||||||
cy.contains(vegaWalletPublicKeyShort, { timeout: 20000 }).should(
|
cy.contains(vegaWalletPublicKeyShort, { timeout: 20000 }).should(
|
||||||
'not.exist'
|
'not.exist'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet)
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 0.0);
|
.first()
|
||||||
|
.within(() => {
|
||||||
|
cy.get(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
0.0
|
||||||
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -200,8 +234,13 @@ context(
|
|||||||
cy.getByTestId('currency-title', txTimeout).should('have.length', 6);
|
cy.getByTestId('currency-title', txTimeout).should('have.length', 6);
|
||||||
verifyEthWalletAssociatedBalance('2.0');
|
verifyEthWalletAssociatedBalance('2.0');
|
||||||
verifyEthWalletTotalAssociatedBalance('2.0');
|
verifyEthWalletTotalAssociatedBalance('2.0');
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet)
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 2.0);
|
.first()
|
||||||
|
.within(() => {
|
||||||
|
cy.get(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
2.0
|
||||||
|
);
|
||||||
});
|
});
|
||||||
cy.get(vegaWalletUnstakedBalance, txTimeout).should('contain', 2.0);
|
cy.get(vegaWalletUnstakedBalance, txTimeout).should('contain', 2.0);
|
||||||
stakingPageDisassociateTokens('1', {
|
stakingPageDisassociateTokens('1', {
|
||||||
@@ -228,37 +267,60 @@ context(
|
|||||||
stakingPageAssociateTokens('21', { type: 'wallet' });
|
stakingPageAssociateTokens('21', { type: 'wallet' });
|
||||||
cy.get('button').contains('Select a validator to nominate').click();
|
cy.get('button').contains('Select a validator to nominate').click();
|
||||||
stakingPageAssociateTokens('37', { type: 'contract' });
|
stakingPageAssociateTokens('37', { type: 'contract' });
|
||||||
cy.get(vestingContractSection).within(() => {
|
cy.get(vestingContractSection)
|
||||||
|
.first()
|
||||||
|
.within(() => {
|
||||||
cy.get(associatedKey).should(
|
cy.get(associatedKey).should(
|
||||||
'contain',
|
'contain',
|
||||||
Cypress.env('vegaWalletPublicKeyShort')
|
Cypress.env('vegaWalletPublicKeyShort')
|
||||||
);
|
);
|
||||||
cy.get(associatedAmount, txTimeout).should('contain', 37);
|
cy.get(associatedAmount, txTimeout).should('contain', 37);
|
||||||
});
|
});
|
||||||
cy.get(vegaInWalletSection).within(() => {
|
cy.get(vegaInWalletSection)
|
||||||
|
.first()
|
||||||
|
.within(() => {
|
||||||
cy.get(associatedKey).should(
|
cy.get(associatedKey).should(
|
||||||
'contain',
|
'contain',
|
||||||
Cypress.env('vegaWalletPublicKeyShort')
|
Cypress.env('vegaWalletPublicKeyShort')
|
||||||
);
|
);
|
||||||
cy.get(associatedAmount, txTimeout).should('contain', 21);
|
cy.get(associatedAmount, txTimeout).should('contain', 21);
|
||||||
});
|
});
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet)
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 58);
|
.first()
|
||||||
|
.within(() => {
|
||||||
|
cy.get(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
58
|
||||||
|
);
|
||||||
});
|
});
|
||||||
stakingPageDisassociateTokens('6', { type: 'contract' });
|
stakingPageDisassociateTokens('6', { type: 'contract' });
|
||||||
cy.get(vestingContractSection).within(() => {
|
cy.get(vestingContractSection)
|
||||||
|
.first()
|
||||||
|
.within(() => {
|
||||||
cy.get(associatedAmount, txTimeout).should('contain', 31);
|
cy.get(associatedAmount, txTimeout).should('contain', 31);
|
||||||
});
|
});
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet)
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 52);
|
.first()
|
||||||
|
.within(() => {
|
||||||
|
cy.get(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
52
|
||||||
|
);
|
||||||
});
|
});
|
||||||
navigateTo(navigation.validators);
|
navigateTo(navigation.validators);
|
||||||
stakingPageDisassociateTokens('9', { type: 'wallet' });
|
stakingPageDisassociateTokens('9', { type: 'wallet' });
|
||||||
cy.get(vegaInWalletSection).within(() => {
|
cy.get(vegaInWalletSection)
|
||||||
|
.first()
|
||||||
|
.within(() => {
|
||||||
cy.get(associatedAmount, txTimeout).should('contain', 12);
|
cy.get(associatedAmount, txTimeout).should('contain', 12);
|
||||||
});
|
});
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet)
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 43);
|
.first()
|
||||||
|
.within(() => {
|
||||||
|
cy.get(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
43
|
||||||
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -318,8 +380,13 @@ context(
|
|||||||
Cypress.env('vegaWalletPublicKey2')
|
Cypress.env('vegaWalletPublicKey2')
|
||||||
);
|
);
|
||||||
stakingPageAssociateTokens('2');
|
stakingPageAssociateTokens('2');
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet)
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 2.0);
|
.first()
|
||||||
|
.within(() => {
|
||||||
|
cy.get(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
2.0
|
||||||
|
);
|
||||||
});
|
});
|
||||||
cy.get(associateCompleteText).should(
|
cy.get(associateCompleteText).should(
|
||||||
'have.text',
|
'have.text',
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
import {
|
import {
|
||||||
navigateTo,
|
navigateTo,
|
||||||
navigation,
|
navigation,
|
||||||
|
turnTelemetryOff,
|
||||||
waitForSpinner,
|
waitForSpinner,
|
||||||
} from '../../support/common.functions';
|
} from '../../support/common.functions';
|
||||||
import { ethereumWalletConnect } from '../../support/wallet-eth.functions';
|
import { ethereumWalletConnect } from '../../support/wallet-eth.functions';
|
||||||
import {
|
import { depositAsset } from '../../support/wallet-teardown.functions';
|
||||||
depositAsset,
|
|
||||||
vegaWalletTeardown,
|
|
||||||
} from '../../support/wallet-teardown.functions';
|
|
||||||
|
|
||||||
const withdraw = 'withdraw';
|
const withdraw = 'withdraw';
|
||||||
const withdrawalForm = 'withdraw-form';
|
const withdrawalForm = 'withdraw-form';
|
||||||
@@ -25,6 +23,15 @@ const withdrawalAmount = 'withdrawal-amount';
|
|||||||
const withdrawalRecipient = 'withdrawal-recipient';
|
const withdrawalRecipient = 'withdrawal-recipient';
|
||||||
const withdrawFundsButton = 'withdraw-funds';
|
const withdrawFundsButton = 'withdraw-funds';
|
||||||
const completeWithdrawalButton = 'complete-withdrawal';
|
const completeWithdrawalButton = 'complete-withdrawal';
|
||||||
|
const tableTxHash = '[col-id="txHash"]';
|
||||||
|
const tableAssetSymbol = '[col-id="asset.symbol"]';
|
||||||
|
const tableAmount = '[col-id="amount"]';
|
||||||
|
const tableReceiverAddress = '[col-id="details.receiverAddress"]';
|
||||||
|
const tableWithdrawnTimeStamp = '[col-id="withdrawnTimestamp"]';
|
||||||
|
const tableWithdrawnStatus = '[col-id="status"]';
|
||||||
|
const tableCreatedTimeStamp = '[col-id="createdTimestamp"]';
|
||||||
|
const toastContent = 'toast-content';
|
||||||
|
const toastPanel = 'toast-panel';
|
||||||
const usdtName = 'USDC (local)';
|
const usdtName = 'USDC (local)';
|
||||||
const usdcEthAddress = '0x1b8a1B6CBE5c93609b46D1829Cc7f3Cb8eeE23a0';
|
const usdcEthAddress = '0x1b8a1B6CBE5c93609b46D1829Cc7f3Cb8eeE23a0';
|
||||||
const usdcSymbol = 'tUSDC';
|
const usdcSymbol = 'tUSDC';
|
||||||
@@ -42,26 +49,24 @@ context(
|
|||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
// When running tests locally, will fail if run without restarting capsule
|
// When running tests locally, will fail if run without restarting capsule
|
||||||
cy.updateCapsuleMultiSig().then(() => {
|
cy.updateCapsuleMultiSig().then(() => {
|
||||||
depositAsset(usdcEthAddress, '100');
|
ethereumWalletConnect();
|
||||||
|
depositAsset(usdcEthAddress, '1000', 5);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
beforeEach('Navigate to withdrawal page', function () {
|
beforeEach('Navigate to withdrawal page', function () {
|
||||||
|
cy.clearLocalStorage();
|
||||||
|
turnTelemetryOff();
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
navigateTo(navigation.withdraw);
|
navigateTo(navigation.withdraw);
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
ethereumWalletConnect();
|
ethereumWalletConnect();
|
||||||
vegaWalletTeardown();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Able to open withdrawal form with vega wallet connected', function () {
|
it('Able to open withdrawal form with vega wallet connected', function () {
|
||||||
// needs to reload page for withdrawal form to be displayed in ci - not reproducible outside of ci
|
|
||||||
cy.reload();
|
|
||||||
waitForSpinner();
|
|
||||||
ethereumWalletConnect();
|
|
||||||
cy.getByTestId(withdraw).should('be.visible').click();
|
cy.getByTestId(withdraw).should('be.visible').click();
|
||||||
cy.getByTestId(withdrawalForm).within(() => {
|
cy.getByTestId(withdrawalForm, txTimeout).within(() => {
|
||||||
cy.get('select').find('option').should('have.length.at.least', 2);
|
cy.get('select').find('option').should('have.length.at.least', 2);
|
||||||
cy.getByTestId(ethAddressInput).should('be.visible');
|
cy.getByTestId(ethAddressInput).should('be.visible');
|
||||||
cy.getByTestId(amountInput).should('be.visible');
|
cy.getByTestId(amountInput).should('be.visible');
|
||||||
@@ -70,7 +75,7 @@ context(
|
|||||||
|
|
||||||
it('Unable to submit withdrawal with invalid fields', function () {
|
it('Unable to submit withdrawal with invalid fields', function () {
|
||||||
cy.getByTestId(withdraw).should('be.visible').click();
|
cy.getByTestId(withdraw).should('be.visible').click();
|
||||||
cy.getByTestId(withdrawalForm).within(() => {
|
cy.getByTestId(withdrawalForm, txTimeout).within(() => {
|
||||||
cy.get('select').select(usdtSelectValue, { force: true });
|
cy.get('select').select(usdtSelectValue, { force: true });
|
||||||
cy.getByTestId(balanceAvailable, txTimeout).should('exist');
|
cy.getByTestId(balanceAvailable, txTimeout).should('exist');
|
||||||
cy.getByTestId(submitWithdrawalButton).click();
|
cy.getByTestId(submitWithdrawalButton).click();
|
||||||
@@ -94,7 +99,7 @@ context(
|
|||||||
it('Able to withdraw asset: -eth wallet connected -withdraw funds button', function () {
|
it('Able to withdraw asset: -eth wallet connected -withdraw funds button', function () {
|
||||||
// fill in withdrawal form
|
// fill in withdrawal form
|
||||||
cy.getByTestId(withdraw).should('be.visible').click();
|
cy.getByTestId(withdraw).should('be.visible').click();
|
||||||
cy.getByTestId(withdrawalForm).within(() => {
|
cy.getByTestId(withdrawalForm, txTimeout).within(() => {
|
||||||
cy.get('select').select(usdtSelectValue, { force: true });
|
cy.get('select').select(usdtSelectValue, { force: true });
|
||||||
cy.getByTestId(balanceAvailable, txTimeout).should('exist');
|
cy.getByTestId(balanceAvailable, txTimeout).should('exist');
|
||||||
cy.getByTestId(withdrawalThreshold).should(
|
cy.getByTestId(withdrawalThreshold).should(
|
||||||
@@ -102,7 +107,7 @@ context(
|
|||||||
'100,000.00000T'
|
'100,000.00000T'
|
||||||
);
|
);
|
||||||
cy.getByTestId(delayTime).should('have.text', 'None');
|
cy.getByTestId(delayTime).should('have.text', 'None');
|
||||||
cy.getByTestId(amountInput).click().type('100');
|
cy.getByTestId(amountInput).click().type('120');
|
||||||
cy.getByTestId(submitWithdrawalButton).click();
|
cy.getByTestId(submitWithdrawalButton).click();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -116,7 +121,7 @@ context(
|
|||||||
.should('have.attr', 'href')
|
.should('have.attr', 'href')
|
||||||
.and('contain', '/txs/');
|
.and('contain', '/txs/');
|
||||||
cy.getByTestId(withdrawalAssetSymbol).should('have.text', usdcSymbol);
|
cy.getByTestId(withdrawalAssetSymbol).should('have.text', usdcSymbol);
|
||||||
cy.getByTestId(withdrawalAmount).should('have.text', '100.00');
|
cy.getByTestId(withdrawalAmount).should('have.text', '120.00');
|
||||||
cy.getByTestId(withdrawalRecipient)
|
cy.getByTestId(withdrawalRecipient)
|
||||||
.should('have.text', truncatedWithdrawalEthAddress)
|
.should('have.text', truncatedWithdrawalEthAddress)
|
||||||
.and('have.attr', 'href')
|
.and('have.attr', 'href')
|
||||||
@@ -128,43 +133,36 @@ context(
|
|||||||
'Withdraw asset complete'
|
'Withdraw asset complete'
|
||||||
);
|
);
|
||||||
cy.getByTestId(dialogClose).click();
|
cy.getByTestId(dialogClose).click();
|
||||||
|
|
||||||
// need to reload page to see withdrawal history complete
|
|
||||||
cy.reload();
|
|
||||||
waitForAssetsDisplayed(usdtName);
|
|
||||||
|
|
||||||
// withdrawal history for complete withdrawal displayed
|
// withdrawal history for complete withdrawal displayed
|
||||||
cy.get('[col-id="txHash"]', txTimeout)
|
cy.get(tableWithdrawnStatus)
|
||||||
.should('have.length.above', 1)
|
.eq(1, txTimeout)
|
||||||
.eq(1)
|
.should('have.text', 'Completed')
|
||||||
.parent()
|
.parent()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get('[col-id="asset.symbol"]').should('have.text', usdcSymbol);
|
cy.get(tableAssetSymbol).should('have.text', usdcSymbol);
|
||||||
cy.get('[col-id="amount"]').should('have.text', '100.00');
|
cy.get(tableAmount).should('have.text', '120.00');
|
||||||
cy.get('[col-id="details.receiverAddress"]')
|
cy.get(tableReceiverAddress)
|
||||||
.find('a')
|
.find('a')
|
||||||
.should('have.attr', 'href')
|
.should('have.attr', 'href')
|
||||||
.and('contain', 'https://sepolia.etherscan.io/address/');
|
.and('contain', 'https://sepolia.etherscan.io/address/');
|
||||||
cy.get('[col-id="withdrawnTimestamp"]').should('not.be.empty');
|
cy.get(tableWithdrawnTimeStamp).should('not.be.empty');
|
||||||
cy.get('[col-id="status"]').should('have.text', 'Completed');
|
cy.get(tableTxHash)
|
||||||
cy.get('[col-id="txHash"]')
|
|
||||||
.find('a')
|
.find('a')
|
||||||
.should('have.attr', 'href')
|
.should('have.attr', 'href')
|
||||||
.and('contain', 'https://sepolia.etherscan.io/tx/');
|
.and('contain', 'https://sepolia.etherscan.io/tx/');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Skipping because of bug #1857
|
it('Able to withdraw asset: -eth wallet not connected', function () {
|
||||||
it.skip('Able to withdraw asset: -eth wallet not connected', function () {
|
|
||||||
const ethWalletAddress = Cypress.env('ethWalletPublicKey');
|
const ethWalletAddress = Cypress.env('ethWalletPublicKey');
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForAssetsDisplayed(usdtName);
|
waitForAssetsDisplayed(usdtName);
|
||||||
// fill in withdrawal form
|
// fill in withdrawal form
|
||||||
cy.getByTestId(withdraw).should('be.visible').click();
|
cy.getByTestId(withdraw).should('be.visible').click();
|
||||||
cy.getByTestId(withdrawalForm).within(() => {
|
cy.getByTestId(withdrawalForm, txTimeout).within(() => {
|
||||||
cy.get('select').select(usdtSelectValue, { force: true });
|
cy.get('select').select(usdtSelectValue, { force: true });
|
||||||
cy.getByTestId(ethAddressInput).should('be.empty');
|
cy.getByTestId(ethAddressInput).should('be.empty');
|
||||||
cy.getByTestId(amountInput).click().type('100');
|
cy.getByTestId(amountInput).click().type('110');
|
||||||
cy.getByTestId(submitWithdrawalButton).click();
|
cy.getByTestId(submitWithdrawalButton).click();
|
||||||
|
|
||||||
// Need eth address to submit withdrawal
|
// Need eth address to submit withdrawal
|
||||||
@@ -180,20 +178,38 @@ context(
|
|||||||
'Transaction complete'
|
'Transaction complete'
|
||||||
);
|
);
|
||||||
cy.getByTestId(dialogClose).click();
|
cy.getByTestId(dialogClose).click();
|
||||||
|
cy.get(tableTxHash)
|
||||||
cy.getByTestId(completeWithdrawalButton)
|
.eq(1)
|
||||||
.eq(0)
|
.should('have.text', 'Complete withdrawal')
|
||||||
.parent()
|
|
||||||
.parent()
|
.parent()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get('[col-id="asset.symbol"]').should('have.text', usdcSymbol);
|
cy.get(tableAssetSymbol).should('have.text', usdcSymbol);
|
||||||
cy.get('[col-id="amount"]').should('have.text', '100.00');
|
cy.get(tableAmount).should('have.text', '110.00');
|
||||||
cy.get('[col-id="details.receiverAddress"]')
|
cy.get(tableReceiverAddress)
|
||||||
.find('a')
|
.find('a')
|
||||||
.should('have.attr', 'href')
|
.should('have.attr', 'href')
|
||||||
.and('contain', 'https://sepolia.etherscan.io/address/');
|
.and('contain', 'https://sepolia.etherscan.io/address/');
|
||||||
cy.get('[col-id="createdTimestamp"]').should('not.be.empty');
|
cy.get(tableCreatedTimeStamp).should('not.be.empty');
|
||||||
|
});
|
||||||
|
ethereumWalletConnect();
|
||||||
cy.getByTestId(completeWithdrawalButton).click();
|
cy.getByTestId(completeWithdrawalButton).click();
|
||||||
|
cy.getByTestId(toastContent)
|
||||||
|
.last()
|
||||||
|
.should('contain.text', 'Awaiting confirmation')
|
||||||
|
.within(() => {
|
||||||
|
cy.getByTestId('external-link').should('exist');
|
||||||
|
});
|
||||||
|
cy.getByTestId(toastContent)
|
||||||
|
.first()
|
||||||
|
.should('contain.text', 'The withdrawal has been approved.')
|
||||||
|
.within(() => {
|
||||||
|
cy.getByTestId(toastPanel).should('contain.text', '110.00', 'tUSDC');
|
||||||
|
});
|
||||||
|
cy.getByTestId(toastContent)
|
||||||
|
.last()
|
||||||
|
.should('contain.text', 'Transaction confirmed')
|
||||||
|
.within(() => {
|
||||||
|
cy.getByTestId('external-link').should('exist');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -202,26 +218,31 @@ context(
|
|||||||
const expectedErrorTxt = `You are connected in a view only state for public key: ${vegaWalletPubKey}. In order to send transactions you must connect to a real wallet.`;
|
const expectedErrorTxt = `You are connected in a view only state for public key: ${vegaWalletPubKey}. In order to send transactions you must connect to a real wallet.`;
|
||||||
|
|
||||||
// Disconnect vega wallet
|
// Disconnect vega wallet
|
||||||
cy.getByTestId('manage-vega-wallet').click();
|
cy.getByTestId('manage-vega-wallet').last().click();
|
||||||
cy.getByTestId('disconnect').click();
|
cy.getByTestId('disconnect').click();
|
||||||
|
|
||||||
cy.connectPublicKey(vegaWalletPubKey);
|
cy.connectPublicKey(vegaWalletPubKey);
|
||||||
cy.getByTestId(withdraw).should('be.visible').click();
|
cy.getByTestId(withdraw).should('be.visible').click();
|
||||||
cy.getByTestId(withdrawalForm).within(() => {
|
cy.getByTestId(withdrawalForm, txTimeout).within(() => {
|
||||||
cy.get('select').select(usdtSelectValue, { force: true });
|
cy.get('select').select(usdtSelectValue, { force: true });
|
||||||
cy.getByTestId(balanceAvailable, txTimeout).should('exist');
|
cy.getByTestId(balanceAvailable, txTimeout).should('exist');
|
||||||
cy.getByTestId(amountInput).click().type('100');
|
cy.getByTestId(amountInput).click().type('100');
|
||||||
cy.getByTestId(submitWithdrawalButton).click();
|
cy.getByTestId(submitWithdrawalButton).click();
|
||||||
});
|
});
|
||||||
|
|
||||||
cy.getByTestId('dialog-content').within(() => {
|
cy.getByTestId('dialog-content')
|
||||||
|
.last()
|
||||||
|
.within(() => {
|
||||||
cy.get('h1').should('have.text', 'Transaction failed');
|
cy.get('h1').should('have.text', 'Transaction failed');
|
||||||
cy.getByTestId('Error').should('have.text', expectedErrorTxt);
|
cy.getByTestId('Error').should('have.text', expectedErrorTxt);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
function waitForAssetsDisplayed(expectedAsset: string) {
|
function waitForAssetsDisplayed(expectedAsset: string) {
|
||||||
cy.contains(expectedAsset, txTimeout).should('be.visible');
|
cy.getByTestId('currency-title', txTimeout).should(
|
||||||
|
'contain.text',
|
||||||
|
expectedAsset
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ context('Home Page - verify elements on page', { tags: '@smoke' }, function () {
|
|||||||
cy.getByTestId('app-announcement').should('not.exist');
|
cy.getByTestId('app-announcement').should('not.exist');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should show open or enacted proposals with proposal summary', function () {
|
it('should show open or enacted proposals without proposal summary', function () {
|
||||||
cy.get('body').then(($body) => {
|
cy.get('body').then(($body) => {
|
||||||
if (!$body.find('[data-testid="proposals-list-item"]').length) {
|
if (!$body.find('[data-testid="proposals-list-item"]').length) {
|
||||||
cy.createMarket();
|
cy.createMarket();
|
||||||
@@ -43,12 +43,6 @@ context('Home Page - verify elements on page', { tags: '@smoke' }, function () {
|
|||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('not.be.empty');
|
.should('not.be.empty');
|
||||||
cy.getByTestId('proposal-type').invoke('text').should('not.be.empty');
|
cy.getByTestId('proposal-type').invoke('text').should('not.be.empty');
|
||||||
cy.getByTestId('proposal-description')
|
|
||||||
.invoke('text')
|
|
||||||
.should('not.be.empty');
|
|
||||||
cy.getByTestId('proposal-details')
|
|
||||||
.invoke('text')
|
|
||||||
.should('not.be.empty');
|
|
||||||
cy.getByTestId('proposal-status')
|
cy.getByTestId('proposal-status')
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('not.be.empty');
|
.should('not.be.empty');
|
||||||
@@ -167,7 +161,7 @@ context('Home Page - verify elements on page', { tags: '@smoke' }, function () {
|
|||||||
cy.getByTestId('menu-drawer').should('be.visible');
|
cy.getByTestId('menu-drawer').should('be.visible');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should have link for proposal page', function () {
|
it.skip('should have link for proposal page', function () {
|
||||||
cy.getByTestId('menu-drawer').within(() => {
|
cy.getByTestId('menu-drawer').within(() => {
|
||||||
cy.get('[href="/proposals"]')
|
cy.get('[href="/proposals"]')
|
||||||
.should('exist')
|
.should('exist')
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ context(
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should be able to see button for - new proposal', function () {
|
it.skip('should be able to see button for - new proposal', function () {
|
||||||
// 3001-VOTE-002
|
// 3001-VOTE-002
|
||||||
cy.get(newProposalLink)
|
cy.get(newProposalLink)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
@@ -63,7 +63,7 @@ context(
|
|||||||
.and('equal', '/proposals/propose');
|
.and('equal', '/proposals/propose');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should be able to see a connect wallet button - if vega wallet disconnected and user is submitting new proposal', function () {
|
it.skip('should be able to see a connect wallet button - if vega wallet disconnected and user is submitting new proposal', function () {
|
||||||
goToMakeNewProposal(governanceProposalType.NETWORK_PARAMETER);
|
goToMakeNewProposal(governanceProposalType.NETWORK_PARAMETER);
|
||||||
cy.get(connectToVegaWalletButton)
|
cy.get(connectToVegaWalletButton)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
@@ -101,15 +101,15 @@ context(
|
|||||||
);
|
);
|
||||||
cy.getByTestId('protocol-upgrade-proposal-release-tag').should(
|
cy.getByTestId('protocol-upgrade-proposal-release-tag').should(
|
||||||
'have.text',
|
'have.text',
|
||||||
'Vega release tagv1'
|
'Vega release tag: v1'
|
||||||
);
|
);
|
||||||
cy.getByTestId('protocol-upgrade-proposal-block-height').should(
|
cy.getByTestId('protocol-upgrade-proposal-block-height').should(
|
||||||
'have.text',
|
'have.text',
|
||||||
'Upgrade block height2015942'
|
'Upgrade block height: 2015942'
|
||||||
);
|
);
|
||||||
cy.getByTestId('protocol-upgrade-proposal-status').should(
|
cy.getByTestId('protocol-upgrade-proposal-status').should(
|
||||||
'have.text',
|
'have.text',
|
||||||
'Approved'
|
'Approved '
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
import {
|
import {
|
||||||
navigateTo,
|
navigateTo,
|
||||||
navigation,
|
navigation,
|
||||||
|
turnTelemetryOff,
|
||||||
waitForSpinner,
|
waitForSpinner,
|
||||||
} from '../../support/common.functions';
|
} from '../../support/common.functions';
|
||||||
import {
|
import {
|
||||||
@@ -26,6 +27,7 @@ context('View functionality with public key', { tags: '@smoke' }, function () {
|
|||||||
|
|
||||||
beforeEach('visit home page', function () {
|
beforeEach('visit home page', function () {
|
||||||
cy.clearLocalStorage();
|
cy.clearLocalStorage();
|
||||||
|
turnTelemetryOff();
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.connectPublicKey(vegaWalletPubKey);
|
cy.connectPublicKey(vegaWalletPubKey);
|
||||||
@@ -44,7 +46,7 @@ context('View functionality with public key', { tags: '@smoke' }, function () {
|
|||||||
.and('contain.text', 'USDC (fake)');
|
.and('contain.text', 'USDC (fake)');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Unable to submit proposal with public key', function () {
|
it.skip('Unable to submit proposal with public key', function () {
|
||||||
const expectedErrorTxt = `You are connected in a view only state for public key: ${vegaWalletPubKey}. In order to send transactions you must connect to a real wallet.`;
|
const expectedErrorTxt = `You are connected in a view only state for public key: ${vegaWalletPubKey}. In order to send transactions you must connect to a real wallet.`;
|
||||||
|
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ context(
|
|||||||
{ tags: '@regression' },
|
{ tags: '@regression' },
|
||||||
function () {
|
function () {
|
||||||
before('navigate to rewards page', function () {
|
before('navigate to rewards page', function () {
|
||||||
cy.clearLocalStorage();
|
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
navigateTo(navigation.rewards);
|
navigateTo(navigation.rewards);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ const stakeNumberRegex = /^\d*\.?\d*$/;
|
|||||||
|
|
||||||
context('Validators Page - verify elements on page', function () {
|
context('Validators Page - verify elements on page', function () {
|
||||||
before('navigate to validators page', function () {
|
before('navigate to validators page', function () {
|
||||||
cy.clearAllLocalStorage();
|
|
||||||
cy.visit('/validators');
|
cy.visit('/validators');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ context(
|
|||||||
{ tags: '@regression' },
|
{ tags: '@regression' },
|
||||||
() => {
|
() => {
|
||||||
before('visit token home page', () => {
|
before('visit token home page', () => {
|
||||||
cy.clearAllLocalStorage();
|
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
cy.get(walletContainer, { timeout: 60000 }).should('be.visible');
|
cy.get(walletContainer, { timeout: 60000 }).should('be.visible');
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ context(
|
|||||||
{ tags: '@smoke' },
|
{ tags: '@smoke' },
|
||||||
function () {
|
function () {
|
||||||
before('navigate to withdrawals page', function () {
|
before('navigate to withdrawals page', function () {
|
||||||
cy.clearAllLocalStorage();
|
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
navigateTo(navigation.withdraw);
|
navigateTo(navigation.withdraw);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -90,3 +90,10 @@ export function verifyEthWalletAssociatedBalance(amount: string) {
|
|||||||
export function closeDialog() {
|
export function closeDialog() {
|
||||||
cy.getByTestId('dialog-close').click();
|
cy.getByTestId('dialog-close').click();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function turnTelemetryOff() {
|
||||||
|
// Ensuring the telemetry modal doesn't disrupt the tests
|
||||||
|
cy.window().then((win) =>
|
||||||
|
win.localStorage.setItem('vega_telemetry_on', 'false')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { format } from 'date-fns';
|
||||||
import { closeDialog, navigateTo, navigation } from './common.functions';
|
import { closeDialog, navigateTo, navigation } from './common.functions';
|
||||||
import { ensureSpecifiedUnstakedTokensAreAssociated } from './staking.functions';
|
import { ensureSpecifiedUnstakedTokensAreAssociated } from './staking.functions';
|
||||||
|
|
||||||
@@ -15,35 +16,6 @@ const newProposalSubmitButton = '[data-testid="proposal-submit"]';
|
|||||||
const epochTimeout = Cypress.env('epochTimeout');
|
const epochTimeout = Cypress.env('epochTimeout');
|
||||||
const proposalTimeout = { timeout: 14000 };
|
const proposalTimeout = { timeout: 14000 };
|
||||||
|
|
||||||
export function convertUnixTimestampToDateformat(
|
|
||||||
unixTimestamp: number,
|
|
||||||
monthTextLength = 'longMonth'
|
|
||||||
) {
|
|
||||||
const dateSupplied = new Date(unixTimestamp * 1000);
|
|
||||||
const year = dateSupplied.getFullYear();
|
|
||||||
const months = [
|
|
||||||
'January',
|
|
||||||
'February',
|
|
||||||
'March',
|
|
||||||
'April',
|
|
||||||
'May',
|
|
||||||
'June',
|
|
||||||
'July',
|
|
||||||
'August',
|
|
||||||
'September',
|
|
||||||
'October',
|
|
||||||
'November',
|
|
||||||
'December',
|
|
||||||
];
|
|
||||||
const month = months[dateSupplied.getMonth()];
|
|
||||||
const shortMonth = months[dateSupplied.getMonth()].substring(0, 3),
|
|
||||||
date = dateSupplied.getDate();
|
|
||||||
|
|
||||||
if (monthTextLength === 'longMonth') {
|
|
||||||
return cy.wrap(`${date} ${month} ${year}`);
|
|
||||||
} else return cy.wrap(`${date} ${shortMonth} ${year}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function createTenDigitUnixTimeStampForSpecifiedDays(
|
export function createTenDigitUnixTimeStampForSpecifiedDays(
|
||||||
durationDays: number
|
durationDays: number
|
||||||
) {
|
) {
|
||||||
@@ -52,6 +24,13 @@ export function createTenDigitUnixTimeStampForSpecifiedDays(
|
|||||||
return (timestamp = Math.floor(timestamp / 1000));
|
return (timestamp = Math.floor(timestamp / 1000));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getDateFormatForSpecifiedDays(days: number) {
|
||||||
|
const date = new Date(
|
||||||
|
createTenDigitUnixTimeStampForSpecifiedDays(days) * 1000
|
||||||
|
);
|
||||||
|
return cy.wrap(format(date, 'dd MMM yyyy'));
|
||||||
|
}
|
||||||
|
|
||||||
export function enterRawProposalBody(timestamp: number) {
|
export function enterRawProposalBody(timestamp: number) {
|
||||||
cy.fixture('/proposals/raw.json').then((rawProposal) => {
|
cy.fixture('/proposals/raw.json').then((rawProposal) => {
|
||||||
rawProposal.terms.closingTimestamp = timestamp;
|
rawProposal.terms.closingTimestamp = timestamp;
|
||||||
@@ -90,6 +69,7 @@ export function getSubmittedProposalFromProposalList(proposalTitle: string) {
|
|||||||
export function getProposalIdFromList(proposalTitle: string) {
|
export function getProposalIdFromList(proposalTitle: string) {
|
||||||
cy.contains(proposalTitle)
|
cy.contains(proposalTitle)
|
||||||
.parentsUntil(proposalListItem)
|
.parentsUntil(proposalListItem)
|
||||||
|
.last()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(proposalDetails)
|
cy.get(proposalDetails)
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
@@ -103,16 +83,6 @@ export function getProposalIdFromList(proposalTitle: string) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getGovernanceProposalDateFormatForSpecifiedDays(
|
|
||||||
days: number,
|
|
||||||
shortOrLong?: string
|
|
||||||
) {
|
|
||||||
return convertUnixTimestampToDateformat(
|
|
||||||
createTenDigitUnixTimeStampForSpecifiedDays(days),
|
|
||||||
shortOrLong
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getProposalInformationFromTable(heading: string) {
|
export function getProposalInformationFromTable(heading: string) {
|
||||||
return cy.get(proposalInformationTableRows).contains(heading).siblings();
|
return cy.get(proposalInformationTableRows).contains(heading).siblings();
|
||||||
}
|
}
|
||||||
@@ -133,7 +103,7 @@ export function waitForProposalSync() {
|
|||||||
// before proposal appears in the list - so rather than hard coded wait - we just wait on the
|
// before proposal appears in the list - so rather than hard coded wait - we just wait on the
|
||||||
// delegation checks that are performed on the governance page.
|
// delegation checks that are performed on the governance page.
|
||||||
|
|
||||||
cy.intercept('POST', '/query', (req) => {
|
cy.intercept('POST', '/graphql', (req) => {
|
||||||
if (req.body.operationName === 'Delegations') {
|
if (req.body.operationName === 'Delegations') {
|
||||||
req.alias = 'proposalDelegationsCompletion';
|
req.alias = 'proposalDelegationsCompletion';
|
||||||
}
|
}
|
||||||
@@ -143,7 +113,7 @@ export function waitForProposalSync() {
|
|||||||
cy.wait(['@proposalDelegationsCompletion', '@proposalDelegationsCompletion']);
|
cy.wait(['@proposalDelegationsCompletion', '@proposalDelegationsCompletion']);
|
||||||
|
|
||||||
// Turn off this intercept from here on in
|
// Turn off this intercept from here on in
|
||||||
cy.intercept('POST', '/query', (req) => {
|
cy.intercept('POST', '/graphql', (req) => {
|
||||||
if (req.body.operationName === 'Delegations') {
|
if (req.body.operationName === 'Delegations') {
|
||||||
req.continue();
|
req.continue();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import './proposal.functions.ts';
|
|||||||
import registerCypressGrep from '@cypress/grep';
|
import registerCypressGrep from '@cypress/grep';
|
||||||
import { aliasGQLQuery } from '@vegaprotocol/cypress';
|
import { aliasGQLQuery } from '@vegaprotocol/cypress';
|
||||||
import { chainIdQuery, statisticsQuery } from '@vegaprotocol/mock';
|
import { chainIdQuery, statisticsQuery } from '@vegaprotocol/mock';
|
||||||
|
import { turnTelemetryOff } from './common.functions.ts';
|
||||||
registerCypressGrep();
|
registerCypressGrep();
|
||||||
|
|
||||||
// Hide fetch/XHR requests - They create a lot of noise in command log
|
// Hide fetch/XHR requests - They create a lot of noise in command log
|
||||||
@@ -24,6 +25,9 @@ if (!app.document.head.querySelector('[data-hide-command-log-request]')) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
before(() => {
|
before(() => {
|
||||||
|
cy.clearLocalStorage();
|
||||||
|
// // Ensuring the telemetry modal doesn't disrupt the tests
|
||||||
|
turnTelemetryOff();
|
||||||
// Mock chainId fetch which happens on every page for wallet connection
|
// Mock chainId fetch which happens on every page for wallet connection
|
||||||
cy.mockGQL((req) => {
|
cy.mockGQL((req) => {
|
||||||
aliasGQLQuery(req, 'ChainId', chainIdQuery());
|
aliasGQLQuery(req, 'ChainId', chainIdQuery());
|
||||||
|
|||||||
@@ -89,6 +89,6 @@ export function mockNetworkUpgradeProposal() {
|
|||||||
cy.mockGQL((req) => {
|
cy.mockGQL((req) => {
|
||||||
aliasGQLQuery(req, 'Nodes', nodeData);
|
aliasGQLQuery(req, 'Nodes', nodeData);
|
||||||
aliasGQLQuery(req, 'Proposals', proposalsData);
|
aliasGQLQuery(req, 'Proposals', proposalsData);
|
||||||
aliasGQLQuery(req, 'ProtocolUpgrades', upgradeProposalsData);
|
aliasGQLQuery(req, 'ProtocolUpgradeProposals', upgradeProposalsData);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,18 +35,25 @@ const stakingBridgeContract = new StakingBridge(
|
|||||||
);
|
);
|
||||||
const vestingContract = new TokenVesting(vegaTokenContractAddress, signer);
|
const vestingContract = new TokenVesting(vegaTokenContractAddress, signer);
|
||||||
|
|
||||||
export async function depositAsset(assetEthAddress: string, amount: string) {
|
export async function depositAsset(
|
||||||
|
assetEthAddress: string,
|
||||||
|
amount: string,
|
||||||
|
decimalPlaces: number
|
||||||
|
) {
|
||||||
// Approve asset
|
// Approve asset
|
||||||
const faucet = new TokenFaucetable(assetEthAddress, signer);
|
const faucet = new TokenFaucetable(assetEthAddress, signer);
|
||||||
cy.wrap(faucet.approve(Erc20BridgeAddress, amount + '0'.repeat(19)), {
|
cy.wrap(
|
||||||
|
faucet.approve(Erc20BridgeAddress, amount + '0'.repeat(decimalPlaces + 1)),
|
||||||
|
{
|
||||||
timeout: transactionTimeout,
|
timeout: transactionTimeout,
|
||||||
log: false,
|
log: false,
|
||||||
}).then(() => {
|
}
|
||||||
|
).then(() => {
|
||||||
const collateralBridge = new CollateralBridge(Erc20BridgeAddress, signer);
|
const collateralBridge = new CollateralBridge(Erc20BridgeAddress, signer);
|
||||||
cy.wrap(
|
cy.wrap(
|
||||||
collateralBridge.deposit_asset(
|
collateralBridge.deposit_asset(
|
||||||
assetEthAddress,
|
assetEthAddress,
|
||||||
amount + '0'.repeat(18),
|
amount + '0'.repeat(decimalPlaces),
|
||||||
'0x' + vegaWalletPubKey
|
'0x' + vegaWalletPubKey
|
||||||
),
|
),
|
||||||
{ timeout: transactionTimeout, log: false }
|
{ timeout: transactionTimeout, log: false }
|
||||||
@@ -102,27 +109,49 @@ async function vegaWalletTeardownStaking(stakingBridgeContract: StakingBridge) {
|
|||||||
cy.highlight('Tearing down staking tokens from vega wallet if present');
|
cy.highlight('Tearing down staking tokens from vega wallet if present');
|
||||||
cy.wrap(
|
cy.wrap(
|
||||||
stakingBridgeContract.stake_balance(ethWalletPubKey, vegaWalletPubKey),
|
stakingBridgeContract.stake_balance(ethWalletPubKey, vegaWalletPubKey),
|
||||||
{ timeout: transactionTimeout, log: false }
|
{ timeout: transactionTimeout }
|
||||||
).then((stakeBalance) => {
|
).then((stakeBalance) => {
|
||||||
if (Number(stakeBalance) != 0) {
|
if (Number(stakeBalance) != 0) {
|
||||||
cy.get('[data-testid="vega-wallet-balance-unstaked"]:visible').within(
|
cy.get(vegaWalletContainer).within(() => {
|
||||||
() => {
|
cy.getByTestId('currency-value')
|
||||||
cy.get(associatedAmountInWallet)
|
.first()
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.then(($walletAmount) => {
|
.then(($associatedAmount) => {
|
||||||
cy.wrap(
|
cy.wrap(
|
||||||
stakingBridgeContract.remove_stake(
|
stakingBridgeContract.remove_stake(
|
||||||
String(stakeBalance),
|
String(stakeBalance),
|
||||||
vegaWalletPubKey
|
vegaWalletPubKey
|
||||||
),
|
),
|
||||||
{ timeout: transactionTimeout, log: false }
|
{ timeout: transactionTimeout }
|
||||||
);
|
);
|
||||||
cy.get(associatedAmountInWallet, {
|
cy.wrap(
|
||||||
|
vestingContract.stake_balance(ethWalletPubKey, vegaWalletPubKey),
|
||||||
|
{
|
||||||
timeout: transactionTimeout,
|
timeout: transactionTimeout,
|
||||||
}).should('not.have.text', $walletAmount);
|
log: false,
|
||||||
|
}
|
||||||
|
).then((vestingAmount) => {
|
||||||
|
if (Number(vestingAmount) != 0) {
|
||||||
|
cy.contains('Associated', {
|
||||||
|
timeout: transactionTimeout,
|
||||||
|
})
|
||||||
|
.parent()
|
||||||
|
.parent()
|
||||||
|
.within(() => {
|
||||||
|
cy.getByTestId('currency-value', {
|
||||||
|
timeout: transactionTimeout,
|
||||||
|
})
|
||||||
|
.should('have.length', 1)
|
||||||
|
.invoke('text')
|
||||||
|
.as('displayedAmount');
|
||||||
|
cy.get('@displayedAmount', {
|
||||||
|
timeout: transactionTimeout,
|
||||||
|
}).should('not.eq', $associatedAmount);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
);
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -136,7 +165,7 @@ async function vegaWalletTeardownVesting(vestingContract: TokenVesting) {
|
|||||||
if (Number(vestingAmount) != 0) {
|
if (Number(vestingAmount) != 0) {
|
||||||
cy.wrap(
|
cy.wrap(
|
||||||
vestingContract.remove_stake(String(vestingAmount), vegaWalletPubKey),
|
vestingContract.remove_stake(String(vestingAmount), vegaWalletPubKey),
|
||||||
{ timeout: transactionTimeout, log: false }
|
{ timeout: transactionTimeout }
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
NX_VEGA_ENV=STAGNET3
|
NX_VEGA_ENV=STAGNET1
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/stagnet3/vegawallet-stagnet3.toml
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/stagnet1/vegawallet-stagnet1.toml
|
||||||
NX_VEGA_URL=https://api.stagnet3.vega.xyz/graphql
|
NX_VEGA_URL=https://api.n00.stagnet1.vega.xyz/graphql
|
||||||
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_FAIRGROUND=false
|
NX_FAIRGROUND=false
|
||||||
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.token.vega.xyz","STAGNET3":"https://stagnet3.token.vega.xyz","TESTNET":"https://token.fairground.wtf","MAINNET":"https://token.vega.xyz"}'
|
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.governance.vega.xyz","STAGNET1":"https://stagnet1.governance.vega.xyz","TESTNET":"https://governance.fairground.wtf","MAINNET":"https://governance.vega.xyz"}'
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
||||||
NX_VEGA_WALLET_URL=http://localhost:1789
|
NX_VEGA_WALLET_URL=http://localhost:1789
|
||||||
NX_VEGA_EXPLORER_URL=https://explorer.fairground.wtf
|
NX_VEGA_EXPLORER_URL=https://stagnet1.explorer.vega.xyz
|
||||||
NX_HOSTED_WALLET_URL=https://wallet.testnet.vega.xyz
|
NX_HOSTED_WALLET_URL=https://wallet.testnet.vega.xyz
|
||||||
NX_VEGA_DOCS_URL=https://docs.vega.xyz/testnet
|
NX_VEGA_DOCS_URL=https://docs.vega.xyz/testnet
|
||||||
NX_DELEGATIONS_PAGINATION=50
|
NX_DELEGATIONS_PAGINATION=50
|
||||||
NX_TRANCHES_SERVICE_URL=https://tranches-stagnet3-k8s.ops.vega.xyz
|
NX_TRANCHES_SERVICE_URL=https://tranches-stagnet1-k8s.ops.vega.xyz
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/main/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/main/announcements.json
|
||||||
NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72
|
NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ NX_VEGA_ENV=CUSTOM
|
|||||||
NX_ETHEREUM_PROVIDER_URL=http://localhost:8545
|
NX_ETHEREUM_PROVIDER_URL=http://localhost:8545
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_FAIRGROUND=false
|
NX_FAIRGROUND=false
|
||||||
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.token.vega.xyz","STAGNET3":"https://stagnet3.token.vega.xyz","TESTNET":"https://token.fairground.wtf","MAINNET":"https://token.vega.xyz"}'
|
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.governance.vega.xyz","TESTNET":"https://governance.fairground.wtf","MAINNET":"https://governance.vega.xyz"}'
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
||||||
NX_VEGA_CONFIG_URL=''
|
NX_VEGA_CONFIG_URL=''
|
||||||
@@ -16,7 +16,7 @@ NX_LOCAL_PROVIDER_URL=http://localhost:8545/
|
|||||||
NX_VEGA_WALLET_URL=http://localhost:1789
|
NX_VEGA_WALLET_URL=http://localhost:1789
|
||||||
NX_VEGA_DOCS_URL=https://docs.vega.xyz/testnet
|
NX_VEGA_DOCS_URL=https://docs.vega.xyz/testnet
|
||||||
NX_DELEGATIONS_PAGINATION=50
|
NX_DELEGATIONS_PAGINATION=50
|
||||||
NX_TRANCHES_SERVICE_URL=https://tranches-stagnet3-k8s.ops.vega.xyz
|
NX_TRANCHES_SERVICE_URL=https://tranches-stagnet1-k8s.ops.vega.xyz
|
||||||
|
|
||||||
#Test configuration variables
|
#Test configuration variables
|
||||||
CYPRESS_FAIRGROUND=false
|
CYPRESS_FAIRGROUND=false
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
NX_VEGA_ENV=DEVNET
|
NX_VEGA_ENV=DEVNET
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/devnet1/vegawallet-devnet1.toml
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/devnet1/vegawallet-devnet1.toml
|
||||||
NX_VEGA_URL=https://api.n00.devnet1.vega.xyz/graphql
|
NX_VEGA_URL=https://api.n00.devnet1.vega.xyz/graphql
|
||||||
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.token.vega.xyz","STAGNET3":"https://stagnet3.token.vega.xyz","TESTNET":"https://token.fairground.wtf","MAINNET":"https://token.vega.xyz"}'
|
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.governance.vega.xyz","TESTNET":"https://governance.fairground.wtf","MAINNET":"https://governance.vega.xyz"}'
|
||||||
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
NX_VEGA_ENV=MAINNET
|
NX_VEGA_ENV=MAINNET
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks/master/mainnet1/mainnet1.toml
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks/master/mainnet1/mainnet1.toml
|
||||||
NX_VEGA_URL=https://api.vega.xyz/query
|
NX_VEGA_URL=https://api.vega.community/graphql
|
||||||
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.token.vega.xyz","STAGNET3":"https://stagnet3.token.vega.xyz","TESTNET":"https://token.fairground.wtf","MAINNET":"https://token.vega.xyz"}'
|
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.governance.vega.xyz","TESTNET":"https://governance.fairground.wtf","MAINNET":"https://governance.vega.xyz"}'
|
||||||
NX_ETHEREUM_PROVIDER_URL=https://mainnet.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
NX_ETHEREUM_PROVIDER_URL=https://mainnet.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
||||||
NX_ETHERSCAN_URL=https://etherscan.io
|
NX_ETHERSCAN_URL=https://etherscan.io
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
NX_VEGA_URL=https://api.n00.stagnet1.vega.xyz/graphql
|
NX_VEGA_URL=https://api.n00.stagnet1.vega.xyz/graphql
|
||||||
NX_VEGA_ENV=STAGNET1
|
NX_VEGA_ENV=STAGNET1
|
||||||
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.token.vega.xyz","STAGNET3":"https://stagnet3.token.vega.xyz","STAGNET1":"https://stagnet1.token.vega.xyz","TESTNET":"https://token.fairground.wtf","MAINNET":"https://token.vega.xyz"}'
|
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.governance.vega.xyz","STAGNET1":"https://stagnet1.governance.vega.xyz","TESTNET":"https://governance.fairground.wtf","MAINNET":"https://governance.vega.xyz"}'
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/stagnet1/vegawallet-stagnet1.toml
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/stagnet1/vegawallet-stagnet1.toml
|
||||||
NX_VEGA_EXPLORER_URL=https://stagnet1.explorer.vega.xyz
|
NX_VEGA_EXPLORER_URL=https://stagnet1.explorer.vega.xyz
|
||||||
NX_VEGA_DOCS_URL=https://docs.vega.xyz/testnet
|
NX_VEGA_DOCS_URL=https://docs.vega.xyz/testnet
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
# App configuration variables
|
|
||||||
NX_VEGA_URL=https://api.stagnet3.vega.xyz/graphql
|
|
||||||
NX_VEGA_ENV=STAGNET3
|
|
||||||
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.token.vega.xyz","STAGNET3":"https://stagnet3.token.vega.xyz","TESTNET":"https://token.fairground.wtf","MAINNET":"https://token.vega.xyz"}'
|
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/stagnet3/vegawallet-stagnet3.toml
|
|
||||||
NX_VEGA_EXPLORER_URL=https://stagnet3.explorer.vega.xyz
|
|
||||||
NX_VEGA_DOCS_URL=https://docs.vega.xyz/testnet
|
|
||||||
NX_HOSTED_WALLET_URL=https://wallet.testnet.vega.xyz
|
|
||||||
NX_DELEGATIONS_PAGINATION=50
|
|
||||||
NX_TRANCHES_SERVICE_URL=https://tranches-stagnet3-k8s.ops.vega.xyz
|
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
NX_VEGA_ENV=TESTNET
|
NX_VEGA_ENV=TESTNET
|
||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/fairground/vegawallet-fairground.toml
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/fairground/vegawallet-fairground.toml
|
||||||
NX_VEGA_URL=https://api.n07.testnet.vega.xyz/graphql
|
NX_VEGA_URL=https://api.n07.testnet.vega.xyz/graphql
|
||||||
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.token.vega.xyz","STAGNET3":"https://stagnet3.token.vega.xyz","TESTNET":"https://token.fairground.wtf","MAINNET":"https://token.vega.xyz"}'
|
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.governance.vega.xyz","TESTNET":"https://governance.fairground.wtf","MAINNET":"https://governance.vega.xyz"}'
|
||||||
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ NX_VEGA_ENV=VALIDATOR_TESTNET
|
|||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks/master/testnet2/testnet2.toml
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks/master/testnet2/testnet2.toml
|
||||||
NX_VEGA_URL=https://api-validators-testnet.vega.rocks/graphql
|
NX_VEGA_URL=https://api-validators-testnet.vega.rocks/graphql
|
||||||
NX_VEGA_REST=https://api-validators-testnet.vega.rocks/
|
NX_VEGA_REST=https://api-validators-testnet.vega.rocks/
|
||||||
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.token.vega.xyz","STAGNET3":"https://stagnet3.token.vega.xyz","TESTNET":"https://token.fairground.wtf","MAINNET":"https://token.vega.xyz"}'
|
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.governance.vega.xyz","TESTNET":"https://governance.fairground.wtf","MAINNET":"https://governance.vega.xyz"}'
|
||||||
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
||||||
|
|||||||
@@ -27,12 +27,11 @@ Example configurations are provided here:
|
|||||||
- [Mainnet](./.env.mainnet)
|
- [Mainnet](./.env.mainnet)
|
||||||
- [Devnet](./.env.devnet)
|
- [Devnet](./.env.devnet)
|
||||||
- [Testnet](./.env.testnet)
|
- [Testnet](./.env.testnet)
|
||||||
- [Stagnet3](./.env.stagnet3)
|
|
||||||
|
|
||||||
For convenience, you can boot the app injecting one of the configurations above by running:
|
For convenience, you can boot the app injecting one of the configurations above by running:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yarn nx run governance:serve --env={env} # e.g. stagnet3
|
yarn nx run governance:serve --env={env} # e.g. stagnet1
|
||||||
```
|
```
|
||||||
|
|
||||||
There are a few different configuration options offered for this app:
|
There are a few different configuration options offered for this app:
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
function ReactMarkdown({ children }) {
|
||||||
|
return <div>{children}</div>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ReactMarkdown;
|
||||||
@@ -58,9 +58,15 @@ export const AppLoader = ({ children }: { children: React.ReactElement }) => {
|
|||||||
token.decimals(),
|
token.decimals(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const totalSupply = toBigNum(supply, decimals);
|
const totalSupply = toBigNum(supply.toString(), decimals);
|
||||||
const totalWallet = toBigNum(totalAssociatedWallet, decimals);
|
const totalWallet = toBigNum(
|
||||||
const totalVesting = toBigNum(totalAssociatedVesting, decimals);
|
totalAssociatedWallet.toString(),
|
||||||
|
decimals
|
||||||
|
);
|
||||||
|
const totalVesting = toBigNum(
|
||||||
|
totalAssociatedVesting.toString(),
|
||||||
|
decimals
|
||||||
|
);
|
||||||
|
|
||||||
appDispatch({
|
appDispatch({
|
||||||
type: AppStateActionType.SET_TOKEN,
|
type: AppStateActionType.SET_TOKEN,
|
||||||
|
|||||||
@@ -20,12 +20,17 @@ import type { EthereumConfig } from '@vegaprotocol/web3';
|
|||||||
import {
|
import {
|
||||||
createConnectors,
|
createConnectors,
|
||||||
useEthTransactionManager,
|
useEthTransactionManager,
|
||||||
|
useEthTransactionUpdater,
|
||||||
useEthWithdrawApprovalsManager,
|
useEthWithdrawApprovalsManager,
|
||||||
useWeb3ConnectStore,
|
useWeb3ConnectStore,
|
||||||
} from '@vegaprotocol/web3';
|
} from '@vegaprotocol/web3';
|
||||||
import { Web3Provider } from '@vegaprotocol/web3';
|
import { Web3Provider } from '@vegaprotocol/web3';
|
||||||
import { VegaWalletDialogs } from './components/vega-wallet-dialogs';
|
import { VegaWalletDialogs } from './components/vega-wallet-dialogs';
|
||||||
import { VegaWalletProvider } from '@vegaprotocol/wallet';
|
import {
|
||||||
|
useVegaTransactionManager,
|
||||||
|
useVegaTransactionUpdater,
|
||||||
|
VegaWalletProvider,
|
||||||
|
} from '@vegaprotocol/wallet';
|
||||||
import { AsyncRenderer } from '@vegaprotocol/ui-toolkit';
|
import { AsyncRenderer } from '@vegaprotocol/ui-toolkit';
|
||||||
import { useEthereumConfig } from '@vegaprotocol/web3';
|
import { useEthereumConfig } from '@vegaprotocol/web3';
|
||||||
import {
|
import {
|
||||||
@@ -37,6 +42,12 @@ import { ENV } from './config';
|
|||||||
import type { InMemoryCacheConfig } from '@apollo/client';
|
import type { InMemoryCacheConfig } from '@apollo/client';
|
||||||
import { WithdrawalDialog } from '@vegaprotocol/withdraws';
|
import { WithdrawalDialog } from '@vegaprotocol/withdraws';
|
||||||
import { SplashLoader } from './components/splash-loader';
|
import { SplashLoader } from './components/splash-loader';
|
||||||
|
import { ToastsManager } from './toasts-manager';
|
||||||
|
import {
|
||||||
|
TelemetryDialog,
|
||||||
|
TELEMETRY_ON,
|
||||||
|
} from './components/telemetry-dialog/telemetry-dialog';
|
||||||
|
import { useLocalStorage } from '@vegaprotocol/react-helpers';
|
||||||
|
|
||||||
const cache: InMemoryCacheConfig = {
|
const cache: InMemoryCacheConfig = {
|
||||||
typePolicies: {
|
typePolicies: {
|
||||||
@@ -81,7 +92,10 @@ const Web3Container = ({
|
|||||||
providerUrl: string;
|
providerUrl: string;
|
||||||
}) => {
|
}) => {
|
||||||
const InitializeHandlers = () => {
|
const InitializeHandlers = () => {
|
||||||
|
useVegaTransactionManager();
|
||||||
|
useVegaTransactionUpdater();
|
||||||
useEthTransactionManager();
|
useEthTransactionManager();
|
||||||
|
useEthTransactionUpdater();
|
||||||
useEthWithdrawApprovalsManager();
|
useEthWithdrawApprovalsManager();
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
@@ -135,10 +149,12 @@ const Web3Container = ({
|
|||||||
<NetworkInfo />
|
<NetworkInfo />
|
||||||
</footer>
|
</footer>
|
||||||
</AppLayout>
|
</AppLayout>
|
||||||
|
<ToastsManager />
|
||||||
<InitializeHandlers />
|
<InitializeHandlers />
|
||||||
<VegaWalletDialogs />
|
<VegaWalletDialogs />
|
||||||
<TransactionModal />
|
<TransactionModal />
|
||||||
<WithdrawalDialog />
|
<WithdrawalDialog />
|
||||||
|
<TelemetryDialog />
|
||||||
</>
|
</>
|
||||||
</BalanceManager>
|
</BalanceManager>
|
||||||
</AppLoader>
|
</AppLoader>
|
||||||
@@ -167,9 +183,10 @@ const AppContainer = () => {
|
|||||||
const { config, loading, error } = useEthereumConfig();
|
const { config, loading, error } = useEthereumConfig();
|
||||||
const { VEGA_ENV, GIT_COMMIT_HASH, GIT_BRANCH, ETHEREUM_PROVIDER_URL } =
|
const { VEGA_ENV, GIT_COMMIT_HASH, GIT_BRANCH, ETHEREUM_PROVIDER_URL } =
|
||||||
useEnvironment();
|
useEnvironment();
|
||||||
|
const [telemetryOn] = useLocalStorage(TELEMETRY_ON);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (ENV.dsn) {
|
if (ENV.dsn && telemetryOn) {
|
||||||
Sentry.init({
|
Sentry.init({
|
||||||
dsn: ENV.dsn,
|
dsn: ENV.dsn,
|
||||||
integrations: [new Integrations.BrowserTracing()],
|
integrations: [new Integrations.BrowserTracing()],
|
||||||
@@ -192,8 +209,10 @@ const AppContainer = () => {
|
|||||||
});
|
});
|
||||||
Sentry.setTag('branch', GIT_BRANCH);
|
Sentry.setTag('branch', GIT_BRANCH);
|
||||||
Sentry.setTag('commit', GIT_COMMIT_HASH);
|
Sentry.setTag('commit', GIT_COMMIT_HASH);
|
||||||
|
} else {
|
||||||
|
Sentry.close();
|
||||||
}
|
}
|
||||||
}, [GIT_COMMIT_HASH, GIT_BRANCH, VEGA_ENV]);
|
}, [GIT_COMMIT_HASH, GIT_BRANCH, VEGA_ENV, telemetryOn]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Router>
|
<Router>
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ export const ConnectToVega = () => {
|
|||||||
openVegaWalletDialog();
|
openVegaWalletDialog();
|
||||||
}}
|
}}
|
||||||
data-testid="connect-to-vega-wallet-btn"
|
data-testid="connect-to-vega-wallet-btn"
|
||||||
|
variant="primary"
|
||||||
>
|
>
|
||||||
{t('connectVegaWallet')}
|
{t('connectVegaWallet')}
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ export const Heading = ({
|
|||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
<h1
|
<h1
|
||||||
className={classNames('font-alpha calt text-5xl', {
|
className={classNames('font-alpha calt text-5xl break-words', {
|
||||||
'mt-0': !marginTop,
|
'mt-0': !marginTop,
|
||||||
'mb-0': !marginBottom,
|
'mb-0': !marginBottom,
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -11,11 +11,26 @@ import {
|
|||||||
NavigationLink,
|
NavigationLink,
|
||||||
NavigationList,
|
NavigationList,
|
||||||
NavigationTrigger,
|
NavigationTrigger,
|
||||||
|
Icon,
|
||||||
} from '@vegaprotocol/ui-toolkit';
|
} from '@vegaprotocol/ui-toolkit';
|
||||||
import { EthWallet } from '../eth-wallet';
|
import { EthWallet } from '../eth-wallet';
|
||||||
import { VegaWallet } from '../vega-wallet';
|
import { VegaWallet } from '../vega-wallet';
|
||||||
import { useLocation, useMatch } from 'react-router-dom';
|
import { useLocation, useMatch } from 'react-router-dom';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
|
import { useTelemetryDialog } from '../telemetry-dialog/telemetry-dialog';
|
||||||
|
|
||||||
|
export const SettingsLink = () => {
|
||||||
|
const { open, isOpen, close } = useTelemetryDialog();
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => (isOpen ? close() : open())}
|
||||||
|
aria-label="Open Telemetry Settings"
|
||||||
|
>
|
||||||
|
<Icon name="cog" className="w-5 h-5 mr-2" />
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
export const Nav = ({ theme }: Pick<NavigationProps, 'theme'>) => {
|
export const Nav = ({ theme }: Pick<NavigationProps, 'theme'>) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -42,7 +57,12 @@ export const Nav = ({ theme }: Pick<NavigationProps, 'theme'>) => {
|
|||||||
));
|
));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Navigation appName="Governance" theme={theme} breakpoints={[458, 959]}>
|
<Navigation
|
||||||
|
appName="Governance"
|
||||||
|
theme={theme}
|
||||||
|
breakpoints={[458, 959]}
|
||||||
|
actions={<SettingsLink />}
|
||||||
|
>
|
||||||
<NavigationList
|
<NavigationList
|
||||||
className="[.drawer-content_&]:border-b [.drawer-content_&]:border-b-vega-light-200 dark:[.drawer-content_&]:border-b-vega-dark-200 [.drawer-content_&]:pb-8 [.drawer-content_&]:mb-2"
|
className="[.drawer-content_&]:border-b [.drawer-content_&]:border-b-vega-light-200 dark:[.drawer-content_&]:border-b-vega-dark-200 [.drawer-content_&]:pb-8 [.drawer-content_&]:mb-2"
|
||||||
hide={[NavigationBreakpoint.Small]}
|
hide={[NavigationBreakpoint.Small]}
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
import { renderHook, act } from '@testing-library/react';
|
||||||
|
import { useTelemetryDialog, TELEMETRY_ON } from './telemetry-dialog';
|
||||||
|
|
||||||
|
describe('useTelemetryDialog', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
localStorage.clear();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have the correct initial state based on localStorage', () => {
|
||||||
|
localStorage.setItem(TELEMETRY_ON, 'true');
|
||||||
|
|
||||||
|
const { result } = renderHook(() => useTelemetryDialog());
|
||||||
|
|
||||||
|
expect(result.current.isOpen).toBe(false);
|
||||||
|
expect(result.current.telemetryAccepted).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should update localStorage and the telemetryAccepted state when setTelemetryAccepted is called', () => {
|
||||||
|
const { result } = renderHook(() => useTelemetryDialog());
|
||||||
|
|
||||||
|
act(() => {
|
||||||
|
result.current.setTelemetryAccepted(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result.current.telemetryAccepted).toBe(true);
|
||||||
|
expect(localStorage.getItem(TELEMETRY_ON)).toBe('true');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should update localStorage and the isOpen state when close is called', () => {
|
||||||
|
const { result } = renderHook(() => useTelemetryDialog());
|
||||||
|
|
||||||
|
act(() => {
|
||||||
|
result.current.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result.current.isOpen).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should update the isOpen state when open is called', () => {
|
||||||
|
const { result } = renderHook(() => useTelemetryDialog());
|
||||||
|
|
||||||
|
act(() => {
|
||||||
|
result.current.open();
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result.current.isOpen).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should open the dialog if TELEMETRY_ON is not set', () => {
|
||||||
|
const { result } = renderHook(() => useTelemetryDialog());
|
||||||
|
expect(result.current.isOpen).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
import { create } from 'zustand';
|
||||||
|
import { useEffect } from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { useLocalStorage } from '@vegaprotocol/react-helpers';
|
||||||
|
import { Dialog, Icon, Button } from '@vegaprotocol/ui-toolkit';
|
||||||
|
import { Networks, useEnvironment } from '@vegaprotocol/environment';
|
||||||
|
|
||||||
|
type TelemetryDialogState = {
|
||||||
|
isOpen: boolean;
|
||||||
|
open: () => void;
|
||||||
|
close: () => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const useTelemetryDialogStore = create<TelemetryDialogState>((set) => ({
|
||||||
|
isOpen: false,
|
||||||
|
open: () => set({ isOpen: true }),
|
||||||
|
close: () => set({ isOpen: false }),
|
||||||
|
}));
|
||||||
|
|
||||||
|
export const TELEMETRY_ON = 'vega_telemetry_on';
|
||||||
|
|
||||||
|
export const useTelemetryDialog = () => {
|
||||||
|
const [telemetryOn, setTelemetryOn] = useLocalStorage(TELEMETRY_ON);
|
||||||
|
const { VEGA_ENV } = useEnvironment();
|
||||||
|
const isMainnet = VEGA_ENV === Networks.MAINNET;
|
||||||
|
|
||||||
|
const defaultTelemetryAccepted = isMainnet ? 'false' : 'true';
|
||||||
|
|
||||||
|
const { isOpen, open, close } = useTelemetryDialogStore();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (telemetryOn === null || telemetryOn === undefined) {
|
||||||
|
open();
|
||||||
|
setTelemetryOn(defaultTelemetryAccepted);
|
||||||
|
}
|
||||||
|
}, [defaultTelemetryAccepted, open, setTelemetryOn, telemetryOn]);
|
||||||
|
|
||||||
|
return {
|
||||||
|
isOpen,
|
||||||
|
open: open,
|
||||||
|
close: close,
|
||||||
|
telemetryAccepted: telemetryOn === 'true',
|
||||||
|
setTelemetryAccepted: (value: boolean) => {
|
||||||
|
setTelemetryOn(value.toString());
|
||||||
|
},
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export const TelemetryDialog = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { isOpen, open, close, telemetryAccepted, setTelemetryAccepted } =
|
||||||
|
useTelemetryDialog();
|
||||||
|
return (
|
||||||
|
<Dialog
|
||||||
|
title={t('ImproveVegaGovernance')}
|
||||||
|
open={isOpen}
|
||||||
|
onChange={(isOpen) => (isOpen ? open() : close())}
|
||||||
|
size="small"
|
||||||
|
>
|
||||||
|
<div className="mt-6">{t('TelemetryModalIntro')}</div>
|
||||||
|
<div className="flex items-center mt-6">
|
||||||
|
<Icon name="eye-off" className="mr-6" size={6} />
|
||||||
|
<div className="flex flex-col gap-1">
|
||||||
|
<div className="font-semibold">{t('Anonymous')}</div>
|
||||||
|
<div>{t('YourIdentityAnonymous')}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex items-center mt-6">
|
||||||
|
<Icon name="cog" className="mr-6" size={6} />
|
||||||
|
<div className="flex flex-col gap-1">
|
||||||
|
<div className="font-semibold">{t('Optional')}</div>
|
||||||
|
<div>{t('OptOutOfTelemetry')}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex items-center mt-10 gap-4">
|
||||||
|
<Button
|
||||||
|
onClick={() => {
|
||||||
|
setTelemetryAccepted(false);
|
||||||
|
close();
|
||||||
|
}}
|
||||||
|
variant="default"
|
||||||
|
data-testid="do-not-share-data-button"
|
||||||
|
>
|
||||||
|
{t('NoThanks')}
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
onClick={() => {
|
||||||
|
setTelemetryAccepted(true);
|
||||||
|
close();
|
||||||
|
}}
|
||||||
|
variant="primary"
|
||||||
|
data-testid="share-data-button"
|
||||||
|
>
|
||||||
|
{telemetryAccepted ? t('ContinueSharingData') : t('ShareData')}
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</Dialog>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -33,10 +33,6 @@ export const ContractAddresses: {
|
|||||||
claimAddress: '0x8Cef746ab7C83B61F6461cC92882bD61AB65a994', // TODO not deployed to this env, but random address so app doesn't error
|
claimAddress: '0x8Cef746ab7C83B61F6461cC92882bD61AB65a994', // TODO not deployed to this env, but random address so app doesn't error
|
||||||
lockedAddress: '0x0', // TODO not deployed to this env
|
lockedAddress: '0x0', // TODO not deployed to this env
|
||||||
},
|
},
|
||||||
STAGNET3: {
|
|
||||||
claimAddress: '0x8Cef746ab7C83B61F6461cC92882bD61AB65a994', // TODO not deployed to this env, but random address so app doesn't error
|
|
||||||
lockedAddress: '0x0', // TODO not deployed to this env
|
|
||||||
},
|
|
||||||
TESTNET: {
|
TESTNET: {
|
||||||
claimAddress: '0x8Cef746ab7C83B61F6461cC92882bD61AB65a994', // TODO not deployed to this env, but random address so app doesn't error
|
claimAddress: '0x8Cef746ab7C83B61F6461cC92882bD61AB65a994', // TODO not deployed to this env, but random address so app doesn't error
|
||||||
lockedAddress: '0x0', // TODO not deployed to this env
|
lockedAddress: '0x0', // TODO not deployed to this env
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
export function useDocumentTitle(name?: string) {
|
export function useDocumentTitle(name?: string) {
|
||||||
const base = 'VEGA token';
|
const base = 'VEGA Governance';
|
||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
if (name) {
|
if (name) {
|
||||||
|
|||||||
@@ -21,10 +21,10 @@ export const useGetUserBalances = (account: string | undefined) => {
|
|||||||
token.allowance(account, config.staking_bridge_contract.address),
|
token.allowance(account, config.staking_bridge_contract.address),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const balance = toBigNum(b, decimals);
|
const balance = toBigNum(b.toString(), decimals);
|
||||||
const walletBalance = toBigNum(w, decimals);
|
const walletBalance = toBigNum(w.toString(), decimals);
|
||||||
const lien = toBigNum(stats.lien, decimals);
|
const lien = toBigNum(stats.lien.toString(), decimals);
|
||||||
const allowance = toBigNum(a, decimals);
|
const allowance = toBigNum(a.toString(), decimals);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
balanceFormatted: balance,
|
balanceFormatted: balance,
|
||||||
|
|||||||
@@ -21,8 +21,14 @@ export function useRefreshAssociatedBalances() {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
updateBalances({
|
updateBalances({
|
||||||
walletAssociatedBalance: toBigNum(walletAssociatedBalance, decimals),
|
walletAssociatedBalance: toBigNum(
|
||||||
vestingAssociatedBalance: toBigNum(vestingAssociatedBalance, decimals),
|
walletAssociatedBalance.toString(),
|
||||||
|
decimals
|
||||||
|
),
|
||||||
|
vestingAssociatedBalance: toBigNum(
|
||||||
|
vestingAssociatedBalance.toString(),
|
||||||
|
decimals
|
||||||
|
),
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
[staking, vesting, updateBalances, decimals]
|
[staking, vesting, updateBalances, decimals]
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user