Compare commits
135
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ca1300d13a | ||
|
|
fc3b1bd9ab | ||
|
|
090d850647 | ||
|
|
95280f5b26 | ||
|
|
101ae00a57 | ||
|
|
613cce3683 | ||
|
|
41fa18ed45 | ||
|
|
c941893cdd | ||
|
|
d049b471d8 | ||
|
|
010ffc0f46 | ||
|
|
dd56e4083b | ||
|
|
09d1ba68ba | ||
|
|
3959daa2b7 | ||
|
|
c599b02c89 | ||
|
|
e5ebaf02d2 | ||
|
|
ae54616c1f | ||
|
|
8f3cf390c5 | ||
|
|
64cf0c90a7 | ||
|
|
3edd91eadb | ||
|
|
676aeb07a4 | ||
|
|
52ee998bf0 | ||
|
|
727e2cd2ff | ||
|
|
06b2dd18f9 | ||
|
|
a189f38cdc | ||
|
|
d18681a5f0 | ||
|
|
9e2d03853a | ||
|
|
18c36d5e6b | ||
|
|
dcfb8f9527 | ||
|
|
a64acecf4b | ||
|
|
0998952196 | ||
|
|
2fd4d379cf | ||
|
|
c99d055b24 | ||
|
|
f1fa13e0bd | ||
|
|
ae020a8dca | ||
|
|
fa871a49c7 | ||
|
|
4205dd471a | ||
|
|
1040077c2b | ||
|
|
9d346d7846 | ||
|
|
b68136ba3f | ||
|
|
f5ad2de5a5 | ||
|
|
b3bfb90804 | ||
|
|
327ebf3496 | ||
|
|
1098accb84 | ||
|
|
52183555a9 | ||
|
|
51187029aa | ||
|
|
f7f7be59d3 | ||
|
|
49e3baf094 | ||
|
|
a575b4c502 | ||
|
|
af2e52d59c | ||
|
|
2725bef159 | ||
|
|
070f1905e2 | ||
|
|
6705eb4398 | ||
|
|
9d3fc04597 | ||
|
|
d3929b8d4a | ||
|
|
8a5579b1cc | ||
|
|
197f2e8097 | ||
|
|
8f5a2276de | ||
|
|
46513685c8 | ||
|
|
e66e96f12d | ||
|
|
31c8365812 | ||
|
|
460f534c7a | ||
|
|
24cd080dd4 | ||
|
|
f10c33748f | ||
|
|
ac163d0194 | ||
|
|
e7616e64f8 | ||
|
|
adca4600c2 | ||
|
|
a8eef1cb53 | ||
|
|
58d4bd1459 | ||
|
|
26020b5f71 | ||
|
|
16d345eb4a | ||
|
|
3b3fcab4f4 | ||
|
|
f54a629179 | ||
|
|
56f48671cc | ||
|
|
a65ee358ff | ||
|
|
7b8d814724 | ||
|
|
cd237dc491 | ||
|
|
9ad00adc5a | ||
|
|
fab055bb34 | ||
|
|
d66956d080 | ||
|
|
9848c8ffff | ||
|
|
b0e8ed62d2 | ||
|
|
289ff3b5b3 | ||
|
|
1d965187dc | ||
|
|
8bf3615001 | ||
|
|
1b77800b62 | ||
|
|
979dc2904b | ||
|
|
0fec3bcf3c | ||
|
|
4542e25ec9 | ||
|
|
acd96fbf21 | ||
|
|
96bf12d4dd | ||
|
|
47b81188d4 | ||
|
|
efada06256 | ||
|
|
311ef41138 | ||
|
|
5dd0cafeca | ||
|
|
f3d6aa1129 | ||
|
|
93dbc32f22 | ||
|
|
fd1827ef67 | ||
|
|
9c9948e4c1 | ||
|
|
79b0868ff7 | ||
|
|
a8401d4c6f | ||
|
|
c030264211 | ||
|
|
068f7b3fc3 | ||
|
|
4430f0c5f6 | ||
|
|
0a14000708 | ||
|
|
9ca6fe3cbf | ||
|
|
4f96472375 | ||
|
|
cddf2ba00b | ||
|
|
d01d6f5815 | ||
|
|
2998e165f6 | ||
|
|
886b0cb6d3 | ||
|
|
6799a06acd | ||
|
|
47a6bcff78 | ||
|
|
06dcd00b53 | ||
|
|
fd7aa5bd78 | ||
|
|
384cfbc70b | ||
|
|
9d14f603b3 | ||
|
|
8fab8dad6c | ||
|
|
76bf45b461 | ||
|
|
f128f41ea0 | ||
|
|
fcb992b64e | ||
|
|
1251c8b89b | ||
|
|
a796a38200 | ||
|
|
cf83fe9469 | ||
|
|
43c48741e2 | ||
|
|
cc6ea6176a | ||
|
|
6b280d8a70 | ||
|
|
891b441427 | ||
|
|
86739dfaad | ||
|
|
d87adfd7d5 | ||
|
|
7364abbbf2 | ||
|
|
1bd56c9bdb | ||
|
|
a985bc7317 | ||
|
|
1cab9abfd5 | ||
|
|
26a82ab2ab | ||
|
|
69a0830e80 |
@@ -11,7 +11,7 @@ on:
|
|||||||
type: choice
|
type: choice
|
||||||
options:
|
options:
|
||||||
- explorer-e2e
|
- explorer-e2e
|
||||||
- token-e2e
|
- governance-e2e
|
||||||
- trading-e2e
|
- trading-e2e
|
||||||
tags:
|
tags:
|
||||||
description: 'Test tags to run'
|
description: 'Test tags to run'
|
||||||
|
|||||||
@@ -10,5 +10,5 @@ jobs:
|
|||||||
uses: ./.github/workflows/cypress-run.yml
|
uses: ./.github/workflows/cypress-run.yml
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
with:
|
with:
|
||||||
projects: '["explorer-e2e","token-e2e","trading-e2e"]'
|
projects: '["explorer-e2e","governance-e2e","trading-e2e"]'
|
||||||
tags: '@smoke @regression @slow'
|
tags: '@smoke @regression @slow'
|
||||||
|
|||||||
@@ -42,10 +42,10 @@ 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"
|
||||||
projects=""
|
projects=""
|
||||||
if [[ $affected == *"token"* ]]; then projects+='"token-e2e" '; fi
|
if [[ $affected == *"governance"* ]]; then projects+='"governance-e2e" '; fi
|
||||||
if [[ $affected == *"trading"* ]]; then projects+='"trading-e2e" '; fi
|
if [[ $affected == *"trading"* ]]; then projects+='"trading-e2e" '; fi
|
||||||
if [[ $affected == *"explorer"* ]]; then projects+='"explorer-e2e" '; fi
|
if [[ $affected == *"explorer"* ]]; then projects+='"explorer-e2e" '; fi
|
||||||
if [[ -z "$projects" ]]; then projects+='"token-e2e" "trading-e2e" "explorer-e2e" '; fi
|
if [[ -z "$projects" ]]; then projects+='"governance-e2e" "trading-e2e" "explorer-e2e" '; fi
|
||||||
projects=${projects%?}
|
projects=${projects%?}
|
||||||
projects=[${projects// /,}]
|
projects=[${projects// /,}]
|
||||||
echo PROJECTS=$projects >> $GITHUB_ENV
|
echo PROJECTS=$projects >> $GITHUB_ENV
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ jobs:
|
|||||||
run: ls -alsh /home/runner/.vegacapsule/testnet/logs/
|
run: ls -alsh /home/runner/.vegacapsule/testnet/logs/
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v3
|
||||||
if: ${{ always() }}
|
if: ${{ failure() }}
|
||||||
with:
|
with:
|
||||||
name: logs-${{ matrix.project }}
|
name: logs-${{ matrix.project }}
|
||||||
path: /home/runner/.vegacapsule/testnet/logs
|
path: /home/runner/.vegacapsule/testnet/logs
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ on:
|
|||||||
- react-helpers
|
- react-helpers
|
||||||
- tailwindcss-config
|
- tailwindcss-config
|
||||||
- types
|
- types
|
||||||
|
- utils
|
||||||
|
- i18n
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish:
|
publish:
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ In order to setup and run vegawallet for e2e capsule tests, in a separate termin
|
|||||||
bash setup-vegawallet.sh
|
bash setup-vegawallet.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
3. copy generated `api-token` and paste the token into `CYPRESS_VEGA_WALLET_API_TOKEN` environment variable in either `apps/token-e2e/.env` or `apps/explorer-e2e/.env` depending on which project needs testing.
|
3. copy generated `api-token` and paste the token into `CYPRESS_VEGA_WALLET_API_TOKEN` environment variable in either `apps/governance-e2e/.env` or `apps/explorer-e2e/.env` depending on which project needs testing.
|
||||||
|
|
||||||
Note: The script is only needed if capsule was built for first time or fresh. To run existing wallet service for capsule:
|
Note: The script is only needed if capsule was built for first time or fresh. To run existing wallet service for capsule:
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ NX_TENDERMINT_URL=http://localhost:26617
|
|||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://localhost:26617/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://localhost:26617/websocket
|
||||||
NX_VEGA_URL=http://localhost:3028/query
|
NX_VEGA_URL=http://localhost:3028/query
|
||||||
NX_VEGA_ENV=CUSTOM
|
NX_VEGA_ENV=CUSTOM
|
||||||
NX_VEGA_CONFIG_URL=https://static.vega.xyz/assets/capsule-network.json
|
NX_VEGA_CONFIG_URL=
|
||||||
|
|
||||||
CYPRESS_VEGA_TENDERMINT_URL=http://localhost:26617
|
CYPRESS_VEGA_TENDERMINT_URL=http://localhost:26617
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"governance.proposal.updateAsset.minProposerBalance",
|
"governance.proposal.updateAsset.minProposerBalance",
|
||||||
"governance.proposal.updateAsset.minVoterBalance",
|
"governance.proposal.updateAsset.minVoterBalance",
|
||||||
"governance.proposal.updateAsset.requiredParticipation",
|
"governance.proposal.updateAsset.requiredParticipation",
|
||||||
"governance.proposal.updateMarket.minProposerEquityLikeShare",
|
|
||||||
"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.updateMarket.requiredParticipationLP",
|
"governance.proposal.updateMarket.requiredParticipationLP",
|
||||||
"governance.proposal.updateNetParam.requiredMajority",
|
"governance.proposal.updateNetParam.requiredMajority",
|
||||||
"governance.proposal.updateNetParam.requiredParticipation",
|
"governance.proposal.updateNetParam.requiredParticipation",
|
||||||
|
"governance.proposal.updateMarket.minProposerEquityLikeShare",
|
||||||
"validators.vote.required"
|
"validators.vote.required"
|
||||||
],
|
],
|
||||||
"duration": [
|
"duration": [
|
||||||
|
|||||||
@@ -1,33 +1,27 @@
|
|||||||
context('Blocks page', { tags: '@regression' }, function () {
|
context('Blocks page', { tags: '@regression' }, function () {
|
||||||
before('visit token home page', function () {
|
|
||||||
cy.visit('/');
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Verify elements on page', function () {
|
describe('Verify elements on page', function () {
|
||||||
const blockNavigation = 'a[href="/blocks"]';
|
beforeEach(() => {
|
||||||
|
cy.visit('/blocks');
|
||||||
|
});
|
||||||
const blockHeight = '[data-testid="block-height"]';
|
const blockHeight = '[data-testid="block-height"]';
|
||||||
const blockTime = '[data-testid="block-time"]';
|
const blockTime = '[data-testid="block-time"]';
|
||||||
const blockHeader = '[data-testid="block-header"]';
|
const blockHeader = '[data-testid="block-header"]';
|
||||||
const previousBlockBtn = '[data-testid="previous-block"]';
|
const previousBlockBtn = '[data-testid="previous-block"]';
|
||||||
const infiniteScrollWrapper = '[data-testid="infinite-scroll-wrapper"]';
|
const infiniteScrollWrapper = '[data-testid="infinite-scroll-wrapper"]';
|
||||||
|
|
||||||
beforeEach('navigate to blocks page', function () {
|
|
||||||
cy.get(blockNavigation).click();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Blocks page is displayed', function () {
|
it('Blocks page is displayed', function () {
|
||||||
validateBlocksDisplayed();
|
validateBlocksDisplayed();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Blocks page is displayed on mobile', function () {
|
it('Blocks page is displayed on mobile', function () {
|
||||||
cy.common_switch_to_mobile_and_click_toggle();
|
cy.switchToMobile();
|
||||||
cy.get(blockNavigation).click();
|
|
||||||
validateBlocksDisplayed();
|
validateBlocksDisplayed();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Block validator page is displayed', function () {
|
it('Block validator page is displayed', function () {
|
||||||
waitForBlocksResponse();
|
waitForBlocksResponse();
|
||||||
cy.get(blockHeight).eq(0).click();
|
cy.get(blockHeight).eq(0).find('a').click({ force: true });
|
||||||
|
|
||||||
cy.get('[data-testid="block-validator"]').should('not.be.empty');
|
cy.get('[data-testid="block-validator"]').should('not.be.empty');
|
||||||
cy.get(blockTime).should('not.be.empty');
|
cy.get(blockTime).should('not.be.empty');
|
||||||
//TODO: Add assertion for transactions when txs are added
|
//TODO: Add assertion for transactions when txs are added
|
||||||
@@ -35,7 +29,7 @@ context('Blocks page', { tags: '@regression' }, function () {
|
|||||||
|
|
||||||
it('Navigate to previous block', function () {
|
it('Navigate to previous block', function () {
|
||||||
waitForBlocksResponse();
|
waitForBlocksResponse();
|
||||||
cy.get(blockHeight).eq(0).click();
|
cy.get(blockHeight).eq(0).find('a').click({ force: true });
|
||||||
cy.get(blockHeader)
|
cy.get(blockHeader)
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.then(($blockHeaderTxt) => {
|
.then(($blockHeaderTxt) => {
|
||||||
|
|||||||
@@ -2,17 +2,14 @@ context('Network parameters page', { tags: '@smoke' }, function () {
|
|||||||
before('navigate to network parameter page', function () {
|
before('navigate to network parameter page', function () {
|
||||||
cy.fixture('net_parameter_format_lookup').as('networkParameterFormat');
|
cy.fixture('net_parameter_format_lookup').as('networkParameterFormat');
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Verify elements on page', function () {
|
describe('Verify elements on page', function () {
|
||||||
const networkParametersNavigation = 'a[href="/network-parameters"]';
|
beforeEach(() => {
|
||||||
|
cy.visit('/network-parameters');
|
||||||
|
});
|
||||||
|
|
||||||
const networkParametersHeader = '[data-testid="network-param-header"]';
|
const networkParametersHeader = '[data-testid="network-param-header"]';
|
||||||
const tableRows = '[data-testid="key-value-table-row"]';
|
const tableRows = '[data-testid="key-value-table-row"]';
|
||||||
|
|
||||||
before('navigate to network parameter page', function () {
|
|
||||||
cy.visit('/');
|
|
||||||
cy.get(networkParametersNavigation).click();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should show network parameter heading at top of page', function () {
|
it('should show network parameter heading at top of page', function () {
|
||||||
cy.get(networkParametersHeader)
|
cy.get(networkParametersHeader)
|
||||||
.should('have.text', 'Network Parameters')
|
.should('have.text', 'Network Parameters')
|
||||||
@@ -201,55 +198,8 @@ context('Network parameters page', { tags: '@smoke' }, function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should be able to switch network parameter page - between light and dark mode', function () {
|
it('should be able to see network parameters - on mobile', function () {
|
||||||
const whiteThemeSelectedMenuOptionColor = 'rgb(255, 7, 127)';
|
cy.switchToMobile();
|
||||||
const whiteThemeJsonFieldBackColor = 'rgb(255, 255, 255)';
|
|
||||||
const whiteThemeSideMenuBackgroundColor = 'rgb(255, 255, 255)';
|
|
||||||
const darkThemeSelectedMenuOptionColor = 'rgb(215, 251, 80)';
|
|
||||||
const darkThemeJsonFieldBackColor = 'rgb(38, 38, 38)';
|
|
||||||
const darkThemeSideMenuBackgroundColor = 'rgb(0, 0, 0)';
|
|
||||||
const themeSwitcher = '[data-testid="theme-switcher"]';
|
|
||||||
const jsonFields = '.hljs';
|
|
||||||
const sideMenuBackground = '.absolute';
|
|
||||||
|
|
||||||
// Engage dark mode if not already set
|
|
||||||
cy.get(sideMenuBackground)
|
|
||||||
.should('have.css', 'background-color')
|
|
||||||
.then((background_color) => {
|
|
||||||
if (background_color.includes(whiteThemeSideMenuBackgroundColor))
|
|
||||||
cy.get(themeSwitcher).click();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Engage white mode
|
|
||||||
cy.get(themeSwitcher).click();
|
|
||||||
|
|
||||||
// White Mode
|
|
||||||
cy.get(networkParametersNavigation)
|
|
||||||
.should('have.css', 'background-color')
|
|
||||||
.and('include', whiteThemeSelectedMenuOptionColor);
|
|
||||||
cy.get(jsonFields)
|
|
||||||
.should('have.css', 'background-color')
|
|
||||||
.and('include', whiteThemeJsonFieldBackColor);
|
|
||||||
cy.get(sideMenuBackground)
|
|
||||||
.should('have.css', 'background-color')
|
|
||||||
.and('include', whiteThemeSideMenuBackgroundColor);
|
|
||||||
|
|
||||||
// Dark Mode
|
|
||||||
cy.get(themeSwitcher).click();
|
|
||||||
cy.get(networkParametersNavigation)
|
|
||||||
.should('have.css', 'background-color')
|
|
||||||
.and('include', darkThemeSelectedMenuOptionColor);
|
|
||||||
cy.get(jsonFields)
|
|
||||||
.should('have.css', 'background-color')
|
|
||||||
.and('include', darkThemeJsonFieldBackColor);
|
|
||||||
cy.get(sideMenuBackground)
|
|
||||||
.should('have.css', 'background-color')
|
|
||||||
.and('include', darkThemeSideMenuBackgroundColor);
|
|
||||||
});
|
|
||||||
|
|
||||||
it.skip('should be able to see network parameters - on mobile', function () {
|
|
||||||
cy.common_switch_to_mobile_and_click_toggle();
|
|
||||||
cy.get(networkParametersNavigation).click();
|
|
||||||
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) => {
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
NX_TENDERMINT_URL=https://tm.n00.stagnet3.vega.xyz
|
NX_TENDERMINT_URL=https://tm.n00.stagnet3.vega.xyz
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n00.stagnet3.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n00.stagnet3.vega.xyz/websocket
|
||||||
NX_VEGA_CONFIG_URL=https://static.vega.xyz/assets/stagnet3-network.json
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/stagnet3/vegawallet-stagnet3.toml
|
||||||
NX_VEGA_NETWORKS={\"MAINNET"\:\"https://explorer.vega.xyz"\,\"TESTNET\":\"https://explorer.fairground.wtf\"}
|
NX_VEGA_NETWORKS='{"SANDBOX":"https://sandbox.explorer.vega.xyz","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_VEGA_ENV=STAGNET3
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
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
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
NX_TENDERMINT_URL=http://localhost:26617
|
NX_TENDERMINT_URL=http://localhost:26617
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://localhost:26617/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://localhost:26617/websocket
|
||||||
NX_VEGA_NETWORKS={\"MAINNET"\:\"https://explorer.vega.xyz"\,\"TESTNET\":\"https://explorer.fairground.wtf\"}
|
|
||||||
NX_VEGA_ENV=CUSTOM
|
NX_VEGA_ENV=CUSTOM
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
|
|
||||||
# App flags
|
# App flags
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
NX_TENDERMINT_URL=https://tm.be.devnet1.vega.xyz/tm
|
NX_TENDERMINT_URL=https://tm.be.devnet1.vega.xyz/tm
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.be.devnet1.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.devnet1.vega.xyz/websocket
|
||||||
NX_VEGA_CONFIG_URL=https://static.vega.xyz/assets/devnet-network.json
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/devnet1/vegawallet-devnet1.toml
|
||||||
NX_VEGA_NETWORKS={\"MAINNET"\:\"https://explorer.vega.xyz"\,\"TESTNET\":\"https://explorer.fairground.wtf\"}
|
|
||||||
NX_VEGA_ENV=DEVNET
|
NX_VEGA_ENV=DEVNET
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
|
||||||
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.token.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://static.vega.xyz/assets/devnet1-network.json
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/devnet1/vegawallet-devnet1.toml
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
NX_TENDERMINT_URL=https://be.explorer.vega.xyz
|
NX_TENDERMINT_URL=https://be.explorer.vega.xyz
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.explorer.vega.xyz
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.explorer.vega.xyz/websocket
|
||||||
NX_VEGA_CONFIG_URL=https://static.vega.xyz/assets/mainnet-network.json
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks/master/mainnet1/mainnet1.toml
|
||||||
NX_VEGA_NETWORKS={\"MAINNET"\:\"https://explorer.vega.xyz"\,\"TESTNET\":\"https://explorer.fairground.wtf\"}
|
|
||||||
NX_VEGA_ENV=MAINNET
|
NX_VEGA_ENV=MAINNET
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
|
||||||
NX_BLOCK_EXPLORER=https://be.explorer.vega.xyz/rest/
|
NX_BLOCK_EXPLORER=https://be.explorer.vega.xyz/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://token.vega.xyz
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
NX_TENDERMINT_URL=https://tm.be.mainnet-mirror.vega.xyz
|
NX_TENDERMINT_URL=https://tm.be.mainnet-mirror.vega.xyz
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=https://tm.be.mainnet-mirror.vega.xyz
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.mainnet-mirror.vega.xyz/websocket
|
||||||
NX_VEGA_CONFIG_URL=https://static.vega.xyz/assets/mirror-network.json
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/mainnet-mirror/vegawallet-mainnet-mirror.toml
|
||||||
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_ENV=MIRROR
|
NX_VEGA_ENV=MIRROR
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
|
||||||
NX_BLOCK_EXPLORER=https://be.mainnet-mirror.vega.xyz/rest/
|
NX_BLOCK_EXPLORER=https://be.mainnet-mirror.vega.xyz/rest/
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_VEGA_GOVERNANCE_URL=https://mainnet-mirror.token.vega.xyz
|
NX_VEGA_GOVERNANCE_URL=https://mainnet-mirror.token.vega.xyz
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
NX_VEGA_ENV=SANDBOX
|
NX_VEGA_ENV=SANDBOX
|
||||||
NX_VEGA_CONFIG_URL=https://static.vega.xyz/assets/sandbox-network.json
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/sandbox/vegawallet-sandbox.toml
|
||||||
NX_VEGA_EXPLORER_URL=https://sandbox.explorer.vega.xyz
|
NX_VEGA_EXPLORER_URL=https://sandbox.explorer.vega.xyz
|
||||||
NX_VEGA_DOCS_URL=https://docs.vega.xyz/testnet
|
NX_VEGA_DOCS_URL=https://docs.vega.xyz/testnet
|
||||||
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_VEGA_NETWORKS={\"MAINNET"\:\"https://explorer.vega.xyz"\,\"TESTNET\":\"https://explorer.fairground.wtf\"}
|
|
||||||
NX_TENDERMINT_URL=https://tm.sandbox.vega.xyz
|
NX_TENDERMINT_URL=https://tm.sandbox.vega.xyz
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.sandbox.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.sandbox.vega.xyz/websocket
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_VEGA_GOVERNANCE_URL=https://sandbox.token.vega.xyz
|
NX_VEGA_GOVERNANCE_URL=https://sandbox.token.vega.xyz
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
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_HOSTED_WALLET_URL=https://wallet.testnet.vega.xyz
|
NX_HOSTED_WALLET_URL=https://wallet.testnet.vega.xyz
|
||||||
NX_VEGA_CONFIG_URL=https://static.vega.xyz/assets/stagnet1-network.json
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/stagnet1/vegawallet-stagnet1.toml
|
||||||
NX_VEGA_ENV=STAGNET1
|
NX_VEGA_ENV=STAGNET1
|
||||||
NX_VEGA_EXPLORER_URL=https://stagnet1.explorer.vega.xyz
|
NX_VEGA_EXPLORER_URL=https://stagnet1.explorer.vega.xyz
|
||||||
NX_VEGA_NETWORKS={\"MAINNET"\:\"https://explorer.vega.xyz"\,\"TESTNET\":\"https://explorer.fairground.wtf\"}
|
|
||||||
NX_VEGA_TOKEN_URL=https://stagnet1.token.vega.xyz
|
NX_VEGA_TOKEN_URL=https://stagnet1.token.vega.xyz
|
||||||
NX_VEGA_WALLET_URL=http://localhost:1789
|
NX_VEGA_WALLET_URL=http://localhost:1789
|
||||||
NX_TENDERMINT_URL=https://tm.n01.stagnet1.vega.xyz
|
NX_TENDERMINT_URL=https://tm.n01.stagnet1.vega.xyz
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
NX_TENDERMINT_URL=https://tm.n00.stagnet3.vega.xyz
|
NX_TENDERMINT_URL=https://tm.n00.stagnet3.vega.xyz
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n00.stagnet3.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.stagnet3.vega.xyz/websocket
|
||||||
NX_VEGA_CONFIG_URL=https://static.vega.xyz/assets/stagnet3-network.json
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/stagnet3/vegawallet-stagnet3.toml
|
||||||
NX_VEGA_NETWORKS={\"MAINNET"\:\"https://explorer.vega.xyz"\,\"TESTNET\":\"https://explorer.fairground.wtf\"}
|
|
||||||
NX_VEGA_ENV=STAGNET3
|
NX_VEGA_ENV=STAGNET3
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
|
||||||
NX_BLOCK_EXPLORER=https://be.stagnet3.vega.xyz/rest
|
NX_BLOCK_EXPLORER=https://be.stagnet3.vega.xyz/rest
|
||||||
NX_VEGA_GOVERNANCE_URL=https://stagnet3.token.vega.xyz
|
NX_VEGA_GOVERNANCE_URL=https://stagnet3.token.vega.xyz
|
||||||
NX_VEGA_REPO_URL=https://github.com/vegaprotocol/vega-dev-releases/releases/
|
NX_VEGA_REPO_URL=https://github.com/vegaprotocol/vega-dev-releases/releases/
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
# App configuration variables
|
# App configuration variables
|
||||||
NX_TENDERMINT_URL=https://tm.be.testnet.vega.xyz
|
NX_TENDERMINT_URL=https://tm.be.testnet.vega.xyz
|
||||||
NX_BLOCK_EXPLORER=https://be.testnet.vega.xyz/rest
|
NX_BLOCK_EXPLORER=https://be.testnet.vega.xyz/rest
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://tm.be.testnet.vega.xyz/websocket/
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.testnet.vega.xyz/websocket
|
||||||
NX_VEGA_CONFIG_URL=https://static.vega.xyz/assets/testnet-network.json
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/fairground/vegawallet-fairground.toml
|
||||||
NX_VEGA_NETWORKS={\"MAINNET"\:\"https://explorer.vega.xyz"\,\"TESTNET\":\"https://explorer.fairground.wtf\"}
|
|
||||||
NX_VEGA_ENV=TESTNET
|
NX_VEGA_ENV=TESTNET
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
|
||||||
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_VEGA_NETWORKS={}
|
|
||||||
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://token.fairground.wtf
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
# App configuration variables
|
||||||
|
NX_VEGA_ENV=VALIDATOR_TESTNET
|
||||||
|
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_REST=https://api.validators-testnet.vega.xyz/
|
||||||
|
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
||||||
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
|
|
||||||
|
NX_VEGA_GOVERNANCE_URL=https://validator-testnet.governance.vega.xyz
|
||||||
|
NX_TENDERMINT_URL=https://tm.be.validators-testnet.vega.xyz
|
||||||
|
NX_BLOCK_EXPLORER=https://be.validators-testnet.vega.xyz/rest
|
||||||
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.validators-testnet.vega.xyz/websocket
|
||||||
@@ -2,6 +2,5 @@
|
|||||||
NX_TENDERMINT_URL=http://localhost:26607/
|
NX_TENDERMINT_URL=http://localhost:26607/
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://localhost:26607/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://localhost:26607/websocket
|
||||||
NX_VEGA_ENV=CUSTOM
|
NX_VEGA_ENV=CUSTOM
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
|
||||||
NX_BLOCK_EXPLORER=
|
NX_BLOCK_EXPLORER=
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
function ReactMarkdown({ children }) {
|
||||||
|
return <div>{children}</div>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ReactMarkdown;
|
||||||
@@ -1,16 +1,20 @@
|
|||||||
import classnames from 'classnames';
|
|
||||||
import { NetworkLoader, useInitializeEnv } from '@vegaprotocol/environment';
|
import { NetworkLoader, useInitializeEnv } from '@vegaprotocol/environment';
|
||||||
import { Nav } from './components/nav';
|
|
||||||
import { Header } from './components/header';
|
import { Header } from './components/header';
|
||||||
import { Main } from './components/main';
|
import { Main } from './components/main';
|
||||||
import { TendermintWebsocketProvider } from './contexts/websocket/tendermint-websocket-provider';
|
import { TendermintWebsocketProvider } from './contexts/websocket/tendermint-websocket-provider';
|
||||||
import { Footer } from './components/footer/footer';
|
import { Footer } from './components/footer/footer';
|
||||||
import { AnnouncementBanner, ExternalLink } from '@vegaprotocol/ui-toolkit';
|
import {
|
||||||
|
AnnouncementBanner,
|
||||||
|
ExternalLink,
|
||||||
|
Icon,
|
||||||
|
} from '@vegaprotocol/ui-toolkit';
|
||||||
import {
|
import {
|
||||||
AssetDetailsDialog,
|
AssetDetailsDialog,
|
||||||
useAssetDetailsDialogStore,
|
useAssetDetailsDialogStore,
|
||||||
} from '@vegaprotocol/assets';
|
} from '@vegaprotocol/assets';
|
||||||
import { DEFAULT_CACHE_CONFIG } from '@vegaprotocol/apollo-client';
|
import { DEFAULT_CACHE_CONFIG } from '@vegaprotocol/apollo-client';
|
||||||
|
import classNames from 'classnames';
|
||||||
|
import { useState } from 'react';
|
||||||
|
|
||||||
const DialogsContainer = () => {
|
const DialogsContainer = () => {
|
||||||
const { isOpen, id, trigger, asJson, setOpen } = useAssetDetailsDialogStore();
|
const { isOpen, id, trigger, asJson, setOpen } = useAssetDetailsDialogStore();
|
||||||
@@ -25,35 +29,58 @@ const DialogsContainer = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
function App() {
|
const MainnetSimAd = () => {
|
||||||
const layoutClasses = classnames(
|
const [shouldDisplayBanner, setShouldDisplayBanner] = useState<boolean>(true);
|
||||||
'grid grid-rows-[auto_1fr_auto] grid-cols-[1fr] md:grid-rows-[auto_minmax(700px,_1fr)_auto] md:grid-cols-[300px_1fr]',
|
|
||||||
'min-h-[100vh] mx-auto my-0',
|
|
||||||
'border-neutral-700 dark:border-neutral-300 lg:border-l lg:border-r',
|
|
||||||
'bg-white dark:bg-black',
|
|
||||||
'antialiased text-black dark:text-white',
|
|
||||||
'overflow-hidden relative'
|
|
||||||
);
|
|
||||||
|
|
||||||
|
// Return an empty div so that the grid layout in _app.page.ts
|
||||||
|
// renders correctly
|
||||||
|
if (!shouldDisplayBanner) {
|
||||||
|
return <div />;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<AnnouncementBanner>
|
||||||
|
<div className="grid grid-cols-[auto_1fr] gap-4 font-alpha calt uppercase text-center text-lg text-white">
|
||||||
|
<button
|
||||||
|
className="flex items-center"
|
||||||
|
onClick={() => setShouldDisplayBanner(false)}
|
||||||
|
>
|
||||||
|
<Icon name="cross" className="w-6 h-6" ariaLabel="dismiss" />
|
||||||
|
</button>
|
||||||
|
<div>
|
||||||
|
<span className="pr-4">Mainnet sim 3 is live!</span>
|
||||||
|
<ExternalLink href="https://fairground.wtf/">Learn more</ExternalLink>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</AnnouncementBanner>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
function App() {
|
||||||
return (
|
return (
|
||||||
<TendermintWebsocketProvider>
|
<TendermintWebsocketProvider>
|
||||||
<NetworkLoader cache={DEFAULT_CACHE_CONFIG}>
|
<NetworkLoader cache={DEFAULT_CACHE_CONFIG}>
|
||||||
<AnnouncementBanner>
|
<div
|
||||||
<div className="font-alpha calt uppercase text-center text-lg text-white">
|
className={classNames(
|
||||||
<span className="pr-4">Mainnet sim 2 coming in March!</span>
|
'max-w-[1500px] min-h-[100vh]',
|
||||||
<ExternalLink href="https://fairground.wtf/">
|
'mx-auto my-0',
|
||||||
Learn more
|
'grid grid-rows-[auto_1fr_auto] grid-cols-1',
|
||||||
</ExternalLink>
|
'border-vega-light-200 dark:border-vega-dark-200 lg:border-l lg:border-r',
|
||||||
|
'antialiased text-black dark:text-white',
|
||||||
|
'overflow-hidden relative'
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<Header />
|
||||||
|
<MainnetSimAd />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<Main />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<Footer />
|
||||||
</div>
|
</div>
|
||||||
</AnnouncementBanner>
|
|
||||||
|
|
||||||
<div className={layoutClasses}>
|
|
||||||
<Header />
|
|
||||||
<Nav />
|
|
||||||
<Main />
|
|
||||||
<Footer />
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<DialogsContainer />
|
<DialogsContainer />
|
||||||
</NetworkLoader>
|
</NetworkLoader>
|
||||||
</TendermintWebsocketProvider>
|
</TendermintWebsocketProvider>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useAssetDataProvider } from '@vegaprotocol/assets';
|
import { useAssetDataProvider } from '@vegaprotocol/assets';
|
||||||
import { addDecimalsFormatNumber } from '@vegaprotocol/react-helpers';
|
import { addDecimalsFormatNumber } from '@vegaprotocol/utils';
|
||||||
import { AssetLink } from '../links';
|
import { AssetLink } from '../links';
|
||||||
|
|
||||||
export type AssetBalanceProps = {
|
export type AssetBalanceProps = {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { addDecimalsFormatNumber } from '@vegaprotocol/react-helpers';
|
import { addDecimalsFormatNumber } from '@vegaprotocol/utils';
|
||||||
import { useExplorerGovernanceAssetQuery } from './__generated__/Governance-asset';
|
import { useExplorerGovernanceAssetQuery } from './__generated__/Governance-asset';
|
||||||
import AssetBalance from './asset-balance';
|
import AssetBalance from './asset-balance';
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import type { AssetFieldsFragment } from '@vegaprotocol/assets';
|
import type { AssetFieldsFragment } from '@vegaprotocol/assets';
|
||||||
import { AssetTypeMapping, AssetStatusMapping } from '@vegaprotocol/assets';
|
import { AssetTypeMapping, AssetStatusMapping } from '@vegaprotocol/assets';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import type { VegaICellRendererParams } from '@vegaprotocol/ui-toolkit';
|
|
||||||
import { ButtonLink } from '@vegaprotocol/ui-toolkit';
|
import { ButtonLink } from '@vegaprotocol/ui-toolkit';
|
||||||
import type { AgGridReact } from 'ag-grid-react';
|
import type { AgGridReact } from 'ag-grid-react';
|
||||||
import { AgGridColumn } from 'ag-grid-react';
|
import { AgGridColumn } from 'ag-grid-react';
|
||||||
import { AgGridDynamic as AgGrid } from '@vegaprotocol/ui-toolkit';
|
import { AgGridDynamic as AgGrid } from '@vegaprotocol/datagrid';
|
||||||
|
import type { VegaICellRendererParams } from '@vegaprotocol/datagrid';
|
||||||
import { useRef, useLayoutEffect } from 'react';
|
import { useRef, useLayoutEffect } from 'react';
|
||||||
import { BREAKPOINT_MD } from '../../config/breakpoints';
|
import { BREAKPOINT_MD } from '../../config/breakpoints';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import React from 'react';
|
|||||||
import type { BlockMeta } from '../../routes/blocks/tendermint-blockchain-response';
|
import type { BlockMeta } from '../../routes/blocks/tendermint-blockchain-response';
|
||||||
import { Routes } from '../../routes/route-names';
|
import { Routes } from '../../routes/route-names';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import { getDateTimeFormat } from '@vegaprotocol/react-helpers';
|
import { getDateTimeFormat } from '@vegaprotocol/utils';
|
||||||
import { Tooltip } from '@vegaprotocol/ui-toolkit';
|
import { Tooltip } from '@vegaprotocol/ui-toolkit';
|
||||||
import { TimeAgo } from '../time-ago';
|
import { TimeAgo } from '../time-ago';
|
||||||
import { TableWithTbody, TableRow, TableCell } from '../table';
|
import { TableWithTbody, TableRow, TableCell } from '../table';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
interface BlockProps {
|
interface BlockProps {
|
||||||
block: BlockMeta;
|
block: BlockMeta;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import type { TendermintBlockchainResponse } from '../../routes/blocks/tendermint-blockchain-response';
|
import type { TendermintBlockchainResponse } from '../../routes/blocks/tendermint-blockchain-response';
|
||||||
import { BlockData } from './block-data';
|
import { BlockData } from './block-data';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { FixedSizeList as List } from 'react-window';
|
import { FixedSizeList as List } from 'react-window';
|
||||||
import InfiniteLoader from 'react-window-infinite-loader';
|
import InfiniteLoader from 'react-window-infinite-loader';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import type { BlockMeta } from '../../routes/blocks/tendermint-blockchain-response';
|
import type { BlockMeta } from '../../routes/blocks/tendermint-blockchain-response';
|
||||||
import { BlockData } from './block-data';
|
import { BlockData } from './block-data';
|
||||||
import EmptyList from '../empty-list/empty-list';
|
import EmptyList from '../empty-list/empty-list';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { useTendermintWebsocket } from '../../hooks/use-tendermint-websocket';
|
import { useTendermintWebsocket } from '../../hooks/use-tendermint-websocket';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { ButtonLink } from '@vegaprotocol/ui-toolkit';
|
import { ButtonLink } from '@vegaprotocol/ui-toolkit';
|
||||||
|
|
||||||
interface BlocksRefetchProps {
|
interface BlocksRefetchProps {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import {
|
import {
|
||||||
Button,
|
Button,
|
||||||
Dialog,
|
Dialog,
|
||||||
|
|||||||
@@ -22,29 +22,3 @@ query ExplorerFutureEpoch {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# query ExplorerEpoch($id: ID!) {
|
|
||||||
#
|
|
||||||
##### This could be useful for calculating roughly when a future epoch will
|
|
||||||
##### occur, but epoch not exist results in a total error
|
|
||||||
# networkParameter(key: "validators.epoch.length") {
|
|
||||||
# value
|
|
||||||
# }
|
|
||||||
#
|
|
||||||
##### This could be useful for relating where we are in time, but as above
|
|
||||||
##### the total failure caused by epoch(id) not existing
|
|
||||||
##### means this is useful
|
|
||||||
# currentEpoch: epoch {
|
|
||||||
# id
|
|
||||||
# }
|
|
||||||
#
|
|
||||||
# epoch(id: $id) {
|
|
||||||
# id
|
|
||||||
# timestamps {
|
|
||||||
# start
|
|
||||||
# end
|
|
||||||
# firstBlock
|
|
||||||
# lastBlock
|
|
||||||
# }
|
|
||||||
# }
|
|
||||||
#}
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { MockedProvider } from '@apollo/client/testing';
|
import { MockedProvider } from '@apollo/client/testing';
|
||||||
import { render } from '@testing-library/react';
|
import { render } from '@testing-library/react';
|
||||||
import EpochMissingOverview, { calculateEpochData } from './epoch-missing';
|
import EpochMissingOverview, { calculateEpochData } from './epoch-missing';
|
||||||
import { getSecondsFromInterval } from '@vegaprotocol/react-helpers';
|
import { getSecondsFromInterval } from '@vegaprotocol/utils';
|
||||||
const START_DATE_PAST = 'Monday, 17 February 2022 11:44:09';
|
const START_DATE_PAST = 'Monday, 17 February 2022 11:44:09';
|
||||||
|
|
||||||
describe('getSecondsFromInterval', () => {
|
describe('getSecondsFromInterval', () => {
|
||||||
|
|||||||
@@ -4,8 +4,7 @@ import addSeconds from 'date-fns/addSeconds';
|
|||||||
import formatDistance from 'date-fns/formatDistance';
|
import formatDistance from 'date-fns/formatDistance';
|
||||||
import { Icon, Tooltip } from '@vegaprotocol/ui-toolkit';
|
import { Icon, Tooltip } from '@vegaprotocol/ui-toolkit';
|
||||||
import isFuture from 'date-fns/isFuture';
|
import isFuture from 'date-fns/isFuture';
|
||||||
import { isValidDate } from '@vegaprotocol/react-helpers';
|
import { getSecondsFromInterval, isValidDate } from '@vegaprotocol/utils';
|
||||||
import { getSecondsFromInterval } from '@vegaprotocol/react-helpers';
|
|
||||||
|
|
||||||
export type EpochMissingOverviewProps = {
|
export type EpochMissingOverviewProps = {
|
||||||
missingEpochId?: string;
|
missingEpochId?: string;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { useExplorerEpochQuery } from './__generated__/Epoch';
|
import { useExplorerEpochQuery } from './__generated__/Epoch';
|
||||||
|
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { BlockLink } from '../links';
|
import { BlockLink } from '../links';
|
||||||
import { Time } from '../time';
|
import { Time } from '../time';
|
||||||
import { TimeAgo } from '../time-ago';
|
import { TimeAgo } from '../time-ago';
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { NodeSwitcherDialog, useEnvironment } from '@vegaprotocol/environment';
|
import { NodeSwitcherDialog, useEnvironment } from '@vegaprotocol/environment';
|
||||||
import { t, useScreenDimensions } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
import { useScreenDimensions } from '@vegaprotocol/react-helpers';
|
||||||
import { ExternalLink, Link } from '@vegaprotocol/ui-toolkit';
|
import { ExternalLink, Link } from '@vegaprotocol/ui-toolkit';
|
||||||
import { useMemo, useState } from 'react';
|
import { useMemo, useState } from 'react';
|
||||||
import { ENV } from '../../config/env';
|
import { ENV } from '../../config/env';
|
||||||
@@ -15,7 +16,7 @@ export const Footer = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<footer className="grid grid-rows-2 grid-cols-[1fr_auto] text-xs md:text-md md:flex md:col-span-2 px-4 py-2 gap-4 border-t border-neutral-700 dark:border-neutral-300">
|
<footer className="grid grid-rows-2 grid-cols-[1fr_auto] text-xs md:text-md md:flex md:col-span-2 px-4 py-2 gap-4 border-t border-vega-light-200 dark:border-vega-dark-200">
|
||||||
<div className="flex justify-between gap-2 align-middle">
|
<div className="flex justify-between gap-2 align-middle">
|
||||||
{GIT_COMMIT_HASH && (
|
{GIT_COMMIT_HASH && (
|
||||||
<div className="content-center flex border-r border-neutral-700 dark:border-neutral-300 pr-4">
|
<div className="content-center flex border-r border-neutral-700 dark:border-neutral-300 pr-4">
|
||||||
|
|||||||
@@ -19,12 +19,10 @@ const renderComponent = () => (
|
|||||||
);
|
);
|
||||||
|
|
||||||
describe('Header', () => {
|
describe('Header', () => {
|
||||||
it('should render heading', () => {
|
it('should render navigation', () => {
|
||||||
render(renderComponent());
|
render(renderComponent());
|
||||||
|
|
||||||
expect(screen.getByTestId('explorer-header')).toHaveTextContent(
|
expect(screen.getByTestId('navigation')).toHaveTextContent('Explorer');
|
||||||
'Vega Explorer'
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
it('should render search', () => {
|
it('should render search', () => {
|
||||||
render(renderComponent());
|
render(renderComponent());
|
||||||
|
|||||||
@@ -1,43 +1,108 @@
|
|||||||
import classnames from 'classnames';
|
import { matchPath, useLocation } from 'react-router-dom';
|
||||||
import { Link } from 'react-router-dom';
|
import {
|
||||||
import { ThemeSwitcher, Icon } from '@vegaprotocol/ui-toolkit';
|
ThemeSwitcher,
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
Navigation,
|
||||||
import { Search } from '../search';
|
NavigationList,
|
||||||
|
NavigationItem,
|
||||||
|
NavigationLink,
|
||||||
|
NavigationBreakpoint,
|
||||||
|
NavigationTrigger,
|
||||||
|
NavigationContent,
|
||||||
|
} from '@vegaprotocol/ui-toolkit';
|
||||||
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { Routes } from '../../routes/route-names';
|
import { Routes } from '../../routes/route-names';
|
||||||
import { NetworkSwitcher } from '@vegaprotocol/environment';
|
import { NetworkSwitcher } from '@vegaprotocol/environment';
|
||||||
import { useNavStore } from '../nav';
|
import type { Navigable } from '../../routes/router-config';
|
||||||
|
import routerConfig from '../../routes/router-config';
|
||||||
|
import { useMemo } from 'react';
|
||||||
|
import compact from 'lodash/compact';
|
||||||
|
import { Search } from '../search';
|
||||||
|
|
||||||
|
const routeToNavigationItem = (r: Navigable) => (
|
||||||
|
<NavigationItem key={r.name}>
|
||||||
|
<NavigationLink to={r.path}>{r.text}</NavigationLink>
|
||||||
|
</NavigationItem>
|
||||||
|
);
|
||||||
|
|
||||||
export const Header = () => {
|
export const Header = () => {
|
||||||
const [open, toggle] = useNavStore((state) => [state.open, state.toggle]);
|
const mainItems = compact(
|
||||||
const headerClasses = classnames(
|
[Routes.TX, Routes.BLOCKS, Routes.ORACLES, Routes.VALIDATORS].map((n) =>
|
||||||
'md:col-span-2',
|
routerConfig.find((r) => r.path === n)
|
||||||
'grid grid-rows-2 md:grid-rows-1 grid-cols-[1fr_auto] md:grid-cols-[auto_1fr_auto] items-center',
|
)
|
||||||
'p-4 gap-2 md:gap-4',
|
|
||||||
'border-b border-neutral-700 dark:border-neutral-300 bg-black',
|
|
||||||
'dark text-white'
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const groupedItems = compact(
|
||||||
|
[
|
||||||
|
Routes.PARTIES,
|
||||||
|
Routes.ASSETS,
|
||||||
|
Routes.MARKETS,
|
||||||
|
Routes.GOVERNANCE,
|
||||||
|
Routes.NETWORK_PARAMETERS,
|
||||||
|
Routes.GENESIS,
|
||||||
|
].map((n) => routerConfig.find((r) => r.path === n))
|
||||||
|
);
|
||||||
|
|
||||||
|
const { pathname } = useLocation();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Because the grouped items are displayed in a sub menu under an "Other" item
|
||||||
|
* we need to determine whether any underlying item is active to highlight the
|
||||||
|
* trigger in the same fashion as any other top-level `NavigationLink`.
|
||||||
|
* This function checks whether the current location pathname is one of the
|
||||||
|
* underlying NavigationLinks.
|
||||||
|
*/
|
||||||
|
const isOnOther = useMemo(() => {
|
||||||
|
for (const path of groupedItems.map((r) => r.path)) {
|
||||||
|
const matched = matchPath(`${path}/*`, pathname);
|
||||||
|
if (matched) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}, [groupedItems, pathname]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<header className={headerClasses}>
|
<Navigation
|
||||||
<div className="flex h-full items-center sm:items-stretch gap-4">
|
appName="Explorer"
|
||||||
<Link to={Routes.HOME}>
|
theme="system"
|
||||||
<h1
|
breakpoints={[490, 900]}
|
||||||
className="text-white text-3xl font-alpha uppercase calt mb-0"
|
actions={
|
||||||
data-testid="explorer-header"
|
<>
|
||||||
>
|
<ThemeSwitcher />
|
||||||
{t('Vega Explorer')}
|
<Search />
|
||||||
</h1>
|
</>
|
||||||
</Link>
|
}
|
||||||
<NetworkSwitcher />
|
onResize={(width, el) => {
|
||||||
</div>
|
if (width < 1157) {
|
||||||
<button
|
// switch to magnifying glass trigger when width < 1157
|
||||||
data-testid="open-menu"
|
el.classList.remove('nav-search-full');
|
||||||
className="md:hidden text-white"
|
el.classList.add('nav-search-compact');
|
||||||
onClick={() => toggle()}
|
} else {
|
||||||
|
el.classList.remove('nav-search-compact');
|
||||||
|
el.classList.add('nav-search-full');
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<NavigationList hide={[NavigationBreakpoint.Small]}>
|
||||||
|
<NavigationItem>
|
||||||
|
<NetworkSwitcher />
|
||||||
|
</NavigationItem>
|
||||||
|
</NavigationList>
|
||||||
|
<NavigationList
|
||||||
|
hide={[NavigationBreakpoint.Small, NavigationBreakpoint.Narrow]}
|
||||||
>
|
>
|
||||||
<Icon name={open ? 'cross' : 'menu'} />
|
{mainItems.map(routeToNavigationItem)}
|
||||||
</button>
|
{groupedItems && (
|
||||||
<Search />
|
<NavigationItem>
|
||||||
<ThemeSwitcher className="-my-4" />
|
<NavigationTrigger isActive={Boolean(isOnOther)}>
|
||||||
</header>
|
{t('Other')}
|
||||||
|
</NavigationTrigger>
|
||||||
|
<NavigationContent>
|
||||||
|
<NavigationList>
|
||||||
|
{groupedItems.map(routeToNavigationItem)}
|
||||||
|
</NavigationList>
|
||||||
|
</NavigationContent>
|
||||||
|
</NavigationItem>
|
||||||
|
)}
|
||||||
|
</NavigationList>
|
||||||
|
</Navigation>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import { Routes } from '../../routes/route-names';
|
import { Routes } from '../../routes/route-names';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import type { HTMLInputTypeAttribute, SyntheticEvent } from 'react';
|
import type { HTMLInputTypeAttribute, SyntheticEvent } from 'react';
|
||||||
import { Input, Button } from '@vegaprotocol/ui-toolkit';
|
import { Input, Button } from '@vegaprotocol/ui-toolkit';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
interface JumpToProps {
|
interface JumpToProps {
|
||||||
label: string;
|
label: string;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { useExplorerMarketQuery } from './__generated__/Market';
|
|||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
|
|
||||||
import type { ComponentProps } from 'react';
|
import type { ComponentProps } from 'react';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import Hash from '../hash';
|
import Hash from '../hash';
|
||||||
|
|
||||||
export type MarketLinkProps = Partial<ComponentProps<typeof Link>> & {
|
export type MarketLinkProps = Partial<ComponentProps<typeof Link>> & {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Link } from 'react-router-dom';
|
|||||||
|
|
||||||
import type { ComponentProps } from 'react';
|
import type { ComponentProps } from 'react';
|
||||||
import Hash from '../hash';
|
import Hash from '../hash';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { isValidPartyId } from '../../../routes/parties/id/components/party-id-error';
|
import { isValidPartyId } from '../../../routes/parties/id/components/party-id-error';
|
||||||
import { truncateMiddle } from '@vegaprotocol/ui-toolkit';
|
import { truncateMiddle } from '@vegaprotocol/ui-toolkit';
|
||||||
|
|
||||||
|
|||||||
@@ -4,13 +4,14 @@ import { ENV } from '../../../config/env';
|
|||||||
import Hash from '../hash';
|
import Hash from '../hash';
|
||||||
export type ProposalLinkProps = {
|
export type ProposalLinkProps = {
|
||||||
id: string;
|
id: string;
|
||||||
|
text?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given a proposal ID, generates an external link over to
|
* Given a proposal ID, generates an external link over to
|
||||||
* the Governance page for more information
|
* the Governance page for more information
|
||||||
*/
|
*/
|
||||||
const ProposalLink = ({ id }: ProposalLinkProps) => {
|
const ProposalLink = ({ id, text }: ProposalLinkProps) => {
|
||||||
const { data } = useExplorerProposalQuery({
|
const { data } = useExplorerProposalQuery({
|
||||||
variables: { id },
|
variables: { id },
|
||||||
});
|
});
|
||||||
@@ -20,7 +21,7 @@ const ProposalLink = ({ id }: ProposalLinkProps) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<ExternalLink href={`${base}/proposals/${id}`}>
|
<ExternalLink href={`${base}/proposals/${id}`}>
|
||||||
<Hash text={label} />
|
{text ? text : <Hash text={label} />}
|
||||||
</ExternalLink>
|
</ExternalLink>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,11 +2,10 @@ import {
|
|||||||
addDecimalsFormatNumber,
|
addDecimalsFormatNumber,
|
||||||
formatNumberPercentage,
|
formatNumberPercentage,
|
||||||
getMarketExpiryDateFormatted,
|
getMarketExpiryDateFormatted,
|
||||||
t,
|
} from '@vegaprotocol/utils';
|
||||||
} from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import type { MarketInfoNoCandlesQuery } from '@vegaprotocol/market-info';
|
import type { MarketInfoWithData } from '@vegaprotocol/market-info';
|
||||||
import { MarketInfoTable } from '@vegaprotocol/market-info';
|
import { MarketInfoTable } from '@vegaprotocol/market-info';
|
||||||
import pick from 'lodash/pick';
|
|
||||||
import {
|
import {
|
||||||
MarketStateMapping,
|
MarketStateMapping,
|
||||||
MarketTradingModeMapping,
|
MarketTradingModeMapping,
|
||||||
@@ -17,11 +16,7 @@ import BigNumber from 'bignumber.js';
|
|||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
|
|
||||||
export const MarketDetails = ({
|
export const MarketDetails = ({ market }: { market: MarketInfoWithData }) => {
|
||||||
market,
|
|
||||||
}: {
|
|
||||||
market: MarketInfoNoCandlesQuery['market'];
|
|
||||||
}) => {
|
|
||||||
const quoteUnit = market?.tradableInstrument.instrument.product.quoteName;
|
const quoteUnit = market?.tradableInstrument.instrument.product.quoteName;
|
||||||
const assetId = useMemo(
|
const assetId = useMemo(
|
||||||
() => market?.tradableInstrument.instrument.product?.settlementAsset.id,
|
() => market?.tradableInstrument.instrument.product?.settlementAsset.id,
|
||||||
@@ -32,7 +27,9 @@ export const MarketDetails = ({
|
|||||||
if (!market) return null;
|
if (!market) return null;
|
||||||
|
|
||||||
const keyDetails = {
|
const keyDetails = {
|
||||||
...pick(market, 'decimalPlaces', 'positionDecimalPlaces', 'tradingMode'),
|
decimalPlaces: market.decimalPlaces,
|
||||||
|
positionDecimalPlaces: market.positionDecimalPlaces,
|
||||||
|
tradingMode: market.tradingMode,
|
||||||
state: MarketStateMapping[market.state],
|
state: MarketStateMapping[market.state],
|
||||||
};
|
};
|
||||||
const assetDecimals =
|
const assetDecimals =
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import type { MarketFieldsFragment } from '@vegaprotocol/market-list';
|
import type { MarketFieldsFragment } from '@vegaprotocol/market-list';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import type {
|
|
||||||
VegaICellRendererParams,
|
|
||||||
VegaValueGetterParams,
|
|
||||||
} from '@vegaprotocol/ui-toolkit';
|
|
||||||
import { ButtonLink } from '@vegaprotocol/ui-toolkit';
|
import { ButtonLink } from '@vegaprotocol/ui-toolkit';
|
||||||
import type { AgGridReact } from 'ag-grid-react';
|
import type { AgGridReact } from 'ag-grid-react';
|
||||||
import { AgGridColumn } from 'ag-grid-react';
|
import { AgGridColumn } from 'ag-grid-react';
|
||||||
import { AgGridDynamic as AgGrid } from '@vegaprotocol/ui-toolkit';
|
import { AgGridDynamic as AgGrid } from '@vegaprotocol/datagrid';
|
||||||
|
import type {
|
||||||
|
VegaICellRendererParams,
|
||||||
|
VegaValueGetterParams,
|
||||||
|
} from '@vegaprotocol/datagrid';
|
||||||
import { useRef, useLayoutEffect } from 'react';
|
import { useRef, useLayoutEffect } from 'react';
|
||||||
import { BREAKPOINT_MD } from '../../config/breakpoints';
|
import { BREAKPOINT_MD } from '../../config/breakpoints';
|
||||||
import { MarketStateMapping } from '@vegaprotocol/types';
|
import { MarketStateMapping } from '@vegaprotocol/types';
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
export * from './nav';
|
|
||||||
@@ -1,181 +0,0 @@
|
|||||||
import { NavLink, useLocation } from 'react-router-dom';
|
|
||||||
import type { Navigable } from '../../routes/router-config';
|
|
||||||
import routerConfig from '../../routes/router-config';
|
|
||||||
import classnames from 'classnames';
|
|
||||||
import { create } from 'zustand';
|
|
||||||
import {
|
|
||||||
useCallback,
|
|
||||||
useEffect,
|
|
||||||
useLayoutEffect,
|
|
||||||
useMemo,
|
|
||||||
useRef,
|
|
||||||
} from 'react';
|
|
||||||
import { Icon } from '@vegaprotocol/ui-toolkit';
|
|
||||||
import first from 'lodash/first';
|
|
||||||
import last from 'lodash/last';
|
|
||||||
import { BREAKPOINT_MD } from '../../config/breakpoints';
|
|
||||||
|
|
||||||
type NavStore = {
|
|
||||||
open: boolean;
|
|
||||||
toggle: () => void;
|
|
||||||
hide: () => void;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useNavStore = create<NavStore>((set, get) => ({
|
|
||||||
open: false,
|
|
||||||
toggle: () => set({ open: !get().open }),
|
|
||||||
hide: () => set({ open: false }),
|
|
||||||
}));
|
|
||||||
|
|
||||||
const NavLinks = ({ links }: { links: Navigable[] }) => {
|
|
||||||
const navLinks = links.map((r) => (
|
|
||||||
<li key={r.name}>
|
|
||||||
<NavLink
|
|
||||||
to={r.path}
|
|
||||||
className={({ isActive }) =>
|
|
||||||
classnames(
|
|
||||||
'block mb-2 px-2',
|
|
||||||
'text-lg hover:bg-vega-pink dark:hover:bg-vega-yellow hover:text-white dark:hover:text-black',
|
|
||||||
{
|
|
||||||
'bg-vega-pink text-white dark:bg-vega-yellow dark:text-black':
|
|
||||||
isActive,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
>
|
|
||||||
{r.text}
|
|
||||||
</NavLink>
|
|
||||||
</li>
|
|
||||||
));
|
|
||||||
|
|
||||||
return <ul className="pr-8 md:pr-0">{navLinks}</ul>;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const Nav = () => {
|
|
||||||
const [open, hide] = useNavStore((state) => [state.open, state.hide]);
|
|
||||||
const location = useLocation();
|
|
||||||
|
|
||||||
const navRef = useRef<HTMLElement>(null);
|
|
||||||
const btnRef = useRef<HTMLButtonElement>(null);
|
|
||||||
|
|
||||||
const focusable = useMemo(
|
|
||||||
() =>
|
|
||||||
navRef.current
|
|
||||||
? [
|
|
||||||
...(navRef.current.querySelectorAll(
|
|
||||||
'a, button'
|
|
||||||
) as NodeListOf<HTMLElement>),
|
|
||||||
]
|
|
||||||
: [],
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
[navRef.current] // do not remove `navRef.current` from deps
|
|
||||||
);
|
|
||||||
|
|
||||||
const closeNav = useCallback(() => {
|
|
||||||
hide();
|
|
||||||
console.log(focusable);
|
|
||||||
focusable.forEach((fe) =>
|
|
||||||
fe.setAttribute(
|
|
||||||
'tabindex',
|
|
||||||
window.innerWidth > BREAKPOINT_MD ? '0' : '-1'
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}, [focusable, hide]);
|
|
||||||
|
|
||||||
// close navigation when location changes
|
|
||||||
useEffect(() => {
|
|
||||||
closeNav();
|
|
||||||
}, [closeNav, location]);
|
|
||||||
|
|
||||||
useLayoutEffect(() => {
|
|
||||||
if (open) {
|
|
||||||
focusable.forEach((fe) => fe.setAttribute('tabindex', '0'));
|
|
||||||
}
|
|
||||||
|
|
||||||
document.body.style.overflow = open ? 'hidden' : '';
|
|
||||||
const offset =
|
|
||||||
document.querySelector('header')?.getBoundingClientRect().top || 0;
|
|
||||||
if (navRef.current) {
|
|
||||||
navRef.current.style.height = `calc(100vh - ${offset}px)`;
|
|
||||||
}
|
|
||||||
|
|
||||||
// focus current by default
|
|
||||||
if (navRef.current && open) {
|
|
||||||
(navRef.current.querySelector('a[aria-current]') as HTMLElement)?.focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
const closeOnEsc = (e: KeyboardEvent) => {
|
|
||||||
if (e.key === 'Escape') {
|
|
||||||
closeNav();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// tabbing loop
|
|
||||||
const focusLast = (e: FocusEvent) => {
|
|
||||||
e.preventDefault();
|
|
||||||
const isNavElement =
|
|
||||||
e.relatedTarget && navRef.current?.contains(e.relatedTarget as Node);
|
|
||||||
if (!isNavElement && open) {
|
|
||||||
last(focusable)?.focus();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const focusFirst = (e: FocusEvent) => {
|
|
||||||
e.preventDefault();
|
|
||||||
const isNavElement =
|
|
||||||
e.relatedTarget && navRef.current?.contains(e.relatedTarget as Node);
|
|
||||||
if (!isNavElement && open) {
|
|
||||||
first(focusable)?.focus();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const resetOnDesktop = () => {
|
|
||||||
focusable.forEach((fe) =>
|
|
||||||
fe.setAttribute(
|
|
||||||
'tabindex',
|
|
||||||
window.innerWidth > BREAKPOINT_MD ? '0' : '-1'
|
|
||||||
)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
window.addEventListener('resize', resetOnDesktop);
|
|
||||||
|
|
||||||
first(focusable)?.addEventListener('focusout', focusLast);
|
|
||||||
last(focusable)?.addEventListener('focusout', focusFirst);
|
|
||||||
|
|
||||||
document.addEventListener('keydown', closeOnEsc);
|
|
||||||
return () => {
|
|
||||||
window.removeEventListener('resize', resetOnDesktop);
|
|
||||||
document.removeEventListener('keydown', closeOnEsc);
|
|
||||||
first(focusable)?.removeEventListener('focusout', focusLast);
|
|
||||||
last(focusable)?.removeEventListener('focusout', focusFirst);
|
|
||||||
};
|
|
||||||
}, [closeNav, focusable, open]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<nav
|
|
||||||
ref={navRef}
|
|
||||||
className={classnames(
|
|
||||||
'absolute top-0 z-20 overflow-y-auto',
|
|
||||||
'transition-[right]',
|
|
||||||
{
|
|
||||||
'right-[-200vw] h-full': !open,
|
|
||||||
'right-0 h-[100vh]': open,
|
|
||||||
},
|
|
||||||
'w-full p-4 border-neutral-700 dark:border-neutral-300',
|
|
||||||
'bg-white dark:bg-black',
|
|
||||||
'md:static md:border-r'
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
<NavLinks links={routerConfig} />
|
|
||||||
<button
|
|
||||||
ref={btnRef}
|
|
||||||
className="absolute top-0 right-0 p-4 md:hidden"
|
|
||||||
onClick={() => {
|
|
||||||
closeNav();
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Icon name="cross" />
|
|
||||||
</button>
|
|
||||||
</nav>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { useExplorerDeterministicOrderQuery } from './__generated__/Order';
|
import { useExplorerDeterministicOrderQuery } from './__generated__/Order';
|
||||||
import { MarketLink } from '../links';
|
import { MarketLink } from '../links';
|
||||||
import PriceInMarket from '../price-in-market/price-in-market';
|
import PriceInMarket from '../price-in-market/price-in-market';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { useExplorerDeterministicOrderQuery } from './__generated__/Order';
|
import { useExplorerDeterministicOrderQuery } from './__generated__/Order';
|
||||||
import { MarketLink } from '../links';
|
import { MarketLink } from '../links';
|
||||||
import PriceInMarket from '../price-in-market/price-in-market';
|
import PriceInMarket from '../price-in-market/price-in-market';
|
||||||
@@ -101,7 +101,7 @@ const DeterministicOrderDetails = ({
|
|||||||
{t('Remaining')}
|
{t('Remaining')}
|
||||||
</h2>
|
</h2>
|
||||||
<h5 className="text-lg font-medium text-gray-500 mb-0">
|
<h5 className="text-lg font-medium text-gray-500 mb-0">
|
||||||
{o.remaining}
|
<SizeInMarket size={o.remaining} marketId={o.market.id} />
|
||||||
</h5>
|
</h5>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import type * as Schema from '@vegaprotocol/types';
|
import type * as Schema from '@vegaprotocol/types';
|
||||||
import type { components } from '../../../../types/explorer';
|
import type { components } from '../../../../types/explorer';
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
|
interface CancelSummaryProps {
|
||||||
|
orderId?: string;
|
||||||
|
marketId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple component for rendering a reasonable string from an order cancellation
|
||||||
|
*/
|
||||||
|
export const CancelSummary = ({ orderId, marketId }: CancelSummaryProps) => {
|
||||||
|
return <span className="font-bold">{getLabel(orderId, marketId)}</span>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export function getLabel(
|
||||||
|
orderId: string | undefined,
|
||||||
|
marketId: string | undefined
|
||||||
|
): string {
|
||||||
|
if (!orderId && !marketId) {
|
||||||
|
return t('All orders');
|
||||||
|
} else if (marketId && !orderId) {
|
||||||
|
return t('All in market');
|
||||||
|
}
|
||||||
|
|
||||||
|
return '-';
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import { addDecimalsFormatNumber, t } from '@vegaprotocol/react-helpers';
|
import { addDecimalsFormatNumber } from '@vegaprotocol/utils';
|
||||||
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import isUndefined from 'lodash/isUndefined';
|
import isUndefined from 'lodash/isUndefined';
|
||||||
import { useExplorerMarketQuery } from '../links/market-link/__generated__/Market';
|
import { useExplorerMarketQuery } from '../links/market-link/__generated__/Market';
|
||||||
import get from 'lodash/get';
|
import get from 'lodash/get';
|
||||||
|
|||||||
@@ -1,21 +1,18 @@
|
|||||||
import type { ProposalListFieldsFragment } from '@vegaprotocol/governance';
|
import type { ProposalListFieldsFragment } from '@vegaprotocol/proposals';
|
||||||
import { VoteProgress } from '@vegaprotocol/governance';
|
import { VoteProgress } from '@vegaprotocol/proposals';
|
||||||
import type { AgGridReact } from 'ag-grid-react';
|
import type { AgGridReact } from 'ag-grid-react';
|
||||||
import { AgGridColumn } from 'ag-grid-react';
|
import { AgGridColumn } from 'ag-grid-react';
|
||||||
|
import { ExternalLink } from '@vegaprotocol/ui-toolkit';
|
||||||
|
import { AgGridDynamic as AgGrid } from '@vegaprotocol/datagrid';
|
||||||
import type {
|
import type {
|
||||||
VegaICellRendererParams,
|
VegaICellRendererParams,
|
||||||
VegaValueFormatterParams,
|
VegaValueFormatterParams,
|
||||||
} from '@vegaprotocol/ui-toolkit';
|
} from '@vegaprotocol/datagrid';
|
||||||
import { ExternalLink } from '@vegaprotocol/ui-toolkit';
|
|
||||||
import { AgGridDynamic as AgGrid } from '@vegaprotocol/ui-toolkit';
|
|
||||||
import { useLayoutEffect, useMemo, useRef, useState } from 'react';
|
import { useLayoutEffect, useMemo, useRef, useState } from 'react';
|
||||||
import type { RowClickedEvent } from 'ag-grid-community';
|
import type { RowClickedEvent } from 'ag-grid-community';
|
||||||
import {
|
import { getDateTimeFormat } from '@vegaprotocol/utils';
|
||||||
getDateTimeFormat,
|
import { t } from '@vegaprotocol/i18n';
|
||||||
NetworkParams,
|
import { NetworkParams, useNetworkParams } from '@vegaprotocol/react-helpers';
|
||||||
t,
|
|
||||||
useNetworkParams,
|
|
||||||
} from '@vegaprotocol/react-helpers';
|
|
||||||
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,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { StatusMessage } from '../status-message';
|
import { StatusMessage } from '../status-message';
|
||||||
|
|
||||||
interface RenderFetchedProps {
|
interface RenderFetchedProps {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
interface RouteErrorBoundaryProps {
|
interface RouteErrorBoundaryProps {
|
||||||
|
|||||||
@@ -1,15 +1,35 @@
|
|||||||
import { useCallback, useState } from 'react';
|
import { useCallback, useState } from 'react';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { Button, Input, InputError } from '@vegaprotocol/ui-toolkit';
|
import { Button, Input, InputError } from '@vegaprotocol/ui-toolkit';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import { getSearchType, SearchTypes, toHex } from './detect-search';
|
import { getSearchType, SearchTypes, toHex } from './detect-search';
|
||||||
import { Routes } from '../../routes/route-names';
|
import { Routes } from '../../routes/route-names';
|
||||||
|
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
|
||||||
|
import classNames from 'classnames';
|
||||||
|
|
||||||
interface FormFields {
|
interface FormFields {
|
||||||
search: string;
|
search: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const MagnifyingGlass = () => (
|
||||||
|
<svg
|
||||||
|
className="w-4 h-4"
|
||||||
|
viewBox="0 0 18 18"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<line
|
||||||
|
x1="12.8202"
|
||||||
|
y1="13.1798"
|
||||||
|
x2="17.0629"
|
||||||
|
y2="17.4224"
|
||||||
|
stroke="currentColor"
|
||||||
|
/>
|
||||||
|
<circle cx="8" cy="8" r="7.5" stroke="currentColor" />
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
|
||||||
export const Search = () => {
|
export const Search = () => {
|
||||||
const { register, handleSubmit } = useForm<FormFields>();
|
const { register, handleSubmit } = useForm<FormFields>();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
@@ -49,39 +69,95 @@ export const Search = () => {
|
|||||||
[navigate]
|
[navigate]
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
const searchForm = (
|
||||||
<form
|
<form className="block min-w-[290px]" onSubmit={handleSubmit(onSubmit)}>
|
||||||
onSubmit={handleSubmit(onSubmit)}
|
<div className="flex relative items-stretch gap-2 text-xs">
|
||||||
className="w-full md:max-w-[620px] justify-self-end"
|
<label htmlFor="search" className="sr-only">
|
||||||
>
|
{t('Search by block number or transaction hash')}
|
||||||
<label htmlFor="search" className="sr-only">
|
</label>
|
||||||
{t('Search by block number or transaction hash')}
|
<button
|
||||||
</label>
|
className={classNames(
|
||||||
<div className="flex items-stretch gap-2">
|
'absolute top-[50%] translate-y-[-50%] left-2',
|
||||||
<div className="flex grow relative">
|
'text-vega-light-300 dark:text-vega-dark-300'
|
||||||
<Input
|
|
||||||
{...register('search')}
|
|
||||||
id="search"
|
|
||||||
data-testid="search"
|
|
||||||
className="text-white"
|
|
||||||
hasError={Boolean(error?.message)}
|
|
||||||
type="text"
|
|
||||||
placeholder={t(
|
|
||||||
'Enter block number, public key or transaction hash'
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
{error?.message && (
|
|
||||||
<div className="bg-white border border-t-0 border-accent absolute top-[100%] flex-1 w-full pb-2 px-2 rounded-b text-black">
|
|
||||||
<InputError data-testid="search-error" intent="danger">
|
|
||||||
{error.message}
|
|
||||||
</InputError>
|
|
||||||
</div>
|
|
||||||
)}
|
)}
|
||||||
</div>
|
>
|
||||||
<Button type="submit" size="sm" data-testid="search-button">
|
<MagnifyingGlass />
|
||||||
|
</button>
|
||||||
|
<Input
|
||||||
|
{...register('search')}
|
||||||
|
id="search"
|
||||||
|
data-testid="search"
|
||||||
|
className={classNames(
|
||||||
|
'peer',
|
||||||
|
'pl-8 py-2 text-xs',
|
||||||
|
'border rounded border-vega-light-200 dark:border-vega-dark-200'
|
||||||
|
)}
|
||||||
|
hasError={Boolean(error?.message)}
|
||||||
|
type="text"
|
||||||
|
placeholder={t('Enter block number, public key or transaction hash')}
|
||||||
|
/>
|
||||||
|
{error?.message && (
|
||||||
|
<div
|
||||||
|
className={classNames(
|
||||||
|
'hidden peer-focus:block',
|
||||||
|
'bg-white dark:bg-black',
|
||||||
|
'border rounded-b border-t-0 border-vega-light-200 dark:border-vega-dark-200',
|
||||||
|
'absolute top-[100%] flex-1 w-full pb-2 px-2 text-black dark:text-white'
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<InputError
|
||||||
|
data-testid="search-error"
|
||||||
|
intent="danger"
|
||||||
|
className="text-xs"
|
||||||
|
>
|
||||||
|
{error.message}
|
||||||
|
</InputError>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<Button
|
||||||
|
className="hidden [.search-dropdown_&]:block"
|
||||||
|
type="submit"
|
||||||
|
size="xs"
|
||||||
|
data-testid="search-button"
|
||||||
|
>
|
||||||
{t('Search')}
|
{t('Search')}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const searchTrigger = (
|
||||||
|
<DropdownMenu.Root>
|
||||||
|
<DropdownMenu.Trigger asChild>
|
||||||
|
<button className="text-vega-light-300 dark:text-vega-dark-300 data-open:text-black dark:data-open:text-white flex items-center">
|
||||||
|
<MagnifyingGlass />
|
||||||
|
</button>
|
||||||
|
</DropdownMenu.Trigger>
|
||||||
|
<DropdownMenu.Portal>
|
||||||
|
<DropdownMenu.Content
|
||||||
|
className={classNames(
|
||||||
|
'search-dropdown',
|
||||||
|
'p-2 min-w-[290px] z-20',
|
||||||
|
'text-vega-light-300 dark:text-vega-dark-300',
|
||||||
|
'bg-white dark:bg-black',
|
||||||
|
'border rounded border-vega-light-200 dark:border-vega-dark-200',
|
||||||
|
'shadow-[8px_8px_16px_0_rgba(0,0,0,0.4)]'
|
||||||
|
)}
|
||||||
|
align="end"
|
||||||
|
sideOffset={10}
|
||||||
|
>
|
||||||
|
{searchForm}
|
||||||
|
</DropdownMenu.Content>
|
||||||
|
</DropdownMenu.Portal>
|
||||||
|
</DropdownMenu.Root>
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="hidden [.nav-search-full_&]:block">{searchForm}</div>
|
||||||
|
<div className="hidden [.nav-search-compact_&]:block">
|
||||||
|
{searchTrigger}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useAssetDataProvider } from '@vegaprotocol/assets';
|
import { useAssetDataProvider } from '@vegaprotocol/assets';
|
||||||
import { addDecimalsFormatNumber } from '@vegaprotocol/react-helpers';
|
import { addDecimalsFormatNumber } from '@vegaprotocol/utils';
|
||||||
import { AssetLink } from '../links';
|
import { AssetLink } from '../links';
|
||||||
|
|
||||||
export type DecimalSource = 'ASSET';
|
export type DecimalSource = 'ASSET';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { addDecimalsFormatNumber } from '@vegaprotocol/react-helpers';
|
import { addDecimalsFormatNumber } from '@vegaprotocol/utils';
|
||||||
import { useExplorerMarketQuery } from '../links/market-link/__generated__/Market';
|
import { useExplorerMarketQuery } from '../links/market-link/__generated__/Market';
|
||||||
|
|
||||||
export type DecimalSource = 'MARKET';
|
export type DecimalSource = 'MARKET';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { formatDistanceToNowStrict } from 'date-fns';
|
import { formatDistanceToNowStrict } from 'date-fns';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
interface TimeAgoProps {
|
interface TimeAgoProps {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
interface TimeProps {
|
interface TimeProps {
|
||||||
date: string | null | undefined;
|
date: string | null | undefined;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { truncateByChars } from '@vegaprotocol/react-helpers';
|
import { truncateByChars } from '@vegaprotocol/utils';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
|
||||||
interface TruncateInlineProps {
|
interface TruncateInlineProps {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import type { BatchCancellationInstruction } from '../../../../routes/types/bloc
|
|||||||
import { TxOrderType } from '../../tx-order-type';
|
import { TxOrderType } from '../../tx-order-type';
|
||||||
import { MarketLink } from '../../../links';
|
import { MarketLink } from '../../../links';
|
||||||
import OrderSummary from '../../../order-summary/order-summary';
|
import OrderSummary from '../../../order-summary/order-summary';
|
||||||
|
import { CancelSummary } from '../../../order-summary/order-cancellation';
|
||||||
|
|
||||||
interface BatchCancelProps {
|
interface BatchCancelProps {
|
||||||
index: number;
|
index: number;
|
||||||
@@ -19,7 +20,14 @@ export const BatchCancel = ({ index, submission }: BatchCancelProps) => {
|
|||||||
<TxOrderType orderType={'OrderCancellation'} />
|
<TxOrderType orderType={'OrderCancellation'} />
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<OrderSummary id={submission.orderId} modifier="cancelled" />
|
{submission.orderId ? (
|
||||||
|
<OrderSummary id={submission.orderId} modifier="cancelled" />
|
||||||
|
) : (
|
||||||
|
<CancelSummary
|
||||||
|
orderId={submission.orderId}
|
||||||
|
marketId={submission.marketId}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<MarketLink id={submission.marketId} />
|
<MarketLink id={submission.marketId} />
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
import { render } from '@testing-library/react';
|
import { render } from '@testing-library/react';
|
||||||
import { TxDetailsChainEventBuiltinDeposit } from './tx-builtin-deposit';
|
import { TxDetailsChainEventBuiltinDeposit } from './tx-builtin-deposit';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import omit from 'lodash/omit';
|
import omit from 'lodash/omit';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { TableRow, TableCell } from '../../../table';
|
import { TableRow, TableCell } from '../../../table';
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import { AssetLink, PartyLink } from '../../../links';
|
import { AssetLink, PartyLink } from '../../../links';
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
import { render } from '@testing-library/react';
|
import { render } from '@testing-library/react';
|
||||||
import { TxDetailsChainEventBuiltinWithdrawal } from './tx-builtin-withdrawal';
|
import { TxDetailsChainEventBuiltinWithdrawal } from './tx-builtin-withdrawal';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import omit from 'lodash/omit';
|
import omit from 'lodash/omit';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { TableRow, TableCell } from '../../../table';
|
import { TableRow, TableCell } from '../../../table';
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import { AssetLink, PartyLink } from '../../../links';
|
import { AssetLink, PartyLink } from '../../../links';
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
import { render } from '@testing-library/react';
|
import { render } from '@testing-library/react';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import omit from 'lodash/omit';
|
import omit from 'lodash/omit';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { TableRow, TableCell } from '../../../table';
|
import { TableRow, TableCell } from '../../../table';
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import { AssetLink } from '../../../links';
|
import { AssetLink } from '../../../links';
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
import { render } from '@testing-library/react';
|
import { render } from '@testing-library/react';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import omit from 'lodash/omit';
|
import omit from 'lodash/omit';
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { TableRow, TableCell } from '../../../table';
|
import { TableRow, TableCell } from '../../../table';
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import { AssetLink } from '../../../links';
|
import { AssetLink } from '../../../links';
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
import { render } from '@testing-library/react';
|
import { render } from '@testing-library/react';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import omit from 'lodash/omit';
|
import omit from 'lodash/omit';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { TableRow, TableCell } from '../../../table';
|
import { TableRow, TableCell } from '../../../table';
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import { AssetLink } from '../../../links';
|
import { AssetLink } from '../../../links';
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
import { render } from '@testing-library/react';
|
import { render } from '@testing-library/react';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { TxDetailsChainEventErc20BridgePause } from './tx-erc20-bridge-pause';
|
import { TxDetailsChainEventErc20BridgePause } from './tx-erc20-bridge-pause';
|
||||||
|
|
||||||
describe('Chain Event: ERC20 bridge pause', () => {
|
describe('Chain Event: ERC20 bridge pause', () => {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { TableRow, TableCell } from '../../../table';
|
import { TableRow, TableCell } from '../../../table';
|
||||||
|
|
||||||
export interface TxDetailsChainEventErc20BridgePauseProps {
|
export interface TxDetailsChainEventErc20BridgePauseProps {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { render } from '@testing-library/react';
|
import { render } from '@testing-library/react';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import omit from 'lodash/omit';
|
import omit from 'lodash/omit';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { TableRow, TableCell } from '../../../table';
|
import { TableRow, TableCell } from '../../../table';
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import { AssetLink, PartyLink } from '../../../links';
|
import { AssetLink, PartyLink } from '../../../links';
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
import { render } from '@testing-library/react';
|
import { render } from '@testing-library/react';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import omit from 'lodash/omit';
|
import omit from 'lodash/omit';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { TableRow, TableCell } from '../../../table';
|
import { TableRow, TableCell } from '../../../table';
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import { AssetLink } from '../../../links';
|
import { AssetLink } from '../../../links';
|
||||||
|
|||||||
+1
-8
@@ -1,11 +1,10 @@
|
|||||||
import { render } from '@testing-library/react';
|
import { render } from '@testing-library/react';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import { MockedProvider } from '@apollo/client/testing';
|
import { MockedProvider } from '@apollo/client/testing';
|
||||||
import { MemoryRouter } from 'react-router-dom';
|
import { MemoryRouter } from 'react-router-dom';
|
||||||
import { TxDetailsChainMultisigSigner } from './tx-multisig-signer';
|
import { TxDetailsChainMultisigSigner } from './tx-multisig-signer';
|
||||||
import { getBlockTime } from './lib/get-block-time';
|
|
||||||
|
|
||||||
type Added = components['schemas']['vegaERC20SignerAdded'];
|
type Added = components['schemas']['vegaERC20SignerAdded'];
|
||||||
type Removed = components['schemas']['vegaERC20SignerRemoved'];
|
type Removed = components['schemas']['vegaERC20SignerRemoved'];
|
||||||
@@ -61,10 +60,7 @@ describe('Chain Event: multisig signer change', () => {
|
|||||||
expect(screen.getByText(t('Add signer'))).toBeInTheDocument();
|
expect(screen.getByText(t('Add signer'))).toBeInTheDocument();
|
||||||
expect(screen.getByText(`${addedMock.newSigner}`)).toBeInTheDocument();
|
expect(screen.getByText(`${addedMock.newSigner}`)).toBeInTheDocument();
|
||||||
|
|
||||||
const expectedDate = getBlockTime(mockBlockTime);
|
|
||||||
|
|
||||||
expect(screen.getByText(t('Signer change at'))).toBeInTheDocument();
|
expect(screen.getByText(t('Signer change at'))).toBeInTheDocument();
|
||||||
expect(screen.getByText(expectedDate)).toBeInTheDocument();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Renders TableRows if all data is provided', () => {
|
it('Renders TableRows if all data is provided', () => {
|
||||||
@@ -93,9 +89,6 @@ describe('Chain Event: multisig signer change', () => {
|
|||||||
expect(screen.getByText(t('Remove signer'))).toBeInTheDocument();
|
expect(screen.getByText(t('Remove signer'))).toBeInTheDocument();
|
||||||
expect(screen.getByText(`${removedMock.oldSigner}`)).toBeInTheDocument();
|
expect(screen.getByText(`${removedMock.oldSigner}`)).toBeInTheDocument();
|
||||||
|
|
||||||
const expectedDate = getBlockTime(mockBlockTime);
|
|
||||||
|
|
||||||
expect(screen.getByText(t('Signer change at'))).toBeInTheDocument();
|
expect(screen.getByText(t('Signer change at'))).toBeInTheDocument();
|
||||||
expect(screen.getByText(expectedDate)).toBeInTheDocument();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { TableRow, TableCell } from '../../../table';
|
import { TableRow, TableCell } from '../../../table';
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import { getBlockTime } from './lib/get-block-time';
|
import { getBlockTime } from './lib/get-block-time';
|
||||||
|
|||||||
+1
-5
@@ -1,12 +1,11 @@
|
|||||||
import { render } from '@testing-library/react';
|
import { render } from '@testing-library/react';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import { MockedProvider } from '@apollo/client/testing';
|
import { MockedProvider } from '@apollo/client/testing';
|
||||||
import { MemoryRouter } from 'react-router-dom';
|
import { MemoryRouter } from 'react-router-dom';
|
||||||
import { TxDetailsChainMultisigThreshold } from './tx-multisig-threshold';
|
import { TxDetailsChainMultisigThreshold } from './tx-multisig-threshold';
|
||||||
import omit from 'lodash/omit';
|
import omit from 'lodash/omit';
|
||||||
import { getBlockTime } from './lib/get-block-time';
|
|
||||||
|
|
||||||
type Threshold =
|
type Threshold =
|
||||||
components['schemas']['vegaERC20MultiSigEvent']['thresholdSet'];
|
components['schemas']['vegaERC20MultiSigEvent']['thresholdSet'];
|
||||||
@@ -74,9 +73,6 @@ describe('Chain Event: multisig threshold change', () => {
|
|||||||
expect(screen.getByText(t('Threshold'))).toBeInTheDocument();
|
expect(screen.getByText(t('Threshold'))).toBeInTheDocument();
|
||||||
expect(screen.getByText(`66.7%`)).toBeInTheDocument();
|
expect(screen.getByText(`66.7%`)).toBeInTheDocument();
|
||||||
|
|
||||||
const expectedDate = getBlockTime(mockBlockTime);
|
|
||||||
|
|
||||||
expect(screen.getByText(t('Threshold change date'))).toBeInTheDocument();
|
expect(screen.getByText(t('Threshold change date'))).toBeInTheDocument();
|
||||||
expect(screen.getByText(expectedDate)).toBeInTheDocument();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { TableRow, TableCell } from '../../../table';
|
import { TableRow, TableCell } from '../../../table';
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import isNumber from 'lodash/isNumber';
|
import isNumber from 'lodash/isNumber';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { render } from '@testing-library/react';
|
import { render } from '@testing-library/react';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import omit from 'lodash/omit';
|
import omit from 'lodash/omit';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { TableRow, TableCell } from '../../../table';
|
import { TableRow, TableCell } from '../../../table';
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import { PartyLink } from '../../../links';
|
import { PartyLink } from '../../../links';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { render } from '@testing-library/react';
|
import { render } from '@testing-library/react';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import omit from 'lodash/omit';
|
import omit from 'lodash/omit';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { TableRow, TableCell } from '../../../table';
|
import { TableRow, TableCell } from '../../../table';
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import { PartyLink } from '../../../links';
|
import { PartyLink } from '../../../links';
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
import { render } from '@testing-library/react';
|
import { render } from '@testing-library/react';
|
||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import omit from 'lodash/omit';
|
import omit from 'lodash/omit';
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { formatNumber, t, toBigNum } from '@vegaprotocol/react-helpers';
|
import { formatNumber, toBigNum } from '@vegaprotocol/utils';
|
||||||
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { TableRow, TableCell } from '../../../table';
|
import { TableRow, TableCell } from '../../../table';
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import {
|
import {
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
import type { components } from '../../../../../../types/explorer';
|
import type { components } from '../../../../../../types/explorer';
|
||||||
import { TableRow } from '../../../../table';
|
import { TableRow } from '../../../../table';
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
import { useExplorerSettlementAssetForMarketQuery } from '../__generated__/Explorer-settlement-asset';
|
import { useExplorerSettlementAssetForMarketQuery } from '../__generated__/Explorer-settlement-asset';
|
||||||
import { addDecimalsFormatNumber } from '@vegaprotocol/react-helpers';
|
import { addDecimalsFormatNumber } from '@vegaprotocol/utils';
|
||||||
import type { ExplorerSettlementAssetForMarketQuery } from '../__generated__/Explorer-settlement-asset';
|
import type { ExplorerSettlementAssetForMarketQuery } from '../__generated__/Explorer-settlement-asset';
|
||||||
import type { VegaSide } from './liquidity-provision-details-row';
|
import type { VegaSide } from './liquidity-provision-details-row';
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
import type { components } from '../../../../../types/explorer';
|
import type { components } from '../../../../../types/explorer';
|
||||||
import type { LiquiditySubmission } from '../tx-liquidity-submission';
|
import type { LiquiditySubmission } from '../tx-liquidity-submission';
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
interface JSONOracleDataProps {
|
interface JSONOracleDataProps {
|
||||||
payload: string;
|
payload: string;
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { NestedDataList } from '../../../nested-data-list';
|
import { NestedDataList } from '../../../nested-data-list';
|
||||||
import { OpenOraclePrices } from './open-oracle/open-oracle-prices';
|
import { OpenOraclePrices } from './open-oracle/open-oracle-prices';
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
import { t } from '@vegaprotocol/react-helpers';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { CopyWithTooltip } from '@vegaprotocol/ui-toolkit';
|
import { CopyWithTooltip } from '@vegaprotocol/ui-toolkit';
|
||||||
import { TableRow } from '../../../../table';
|
import { TableRow } from '../../../../table';
|
||||||
import { TruncateInline } from '../../../../truncate/truncate';
|
import { TruncateInline } from '../../../../truncate/truncate';
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
query ExplorerProposalStatus($id: ID!) {
|
||||||
|
proposal(id: $id) {
|
||||||
|
id
|
||||||
|
state
|
||||||
|
rejectionReason
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
query ExplorerNewAssetSignatureBundle($id: ID!) {
|
||||||
|
erc20ListAssetBundle(assetId: $id) {
|
||||||
|
signatures
|
||||||
|
nonce
|
||||||
|
}
|
||||||
|
asset(id: $id) {
|
||||||
|
status
|
||||||
|
source {
|
||||||
|
... on ERC20 {
|
||||||
|
contractAddress
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
query ExplorerUpdateAssetSignatureBundle($id: ID!) {
|
||||||
|
erc20SetAssetLimitsBundle(proposalId: $id) {
|
||||||
|
signatures
|
||||||
|
nonce
|
||||||
|
}
|
||||||
|
asset(id: $id) {
|
||||||
|
status
|
||||||
|
source {
|
||||||
|
... on ERC20 {
|
||||||
|
contractAddress
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
import * as Types from '@vegaprotocol/types';
|
||||||
|
|
||||||
|
import { gql } from '@apollo/client';
|
||||||
|
import * as Apollo from '@apollo/client';
|
||||||
|
const defaultOptions = {} as const;
|
||||||
|
export type ExplorerProposalStatusQueryVariables = Types.Exact<{
|
||||||
|
id: Types.Scalars['ID'];
|
||||||
|
}>;
|
||||||
|
|
||||||
|
|
||||||
|
export type ExplorerProposalStatusQuery = { __typename?: 'Query', proposal?: { __typename?: 'Proposal', id?: string | null, state: Types.ProposalState, rejectionReason?: Types.ProposalRejectionReason | null } | null };
|
||||||
|
|
||||||
|
|
||||||
|
export const ExplorerProposalStatusDocument = gql`
|
||||||
|
query ExplorerProposalStatus($id: ID!) {
|
||||||
|
proposal(id: $id) {
|
||||||
|
id
|
||||||
|
state
|
||||||
|
rejectionReason
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __useExplorerProposalStatusQuery__
|
||||||
|
*
|
||||||
|
* To run a query within a React component, call `useExplorerProposalStatusQuery` and pass it any options that fit your needs.
|
||||||
|
* When your component renders, `useExplorerProposalStatusQuery` returns an object from Apollo Client that contains loading, error, and data properties
|
||||||
|
* you can use to render your UI.
|
||||||
|
*
|
||||||
|
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* const { data, loading, error } = useExplorerProposalStatusQuery({
|
||||||
|
* variables: {
|
||||||
|
* id: // value for 'id'
|
||||||
|
* },
|
||||||
|
* });
|
||||||
|
*/
|
||||||
|
export function useExplorerProposalStatusQuery(baseOptions: Apollo.QueryHookOptions<ExplorerProposalStatusQuery, ExplorerProposalStatusQueryVariables>) {
|
||||||
|
const options = {...defaultOptions, ...baseOptions}
|
||||||
|
return Apollo.useQuery<ExplorerProposalStatusQuery, ExplorerProposalStatusQueryVariables>(ExplorerProposalStatusDocument, options);
|
||||||
|
}
|
||||||
|
export function useExplorerProposalStatusLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<ExplorerProposalStatusQuery, ExplorerProposalStatusQueryVariables>) {
|
||||||
|
const options = {...defaultOptions, ...baseOptions}
|
||||||
|
return Apollo.useLazyQuery<ExplorerProposalStatusQuery, ExplorerProposalStatusQueryVariables>(ExplorerProposalStatusDocument, options);
|
||||||
|
}
|
||||||
|
export type ExplorerProposalStatusQueryHookResult = ReturnType<typeof useExplorerProposalStatusQuery>;
|
||||||
|
export type ExplorerProposalStatusLazyQueryHookResult = ReturnType<typeof useExplorerProposalStatusLazyQuery>;
|
||||||
|
export type ExplorerProposalStatusQueryResult = Apollo.QueryResult<ExplorerProposalStatusQuery, ExplorerProposalStatusQueryVariables>;
|
||||||
+108
@@ -0,0 +1,108 @@
|
|||||||
|
import * as Types from '@vegaprotocol/types';
|
||||||
|
|
||||||
|
import { gql } from '@apollo/client';
|
||||||
|
import * as Apollo from '@apollo/client';
|
||||||
|
const defaultOptions = {} as const;
|
||||||
|
export type ExplorerNewAssetSignatureBundleQueryVariables = Types.Exact<{
|
||||||
|
id: Types.Scalars['ID'];
|
||||||
|
}>;
|
||||||
|
|
||||||
|
|
||||||
|
export type ExplorerNewAssetSignatureBundleQuery = { __typename?: 'Query', erc20ListAssetBundle?: { __typename?: 'Erc20ListAssetBundle', signatures: string, nonce: string } | null, asset?: { __typename?: 'Asset', status: Types.AssetStatus, source: { __typename?: 'BuiltinAsset' } | { __typename?: 'ERC20', contractAddress: string } } | null };
|
||||||
|
|
||||||
|
export type ExplorerUpdateAssetSignatureBundleQueryVariables = Types.Exact<{
|
||||||
|
id: Types.Scalars['ID'];
|
||||||
|
}>;
|
||||||
|
|
||||||
|
|
||||||
|
export type ExplorerUpdateAssetSignatureBundleQuery = { __typename?: 'Query', erc20SetAssetLimitsBundle: { __typename?: 'ERC20SetAssetLimitsBundle', signatures: string, nonce: string }, asset?: { __typename?: 'Asset', status: Types.AssetStatus, source: { __typename?: 'BuiltinAsset' } | { __typename?: 'ERC20', contractAddress: string } } | null };
|
||||||
|
|
||||||
|
|
||||||
|
export const ExplorerNewAssetSignatureBundleDocument = gql`
|
||||||
|
query ExplorerNewAssetSignatureBundle($id: ID!) {
|
||||||
|
erc20ListAssetBundle(assetId: $id) {
|
||||||
|
signatures
|
||||||
|
nonce
|
||||||
|
}
|
||||||
|
asset(id: $id) {
|
||||||
|
status
|
||||||
|
source {
|
||||||
|
... on ERC20 {
|
||||||
|
contractAddress
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __useExplorerNewAssetSignatureBundleQuery__
|
||||||
|
*
|
||||||
|
* To run a query within a React component, call `useExplorerNewAssetSignatureBundleQuery` and pass it any options that fit your needs.
|
||||||
|
* When your component renders, `useExplorerNewAssetSignatureBundleQuery` returns an object from Apollo Client that contains loading, error, and data properties
|
||||||
|
* you can use to render your UI.
|
||||||
|
*
|
||||||
|
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* const { data, loading, error } = useExplorerNewAssetSignatureBundleQuery({
|
||||||
|
* variables: {
|
||||||
|
* id: // value for 'id'
|
||||||
|
* },
|
||||||
|
* });
|
||||||
|
*/
|
||||||
|
export function useExplorerNewAssetSignatureBundleQuery(baseOptions: Apollo.QueryHookOptions<ExplorerNewAssetSignatureBundleQuery, ExplorerNewAssetSignatureBundleQueryVariables>) {
|
||||||
|
const options = {...defaultOptions, ...baseOptions}
|
||||||
|
return Apollo.useQuery<ExplorerNewAssetSignatureBundleQuery, ExplorerNewAssetSignatureBundleQueryVariables>(ExplorerNewAssetSignatureBundleDocument, options);
|
||||||
|
}
|
||||||
|
export function useExplorerNewAssetSignatureBundleLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<ExplorerNewAssetSignatureBundleQuery, ExplorerNewAssetSignatureBundleQueryVariables>) {
|
||||||
|
const options = {...defaultOptions, ...baseOptions}
|
||||||
|
return Apollo.useLazyQuery<ExplorerNewAssetSignatureBundleQuery, ExplorerNewAssetSignatureBundleQueryVariables>(ExplorerNewAssetSignatureBundleDocument, options);
|
||||||
|
}
|
||||||
|
export type ExplorerNewAssetSignatureBundleQueryHookResult = ReturnType<typeof useExplorerNewAssetSignatureBundleQuery>;
|
||||||
|
export type ExplorerNewAssetSignatureBundleLazyQueryHookResult = ReturnType<typeof useExplorerNewAssetSignatureBundleLazyQuery>;
|
||||||
|
export type ExplorerNewAssetSignatureBundleQueryResult = Apollo.QueryResult<ExplorerNewAssetSignatureBundleQuery, ExplorerNewAssetSignatureBundleQueryVariables>;
|
||||||
|
export const ExplorerUpdateAssetSignatureBundleDocument = gql`
|
||||||
|
query ExplorerUpdateAssetSignatureBundle($id: ID!) {
|
||||||
|
erc20SetAssetLimitsBundle(proposalId: $id) {
|
||||||
|
signatures
|
||||||
|
nonce
|
||||||
|
}
|
||||||
|
asset(id: $id) {
|
||||||
|
status
|
||||||
|
source {
|
||||||
|
... on ERC20 {
|
||||||
|
contractAddress
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __useExplorerUpdateAssetSignatureBundleQuery__
|
||||||
|
*
|
||||||
|
* To run a query within a React component, call `useExplorerUpdateAssetSignatureBundleQuery` and pass it any options that fit your needs.
|
||||||
|
* When your component renders, `useExplorerUpdateAssetSignatureBundleQuery` returns an object from Apollo Client that contains loading, error, and data properties
|
||||||
|
* you can use to render your UI.
|
||||||
|
*
|
||||||
|
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* const { data, loading, error } = useExplorerUpdateAssetSignatureBundleQuery({
|
||||||
|
* variables: {
|
||||||
|
* id: // value for 'id'
|
||||||
|
* },
|
||||||
|
* });
|
||||||
|
*/
|
||||||
|
export function useExplorerUpdateAssetSignatureBundleQuery(baseOptions: Apollo.QueryHookOptions<ExplorerUpdateAssetSignatureBundleQuery, ExplorerUpdateAssetSignatureBundleQueryVariables>) {
|
||||||
|
const options = {...defaultOptions, ...baseOptions}
|
||||||
|
return Apollo.useQuery<ExplorerUpdateAssetSignatureBundleQuery, ExplorerUpdateAssetSignatureBundleQueryVariables>(ExplorerUpdateAssetSignatureBundleDocument, options);
|
||||||
|
}
|
||||||
|
export function useExplorerUpdateAssetSignatureBundleLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<ExplorerUpdateAssetSignatureBundleQuery, ExplorerUpdateAssetSignatureBundleQueryVariables>) {
|
||||||
|
const options = {...defaultOptions, ...baseOptions}
|
||||||
|
return Apollo.useLazyQuery<ExplorerUpdateAssetSignatureBundleQuery, ExplorerUpdateAssetSignatureBundleQueryVariables>(ExplorerUpdateAssetSignatureBundleDocument, options);
|
||||||
|
}
|
||||||
|
export type ExplorerUpdateAssetSignatureBundleQueryHookResult = ReturnType<typeof useExplorerUpdateAssetSignatureBundleQuery>;
|
||||||
|
export type ExplorerUpdateAssetSignatureBundleLazyQueryHookResult = ReturnType<typeof useExplorerUpdateAssetSignatureBundleLazyQuery>;
|
||||||
|
export type ExplorerUpdateAssetSignatureBundleQueryResult = Apollo.QueryResult<ExplorerUpdateAssetSignatureBundleQuery, ExplorerUpdateAssetSignatureBundleQueryVariables>;
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
import { Lozenge } from '@vegaprotocol/ui-toolkit';
|
||||||
|
import type { components } from '../../../../../types/explorer';
|
||||||
|
import type { ExplorerProposalStatusQuery } from './__generated__/Proposal';
|
||||||
|
import { useExplorerProposalStatusQuery } from './__generated__/Proposal';
|
||||||
|
|
||||||
|
type Terms = components['schemas']['vegaProposalTerms'];
|
||||||
|
|
||||||
|
export function format(date: string | undefined, def: string) {
|
||||||
|
if (!date) {
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Date().toLocaleDateString() || def;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getDate(
|
||||||
|
data: ExplorerProposalStatusQuery | undefined,
|
||||||
|
terms: Terms
|
||||||
|
): string {
|
||||||
|
const DEFAULT = t('Unknown');
|
||||||
|
if (!data?.proposal?.state) {
|
||||||
|
return DEFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (data.proposal.state) {
|
||||||
|
case 'STATE_DECLINED':
|
||||||
|
return `${t('Rejected on')}: ${format(terms.closingTimestamp, DEFAULT)}`;
|
||||||
|
case 'STATE_ENACTED':
|
||||||
|
return `${t('Vote passed on')}: ${format(
|
||||||
|
terms.enactmentTimestamp,
|
||||||
|
DEFAULT
|
||||||
|
)}`;
|
||||||
|
case 'STATE_FAILED':
|
||||||
|
return `${t('Failed on')}: ${format(terms.validationTimestamp, DEFAULT)}`;
|
||||||
|
case 'STATE_OPEN':
|
||||||
|
return `${t('Open until')}: ${format(terms.closingTimestamp, DEFAULT)}`;
|
||||||
|
case 'STATE_PASSED':
|
||||||
|
return `${t('Passed on')}: ${format(terms.closingTimestamp, DEFAULT)}`;
|
||||||
|
case 'STATE_REJECTED':
|
||||||
|
return `${t('Rejected on submission')}`;
|
||||||
|
case 'STATE_WAITING_FOR_NODE_VOTE':
|
||||||
|
return `${t('Opening')}...`;
|
||||||
|
default:
|
||||||
|
return DEFAULT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ProposalDateProps {
|
||||||
|
id: string;
|
||||||
|
terms: Terms;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Shows the most relevant date for the proposal summary view. Depending on the
|
||||||
|
* state returned by GraphQL, we show either the validation, closing or enactment
|
||||||
|
* timestamp
|
||||||
|
*/
|
||||||
|
export const ProposalDate = ({ terms, id }: ProposalDateProps) => {
|
||||||
|
const { data } = useExplorerProposalStatusQuery({
|
||||||
|
variables: {
|
||||||
|
id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Lozenge className="font-sans text-xs float-right">
|
||||||
|
{getDate(data, terms)}
|
||||||
|
</Lozenge>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
import { Icon, Tooltip } from '@vegaprotocol/ui-toolkit';
|
||||||
|
import type { IconProps } from '@vegaprotocol/ui-toolkit';
|
||||||
|
import { useExplorerProposalStatusQuery } from './__generated__/Proposal';
|
||||||
|
import type { ExplorerProposalStatusQuery } from './__generated__/Proposal';
|
||||||
|
import type * as Apollo from '@apollo/client';
|
||||||
|
import type * as Types from '@vegaprotocol/types';
|
||||||
|
import { t } from '@vegaprotocol/i18n';
|
||||||
|
|
||||||
|
type ProposalQueryResult = Apollo.QueryResult<
|
||||||
|
ExplorerProposalStatusQuery,
|
||||||
|
Types.Exact<{
|
||||||
|
id: string;
|
||||||
|
}>
|
||||||
|
>;
|
||||||
|
|
||||||
|
interface ProposalStatusIconProps {
|
||||||
|
id: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
type IconAndLabel = {
|
||||||
|
icon: IconProps['name'];
|
||||||
|
label: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select an icon for a given query result. Tolerates queries that don't return
|
||||||
|
* any data
|
||||||
|
*
|
||||||
|
* @param data a data result from useExplorerProposalStatusQuery
|
||||||
|
* @returns Icon name
|
||||||
|
*/
|
||||||
|
export function getIconAndLabelForStatus(
|
||||||
|
res: ProposalQueryResult
|
||||||
|
): IconAndLabel {
|
||||||
|
const DEFAULT: IconAndLabel = {
|
||||||
|
icon: 'error',
|
||||||
|
label: t('Proposal state unknown'),
|
||||||
|
};
|
||||||
|
|
||||||
|
if (res.loading) {
|
||||||
|
return {
|
||||||
|
icon: 'more',
|
||||||
|
label: t('Loading data'),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!res?.data?.proposal || res.error) {
|
||||||
|
return {
|
||||||
|
icon: 'error',
|
||||||
|
label: res.error?.message || DEFAULT.label,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (res.data.proposal.state) {
|
||||||
|
case 'STATE_DECLINED':
|
||||||
|
return {
|
||||||
|
icon: 'stop',
|
||||||
|
label: t('Proposal did not have enough participation to be valid'),
|
||||||
|
};
|
||||||
|
case 'STATE_ENACTED':
|
||||||
|
return {
|
||||||
|
icon: 'tick-circle',
|
||||||
|
label: t('Vote passed and the proposal has been enacted'),
|
||||||
|
};
|
||||||
|
case 'STATE_FAILED':
|
||||||
|
return {
|
||||||
|
icon: 'thumbs-down',
|
||||||
|
label: t('Proposal became invalid and was not processed'),
|
||||||
|
};
|
||||||
|
case 'STATE_OPEN':
|
||||||
|
return {
|
||||||
|
// A checklist to indicate in progress
|
||||||
|
icon: 'form',
|
||||||
|
label: t('Voting is in progress'),
|
||||||
|
};
|
||||||
|
case 'STATE_PASSED':
|
||||||
|
return {
|
||||||
|
icon: 'thumbs-up',
|
||||||
|
label: t(
|
||||||
|
'Voting is complete and this proposal was approved. It is not yet enacted.'
|
||||||
|
),
|
||||||
|
};
|
||||||
|
case 'STATE_REJECTED':
|
||||||
|
return {
|
||||||
|
icon: 'disable',
|
||||||
|
label: t('The proposal was invalid'),
|
||||||
|
};
|
||||||
|
case 'STATE_WAITING_FOR_NODE_VOTE':
|
||||||
|
return {
|
||||||
|
// A sparkly thing indicating it's new
|
||||||
|
icon: 'clean',
|
||||||
|
label: t('Proposal is being checked by validators'),
|
||||||
|
};
|
||||||
|
default:
|
||||||
|
return DEFAULT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
export const ProposalStatusIcon = ({ id }: ProposalStatusIconProps) => {
|
||||||
|
const { icon, label } = getIconAndLabelForStatus(
|
||||||
|
useExplorerProposalStatusQuery({
|
||||||
|
variables: {
|
||||||
|
id,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="float-left mr-3">
|
||||||
|
<Tooltip description={<p>{label}</p>}>
|
||||||
|
<div>
|
||||||
|
<Icon name={icon} />
|
||||||
|
</div>
|
||||||
|
</Tooltip>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user