Compare commits
224
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
79ce55f160 | ||
|
|
5ffc67aff3 | ||
|
|
9880aea753 | ||
|
|
c2901bb27d | ||
|
|
b3b10c83fb | ||
|
|
38904b6442 | ||
|
|
98ed5778a3 | ||
|
|
341d78e761 | ||
|
|
58cc074538 | ||
|
|
852c9bb8f4 | ||
|
|
efe9b7a0e7 | ||
|
|
695a059dde | ||
|
|
5d7e4d273a | ||
|
|
b137e024c6 | ||
|
|
6651ee52b4 | ||
|
|
0d14722c5d | ||
|
|
4968b537b8 | ||
|
|
5f5c45f3b9 | ||
|
|
6b10df015d | ||
|
|
6d7e24732b | ||
|
|
b33cf04e16 | ||
|
|
66ebb26b0f | ||
|
|
51c88d2fce | ||
|
|
2786a984b0 | ||
|
|
39c53a7326 | ||
|
|
3371e8e2cc | ||
|
|
5843a36851 | ||
|
|
68b4909dff | ||
|
|
da8e382454 | ||
|
|
81ebefc329 | ||
|
|
1ed7d6fda2 | ||
|
|
a2e4f34b0d | ||
|
|
3a1bb855aa | ||
|
|
b4ca0a8390 | ||
|
|
349c790ecc | ||
|
|
4c8a15cc01 | ||
|
|
f433a030ff | ||
|
|
63a6e4ecbd | ||
|
|
555f6e2a6d | ||
|
|
c116762865 | ||
|
|
b47bd49e83 | ||
|
|
4b942cfb7d | ||
|
|
c27443fc13 | ||
|
|
6dbde76c84 | ||
|
|
f4abd7cef5 | ||
|
|
3b978118dc | ||
|
|
bb4cc1e51d | ||
|
|
797db6ee93 | ||
|
|
6e7b87d9ef | ||
|
|
6965bdf0ca | ||
|
|
f4d46efff5 | ||
|
|
d510330c6b | ||
|
|
5b5765ef63 | ||
|
|
283f654a4c | ||
|
|
6945514b49 | ||
|
|
f74687d30c | ||
|
|
2a7574bd8e | ||
|
|
872f1d300f | ||
|
|
600ea0eeab | ||
|
|
7c3f7a7ab1 | ||
|
|
539abce8af | ||
|
|
60ca6c2eb6 | ||
|
|
eeff4ffcd4 | ||
|
|
73ae00f12c | ||
|
|
ee73e4d5e2 | ||
|
|
14928d318d | ||
|
|
a19ea1c939 | ||
|
|
c65c296db2 | ||
|
|
6c5cd85d96 | ||
|
|
8efadda98c | ||
|
|
0872a14f44 | ||
|
|
8b249e1917 | ||
|
|
13817e4d57 | ||
|
|
abb771e2f9 | ||
|
|
acf1d50d0f | ||
|
|
9da704c117 | ||
|
|
d262650258 | ||
|
|
30da1663eb | ||
|
|
79cbe62774 | ||
|
|
df11401b69 | ||
|
|
2f0be0bf34 | ||
|
|
5b5802104e | ||
|
|
3a149ddfb2 | ||
|
|
0e519f4d0e | ||
|
|
ff2e2574f6 | ||
|
|
9b52cecf21 | ||
|
|
478cc9e753 | ||
|
|
18f1fbd56d | ||
|
|
ccb22f02c3 | ||
|
|
015d8f51c0 | ||
|
|
e2a72cb395 | ||
|
|
0669696b6f | ||
|
|
56c662e5ba | ||
|
|
7fe269fad6 | ||
|
|
b761023069 | ||
|
|
7453acd632 | ||
|
|
1f507facba | ||
|
|
9d6b34963a | ||
|
|
7ac3a68ac9 | ||
|
|
2640ccb20a | ||
|
|
77c0894501 | ||
|
|
60d7cf3029 | ||
|
|
2b8abde938 | ||
|
|
2005f19d50 | ||
|
|
d78de10855 | ||
|
|
bb402c02f6 | ||
|
|
8a9b1c7874 | ||
|
|
a7e8b0eb01 | ||
|
|
89b3c06107 | ||
|
|
cd5c73d3fd | ||
|
|
b3a5ab022d | ||
|
|
ba438549bc | ||
|
|
496d1f5c68 | ||
|
|
e914e7bb70 | ||
|
|
71a36c2382 | ||
|
|
1c6a307bcd | ||
|
|
ef4a740b91 | ||
|
|
a6303456c5 | ||
|
|
2d4be5fcb3 | ||
|
|
9cbd6baccd | ||
|
|
525773773a | ||
|
|
45d6f43e74 | ||
|
|
41760f2956 | ||
|
|
3d2b171de7 | ||
|
|
39a041332b | ||
|
|
4c0d05844e | ||
|
|
bf8480fed4 | ||
|
|
44434a7d39 | ||
|
|
b818e9b2a1 | ||
|
|
775835c667 | ||
|
|
3e30f053ff | ||
|
|
5db3453ba5 | ||
|
|
0b1987d4ce | ||
|
|
290b7ae856 | ||
|
|
835f2b793f | ||
|
|
e1557f51ce | ||
|
|
c98e53a984 | ||
|
|
95a51fd152 | ||
|
|
d50b988b4a | ||
|
|
76ee58e473 | ||
|
|
a6aec899c8 | ||
|
|
a6672d213f | ||
|
|
62f368da10 | ||
|
|
f3e2fe746d | ||
|
|
8b19572dc9 | ||
|
|
80399d04f7 | ||
|
|
8322fc7edd | ||
|
|
46752816ec | ||
|
|
f99f78780c | ||
|
|
f7037bca80 | ||
|
|
ba39720f05 | ||
|
|
6d35f2b39d | ||
|
|
78afecc2e5 | ||
|
|
3de5b07495 | ||
|
|
e944d3e37c | ||
|
|
5596392835 | ||
|
|
5c57106c04 | ||
|
|
2fc688f477 | ||
|
|
9ea8c839db | ||
|
|
d7e2da7a54 | ||
|
|
b29c268257 | ||
|
|
01ca05a313 | ||
|
|
e3c6dd41c9 | ||
|
|
fbd01dc1bd | ||
|
|
af6719cc9d | ||
|
|
c433a4ee06 | ||
|
|
e3a00ada05 | ||
|
|
aa38e0c001 | ||
|
|
86da521da5 | ||
|
|
c6df34fe95 | ||
|
|
c7d0803164 | ||
|
|
250a654544 | ||
|
|
7f5e8ebb15 | ||
|
|
ccbe34e172 | ||
|
|
27e8ce88bf | ||
|
|
41804d9869 | ||
|
|
293288286b | ||
|
|
a77765b1e9 | ||
|
|
2453d7841a | ||
|
|
a0945be721 | ||
|
|
84e40ccb2b | ||
|
|
a868f6d2f5 | ||
|
|
8b83c51014 | ||
|
|
bf7aacf984 | ||
|
|
5183f2591b | ||
|
|
b3308439bd | ||
|
|
719d210219 | ||
|
|
f810a3a0b1 | ||
|
|
db19ee80ac | ||
|
|
45623f33c5 | ||
|
|
08e204fe31 | ||
|
|
81f7b0595e | ||
|
|
4ed0e3a056 | ||
|
|
47a84b4dac | ||
|
|
c540d4b17f | ||
|
|
f1fa3250a4 | ||
|
|
707c00def2 | ||
|
|
78aff54360 | ||
|
|
6160fd7638 | ||
|
|
c345623a06 | ||
|
|
e9173796f5 | ||
|
|
2a0811863f | ||
|
|
4f610bbd1b | ||
|
|
104b2d145d | ||
|
|
f75787562c | ||
|
|
678c9090c7 | ||
|
|
21bb6a69c6 | ||
|
|
467ed5d53d | ||
|
|
d268088e60 | ||
|
|
1208d3f2a8 | ||
|
|
b5ba4f99d9 | ||
|
|
66f25603d3 | ||
|
|
4afd469404 | ||
|
|
9e5bc9c8d1 | ||
|
|
e41aff88b1 | ||
|
|
9209074332 | ||
|
|
39e5836edb | ||
|
|
85a4981700 | ||
|
|
247927e939 | ||
|
|
6523490d96 | ||
|
|
105a758e8d | ||
|
|
559ef48d6d | ||
|
|
255c3752f2 | ||
|
|
2bbf1e2b81 |
@@ -1,6 +1,6 @@
|
|||||||
# Related issues 🔗
|
# Related issues 🔗
|
||||||
|
|
||||||
Issue: #[Issue number here]
|
Closes #[Issue number here]
|
||||||
|
|
||||||
# Description ℹ️
|
# Description ℹ️
|
||||||
|
|
||||||
|
|||||||
@@ -82,3 +82,38 @@ jobs:
|
|||||||
https://${{ env.IPFS_V1 }}.ipfs.dweb.link/
|
https://${{ env.IPFS_V1 }}.ipfs.dweb.link/
|
||||||
https://${{ env.IPFS_V1 }}.ipfs.cf-ipfs.com/
|
https://${{ env.IPFS_V1 }}.ipfs.cf-ipfs.com/
|
||||||
ipfs://${{ env.IPFS_V0 }}/
|
ipfs://${{ env.IPFS_V0 }}/
|
||||||
|
|
||||||
|
- name: Ensure 'Released' label exists
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
REPO="${{ github.repository }}"
|
||||||
|
LABEL_EXIST=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
|
||||||
|
-H "Accept: application/vnd.github.v3+json" \
|
||||||
|
"https://api.github.com/repos/$REPO/labels/Released")
|
||||||
|
if [[ "$LABEL_EXIST" == *"Not Found"* ]]; then
|
||||||
|
curl -s -H "Authorization: token $GITHUB_TOKEN" \
|
||||||
|
-H "Accept: application/vnd.github.v3+json" \
|
||||||
|
-X POST "https://api.github.com/repos/$REPO/labels" \
|
||||||
|
-d '{"name": "Released", "color": "FFFFFF"}'
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Extract issues from release notes
|
||||||
|
id: extract-issues
|
||||||
|
run: |
|
||||||
|
ISSUES=$(echo "${{ github.event.release.body }}" | grep -o -E '#[0-9]+' | tr -d '#' | jq -R . | jq -cs .)
|
||||||
|
echo "Issues to label: $ISSUES"
|
||||||
|
echo "::set-output name=issue_numbers::$ISSUES"
|
||||||
|
|
||||||
|
- name: Add 'Released' label to issues
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
ISSUE_NUMBERS="${{ steps.extract-issues.outputs.issue_numbers }}"
|
||||||
|
REPO="${{ github.repository }}"
|
||||||
|
for ISSUE in $(echo "$ISSUE_NUMBERS" | jq -r '.[]'); do
|
||||||
|
curl -s -H "Authorization: token $GITHUB_TOKEN" \
|
||||||
|
-H "Accept: application/vnd.github.v3+json" \
|
||||||
|
-X POST "https://api.github.com/repos/$REPO/issues/$ISSUE/labels" \
|
||||||
|
-d '{"labels": ["Released"]}'
|
||||||
|
done
|
||||||
|
|||||||
@@ -5,15 +5,17 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- release/*
|
- release/*
|
||||||
- develop
|
- develop
|
||||||
|
- main
|
||||||
pull_request:
|
pull_request:
|
||||||
types:
|
types:
|
||||||
- opened
|
- opened
|
||||||
- ready_for_review
|
- ready_for_review
|
||||||
- reopened
|
- reopened
|
||||||
- edited
|
|
||||||
- synchronize
|
- synchronize
|
||||||
jobs:
|
jobs:
|
||||||
node-modules:
|
node-modules:
|
||||||
|
# All jobs depend on node_modules, so none should run if the PR is in draft
|
||||||
|
if: github.event.pull_request.draft == false
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
name: 'Cache yarn modules'
|
name: 'Cache yarn modules'
|
||||||
steps:
|
steps:
|
||||||
@@ -21,7 +23,6 @@ jobs:
|
|||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
||||||
|
|
||||||
- name: Cache node modules
|
- name: Cache node modules
|
||||||
id: cache
|
id: cache
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v3
|
||||||
@@ -39,23 +40,15 @@ jobs:
|
|||||||
node-version-file: '.nvmrc'
|
node-version-file: '.nvmrc'
|
||||||
# https://stackoverflow.com/questions/61010294/how-to-cache-yarn-packages-in-github-actions
|
# https://stackoverflow.com/questions/61010294/how-to-cache-yarn-packages-in-github-actions
|
||||||
cache: yarn
|
cache: yarn
|
||||||
|
|
||||||
- name: yarn install
|
- name: yarn install
|
||||||
if: steps.cache.outputs.cache-hit != 'true'
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
run: yarn install --pure-lockfile
|
run: yarn install --pure-lockfile
|
||||||
|
|
||||||
lint-pr-title:
|
lint-format:
|
||||||
needs: node-modules
|
timeout-minutes: 20
|
||||||
if: ${{ github.event_name == 'pull_request' }}
|
|
||||||
name: Verify PR title
|
|
||||||
uses: ./.github/workflows/lint-pr.yml
|
|
||||||
secrets: inherit
|
|
||||||
|
|
||||||
lint-test-build:
|
|
||||||
timeout-minutes: 60
|
|
||||||
needs: node-modules
|
needs: node-modules
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
name: '(CI) lint + unit test + build'
|
name: '(CI) lint + format check'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
@@ -81,6 +74,76 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
main-branch-name: develop
|
main-branch-name: develop
|
||||||
|
|
||||||
|
- name: Check formatting
|
||||||
|
run: yarn nx format:check
|
||||||
|
|
||||||
|
- name: Lint affected
|
||||||
|
run: yarn nx affected:lint --max-warnings=0
|
||||||
|
|
||||||
|
- name: Build affected spec
|
||||||
|
run: yarn nx affected --target=build-spec
|
||||||
|
|
||||||
|
test-affected:
|
||||||
|
timeout-minutes: 30
|
||||||
|
needs: build-sources
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
name: 'run unit test of affected apps'
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
||||||
|
|
||||||
|
- name: Setup node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
cache: yarn
|
||||||
|
|
||||||
|
- name: Cache node modules
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: node_modules
|
||||||
|
key: ${{ runner.os }}-cache-node-modules-${{ hashFiles('yarn.lock') }}
|
||||||
|
|
||||||
|
- name: Derive appropriate SHAs for base and head for `nx affected` commands
|
||||||
|
uses: nrwl/nx-set-shas@v3
|
||||||
|
with:
|
||||||
|
main-branch-name: develop
|
||||||
|
|
||||||
|
- name: Test affected
|
||||||
|
run: yarn nx affected:test
|
||||||
|
|
||||||
|
build-sources:
|
||||||
|
timeout-minutes: 30
|
||||||
|
needs: lint-format
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
name: 'Build sources of affected apps'
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
||||||
|
|
||||||
|
- name: Setup node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
cache: yarn
|
||||||
|
|
||||||
|
- name: Cache node modules
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: node_modules
|
||||||
|
key: ${{ runner.os }}-cache-node-modules-${{ hashFiles('yarn.lock') }}
|
||||||
|
|
||||||
|
- name: Derive appropriate SHAs for base and head for `nx affected` commands
|
||||||
|
uses: nrwl/nx-set-shas@v3
|
||||||
|
with:
|
||||||
|
main-branch-name: develop
|
||||||
|
|
||||||
# See affected apps
|
# See affected apps
|
||||||
- name: See affected apps
|
- name: See affected apps
|
||||||
run: |
|
run: |
|
||||||
@@ -97,21 +160,8 @@ jobs:
|
|||||||
echo "preview_explorer: ${{ env.PREVIEW_EXPLORER }}"
|
echo "preview_explorer: ${{ env.PREVIEW_EXPLORER }}"
|
||||||
echo "preview_tools: ${{ env.PREVIEW_TOOLS }}"
|
echo "preview_tools: ${{ env.PREVIEW_TOOLS }}"
|
||||||
|
|
||||||
- name: Check formatting
|
|
||||||
run: yarn nx format:check
|
|
||||||
|
|
||||||
- name: Lint affected
|
|
||||||
run: yarn nx affected:lint --max-warnings=0
|
|
||||||
|
|
||||||
- name: Build affected spec
|
|
||||||
run: yarn nx affected --target=build-spec
|
|
||||||
|
|
||||||
- name: Test affected
|
|
||||||
run: yarn nx affected:test
|
|
||||||
|
|
||||||
- name: Build affected
|
- name: Build affected
|
||||||
run: yarn nx affected:build || (yarn install && yarn nx affected:build)
|
run: yarn nx affected:build || (yarn install && yarn nx affected:build)
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
projects: ${{ env.PROJECTS }}
|
projects: ${{ env.PROJECTS }}
|
||||||
projects-e2e: ${{ env.PROJECTS_E2E }}
|
projects-e2e: ${{ env.PROJECTS_E2E }}
|
||||||
@@ -120,39 +170,62 @@ jobs:
|
|||||||
preview_explorer: ${{ env.PREVIEW_EXPLORER }}
|
preview_explorer: ${{ env.PREVIEW_EXPLORER }}
|
||||||
preview_tools: ${{ env.PREVIEW_TOOLS }}
|
preview_tools: ${{ env.PREVIEW_TOOLS }}
|
||||||
|
|
||||||
console-e2e:
|
check-e2e-needed:
|
||||||
needs: lint-test-build
|
runs-on: ubuntu-latest
|
||||||
name: '(CI) console python'
|
needs: build-sources
|
||||||
uses: ./.github/workflows/console-test-run.yml
|
name: '(CI) check if e2e needed'
|
||||||
secrets: inherit
|
outputs:
|
||||||
if: ${{ contains(fromJSON(needs.lint-test-build.outputs.projects), 'trading') && github.event_name == 'pull_request' }}
|
run-tests: ${{ steps.check-test.outputs.e2e-needed }}
|
||||||
with:
|
steps:
|
||||||
github-sha: ${{ github.event.pull_request.head.sha || github.sha }}
|
- name: Check branch
|
||||||
|
id: check-test
|
||||||
|
run: |
|
||||||
|
if [[ "${{ github.base_ref }}" == "develop" ]]; then
|
||||||
|
echo "e2e-needed=true" >> $GITHUB_OUTPUT
|
||||||
|
elif [[ "${{ github.base_ref }}" == "main" ]]; then
|
||||||
|
echo "e2e-needed=true" >> $GITHUB_OUTPUT
|
||||||
|
elif [[ "${{ github.event_name }}" == "push" && "${{ github.ref_name }}" == *"release/"* ]]; then
|
||||||
|
echo "e2e-needed=true" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "e2e-needed=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
- name: Print result
|
||||||
|
run: |
|
||||||
|
echo "e2e-needed: ${{ steps.check-test.outputs.e2e-needed }}"
|
||||||
|
|
||||||
cypress:
|
cypress:
|
||||||
needs: lint-test-build
|
needs: [build-sources, check-e2e-needed]
|
||||||
name: '(CI) cypress'
|
name: '(CI) cypress'
|
||||||
# if: ${{ needs.lint-test-build.outputs.projects-e2e != '[]' }}
|
if: ${{ needs.check-e2e-needed.outputs.run-tests == 'true' }}
|
||||||
uses: ./.github/workflows/cypress-run.yml
|
uses: ./.github/workflows/cypress-run.yml
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
with:
|
with:
|
||||||
projects: ${{ needs.lint-test-build.outputs.projects-e2e }}
|
projects: ${{ needs.build-sources.outputs.projects-e2e }}
|
||||||
tags: '@smoke'
|
tags: '@smoke'
|
||||||
|
|
||||||
|
console-e2e:
|
||||||
|
needs: [build-sources, check-e2e-needed]
|
||||||
|
name: '(CI) console python'
|
||||||
|
uses: ./.github/workflows/console-test-run.yml
|
||||||
|
secrets: inherit
|
||||||
|
if: needs.check-e2e-needed.outputs.run-tests == 'true' && contains(needs.build-sources.outputs.projects, 'trading')
|
||||||
|
with:
|
||||||
|
github-sha: ${{ github.event.pull_request.head.sha || github.sha }}
|
||||||
|
|
||||||
publish-dist:
|
publish-dist:
|
||||||
needs: lint-test-build
|
needs: build-sources
|
||||||
name: '(CD) publish dist'
|
name: '(CD) publish dist'
|
||||||
if: ${{ (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == 'vegaprotocol/frontend-monorepo') || github.event_name == 'push' }}
|
if: ${{ (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == 'vegaprotocol/frontend-monorepo') || github.event_name == 'push' }}
|
||||||
uses: ./.github/workflows/publish-dist.yml
|
uses: ./.github/workflows/publish-dist.yml
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
with:
|
with:
|
||||||
projects: ${{ needs.lint-test-build.outputs.projects }}
|
projects: ${{ needs.build-sources.outputs.projects }}
|
||||||
|
|
||||||
dist-check:
|
dist-check:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs:
|
needs:
|
||||||
- publish-dist
|
- publish-dist
|
||||||
- lint-test-build
|
- build-sources
|
||||||
if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == 'vegaprotocol/frontend-monorepo' }}
|
if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == 'vegaprotocol/frontend-monorepo' }}
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
name: '(CD) comment preview links'
|
name: '(CD) comment preview links'
|
||||||
@@ -168,27 +241,27 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
# https://stackoverflow.com/questions/3183444/check-for-valid-link-url
|
# https://stackoverflow.com/questions/3183444/check-for-valid-link-url
|
||||||
regex='(https?|ftp|file)://[-[:alnum:]\+&@#/%?=~_|!:,.;]*[-[:alnum:]\+&@#/%=~_|]'
|
regex='(https?|ftp|file)://[-[:alnum:]\+&@#/%?=~_|!:,.;]*[-[:alnum:]\+&@#/%=~_|]'
|
||||||
if [[ "${{ needs.lint-test-build.outputs.preview_governance }}" =~ $regex ]]; then
|
if [[ "${{ needs.build-sources.outputs.preview_governance }}" =~ $regex ]]; then
|
||||||
until curl --insecure --location --fail "${{ needs.lint-test-build.outputs.preview_governance }}"; do
|
until curl --insecure --location --fail "${{ needs.build-sources.outputs.preview_governance }}"; do
|
||||||
echo "waiting for governance preview: ${{ needs.lint-test-build.outputs.preview_governance }}"
|
echo "waiting for governance preview: ${{ needs.build-sources.outputs.preview_governance }}"
|
||||||
sleep 5
|
sleep 5
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
if [[ "${{ needs.lint-test-build.outputs.preview_explorer }}" =~ $regex ]]; then
|
if [[ "${{ needs.build-sources.outputs.preview_explorer }}" =~ $regex ]]; then
|
||||||
until curl --insecure --location --fail "${{ needs.lint-test-build.outputs.preview_explorer }}"; do
|
until curl --insecure --location --fail "${{ needs.build-sources.outputs.preview_explorer }}"; do
|
||||||
echo "waiting for explorer preview: ${{ needs.lint-test-build.outputs.preview_explorer }}"
|
echo "waiting for explorer preview: ${{ needs.build-sources.outputs.preview_explorer }}"
|
||||||
sleep 5
|
sleep 5
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
if [[ "${{ needs.lint-test-build.outputs.preview_trading }}" =~ $regex ]]; then
|
if [[ "${{ needs.build-sources.outputs.preview_trading }}" =~ $regex ]]; then
|
||||||
until curl --insecure --location --fail "${{ needs.lint-test-build.outputs.preview_trading }}"; do
|
until curl --insecure --location --fail "${{ needs.build-sources.outputs.preview_trading }}"; do
|
||||||
echo "waiting for trading preview: ${{ needs.lint-test-build.outputs.preview_trading }}"
|
echo "waiting for trading preview: ${{ needs.build-sources.outputs.preview_trading }}"
|
||||||
sleep 5
|
sleep 5
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
if [[ "${{ needs.lint-test-build.outputs.preview_tools }}" =~ $regex ]]; then
|
if [[ "${{ needs.build-sources.outputs.preview_tools }}" =~ $regex ]]; then
|
||||||
until curl --insecure --location --fail "${{ needs.lint-test-build.outputs.preview_tools }}"; do
|
until curl --insecure --location --fail "${{ needs.build-sources.outputs.preview_tools }}"; do
|
||||||
echo "waiting for tools preview: ${{ needs.lint-test-build.outputs.preview_tools }}"
|
echo "waiting for tools preview: ${{ needs.build-sources.outputs.preview_tools }}"
|
||||||
sleep 5
|
sleep 5
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
@@ -200,10 +273,10 @@ jobs:
|
|||||||
issue-number: ${{ github.event.pull_request.number }}
|
issue-number: ${{ github.event.pull_request.number }}
|
||||||
body: |
|
body: |
|
||||||
Previews
|
Previews
|
||||||
* governance: ${{ needs.lint-test-build.outputs.preview_governance }}
|
* governance: ${{ needs.build-sources.outputs.preview_governance }}
|
||||||
* explorer: ${{ needs.lint-test-build.outputs.preview_explorer }}
|
* explorer: ${{ needs.build-sources.outputs.preview_explorer }}
|
||||||
* trading: ${{ needs.lint-test-build.outputs.preview_trading }}
|
* trading: ${{ needs.build-sources.outputs.preview_trading }}
|
||||||
* tools: ${{ needs.lint-test-build.outputs.preview_tools }}
|
* tools: ${{ needs.build-sources.outputs.preview_tools }}
|
||||||
|
|
||||||
# Report single result at the end, to avoid mess with required checks in PR
|
# Report single result at the end, to avoid mess with required checks in PR
|
||||||
cypress-check:
|
cypress-check:
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#managing-caches
|
||||||
|
name: cleanup caches by a branch
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- closed
|
||||||
|
jobs:
|
||||||
|
cleanup:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Cleanup
|
||||||
|
run: |
|
||||||
|
gh extension install actions/gh-actions-cache
|
||||||
|
|
||||||
|
echo "Fetching list of cache key"
|
||||||
|
cacheKeysForPR=$(gh actions-cache list -R $REPO -B $BRANCH -L 100 | cut -f 1 )
|
||||||
|
|
||||||
|
## Setting this to not fail the workflow while deleting cache keys.
|
||||||
|
set +e
|
||||||
|
echo "Deleting caches..."
|
||||||
|
for cacheKey in $cacheKeysForPR
|
||||||
|
do
|
||||||
|
gh actions-cache delete $cacheKey -R $REPO -B $BRANCH --confirm
|
||||||
|
done
|
||||||
|
echo "Done"
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
REPO: ${{ github.repository }}
|
||||||
|
BRANCH: refs/pull/${{ github.event.pull_request.number }}/merge
|
||||||
@@ -6,23 +6,37 @@ on:
|
|||||||
github-sha:
|
github-sha:
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
console-test-branch:
|
||||||
|
type: choice
|
||||||
|
description: 'main: v0.72.14, develop: v0.73.0-preview7'
|
||||||
|
options:
|
||||||
|
- main
|
||||||
|
- develop
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
run-tests:
|
create-docker-image:
|
||||||
name: run-tests
|
name: Create docker image for console-test
|
||||||
runs-on: 8-cores
|
runs-on: ubuntu-22.04
|
||||||
timeout-minutes: 20
|
timeout-minutes: 20
|
||||||
steps:
|
steps:
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
# check-out frontend-monorepo
|
# check-out frontend-monorepo
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
- name: Checkout console test repo
|
- name: Checkout frontend-monorepo
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
ref: ${{ inputs.github-sha }}
|
ref: ${{ inputs.github-sha || github.sha }}
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
# cache node modules
|
# cache node modules
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
|
- name: setup node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: '16'
|
||||||
|
cache: yarn
|
||||||
|
|
||||||
- name: Cache node modules
|
- name: Cache node modules
|
||||||
id: cache
|
id: cache
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v3
|
||||||
@@ -33,15 +47,6 @@ jobs:
|
|||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-cache-node-modules-
|
${{ runner.os }}-cache-node-modules-
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
# setup node
|
|
||||||
#----------------------------------------------
|
|
||||||
- name: Setup node
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version-file: '.nvmrc'
|
|
||||||
# https://stackoverflow.com/questions/61010294/how-to-cache-yarn-packages-in-github-actions
|
|
||||||
cache: yarn
|
|
||||||
#----------------------------------------------
|
|
||||||
# install deps if cache missing
|
# install deps if cache missing
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
- name: yarn install
|
- name: yarn install
|
||||||
@@ -50,23 +55,105 @@ jobs:
|
|||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
# build trading
|
# build trading
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
- name: Build affected spec
|
- name: Build trading app
|
||||||
run: |
|
run: |
|
||||||
yarn env-cmd -f ./apps/trading/.env.stagnet1 yarn nx export trading
|
yarn env-cmd -f ./apps/trading/.env.stagnet1 yarn nx export trading
|
||||||
|
DIST_LOCATION=dist/apps/trading/exported
|
||||||
|
mv $DIST_LOCATION dist-result
|
||||||
|
tree dist-result
|
||||||
|
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
# run trading server
|
# export trading app docker image
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
- name: Run trading server
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Build and export to local Docker
|
||||||
|
id: docker_build
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: docker/node-outside-docker.Dockerfile
|
||||||
|
load: true
|
||||||
|
build-args: |
|
||||||
|
APP=trading
|
||||||
|
ENV_NAME=stagnet1
|
||||||
|
tags: ci/trading:local
|
||||||
|
outputs: type=docker,dest=/tmp/console-image.tar
|
||||||
|
|
||||||
|
- name: Verify docker image created
|
||||||
run: |
|
run: |
|
||||||
docker run -d -p 80:4200 -v $PWD/docker/nginx.conf:/etc/nginx/conf.d/default.conf -v $PWD/dist/apps/trading/exported:/usr/share/nginx/html nginx:1.23-alpine@sha256:6318314189b40e73145a48060bff4783a116c34cc7241532d0d94198fb2c9629
|
echo ${{ steps.docker_build.outputs.digest }}
|
||||||
sleep 5
|
echo ${{ steps.docker_build.outputs.imageid }}
|
||||||
docker ps
|
|
||||||
#----------------------------------------------
|
- name: Upload docker image for console-test usage
|
||||||
# check if container persists between runs
|
uses: actions/upload-artifact@v3
|
||||||
#----------------------------------------------
|
with:
|
||||||
- name: Check server
|
name: console-image
|
||||||
|
path: /tmp/console-image.tar
|
||||||
|
|
||||||
|
console-test-branch:
|
||||||
|
name: Choose console-test branch to run on
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
timeout-minutes: 5
|
||||||
|
outputs:
|
||||||
|
console-branch: ${{ steps.output-step.outputs.branch }}
|
||||||
|
steps:
|
||||||
|
- name: Workflow dispatch input
|
||||||
|
id: dispatch-step
|
||||||
|
if: github.event_name == 'workflow_dispatch'
|
||||||
|
run: echo "branch=${{ inputs.console-test-branch }}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Print Workflow dispatch input
|
||||||
|
if: github.event_name == 'workflow_dispatch'
|
||||||
|
run: echo ${{ steps.dispatch-step.outputs.branch }}
|
||||||
|
|
||||||
|
- name: Workflow_call input
|
||||||
|
id: workflow_call-step
|
||||||
|
if: github.event_name != 'workflow_dispatch'
|
||||||
run: |
|
run: |
|
||||||
docker ps
|
if [[ "${{ github.base_ref }}" == "main" ]]; then
|
||||||
|
echo "branch=main" >> $GITHUB_OUTPUT
|
||||||
|
elif [[ "${{ github.base_ref }}" == "develop" && "${{ github.ref_name }}" == "main" ]]; then
|
||||||
|
echo "branch=main" >> $GITHUB_OUTPUT
|
||||||
|
elif [[ "${{ github.event_name }}" == "push" && "${{ github.ref_name }}" == *"release/mainnet"* ]]; then
|
||||||
|
echo "branch=main" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "branch=develop" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Print Workflow_call input
|
||||||
|
if: github.event_name != 'workflow_dispatch'
|
||||||
|
run: echo ${{ steps.workflow_call-step.outputs.branch }}
|
||||||
|
|
||||||
|
- name: Set output
|
||||||
|
id: output-step
|
||||||
|
run: echo "branch=${{ steps.dispatch-step.outputs.branch || steps.workflow_call-step.outputs.branch }}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Print final output
|
||||||
|
run: echo ${{ steps.output-step.outputs.branch }}
|
||||||
|
|
||||||
|
run-tests:
|
||||||
|
name: run-tests
|
||||||
|
runs-on: 8-cores
|
||||||
|
needs: [create-docker-image, console-test-branch]
|
||||||
|
timeout-minutes: 20
|
||||||
|
steps:
|
||||||
|
#----------------------------------------------
|
||||||
|
# load docker image
|
||||||
|
#----------------------------------------------
|
||||||
|
- name: Download docker image from previous job
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: console-image
|
||||||
|
path: /tmp
|
||||||
|
|
||||||
|
- name: Load Docker image
|
||||||
|
run: |
|
||||||
|
docker load --input /tmp/console-image.tar
|
||||||
|
docker image ls -a
|
||||||
|
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
# check-out tests repo
|
# check-out tests repo
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
@@ -74,15 +161,24 @@ jobs:
|
|||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
repository: vegaprotocol/console-test
|
repository: vegaprotocol/console-test
|
||||||
path: './console-test'
|
ref: ${{ needs.console-test-branch.outputs.console-branch }}
|
||||||
|
|
||||||
|
- name: Load console test envs
|
||||||
|
id: console-test-env
|
||||||
|
uses: falti/dotenv-action@v1.0.4
|
||||||
|
with:
|
||||||
|
path: '.env.${{ needs.console-test-branch.outputs.console-branch }}'
|
||||||
|
export-variables: true
|
||||||
|
keys-case: upper
|
||||||
|
log-variables: true
|
||||||
|
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
# set-up python
|
# ----- Setup python -----
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
- name: Set up python
|
- name: Setup Python
|
||||||
id: setup-python
|
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: '3.10.11'
|
python-version: '3.10'
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
# ----- install & configure poetry -----
|
# ----- install & configure poetry -----
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
@@ -91,45 +187,29 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
virtualenvs-create: true
|
virtualenvs-create: true
|
||||||
virtualenvs-in-project: true
|
virtualenvs-in-project: true
|
||||||
virtualenvs-path: console-test/.venv
|
virtualenvs-path: .venv
|
||||||
|
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
# load cached venv if cache exists
|
# install python dependencies
|
||||||
#----------------------------------------------
|
|
||||||
- name: Load cached venv
|
|
||||||
id: cached-poetry-dependencies
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: console-test/.venv
|
|
||||||
key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}
|
|
||||||
#----------------------------------------------
|
|
||||||
# install dependencies if cache does not exist
|
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
working-directory: ./console-test
|
|
||||||
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'
|
|
||||||
run: poetry install --no-interaction --no-root
|
run: poetry install --no-interaction --no-root
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
# install vega binaries
|
# install vega binaries
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
- name: Install vega binaries
|
- name: Install vega binaries
|
||||||
working-directory: ./console-test
|
run: poetry run python -m vega_sim.tools.load_binaries --force --version ${{ env.VEGA_VERSION }}
|
||||||
run: poetry run python -m vega_sim.tools.load_binaries --force
|
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
# install playwright
|
# install playwright
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
- name: install playwright
|
- name: install playwright
|
||||||
run: poetry run playwright install
|
run: poetry run playwright install --with-deps chromium
|
||||||
working-directory: ./console-test
|
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
# run tests
|
# run tests
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
working-directory: ./console-test
|
run: CONSOLE_IMAGE_NAME=ci/trading:local poetry run pytest -v -s --numprocesses 4 --dist loadfile --durations=15
|
||||||
run: poetry run pytest -v -s --numprocesses auto --dist loadfile --durations=20
|
|
||||||
- name: Check files
|
|
||||||
run: |
|
|
||||||
ls -al .
|
|
||||||
ls -al console-test
|
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
# upload traces
|
# upload traces
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
@@ -140,3 +220,13 @@ jobs:
|
|||||||
name: playwright-trace
|
name: playwright-trace
|
||||||
path: ./traces/
|
path: ./traces/
|
||||||
retention-days: 15
|
retention-days: 15
|
||||||
|
#----------------------------------------------
|
||||||
|
# ----- upload logs -----
|
||||||
|
#----------------------------------------------
|
||||||
|
- name: Upload worker logs
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
name: worker-logs
|
||||||
|
path: ./logs/
|
||||||
|
retention-days: 15
|
||||||
|
|||||||
@@ -13,13 +13,35 @@ on:
|
|||||||
type: string
|
type: string
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
runner-choice:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
runner: ${{ steps.step.outputs.runner }}
|
||||||
|
steps:
|
||||||
|
- name: Check branch
|
||||||
|
id: step
|
||||||
|
run: |
|
||||||
|
if [[ "${{ github.base_ref }}" == "main" ]]; then
|
||||||
|
echo "runner=mainnet-compatible-runner" >> $GITHUB_OUTPUT
|
||||||
|
elif [[ "${{ github.base_ref }}" == "develop" && "${{ github.ref_name }}" == "main" ]]; then
|
||||||
|
echo "runner=mainnet-compatible-runner" >> $GITHUB_OUTPUT
|
||||||
|
elif [[ "${{ github.event_name }}" == "push" && "${{ github.ref_name }}" == *"release/mainnet"* ]]; then
|
||||||
|
echo "runner=mainnet-compatible-runner" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "runner=self-hosted-runner" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Print runner
|
||||||
|
run: echo ${{ steps.step.outputs.runner }}
|
||||||
|
|
||||||
e2e:
|
e2e:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
project: ${{ fromJSON(inputs.projects) }}
|
project: ${{ fromJSON(inputs.projects) }}
|
||||||
name: ${{ matrix.project }}
|
name: ${{ matrix.project }}
|
||||||
runs-on: self-hosted-runner
|
needs: runner-choice
|
||||||
|
runs-on: ${{ needs.runner-choice.outputs.runner }}
|
||||||
timeout-minutes: 120
|
timeout-minutes: 120
|
||||||
steps:
|
steps:
|
||||||
# Checks if skip cache was requested
|
# Checks if skip cache was requested
|
||||||
@@ -37,6 +59,7 @@ jobs:
|
|||||||
|
|
||||||
# Restore node_modules from cache if possible
|
# Restore node_modules from cache if possible
|
||||||
- name: Restore node_modules from cache
|
- name: Restore node_modules from cache
|
||||||
|
id: cache-node-modules
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
@@ -46,6 +69,7 @@ jobs:
|
|||||||
|
|
||||||
# Install frontend dependencies
|
# Install frontend dependencies
|
||||||
- name: Install root dependencies
|
- name: Install root dependencies
|
||||||
|
if: steps.cache-node-modules.outputs.cache-hit != 'true'
|
||||||
run: yarn install --frozen-lockfile
|
run: yarn install --frozen-lockfile
|
||||||
working-directory: frontend-monorepo
|
working-directory: frontend-monorepo
|
||||||
|
|
||||||
@@ -61,13 +85,14 @@ jobs:
|
|||||||
- name: Run Vegacapsule network and Vega wallet
|
- name: Run Vegacapsule network and Vega wallet
|
||||||
id: setup-vega
|
id: setup-vega
|
||||||
uses: ./frontend-monorepo/.github/actions/run-vegacapsule
|
uses: ./frontend-monorepo/.github/actions/run-vegacapsule
|
||||||
|
timeout-minutes: 10
|
||||||
|
|
||||||
######
|
######
|
||||||
## Run some tests
|
## Run some tests
|
||||||
######
|
######
|
||||||
|
|
||||||
- name: Run Cypress tests
|
- name: Run Cypress tests
|
||||||
run: yarn nx run ${{ matrix.project }}:e2e ${{ env.SKIP_CACHE }} --browser chrome --env.grepTags="${{ inputs.tags }}"
|
run: yarn nx run ${{ matrix.project }}:e2e ${{ env.SKIP_CACHE }} --browser chrome --env.grepTags="${{ inputs.tags }}"
|
||||||
working-directory: frontend-monorepo
|
working-directory: frontend-monorepo
|
||||||
env:
|
env:
|
||||||
CYPRESS_SLACK_WEBHOOK: ${{ secrets.CYPRESS_SLACK_WEBHOOK }}
|
CYPRESS_SLACK_WEBHOOK: ${{ secrets.CYPRESS_SLACK_WEBHOOK }}
|
||||||
|
|||||||
@@ -2,7 +2,12 @@
|
|||||||
name: Verify PR title
|
name: Verify PR title
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_call:
|
pull_request:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- edited
|
||||||
|
- reopened
|
||||||
|
- synchronize
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint_pr:
|
lint_pr:
|
||||||
@@ -11,21 +16,16 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
|
||||||
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
||||||
|
|
||||||
- name: Setup node
|
- name: Setup node
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version-file: '.nvmrc'
|
node-version: 16
|
||||||
# https://stackoverflow.com/questions/61010294/how-to-cache-yarn-packages-in-github-actions
|
|
||||||
cache: yarn
|
|
||||||
|
|
||||||
- name: Cache node modules
|
- name: Install dependencies
|
||||||
uses: actions/cache@v3
|
run: |
|
||||||
with:
|
rm package.json
|
||||||
path: node_modules
|
npm install --no-save @commitlint/cli @commitlint/config-conventional @commitlint/config-nx-scopes nx
|
||||||
key: ${{ runner.os }}-cache-node-modules-${{ hashFiles('yarn.lock') }}
|
|
||||||
|
|
||||||
- name: Check PR title
|
- name: Check PR title
|
||||||
run: echo "${{ github.event.pull_request.title }}" | npx commitlint --config ./commitlint.config-ci.js
|
run: echo "${{ github.event.pull_request.title }}" | npx commitlint --config ./commitlint.config-ci.js
|
||||||
|
|||||||
@@ -30,12 +30,18 @@ jobs:
|
|||||||
echo IS_IPFS_RELEASE=false >> $GITHUB_ENV
|
echo IS_IPFS_RELEASE=false >> $GITHUB_ENV
|
||||||
echo IS_S3_RELEASE=false >> $GITHUB_ENV
|
echo IS_S3_RELEASE=false >> $GITHUB_ENV
|
||||||
echo IS_DEV_IMAGE=false >> $GITHUB_ENV
|
echo IS_DEV_IMAGE=false >> $GITHUB_ENV
|
||||||
|
echo IS_MAIN_IMAGE=false >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Is dev image
|
- name: Is dev image
|
||||||
if: ${{ contains(github.ref, 'develop') && github.event_name == 'push' && matrix.app == 'trading' }}
|
if: ${{ github.ref_name == 'develop' && github.event_name == 'push' && matrix.app == 'trading' }}
|
||||||
run: |
|
run: |
|
||||||
echo IS_DEV_IMAGE=true >> $GITHUB_ENV
|
echo IS_DEV_IMAGE=true >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Is main image
|
||||||
|
if: ${{ github.ref_name == 'main' && github.event_name == 'push' && matrix.app == 'trading' }}
|
||||||
|
run: |
|
||||||
|
echo IS_MAIN_IMAGE=true >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Is PR
|
- name: Is PR
|
||||||
if: ${{ github.event_name == 'pull_request' }}
|
if: ${{ github.event_name == 'pull_request' }}
|
||||||
run: |
|
run: |
|
||||||
@@ -57,7 +63,7 @@ jobs:
|
|||||||
echo IS_IPFS_RELEASE=true >> $GITHUB_ENV
|
echo IS_IPFS_RELEASE=true >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Is S3 Release
|
- name: Is S3 Release
|
||||||
if: ${{ env.IS_IPFS_RELEASE == 'false' && github.event_name == 'push' }}
|
if: ${{ env.IS_IPFS_RELEASE == 'false' && github.event_name == 'push' && github.ref_name != 'main'}}
|
||||||
run: |
|
run: |
|
||||||
echo IS_S3_RELEASE=true >> $GITHUB_ENV
|
echo IS_S3_RELEASE=true >> $GITHUB_ENV
|
||||||
|
|
||||||
@@ -81,7 +87,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Log in to the Container registry (docker hub)
|
- name: Log in to the Container registry (docker hub)
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v2
|
||||||
if: ${{ env.IS_IPFS_RELEASE == 'true' || env.IS_DEV_IMAGE == 'true' }}
|
if: ${{ env.IS_IPFS_RELEASE == 'true' || env.IS_DEV_IMAGE == 'true' || env.IS_MAIN_IMAGE == 'true' }}
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
@@ -155,10 +161,10 @@ jobs:
|
|||||||
- name: Sanity check docker image
|
- name: Sanity check docker image
|
||||||
run: |
|
run: |
|
||||||
echo "Check ipfs-hash"
|
echo "Check ipfs-hash"
|
||||||
docker run --rm ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local cat /ipfs-hash
|
docker run --rm ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local /bin/sh -c 'cat /ipfs-hash'
|
||||||
docker run --rm ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local cat /ipfs-hash > ${{ matrix.app }}-ipfs-hash
|
docker run --rm ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local /bin/sh -c 'cat /ipfs-hash' > ${{ matrix.app }}-ipfs-hash
|
||||||
echo "List html directory"
|
echo "List html directory"
|
||||||
docker run --rm ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local sh -c 'apk add --update tree; tree /usr/share/nginx/html'
|
docker run --rm ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local /bin/sh -c 'apk add --update tree; tree /usr/share/nginx/html'
|
||||||
|
|
||||||
- name: Publish dist as docker image (ghcr)
|
- name: Publish dist as docker image (ghcr)
|
||||||
uses: docker/build-push-action@v3
|
uses: docker/build-push-action@v3
|
||||||
@@ -179,7 +185,7 @@ jobs:
|
|||||||
uses: docker/build-push-action@v3
|
uses: docker/build-push-action@v3
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
id: dockerhub-push
|
id: dockerhub-push
|
||||||
if: ${{ env.IS_IPFS_RELEASE == 'true' || env.IS_DEV_IMAGE == 'true' }}
|
if: ${{ env.IS_IPFS_RELEASE == 'true' || env.IS_DEV_IMAGE == 'true' || env.IS_MAIN_IMAGE == 'true' }}
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: docker/node-outside-docker.Dockerfile
|
file: docker/node-outside-docker.Dockerfile
|
||||||
@@ -189,7 +195,7 @@ jobs:
|
|||||||
ENV_NAME=${{ env.ENV_NAME }}
|
ENV_NAME=${{ env.ENV_NAME }}
|
||||||
tags: |
|
tags: |
|
||||||
vegaprotocol/${{ matrix.app }}:${{ github.sha }}
|
vegaprotocol/${{ matrix.app }}:${{ github.sha }}
|
||||||
vegaprotocol/${{ matrix.app }}:${{ env.IS_MAINNET_RELEASE == 'true' && 'mainnet' || env.IS_TESTNET_RELEASE == 'true' && 'testnet' || env.IS_DEV_IMAGE == 'true' && 'develop' || '' }}
|
vegaprotocol/${{ matrix.app }}:${{ env.IS_MAINNET_RELEASE == 'true' && 'mainnet' || env.IS_TESTNET_RELEASE == 'true' && 'testnet' || env.IS_DEV_IMAGE == 'true' && 'develop' || env.IS_MAIN_IMAGE == 'true' && 'main' || '' }}
|
||||||
|
|
||||||
- name: Publish dist as docker image (ghcr - retry)
|
- name: Publish dist as docker image (ghcr - retry)
|
||||||
uses: docker/build-push-action@v3
|
uses: docker/build-push-action@v3
|
||||||
@@ -216,7 +222,7 @@ jobs:
|
|||||||
ENV_NAME=${{ env.ENV_NAME }}
|
ENV_NAME=${{ env.ENV_NAME }}
|
||||||
tags: |
|
tags: |
|
||||||
vegaprotocol/${{ matrix.app }}:${{ github.sha }}
|
vegaprotocol/${{ matrix.app }}:${{ github.sha }}
|
||||||
vegaprotocol/${{ matrix.app }}:${{ env.IS_MAINNET_RELEASE == 'true' && 'mainnet' || env.IS_TESTNET_RELEASE == 'true' && 'testnet' || '' }}
|
vegaprotocol/${{ matrix.app }}:${{ env.IS_MAINNET_RELEASE == 'true' && 'mainnet' || env.IS_TESTNET_RELEASE == 'true' && 'testnet' || env.IS_DEV_IMAGE == 'true' && 'develop' || env.IS_MAIN_IMAGE == 'true' && 'main' || '' }}
|
||||||
|
|
||||||
# bucket creation in github.com/vegaprotocol/terraform//frontend
|
# bucket creation in github.com/vegaprotocol/terraform//frontend
|
||||||
- name: Publish dist to s3
|
- name: Publish dist to s3
|
||||||
@@ -329,7 +335,9 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# create commit
|
# create commit
|
||||||
commit_msg="Automated hash update from ${{ github.ref }}"
|
if ! git diff --cached --exit-code; then
|
||||||
git commit -m "$commit_msg"
|
commit_msg="Automated hash update from ${{ github.ref }}"
|
||||||
git push -u origin "main"
|
git commit -m "$commit_msg"
|
||||||
|
git push -u origin "main"
|
||||||
|
fi
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -3,6 +3,3 @@
|
|||||||
|
|
||||||
# Lint commit messages to ensure they follow conventional commit standards
|
# Lint commit messages to ensure they follow conventional commit standards
|
||||||
yarn commitlint --edit "${1}"
|
yarn commitlint --edit "${1}"
|
||||||
|
|
||||||
# Lint all staged files
|
|
||||||
yarn lint-staged
|
|
||||||
|
|||||||
Executable
+5
@@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
. "$(dirname "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
# Lint all staged files
|
||||||
|
yarn lint-staged
|
||||||
Executable
+8
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
. "$(dirname "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
# Lint all staged files
|
||||||
|
yarn nx format:check
|
||||||
|
|
||||||
|
# Test all projects with changes
|
||||||
|
yarn nx affected -t test --exclude trading
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
* @vegaprotocol/frontend
|
* @vegaprotocol/frontend
|
||||||
|
* @vegaprotocol/frontend-qa
|
||||||
*.graphql @vegaprotocol/core
|
*.graphql @vegaprotocol/core
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ recalculate-ipfs:
|
|||||||
echo "ipfs hash inside the image"
|
echo "ipfs hash inside the image"
|
||||||
docker run --rm ${TAG} cat /ipfs-hash
|
docker run --rm ${TAG} cat /ipfs-hash
|
||||||
echo "recalculating ipfs hash"
|
echo "recalculating ipfs hash"
|
||||||
docker run --rm ${TAG} ipfs add -r /usr/share/nginx/html
|
docker run --rm ${TAG} ipfs add -rQ /usr/share/nginx/html
|
||||||
|
|
||||||
.PHONY: eject-ipfs-hash
|
.PHONY: eject-ipfs-hash
|
||||||
unpack:
|
unpack:
|
||||||
|
|||||||
@@ -113,13 +113,47 @@ In order to run a container on port 3000:
|
|||||||
docker run -p 3000:80 [TAG]
|
docker run -p 3000:80 [TAG]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
On top of that there are two possible scenarios for running docker image - using nginx server (default) of ipfs daemon.
|
||||||
|
|
||||||
|
to run ipfs on port 3000:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -p 3000:80 [TAG] /run-ipfs.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
to run nginx on port 3000:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -p 3000:80 [TAG]
|
||||||
|
```
|
||||||
|
|
||||||
## Build instructions
|
## Build instructions
|
||||||
|
|
||||||
The [`docker`](./docker) subfolder has some docker configurations for easily setting up your own hosted version of console either for the web, or ready for pinning on IPFS
|
The [`docker`](./docker) subfolder has some docker configurations for easily setting up your own hosted version of Console either for the web, or ready for pinning on IPFS.
|
||||||
|
|
||||||
|
### nx build inside the docker
|
||||||
|
|
||||||
|
Using multistage dockerfile dist is compiled using [node](https://hub.docker.com/_/node) image and later packed to nginx as in [dist build](#dist-build). The multistage builds ensures consistent CPU architecture and build toolchains are used so that the result will be identical.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker build --build-arg APP=[YOUR APP] --build-arg NODE_VERSION=16.5.1 --build-arg ENV_NAME=mainnet -t [TAG] -f docker/node-inside-docker.Dockerfile .
|
||||||
|
```
|
||||||
|
|
||||||
|
### Computing ipfs-hash of the build
|
||||||
|
|
||||||
|
At the moment this feature is important only for Console releases.
|
||||||
|
|
||||||
|
Each docker build finishes with hash calculation for ` dist`` directory. Resulting hash is added to file named as `/ipfs-hash`. Once docker image is produced you can run following commad to display ipfs-hash:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make recalculate-ipfs TAG=vegaprotocol/trading:{YOUR_VERSION}
|
||||||
|
```
|
||||||
|
|
||||||
|
**updating hash:** recompiling dist directory (even if there are no changed to source code) results in different hash computed by ipfs command.
|
||||||
|
|
||||||
### nx build outside the docker
|
### nx build outside the docker
|
||||||
|
|
||||||
Packaging prepared dist into [`nginx`](https://hub.docker.com/_/nginx)([server configuration](./nginx/nginx.conf)) docker image involves building the application on docker host machine from source.
|
This Docker image packages a pre-built `dist` folder into an [`nginx`](https://hub.docker.com/_/nginx)([server configuration](./nginx/nginx.conf)) docker image. In this case, the application on docker host machine from source.
|
||||||
|
|
||||||
As a prerequisite you need to perform build of `dist` directory and move its content for specific application to `dist-result` directory. Use following script to do it with a single command:
|
As a prerequisite you need to perform build of `dist` directory and move its content for specific application to `dist-result` directory. Use following script to do it with a single command:
|
||||||
|
|
||||||
@@ -130,41 +164,21 @@ As a prerequisite you need to perform build of `dist` directory and move its con
|
|||||||
You can build any of the containers locally with the following command:
|
You can build any of the containers locally with the following command:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker build --dockerfile docker/node-outside-docker.Dockerfile . --tag=[TAG]
|
docker build -f docker/node-outside-docker.Dockerfile . --tag=[TAG]
|
||||||
```
|
```
|
||||||
|
|
||||||
### nx build inside the docker
|
|
||||||
|
|
||||||
Using multistage dockerfile dist is compiled using [node](https://hub.docker.com/_/node) image and later packed to nginx as in [dist build](#dist-build) example.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker build --build-arg APP=[YOUR APP] --build-arg NODE_VERSION=$(cat .nvmrc) --build-arg ENV_NAME=mainnet -t [TAG] -f docker/node-inside-docker.Dockerfile .
|
|
||||||
```
|
|
||||||
|
|
||||||
### Computing ipfs-hash of the build
|
|
||||||
|
|
||||||
At the moment this feature is important only for `trading` (console) releases.
|
|
||||||
|
|
||||||
Each docker build finishes with hash calculation for dist directory. Resulting hash is added to file named as `/ipfs-hash`. Once docker image is produced you can run following commad to display ipfs-hash:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
make recalculate-ipfs TAG=vegaprotocol/trading:{YOUR_VERSION}
|
|
||||||
```
|
|
||||||
|
|
||||||
**updating hash:** recompiling dist directory (even if there are no changed to source code) results in different hash computed by ipfs command.
|
|
||||||
|
|
||||||
### Verifying ipfs-hash of existing current application version
|
### Verifying ipfs-hash of existing current application version
|
||||||
|
|
||||||
An IPFS CID will be attached to every [release](https://github.com/vegaprotocol/frontend-monorepo/releases). If you are intending to pin an application on IPFS, you can check that your build matches by running the following steps:
|
An IPFS CID will be attached to every [release](https://github.com/vegaprotocol/frontend-monorepo/releases). If you are intending to pin an application on IPFS, you can check that your build matches by running the following steps:
|
||||||
|
|
||||||
1. Show latest release by runnning: `make latest-release`. You need to configure [`gh`](https://cli.github.com/) for this step to work, otherwise please provide release manually from [github](https://github.com/vegaprotocol/frontend-monorepo/releases) or [dockerhub](https://hub.docker.com/r/vegaprotocol/trading)
|
1. Show latest release by running: `make latest-release`. You need to configure [`gh`](https://cli.github.com/) for this step to work, otherwise please provide release manually from [github](https://github.com/vegaprotocol/frontend-monorepo/releases) or [dockerhub](https://hub.docker.com/r/vegaprotocol/trading)
|
||||||
2. Set RELEASE environment variable to value that you want to validate: `export RELEASE=$(make latest-release)` or `export RELEASE=vXX.XX.XX`
|
2. Set RELEASE environment variable to value that you want to validate: `export RELEASE=$(make latest-release)` or `export RELEASE=vXX.XX.XX`
|
||||||
3. Set TAG environment variable to image that you want to validate: `export TAG=vegaprotocol/trading:$RELEASE`
|
3. Set TAG environment variable to image that you want to validate: `export TAG=vegaprotocol/trading:$RELEASE`
|
||||||
4. Download docker image with the desired release `docker pull $TAG`.
|
4. Download docker image with the desired release `docker pull $TAG`.
|
||||||
5. Recalculate hash: `make recalculate-ipfs`
|
5. Recalculate hash: `make recalculate-ipfs`
|
||||||
6. You should see exactly same hash produced by ipfs command as one placed with the release notes: `make show-latest-release`
|
6. You should see exactly same hash produced by ipfs command as one placed with the release notes: `make show-latest-release`
|
||||||
7. If you want to extract dist from docker image to your local filesystem you can run following command: `make unpack`
|
7. If you want to extract dist from docker image to your local filesystem you can run following command: `make unpack`
|
||||||
8. Now `dist` directory contains valid application build. **it is not possible to calculate same ipfs hash on files that are result of copy operation**
|
8. Now `dist` directory contains valid application build
|
||||||
|
|
||||||
## Config
|
## Config
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ NX_TENDERMINT_WEBSOCKET_URL=wss://n04.d.vega.xyz/tm/websocket
|
|||||||
NX_VEGA_URL=https://api.n04.d.vega.xyz/graphql
|
NX_VEGA_URL=https://api.n04.d.vega.xyz/graphql
|
||||||
NX_VEGA_ENV=DEVNET
|
NX_VEGA_ENV=DEVNET
|
||||||
NX_BLOCK_EXPLORER=https://be.devnet1.vega.xyz/rest
|
NX_BLOCK_EXPLORER=https://be.devnet1.vega.xyz/rest
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|
||||||
|
|
||||||
# App flags
|
# App flags
|
||||||
NX_EXPLORER_ASSETS=1
|
NX_EXPLORER_ASSETS=1
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ NX_TENDERMINT_WEBSOCKET_URL=wss://mainnet-observer-proxy01.ops.vega.xyz/websocke
|
|||||||
NX_VEGA_URL=https://api.vega.community/graphql
|
NX_VEGA_URL=https://api.vega.community/graphql
|
||||||
NX_VEGA_ENV=MAINNET
|
NX_VEGA_ENV=MAINNET
|
||||||
NX_BLOCK_EXPLORER=https://be.explorer.vega.xyz/rest
|
NX_BLOCK_EXPLORER=https://be.explorer.vega.xyz/rest
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|
||||||
# App flags
|
# App flags
|
||||||
NX_EXPLORER_ASSETS=1
|
NX_EXPLORER_ASSETS=1
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ NX_TENDERMINT_WEBSOCKET_URL=wss://lb.testnet.vega.xyz/tm/websocket
|
|||||||
NX_VEGA_URL=https://api.n07.testnet.vega.xyz/graphql
|
NX_VEGA_URL=https://api.n07.testnet.vega.xyz/graphql
|
||||||
NX_VEGA_ENV=TESTNET
|
NX_VEGA_ENV=TESTNET
|
||||||
NX_BLOCK_EXPLORER=https://be.testnet.vega.xyz/rest
|
NX_BLOCK_EXPLORER=https://be.testnet.vega.xyz/rest
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|
||||||
# App flags
|
# App flags
|
||||||
NX_EXPLORER_ASSETS=1
|
NX_EXPLORER_ASSETS=1
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ context('Market page', { tags: '@regression' }, function () {
|
|||||||
|
|
||||||
it('Able to go to market details page', function () {
|
it('Able to go to market details page', function () {
|
||||||
cy.navigate_to('markets');
|
cy.navigate_to('markets');
|
||||||
cy.get_element_by_col_id('actions').eq(1).click();
|
cy.contains('Test market 1').click();
|
||||||
cy.getByTestId(marketHeaders).should('have.text', 'Test market 1');
|
cy.getByTestId(marketHeaders).should('have.text', 'Test market 1');
|
||||||
cy.validate_element_from_table('Name', 'Test market 1');
|
cy.validate_element_from_table('Name', 'Test market 1');
|
||||||
cy.validate_element_from_table('Market ID', this.createdMarketId);
|
cy.validate_element_from_table('Market ID', this.createdMarketId);
|
||||||
@@ -87,15 +87,13 @@ context('Market page', { tags: '@regression' }, function () {
|
|||||||
// Liquidity
|
// Liquidity
|
||||||
cy.validate_element_from_table('Target Stake', '0.00 fUSDC');
|
cy.validate_element_from_table('Target Stake', '0.00 fUSDC');
|
||||||
cy.validate_element_from_table('Supplied Stake', '0.00 fUSDC');
|
cy.validate_element_from_table('Supplied Stake', '0.00 fUSDC');
|
||||||
cy.validate_element_from_table('Market Value Proxy', '0.00 fUSDC');
|
|
||||||
// Liquidity price range
|
// Liquidity price range
|
||||||
cy.validate_element_from_table(
|
cy.validate_element_from_table(
|
||||||
'Liquidity Price Range',
|
'Liquidity Price Range',
|
||||||
'1,000.00% of mid price'
|
'95.00% of mid price'
|
||||||
);
|
);
|
||||||
cy.validate_element_from_table('Lowest Price', '0.00 fUSDC');
|
cy.validate_element_from_table('Lowest Price', '0.00 fUSDC');
|
||||||
cy.validate_element_from_table('Highest Price', '0.00 fUSDC');
|
cy.validate_element_from_table('Highest Price', '0.00 fUSDC');
|
||||||
|
|
||||||
cy.getByTestId('oracle-spec-links')
|
cy.getByTestId('oracle-spec-links')
|
||||||
.should('have.attr', 'href')
|
.should('have.attr', 'href')
|
||||||
.and(
|
.and(
|
||||||
@@ -144,11 +142,8 @@ context('Market page', { tags: '@regression' }, function () {
|
|||||||
.as('successorMarketId');
|
.as('successorMarketId');
|
||||||
cy.contains('Token test market').click();
|
cy.contains('Token test market').click();
|
||||||
cy.getByTestId(marketHeaders).should('have.text', 'Token test market');
|
cy.getByTestId(marketHeaders).should('have.text', 'Token test market');
|
||||||
cy.validate_proposal_change_type('Triggering Ratio', 'Added');
|
|
||||||
cy.validate_element_from_table('Triggering Ratio', '0.7');
|
cy.validate_element_from_table('Triggering Ratio', '0.7');
|
||||||
cy.validate_proposal_change_type('Time Window', 'Added');
|
|
||||||
cy.validate_element_from_table('Time Window', '3,600');
|
cy.validate_element_from_table('Time Window', '3,600');
|
||||||
cy.validate_proposal_change_type('Scaling Factor', 'Added');
|
|
||||||
cy.validate_element_from_table('Scaling Factor', '10');
|
cy.validate_element_from_table('Scaling Factor', '10');
|
||||||
|
|
||||||
cy.getByTestId(successionLineItem)
|
cy.getByTestId(successionLineItem)
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
context('Network parameters page', { tags: '@smoke' }, function () {
|
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');
|
||||||
|
cy.visit('/network-parameters');
|
||||||
});
|
});
|
||||||
describe('Verify elements on page', function () {
|
describe('Verify elements on page', function () {
|
||||||
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"]';
|
||||||
|
|
||||||
@@ -16,6 +13,7 @@ context('Network parameters page', { tags: '@smoke' }, function () {
|
|||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 0006-NETW-021
|
||||||
it('should list each of the network parameters available', function () {
|
it('should list each of the network parameters available', function () {
|
||||||
cy.get_network_parameters().then((network_parameters) => {
|
cy.get_network_parameters().then((network_parameters) => {
|
||||||
const numberOfNetworkParametersInSystem =
|
const numberOfNetworkParametersInSystem =
|
||||||
@@ -198,6 +196,19 @@ context('Network parameters page', { tags: '@smoke' }, function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 0006-NETW-022 0006-NETW-023
|
||||||
|
it('governance assets should be correctly grouped', function () {
|
||||||
|
cy.getByTestId('governance')
|
||||||
|
.should('exist')
|
||||||
|
.parent()
|
||||||
|
.should('have.attr', 'href', '/network-parameters#governance');
|
||||||
|
cy.get('[id="governance-proposal-asset"]')
|
||||||
|
.parent()
|
||||||
|
.within(() => {
|
||||||
|
cy.getByTestId('key-value-table-row').should('have.length', 8);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('should be able to see network parameters - on mobile', function () {
|
it('should be able to see network parameters - on mobile', function () {
|
||||||
cy.switchToMobile();
|
cy.switchToMobile();
|
||||||
cy.get_network_parameters().then((network_parameters) => {
|
cy.get_network_parameters().then((network_parameters) => {
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ context.skip('Node switcher', { tags: '@regression' }, function () {
|
|||||||
const errorTypeTxt = 'Error: invalid url';
|
const errorTypeTxt = 'Error: invalid url';
|
||||||
const nodeErrorTxt = 'fakeUrl is not a valid url.';
|
const nodeErrorTxt = 'fakeUrl is not a valid url.';
|
||||||
|
|
||||||
cy.getByTestId('node-url-custom').click();
|
cy.getByTestId('node-url-custom').click({ force: true });
|
||||||
|
|
||||||
cy.getByTestId(customNodeBtn).within(() => {
|
cy.getByTestId(customNodeBtn).within(() => {
|
||||||
cy.get('input').clear().type('fakeUrl');
|
cy.get('input').clear().type('fakeUrl');
|
||||||
|
|||||||
@@ -0,0 +1,68 @@
|
|||||||
|
context('Oracle page', { tags: '@smoke' }, () => {
|
||||||
|
describe('Verify elements on page', () => {
|
||||||
|
before('create market and navigate to oracle page', () => {
|
||||||
|
cy.createMarket();
|
||||||
|
cy.visit('/oracles');
|
||||||
|
});
|
||||||
|
it('should see oracle data', () => {
|
||||||
|
cy.getByTestId('oracle-details').should('have.length.at.least', 2);
|
||||||
|
cy.getByTestId('oracle-details')
|
||||||
|
.should('exist')
|
||||||
|
.eq(0)
|
||||||
|
.within(() => {
|
||||||
|
cy.get('tr')
|
||||||
|
.eq(0)
|
||||||
|
.within(() => {
|
||||||
|
cy.get('th').should('have.text', 'ID');
|
||||||
|
cy.get('a').invoke('text').should('have.length', 64);
|
||||||
|
cy.get('a')
|
||||||
|
.should('have.attr', 'href')
|
||||||
|
.and('contain', '/oracles/');
|
||||||
|
});
|
||||||
|
cy.get('tr')
|
||||||
|
.eq(1)
|
||||||
|
.within(() => {
|
||||||
|
cy.get('th').should('have.text', 'Type');
|
||||||
|
cy.get('td').should('have.text', 'External data');
|
||||||
|
});
|
||||||
|
cy.get('tr')
|
||||||
|
.eq(2)
|
||||||
|
.within(() => {
|
||||||
|
cy.get('th').should('have.text', 'Signer');
|
||||||
|
cy.getByTestId('keytype').should('have.text', 'Vega');
|
||||||
|
cy.get('a').invoke('text').should('have.length', 64);
|
||||||
|
cy.get('a')
|
||||||
|
.should('have.attr', 'href')
|
||||||
|
.and('contain', '/parties/');
|
||||||
|
});
|
||||||
|
cy.get('tr')
|
||||||
|
.eq(3)
|
||||||
|
.within(() => {
|
||||||
|
cy.get('th').should('have.text', 'Settlement for');
|
||||||
|
cy.get('a').invoke('text').should('have.length', 64);
|
||||||
|
cy.get('a')
|
||||||
|
.should('have.attr', 'href')
|
||||||
|
.and('contain', '/markets/');
|
||||||
|
});
|
||||||
|
cy.get('tr')
|
||||||
|
.eq(4)
|
||||||
|
.within(() => {
|
||||||
|
cy.get('th').should('have.text', 'Matched data');
|
||||||
|
cy.get('td').should('have.text', '❌');
|
||||||
|
});
|
||||||
|
cy.get('details')
|
||||||
|
.eq(0)
|
||||||
|
.within(() => {
|
||||||
|
cy.contains('Filter').click();
|
||||||
|
cy.get('.language-json').should('exist');
|
||||||
|
});
|
||||||
|
cy.get('details')
|
||||||
|
.eq(1)
|
||||||
|
.within(() => {
|
||||||
|
cy.contains('JSON').click();
|
||||||
|
cy.get('.language-json').should('exist');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -26,7 +26,6 @@ function getSuccessorTxBody(parentMarketId) {
|
|||||||
positionDecimalPlaces: '5',
|
positionDecimalPlaces: '5',
|
||||||
linearSlippageFactor: '0.001',
|
linearSlippageFactor: '0.001',
|
||||||
quadraticSlippageFactor: '0',
|
quadraticSlippageFactor: '0',
|
||||||
lpPriceRange: '10',
|
|
||||||
instrument: {
|
instrument: {
|
||||||
name: 'Token test market',
|
name: 'Token test market',
|
||||||
code: 'TEST.24h',
|
code: 'TEST.24h',
|
||||||
@@ -130,6 +129,12 @@ function getSuccessorTxBody(parentMarketId) {
|
|||||||
parentMarketId: parentMarketId,
|
parentMarketId: parentMarketId,
|
||||||
insurancePoolFraction: '0.75',
|
insurancePoolFraction: '0.75',
|
||||||
},
|
},
|
||||||
|
liquiditySlaParameters: {
|
||||||
|
priceRange: '0.95',
|
||||||
|
commitmentMinTimeFraction: '0.5',
|
||||||
|
performanceHysteresisEpochs: 2,
|
||||||
|
slaCompetitionFactor: '0.75',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
closingTimestamp,
|
closingTimestamp,
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ NX_VEGA_ENV=CUSTOM
|
|||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
||||||
NX_VEGA_EXPLORER_URL=/
|
NX_VEGA_EXPLORER_URL=/
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|
||||||
# App flags
|
# App flags
|
||||||
NX_EXPLORER_TXS_LIST=0
|
NX_EXPLORER_TXS_LIST=0
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ NX_VEGA_URL=https://api.devnet1.vega.xyz/graphql
|
|||||||
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/devnet1/vegawallet-devnet1.toml
|
NX_VEGA_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/networks-internal/main/devnet1/vegawallet-devnet1.toml
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
||||||
NX_VEGA_EXPLORER_URL=/
|
NX_VEGA_EXPLORER_URL=/
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.devnet1.vega.xyz/
|
NX_TENDERMINT_URL=https://tm.be.devnet1.vega.xyz/
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.devnet1.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.devnet1.vega.xyz/websocket
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ NX_VEGA_GOVERNANCE_URL=https://governance.vega.xyz
|
|||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/mainnet/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/mainnet/announcements.json
|
||||||
NX_VEGA_EXPLORER_URL=https://explorer.vega.xyz/
|
NX_VEGA_EXPLORER_URL=https://explorer.vega.xyz/
|
||||||
NX_VEGA_CONSOLE_URL=https://console.vega.xyz
|
NX_VEGA_CONSOLE_URL=https://console.vega.xyz
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://be.vega.community
|
NX_TENDERMINT_URL=https://be.vega.community
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.vega.community/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.vega.community/websocket
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ NX_VEGA_GOVERNANCE_URL=https://governance.mainnet-mirror.vega.rocks
|
|||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/mainnet/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/mainnet/announcements.json
|
||||||
NX_VEGA_EXPLORER_URL=https://explorer.mainnet-mirror.vega.rocks/
|
NX_VEGA_EXPLORER_URL=https://explorer.mainnet-mirror.vega.rocks/
|
||||||
NX_VEGA_CONSOLE_URL=https://console.mainnet-mirror.vega.rocks
|
NX_VEGA_CONSOLE_URL=https://console.mainnet-mirror.vega.rocks
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://be.mainnet-mirror.vega.rocks
|
NX_TENDERMINT_URL=https://be.mainnet-mirror.vega.rocks
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.mainnet-mirror.vega.rocks/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.mainnet-mirror.vega.rocks/websocket
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
# .env is stagnet1, so there are no overrides required
|
# .env is stagnet1, so there are no overrides required
|
||||||
NX_VEGA_NETWORKS='{"TESTNET":"https://explorer.fairground.wtf","MAINNET":"https://explorer.vega.xyz","STAGNET1":"https://stagnet1.explorer.vega.xyz"}'
|
NX_VEGA_NETWORKS='{"TESTNET":"https://explorer.fairground.wtf","MAINNET":"https://explorer.vega.xyz","STAGNET1":"https://stagnet1.explorer.vega.xyz"}'
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ NX_VEGA_GOVERNANCE_URL=https://governance.fairground.wtf
|
|||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
||||||
NX_VEGA_EXPLORER_URL=https://explorer.fairground.wtf
|
NX_VEGA_EXPLORER_URL=https://explorer.fairground.wtf
|
||||||
NX_VEGA_CONSOLE_URL=https://console.fairground.wtf
|
NX_VEGA_CONSOLE_URL=https://console.fairground.wtf
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.testnet.vega.xyz
|
NX_TENDERMINT_URL=https://tm.be.testnet.vega.xyz
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.testnet.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.testnet.vega.xyz/websocket
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ NX_BLOCK_EXPLORER=https://be.validators-testnet.vega.rocks/rest
|
|||||||
NX_VEGA_GOVERNANCE_URL=https://governance.validators-testnet.vega.rocks
|
NX_VEGA_GOVERNANCE_URL=https://governance.validators-testnet.vega.rocks
|
||||||
NX_VEGA_EXPLORER_URL=https://explorer.validators-testnet.vega.rocks/
|
NX_VEGA_EXPLORER_URL=https://explorer.validators-testnet.vega.rocks/
|
||||||
NX_VEGA_CONSOLE_URL=https://trading.validators-testnet.vega.rocks/
|
NX_VEGA_CONSOLE_URL=https://trading.validators-testnet.vega.rocks/
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.validators-testnet.vega.rocks
|
NX_TENDERMINT_URL=https://tm.be.validators-testnet.vega.rocks
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.validators-testnet.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.validators-testnet.vega.xyz/websocket
|
||||||
|
|||||||
@@ -5,4 +5,5 @@ NX_VEGA_ENV=CUSTOM
|
|||||||
NX_BLOCK_EXPLORER=
|
NX_BLOCK_EXPLORER=
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
||||||
NX_VEGA_EXPLORER_URL=/
|
NX_VEGA_EXPLORER_URL=/
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
AppFailure,
|
|
||||||
NetworkLoader,
|
NetworkLoader,
|
||||||
|
NodeFailure,
|
||||||
NodeGuard,
|
NodeGuard,
|
||||||
NodeSwitcherDialog,
|
NodeSwitcherDialog,
|
||||||
useEnvironment,
|
useEnvironment,
|
||||||
@@ -31,7 +31,7 @@ function App() {
|
|||||||
<NetworkLoader cache={DEFAULT_CACHE_CONFIG}>
|
<NetworkLoader cache={DEFAULT_CACHE_CONFIG}>
|
||||||
<NodeGuard
|
<NodeGuard
|
||||||
skeleton={<div>{t('Loading')}</div>}
|
skeleton={<div>{t('Loading')}</div>}
|
||||||
failure={<AppFailure title={t(`Node: ${VEGA_URL} is unsuitable`)} />}
|
failure={<NodeFailure title={t(`Node: ${VEGA_URL} is unsuitable`)} />}
|
||||||
>
|
>
|
||||||
<Suspense fallback={splashLoading}>
|
<Suspense fallback={splashLoading}>
|
||||||
<RouterProvider router={router} fallbackElement={splashLoading} />
|
<RouterProvider router={router} fallbackElement={splashLoading} />
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { AssetTypeMapping, AssetStatusMapping } from '@vegaprotocol/assets';
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
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 { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid';
|
import { AgGrid } from '@vegaprotocol/datagrid';
|
||||||
import type { VegaICellRendererParams } 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';
|
||||||
|
|||||||
@@ -13,6 +13,12 @@ query ExplorerMarket($id: ID!) {
|
|||||||
decimals
|
decimals
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
... on Perpetual {
|
||||||
|
quoteName
|
||||||
|
settlementAsset {
|
||||||
|
decimals
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-1
@@ -8,7 +8,7 @@ export type ExplorerMarketQueryVariables = Types.Exact<{
|
|||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
|
||||||
export type ExplorerMarketQuery = { __typename?: 'Query', market?: { __typename?: 'Market', id: string, decimalPlaces: number, positionDecimalPlaces: number, state: Types.MarketState, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', name: string, product: { __typename?: 'Future', quoteName: string, settlementAsset: { __typename?: 'Asset', decimals: number } } } } } | null };
|
export type ExplorerMarketQuery = { __typename?: 'Query', market?: { __typename?: 'Market', id: string, decimalPlaces: number, positionDecimalPlaces: number, state: Types.MarketState, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', name: string, product: { __typename?: 'Future', quoteName: string, settlementAsset: { __typename?: 'Asset', decimals: number } } | { __typename?: 'Perpetual', quoteName: string, settlementAsset: { __typename?: 'Asset', decimals: number } } | { __typename?: 'Spot' } } } } | null };
|
||||||
|
|
||||||
|
|
||||||
export const ExplorerMarketDocument = gql`
|
export const ExplorerMarketDocument = gql`
|
||||||
@@ -27,6 +27,12 @@ export const ExplorerMarketDocument = gql`
|
|||||||
decimals
|
decimals
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
... on Perpetual {
|
||||||
|
quoteName
|
||||||
|
settlementAsset {
|
||||||
|
decimals
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ describe('Market link component', () => {
|
|||||||
instrument: {
|
instrument: {
|
||||||
name: 'test-label',
|
name: 'test-label',
|
||||||
product: {
|
product: {
|
||||||
|
__typename: 'Future',
|
||||||
quoteName: 'dai',
|
quoteName: 'dai',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,37 +1,41 @@
|
|||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import type { MarketInfoWithData } from '@vegaprotocol/markets';
|
import type { MarketInfoWithData } from '@vegaprotocol/markets';
|
||||||
import {
|
import {
|
||||||
|
LiquidityPriceRangeInfoPanel,
|
||||||
|
LiquiditySLAParametersInfoPanel,
|
||||||
|
MarginScalingFactorsPanel,
|
||||||
PriceMonitoringBoundsInfoPanel,
|
PriceMonitoringBoundsInfoPanel,
|
||||||
SuccessionLineInfoPanel,
|
SuccessionLineInfoPanel,
|
||||||
|
getDataSourceSpecForSettlementData,
|
||||||
|
getDataSourceSpecForTradingTermination,
|
||||||
} from '@vegaprotocol/markets';
|
} from '@vegaprotocol/markets';
|
||||||
import {
|
import {
|
||||||
LiquidityInfoPanel,
|
LiquidityInfoPanel,
|
||||||
LiquidityMonitoringParametersInfoPanel,
|
LiquidityMonitoringParametersInfoPanel,
|
||||||
InstrumentInfoPanel,
|
InstrumentInfoPanel,
|
||||||
KeyDetailsInfoPanel,
|
KeyDetailsInfoPanel,
|
||||||
LiquidityPriceRangeInfoPanel,
|
|
||||||
MetadataInfoPanel,
|
MetadataInfoPanel,
|
||||||
OracleInfoPanel,
|
OracleInfoPanel,
|
||||||
RiskFactorsInfoPanel,
|
RiskFactorsInfoPanel,
|
||||||
RiskModelInfoPanel,
|
RiskModelInfoPanel,
|
||||||
RiskParametersInfoPanel,
|
|
||||||
SettlementAssetInfoPanel,
|
SettlementAssetInfoPanel,
|
||||||
} from '@vegaprotocol/markets';
|
} from '@vegaprotocol/markets';
|
||||||
import { MarketInfoTable } from '@vegaprotocol/markets';
|
import { MarketInfoTable } from '@vegaprotocol/markets';
|
||||||
import type { DataSourceDefinition } from '@vegaprotocol/types';
|
import type { DataSourceFragment } from '@vegaprotocol/markets';
|
||||||
import isEqual from 'lodash/isEqual';
|
import isEqual from 'lodash/isEqual';
|
||||||
|
|
||||||
export const MarketDetails = ({ market }: { market: MarketInfoWithData }) => {
|
export const MarketDetails = ({ market }: { market: MarketInfoWithData }) => {
|
||||||
if (!market) return null;
|
if (!market) return null;
|
||||||
|
const { product } = market.tradableInstrument.instrument;
|
||||||
|
const settlementDataSource = getDataSourceSpecForSettlementData(product);
|
||||||
|
const terminationDataSource = getDataSourceSpecForTradingTermination(product);
|
||||||
|
|
||||||
const settlementData = market.tradableInstrument.instrument.product
|
const getSigners = ({ data }: DataSourceFragment) => {
|
||||||
.dataSourceSpecForSettlementData.data as DataSourceDefinition;
|
|
||||||
const terminationData = market.tradableInstrument.instrument.product
|
|
||||||
.dataSourceSpecForTradingTermination.data as DataSourceDefinition;
|
|
||||||
|
|
||||||
const getSigners = (data: DataSourceDefinition) => {
|
|
||||||
if (data.sourceType.__typename === 'DataSourceDefinitionExternal') {
|
if (data.sourceType.__typename === 'DataSourceDefinitionExternal') {
|
||||||
const signers = data.sourceType.sourceType.signers || [];
|
const signers =
|
||||||
|
('signers' in data.sourceType.sourceType &&
|
||||||
|
data.sourceType.sourceType.signers) ||
|
||||||
|
[];
|
||||||
|
|
||||||
return signers.map(({ signer }, i) => {
|
return signers.map(({ signer }, i) => {
|
||||||
return (
|
return (
|
||||||
@@ -43,10 +47,13 @@ export const MarketDetails = ({ market }: { market: MarketInfoWithData }) => {
|
|||||||
return [];
|
return [];
|
||||||
};
|
};
|
||||||
|
|
||||||
const showTwoOracles = isEqual(
|
const showTwoOracles =
|
||||||
getSigners(settlementData),
|
settlementDataSource &&
|
||||||
getSigners(terminationData)
|
terminationDataSource &&
|
||||||
);
|
isEqual(
|
||||||
|
getSigners(settlementDataSource),
|
||||||
|
getSigners(terminationDataSource)
|
||||||
|
);
|
||||||
|
|
||||||
const headerClassName = 'font-alpha calt text-xl mt-4 border-b-2 pb-2';
|
const headerClassName = 'font-alpha calt text-xl mt-4 border-b-2 pb-2';
|
||||||
|
|
||||||
@@ -62,8 +69,8 @@ export const MarketDetails = ({ market }: { market: MarketInfoWithData }) => {
|
|||||||
<MetadataInfoPanel market={market} />
|
<MetadataInfoPanel market={market} />
|
||||||
<h2 className={headerClassName}>{t('Risk model')}</h2>
|
<h2 className={headerClassName}>{t('Risk model')}</h2>
|
||||||
<RiskModelInfoPanel market={market} />
|
<RiskModelInfoPanel market={market} />
|
||||||
<h2 className={headerClassName}>{t('Risk parameters')}</h2>
|
<h2 className={headerClassName}>{t('Margin scaling factors')}</h2>
|
||||||
<RiskParametersInfoPanel market={market} />
|
<MarginScalingFactorsPanel market={market} />
|
||||||
<h2 className={headerClassName}>{t('Risk factors')}</h2>
|
<h2 className={headerClassName}>{t('Risk factors')}</h2>
|
||||||
<RiskFactorsInfoPanel market={market} />
|
<RiskFactorsInfoPanel market={market} />
|
||||||
{(market.data?.priceMonitoringBounds || []).map((trigger, i) => (
|
{(market.data?.priceMonitoringBounds || []).map((trigger, i) => (
|
||||||
@@ -89,10 +96,12 @@ export const MarketDetails = ({ market }: { market: MarketInfoWithData }) => {
|
|||||||
)}
|
)}
|
||||||
<h2 className={headerClassName}>{t('Liquidity monitoring')}</h2>
|
<h2 className={headerClassName}>{t('Liquidity monitoring')}</h2>
|
||||||
<LiquidityMonitoringParametersInfoPanel market={market} />
|
<LiquidityMonitoringParametersInfoPanel market={market} />
|
||||||
<h2 className={headerClassName}>{t('Liquidity')}</h2>
|
|
||||||
<LiquidityInfoPanel market={market} />
|
|
||||||
<h2 className={headerClassName}>{t('Liquidity price range')}</h2>
|
<h2 className={headerClassName}>{t('Liquidity price range')}</h2>
|
||||||
<LiquidityPriceRangeInfoPanel market={market} />
|
<LiquidityPriceRangeInfoPanel market={market} />
|
||||||
|
<h2 className={headerClassName}>{t('Liquidity SLA protocol')}</h2>
|
||||||
|
<LiquiditySLAParametersInfoPanel market={market} />
|
||||||
|
<h2 className={headerClassName}>{t('Liquidity')}</h2>
|
||||||
|
<LiquidityInfoPanel market={market} />
|
||||||
{showTwoOracles ? (
|
{showTwoOracles ? (
|
||||||
<>
|
<>
|
||||||
<h2 className={headerClassName}>{t('Settlement oracle')}</h2>
|
<h2 className={headerClassName}>{t('Settlement oracle')}</h2>
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
import type { MarketFieldsFragment } from '@vegaprotocol/markets';
|
import { getAsset, type MarketFieldsFragment } from '@vegaprotocol/markets';
|
||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
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 type { ColDef } from 'ag-grid-community';
|
import type { ColDef } from 'ag-grid-community';
|
||||||
import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid';
|
import { AgGrid } from '@vegaprotocol/datagrid';
|
||||||
import type {
|
import type {
|
||||||
VegaICellRendererParams,
|
VegaICellRendererParams,
|
||||||
VegaValueGetterParams,
|
VegaValueGetterParams,
|
||||||
@@ -73,8 +73,7 @@ export const MarketsTable = ({ data }: MarketsTableProps) => {
|
|||||||
MarketFieldsFragment,
|
MarketFieldsFragment,
|
||||||
'tradableInstrument.instrument.product.settlementAsset.symbol'
|
'tradableInstrument.instrument.product.settlementAsset.symbol'
|
||||||
>) => {
|
>) => {
|
||||||
const value =
|
const value = data && getAsset(data);
|
||||||
data?.tradableInstrument.instrument.product.settlementAsset;
|
|
||||||
return value ? (
|
return value ? (
|
||||||
<ButtonLink
|
<ButtonLink
|
||||||
onClick={(e) => {
|
onClick={(e) => {
|
||||||
|
|||||||
@@ -31,6 +31,9 @@ fragment ExplorerDeterministicOrderFields on Order {
|
|||||||
... on Future {
|
... on Future {
|
||||||
quoteName
|
quoteName
|
||||||
}
|
}
|
||||||
|
... on Perpetual {
|
||||||
|
quoteName
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import * as Types from '@vegaprotocol/types';
|
|||||||
import { gql } from '@apollo/client';
|
import { gql } from '@apollo/client';
|
||||||
import * as Apollo from '@apollo/client';
|
import * as Apollo from '@apollo/client';
|
||||||
const defaultOptions = {} as const;
|
const defaultOptions = {} as const;
|
||||||
export type ExplorerDeterministicOrderFieldsFragment = { __typename?: 'Order', id: string, type?: Types.OrderType | null, reference: string, status: Types.OrderStatus, version: string, createdAt: any, updatedAt?: any | null, expiresAt?: any | null, timeInForce: Types.OrderTimeInForce, price: string, side: Types.Side, remaining: string, size: string, rejectionReason?: Types.OrderRejectionReason | null, peggedOrder?: { __typename?: 'PeggedOrder', reference: Types.PeggedReference, offset: string } | null, party: { __typename?: 'Party', id: string }, market: { __typename?: 'Market', id: string, decimalPlaces: number, positionDecimalPlaces: number, state: Types.MarketState, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', name: string, product: { __typename?: 'Future', quoteName: string } } } } };
|
export type ExplorerDeterministicOrderFieldsFragment = { __typename?: 'Order', id: string, type?: Types.OrderType | null, reference: string, status: Types.OrderStatus, version: string, createdAt: any, updatedAt?: any | null, expiresAt?: any | null, timeInForce: Types.OrderTimeInForce, price: string, side: Types.Side, remaining: string, size: string, rejectionReason?: Types.OrderRejectionReason | null, peggedOrder?: { __typename?: 'PeggedOrder', reference: Types.PeggedReference, offset: string } | null, party: { __typename?: 'Party', id: string }, market: { __typename?: 'Market', id: string, decimalPlaces: number, positionDecimalPlaces: number, state: Types.MarketState, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', name: string, product: { __typename?: 'Future', quoteName: string } | { __typename?: 'Perpetual', quoteName: string } | { __typename?: 'Spot' } } } } };
|
||||||
|
|
||||||
export type ExplorerDeterministicOrderQueryVariables = Types.Exact<{
|
export type ExplorerDeterministicOrderQueryVariables = Types.Exact<{
|
||||||
orderId: Types.Scalars['ID'];
|
orderId: Types.Scalars['ID'];
|
||||||
@@ -11,7 +11,7 @@ export type ExplorerDeterministicOrderQueryVariables = Types.Exact<{
|
|||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
|
||||||
export type ExplorerDeterministicOrderQuery = { __typename?: 'Query', orderByID: { __typename?: 'Order', id: string, type?: Types.OrderType | null, reference: string, status: Types.OrderStatus, version: string, createdAt: any, updatedAt?: any | null, expiresAt?: any | null, timeInForce: Types.OrderTimeInForce, price: string, side: Types.Side, remaining: string, size: string, rejectionReason?: Types.OrderRejectionReason | null, peggedOrder?: { __typename?: 'PeggedOrder', reference: Types.PeggedReference, offset: string } | null, party: { __typename?: 'Party', id: string }, market: { __typename?: 'Market', id: string, decimalPlaces: number, positionDecimalPlaces: number, state: Types.MarketState, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', name: string, product: { __typename?: 'Future', quoteName: string } } } } } };
|
export type ExplorerDeterministicOrderQuery = { __typename?: 'Query', orderByID: { __typename?: 'Order', id: string, type?: Types.OrderType | null, reference: string, status: Types.OrderStatus, version: string, createdAt: any, updatedAt?: any | null, expiresAt?: any | null, timeInForce: Types.OrderTimeInForce, price: string, side: Types.Side, remaining: string, size: string, rejectionReason?: Types.OrderRejectionReason | null, peggedOrder?: { __typename?: 'PeggedOrder', reference: Types.PeggedReference, offset: string } | null, party: { __typename?: 'Party', id: string }, market: { __typename?: 'Market', id: string, decimalPlaces: number, positionDecimalPlaces: number, state: Types.MarketState, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', name: string, product: { __typename?: 'Future', quoteName: string } | { __typename?: 'Perpetual', quoteName: string } | { __typename?: 'Spot' } } } } } };
|
||||||
|
|
||||||
export const ExplorerDeterministicOrderFieldsFragmentDoc = gql`
|
export const ExplorerDeterministicOrderFieldsFragmentDoc = gql`
|
||||||
fragment ExplorerDeterministicOrderFields on Order {
|
fragment ExplorerDeterministicOrderFields on Order {
|
||||||
@@ -47,6 +47,9 @@ export const ExplorerDeterministicOrderFieldsFragmentDoc = gql`
|
|||||||
... on Future {
|
... on Future {
|
||||||
quoteName
|
quoteName
|
||||||
}
|
}
|
||||||
|
... on Perpetual {
|
||||||
|
quoteName
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -150,6 +150,7 @@ function renderExistingAmend(
|
|||||||
instrument: {
|
instrument: {
|
||||||
name: 'test-label',
|
name: 'test-label',
|
||||||
product: {
|
product: {
|
||||||
|
__typename: 'Future',
|
||||||
quoteName: 'dai',
|
quoteName: 'dai',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ const PriceInMarket = ({
|
|||||||
label = addDecimalsFormatNumber(price, data.market.decimalPlaces);
|
label = addDecimalsFormatNumber(price, data.market.decimalPlaces);
|
||||||
} else if (
|
} else if (
|
||||||
decimalSource === 'SETTLEMENT_ASSET' &&
|
decimalSource === 'SETTLEMENT_ASSET' &&
|
||||||
|
data.market &&
|
||||||
|
'settlementAsset' in data.market.tradableInstrument.instrument.product &&
|
||||||
data.market?.tradableInstrument.instrument.product.settlementAsset
|
data.market?.tradableInstrument.instrument.product.settlementAsset
|
||||||
) {
|
) {
|
||||||
label = addDecimalsFormatNumber(
|
label = addDecimalsFormatNumber(
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import type { ProposalListFieldsFragment } from '@vegaprotocol/proposals';
|
|||||||
import { VoteProgress } from '@vegaprotocol/proposals';
|
import { VoteProgress } from '@vegaprotocol/proposals';
|
||||||
import type { AgGridReact } from 'ag-grid-react';
|
import type { AgGridReact } from 'ag-grid-react';
|
||||||
import { ExternalLink } from '@vegaprotocol/ui-toolkit';
|
import { ExternalLink } from '@vegaprotocol/ui-toolkit';
|
||||||
import { AgGridLazy as AgGrid } from '@vegaprotocol/datagrid';
|
import { AgGrid } from '@vegaprotocol/datagrid';
|
||||||
import type {
|
import type {
|
||||||
VegaICellRendererParams,
|
VegaICellRendererParams,
|
||||||
VegaValueFormatterParams,
|
VegaValueFormatterParams,
|
||||||
@@ -33,7 +33,7 @@ export const ProposalsTable = ({ data }: ProposalsTableProps) => {
|
|||||||
const { params } = useNetworkParams([
|
const { params } = useNetworkParams([
|
||||||
NetworkParams.governance_proposal_market_requiredMajority,
|
NetworkParams.governance_proposal_market_requiredMajority,
|
||||||
]);
|
]);
|
||||||
const tokenLink = useLinks(DApp.Token);
|
const tokenLink = useLinks(DApp.Governance);
|
||||||
const requiredMajorityPercentage = useMemo(() => {
|
const requiredMajorityPercentage = useMemo(() => {
|
||||||
const requiredMajority =
|
const requiredMajority =
|
||||||
params?.governance_proposal_market_requiredMajority ?? 1;
|
params?.governance_proposal_market_requiredMajority ?? 1;
|
||||||
@@ -105,7 +105,7 @@ export const ProposalsTable = ({ data }: ProposalsTableProps) => {
|
|||||||
? new BigNumber(0)
|
? new BigNumber(0)
|
||||||
: yesTokens.multipliedBy(100).dividedBy(totalTokensVoted);
|
: yesTokens.multipliedBy(100).dividedBy(totalTokensVoted);
|
||||||
return (
|
return (
|
||||||
<div className="uppercase flex h-full items-center justify-center pt-2">
|
<div className="flex items-center justify-center h-full pt-2 uppercase">
|
||||||
<VoteProgress
|
<VoteProgress
|
||||||
threshold={requiredMajorityPercentage}
|
threshold={requiredMajorityPercentage}
|
||||||
progress={yesPercentage}
|
progress={yesPercentage}
|
||||||
|
|||||||
+1
-1
@@ -35,7 +35,7 @@ export const BundleSigners = ({
|
|||||||
tx,
|
tx,
|
||||||
id,
|
id,
|
||||||
}: BundleSignersProps) => {
|
}: BundleSignersProps) => {
|
||||||
const tokenLink = useLinks(DApp.Token);
|
const tokenLink = useLinks(DApp.Governance);
|
||||||
|
|
||||||
const bridgeFunction: BridgeFunction =
|
const bridgeFunction: BridgeFunction =
|
||||||
tx?.changes?.erc20 && 'contractAddress' in tx.changes.erc20
|
tx?.changes?.erc20 && 'contractAddress' in tx.changes.erc20
|
||||||
|
|||||||
@@ -1 +1,2 @@
|
|||||||
export * from './network-parameters';
|
export * from './network-parameters';
|
||||||
|
export * from './structure-network-params';
|
||||||
|
|||||||
@@ -1,82 +1,105 @@
|
|||||||
import { render, screen } from '@testing-library/react';
|
import { render, screen } from '@testing-library/react';
|
||||||
import type { NetworkParamsQuery } from '@vegaprotocol/network-parameters';
|
import type { NetworkParamsQuery } from '@vegaprotocol/network-parameters';
|
||||||
import { NetworkParametersTable } from './network-parameters';
|
import { NetworkParametersTable } from './network-parameters';
|
||||||
|
import { MemoryRouter } from 'react-router-dom';
|
||||||
|
|
||||||
|
const renderComponent = (data: NetworkParamsQuery | undefined) => {
|
||||||
|
return render(
|
||||||
|
<MemoryRouter>
|
||||||
|
<NetworkParametersTable data={data} loading={false} />
|
||||||
|
</MemoryRouter>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const mockData = {
|
||||||
|
networkParametersConnection: {
|
||||||
|
edges: [
|
||||||
|
{
|
||||||
|
node: {
|
||||||
|
key: 'spam.protection.delegation.min.tokens',
|
||||||
|
value: '3',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
node: {
|
||||||
|
key: 'spam.protection.voting.min.tokens',
|
||||||
|
value: '1',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
node: {
|
||||||
|
key: 'reward.staking.delegation.minimumValidatorStake',
|
||||||
|
value: '2',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
node: {
|
||||||
|
key: 'reward.asset',
|
||||||
|
value:
|
||||||
|
'fc7fd956078fb1fc9db5c19b88f0874c4299b2a7639ad05a47a28c0aef291b55',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
describe('NetworkParametersTable', () => {
|
describe('NetworkParametersTable', () => {
|
||||||
it('renders correctly when it has network params', () => {
|
it('renders headers correctly', () => {
|
||||||
const data: NetworkParamsQuery = {
|
renderComponent(mockData);
|
||||||
networkParametersConnection: {
|
|
||||||
edges: [
|
const allHeadings = screen.getAllByRole('heading');
|
||||||
{
|
expect(
|
||||||
node: {
|
allHeadings.map((h) => {
|
||||||
__typename: 'NetworkParameter',
|
return {
|
||||||
key: 'market.liquidityProvision.minLpStakeQuantumMultiple',
|
text: h.textContent,
|
||||||
value: '1',
|
level: h.tagName,
|
||||||
},
|
testId: h.getAttribute('data-testid'),
|
||||||
},
|
};
|
||||||
{
|
})
|
||||||
node: {
|
).toEqual([
|
||||||
__typename: 'NetworkParameter',
|
{
|
||||||
key: 'market.fee.factors.infrastructureFee',
|
text: 'Network Parameters',
|
||||||
value: '0.0005',
|
level: 'H1',
|
||||||
},
|
testId: 'network-param-header',
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
};
|
{ text: 'Spam', level: 'H1', testId: 'spam' },
|
||||||
render(<NetworkParametersTable data={data} loading={false} />);
|
{ text: 'Protection', level: 'H2', testId: 'spam-protection' },
|
||||||
expect(screen.getByTestId('network-param-header')).toHaveTextContent(
|
{ text: 'Delegation', level: 'H3', testId: 'spam-protection-delegation' },
|
||||||
'Network Parameters'
|
{ text: 'Min', level: 'H4', testId: 'spam-protection-delegation-min' },
|
||||||
);
|
{ text: 'Voting', level: 'H3', testId: 'spam-protection-voting' },
|
||||||
const rows = screen.getAllByTestId('key-value-table-row');
|
{ text: 'Min', level: 'H4', testId: 'spam-protection-voting-min' },
|
||||||
expect(rows[0].children[0]).toHaveTextContent(
|
{ text: 'Reward', level: 'H1', testId: 'reward' },
|
||||||
'market.fee.factors.infrastructureFee'
|
{ text: 'Staking', level: 'H2', testId: 'reward-staking' },
|
||||||
);
|
{ text: 'Delegation', level: 'H3', testId: 'reward-staking-delegation' },
|
||||||
expect(rows[1].children[0]).toHaveTextContent(
|
]);
|
||||||
'market.liquidityProvision.minLpStakeQuantumMultiple'
|
|
||||||
);
|
|
||||||
expect(rows[0].children[1]).toHaveTextContent('0.0005');
|
|
||||||
expect(rows[1].children[1]).toHaveTextContent('1');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('renders the rows in ascending order', () => {
|
it('renders network params correctly', () => {
|
||||||
const data: NetworkParamsQuery = {
|
renderComponent(mockData);
|
||||||
networkParametersConnection: {
|
|
||||||
edges: [
|
const delegationMinTokensRow = screen.getByTestId(
|
||||||
{
|
'spam-protection-delegation-min-tokens'
|
||||||
node: {
|
|
||||||
__typename: 'NetworkParameter',
|
|
||||||
key: 'market.fee.factors.infrastructureFee',
|
|
||||||
value: '0.0005',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
node: {
|
|
||||||
__typename: 'NetworkParameter',
|
|
||||||
key: 'market.liquidityProvision.minLpStakeQuantumMultiple',
|
|
||||||
value: '1',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
};
|
|
||||||
render(<NetworkParametersTable data={data} loading={false} />);
|
|
||||||
expect(screen.getByTestId('network-param-header')).toHaveTextContent(
|
|
||||||
'Network Parameters'
|
|
||||||
);
|
);
|
||||||
const rows = screen.getAllByTestId('key-value-table-row');
|
expect(delegationMinTokensRow).toHaveTextContent('0.000000000000000003');
|
||||||
expect(rows[0].children[0]).toHaveTextContent(
|
|
||||||
'market.fee.factors.infrastructureFee'
|
const votingMinTokensRow = screen.getByTestId(
|
||||||
|
'spam-protection-voting-min-tokens'
|
||||||
);
|
);
|
||||||
expect(rows[1].children[0]).toHaveTextContent(
|
expect(votingMinTokensRow).toHaveTextContent('0.000000000000000001');
|
||||||
'market.liquidityProvision.minLpStakeQuantumMultiple'
|
|
||||||
|
const minimumValidatorStakeRow = screen.getByTestId(
|
||||||
|
'reward-staking-delegation-minimumValidatorStake'
|
||||||
|
);
|
||||||
|
expect(minimumValidatorStakeRow).toHaveTextContent('2');
|
||||||
|
|
||||||
|
const assetRow = screen.getByTestId('reward-asset');
|
||||||
|
expect(assetRow).toHaveTextContent(
|
||||||
|
'fc7fd956078fb1fc9db5c19b88f0874c4299b2a7639ad05a47a28c0aef291b55'
|
||||||
);
|
);
|
||||||
expect(rows[0].children[1]).toHaveTextContent('0.0005');
|
|
||||||
expect(rows[1].children[1]).toHaveTextContent('1');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does not render rows when is loading', () => {
|
it('does not render rows when is loading', () => {
|
||||||
render(<NetworkParametersTable data={undefined} loading={true} />);
|
renderComponent(undefined);
|
||||||
expect(screen.getByTestId('network-param-header')).toHaveTextContent(
|
expect(screen.getByTestId('network-param-header')).toHaveTextContent(
|
||||||
'Network Parameters'
|
'Network Parameters'
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
|
import startCase from 'lodash/startCase';
|
||||||
|
import classNames from 'classnames';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
import {
|
import {
|
||||||
AsyncRenderer,
|
AsyncRenderer,
|
||||||
KeyValueTable,
|
|
||||||
KeyValueTableRow,
|
KeyValueTableRow,
|
||||||
SyntaxHighlighter,
|
SyntaxHighlighter,
|
||||||
} from '@vegaprotocol/ui-toolkit';
|
} from '@vegaprotocol/ui-toolkit';
|
||||||
@@ -12,11 +14,12 @@ import {
|
|||||||
} from '@vegaprotocol/utils';
|
} from '@vegaprotocol/utils';
|
||||||
import { t } from '@vegaprotocol/i18n';
|
import { t } from '@vegaprotocol/i18n';
|
||||||
import { RouteTitle } from '../../components/route-title';
|
import { RouteTitle } from '../../components/route-title';
|
||||||
import orderBy from 'lodash/orderBy';
|
|
||||||
import { useNetworkParamsQuery } from '@vegaprotocol/network-parameters';
|
import { useNetworkParamsQuery } from '@vegaprotocol/network-parameters';
|
||||||
import type { NetworkParamsQuery } from '@vegaprotocol/network-parameters';
|
|
||||||
import { useScrollToLocation } from '../../hooks/scroll-to-location';
|
import { useScrollToLocation } from '../../hooks/scroll-to-location';
|
||||||
import { useDocumentTitle } from '../../hooks/use-document-title';
|
import { useDocumentTitle } from '../../hooks/use-document-title';
|
||||||
|
import { structureNetworkParams } from './structure-network-params';
|
||||||
|
import type { NetworkParamsQuery } from '@vegaprotocol/network-parameters';
|
||||||
|
import type { GroupedParams } from './structure-network-params';
|
||||||
|
|
||||||
const PERCENTAGE_PARAMS = [
|
const PERCENTAGE_PARAMS = [
|
||||||
'governance.proposal.asset.requiredMajority',
|
'governance.proposal.asset.requiredMajority',
|
||||||
@@ -58,6 +61,54 @@ const BIG_NUMBER_PARAMS = [
|
|||||||
'governance.proposal.updateAsset.minVoterBalance',
|
'governance.proposal.updateAsset.minVoterBalance',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
export const renderGroupedParams = (
|
||||||
|
group: GroupedParams,
|
||||||
|
level: number,
|
||||||
|
parentKeys: string[] = []
|
||||||
|
) => {
|
||||||
|
const Header = `h${level}` as keyof JSX.IntrinsicElements;
|
||||||
|
const headerStyles = classNames('uppercase font-semibold', {
|
||||||
|
'pt-6 text-3xl underline': level === 1,
|
||||||
|
'pt-3 text-2xl': level === 2,
|
||||||
|
'pt-2 text-lg': level === 3,
|
||||||
|
'pt-2 text-default': level === 4,
|
||||||
|
});
|
||||||
|
|
||||||
|
return Object.entries(group).map(([key, value]) => {
|
||||||
|
const fullPath = [...parentKeys, key].join('.');
|
||||||
|
const isLeafNode = typeof value !== 'object';
|
||||||
|
const id = parentKeys.concat([key]).join('-');
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div key={key}>
|
||||||
|
{!isLeafNode && (
|
||||||
|
<div id={id}>
|
||||||
|
<Link to={`#${id}`}>
|
||||||
|
<Header className={headerStyles} data-testid={id}>
|
||||||
|
{startCase(key)}
|
||||||
|
</Header>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{isLeafNode ? (
|
||||||
|
typeof value === 'string' ? (
|
||||||
|
<div data-testid={id}>
|
||||||
|
<NetworkParameterRow
|
||||||
|
key={fullPath}
|
||||||
|
row={{ key: fullPath, value: value }}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
) : null
|
||||||
|
) : (
|
||||||
|
<div className="pb-1">
|
||||||
|
{renderGroupedParams(value, level + 1, [...parentKeys, key])}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
export const NetworkParameterRow = ({
|
export const NetworkParameterRow = ({
|
||||||
row: { key, value },
|
row: { key, value },
|
||||||
}: {
|
}: {
|
||||||
@@ -77,7 +128,9 @@ export const NetworkParameterRow = ({
|
|||||||
>
|
>
|
||||||
{key}
|
{key}
|
||||||
{isSyntaxRow ? (
|
{isSyntaxRow ? (
|
||||||
<SyntaxHighlighter data={JSON.parse(value)} />
|
<div className="pb-2">
|
||||||
|
<SyntaxHighlighter data={JSON.parse(value)} />
|
||||||
|
</div>
|
||||||
) : isNaN(Number(value)) ? (
|
) : isNaN(Number(value)) ? (
|
||||||
value
|
value
|
||||||
) : BIG_NUMBER_PARAMS.includes(key) ? (
|
) : BIG_NUMBER_PARAMS.includes(key) ? (
|
||||||
@@ -113,17 +166,12 @@ export const NetworkParametersTable = ({
|
|||||||
loading={loading}
|
loading={loading}
|
||||||
error={error}
|
error={error}
|
||||||
render={(data) => {
|
render={(data) => {
|
||||||
const ascParams = orderBy(
|
const flatParams = removePaginationWrapper(
|
||||||
removePaginationWrapper(data.networkParametersConnection.edges),
|
data.networkParametersConnection.edges
|
||||||
(param) => param.key,
|
|
||||||
'asc'
|
|
||||||
);
|
);
|
||||||
|
const groupedParams = structureNetworkParams(flatParams);
|
||||||
return (
|
return (
|
||||||
<KeyValueTable data-testid="parameters">
|
<div className="-mt-6">{renderGroupedParams(groupedParams, 1)}</div>
|
||||||
{(ascParams || []).map((row) => (
|
|
||||||
<NetworkParameterRow key={row.key} row={row} />
|
|
||||||
))}
|
|
||||||
</KeyValueTable>
|
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -0,0 +1,109 @@
|
|||||||
|
import type { GroupedParams } from './structure-network-params';
|
||||||
|
import {
|
||||||
|
structureParams,
|
||||||
|
sortGroupedParams,
|
||||||
|
structureNetworkParams,
|
||||||
|
} from './structure-network-params';
|
||||||
|
|
||||||
|
describe('structureParams', () => {
|
||||||
|
it('should correctly structure params', () => {
|
||||||
|
const input = [
|
||||||
|
{ key: 'spam.protection.delegation.min.tokens', value: '10' },
|
||||||
|
{ key: 'spam.protection.voting.min.tokens', value: '5' },
|
||||||
|
];
|
||||||
|
const output: GroupedParams = {
|
||||||
|
spam: {
|
||||||
|
protection: {
|
||||||
|
delegation: {
|
||||||
|
min: {
|
||||||
|
tokens: '10',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
voting: {
|
||||||
|
min: {
|
||||||
|
tokens: '5',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
expect(structureParams(input)).toEqual(output);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle top-level keys correctly', () => {
|
||||||
|
const input = [{ key: 'levelOne', value: '10' }];
|
||||||
|
const output = {
|
||||||
|
levelOne: '10',
|
||||||
|
};
|
||||||
|
expect(structureParams(input)).toEqual(output);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('sortGroupedParams', () => {
|
||||||
|
it('should correctly sort grouped params', () => {
|
||||||
|
const input: GroupedParams = {
|
||||||
|
spam: {
|
||||||
|
protection: {
|
||||||
|
delegation: {
|
||||||
|
min: {
|
||||||
|
tokens: '10',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
reward: '50',
|
||||||
|
};
|
||||||
|
const output: GroupedParams = {
|
||||||
|
reward: '50',
|
||||||
|
spam: {
|
||||||
|
protection: {
|
||||||
|
delegation: {
|
||||||
|
min: {
|
||||||
|
tokens: '10',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
expect(sortGroupedParams(input)).toEqual(output);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle already sorted keys', () => {
|
||||||
|
const input = {
|
||||||
|
a: '10',
|
||||||
|
b: {
|
||||||
|
c: '5',
|
||||||
|
d: '6',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
expect(sortGroupedParams(input)).toEqual(input);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('structureNetworkParams', () => {
|
||||||
|
it('should structure and sort network params correctly', () => {
|
||||||
|
const input = [
|
||||||
|
{ key: 'spam.protection.delegation.min.tokens', value: '10' },
|
||||||
|
{ key: 'reward.asset', value: '50' },
|
||||||
|
];
|
||||||
|
const output: GroupedParams = {
|
||||||
|
reward: {
|
||||||
|
asset: '50',
|
||||||
|
},
|
||||||
|
spam: {
|
||||||
|
protection: {
|
||||||
|
delegation: {
|
||||||
|
min: {
|
||||||
|
tokens: '10',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
expect(structureNetworkParams(input)).toEqual(output);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return an empty object if no params are provided', () => {
|
||||||
|
expect(structureNetworkParams([])).toEqual({});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
/**
|
||||||
|
* Categorizes and sorts an array of key-value pairs of network params into a nested object structure.
|
||||||
|
*
|
||||||
|
* The function takes an array of network params where keys are dot-delimited
|
||||||
|
* strings representing nested categories (e.g., 'spam.protection.delegation.min.tokens').
|
||||||
|
*
|
||||||
|
* Why this is necessary:
|
||||||
|
* A flat key-value structure wouldn't provide the hierarchical information needed.
|
||||||
|
* Organizing network parameters like this allows the rendering of nested headers
|
||||||
|
* and their corresponding network params.
|
||||||
|
*
|
||||||
|
* It also ensures that items with the minimum amount of nesting are ordered first. This
|
||||||
|
* allows us to render these items first, before more deeply nested items are rendered with
|
||||||
|
* subheaders. This creates a more intuitive UI.
|
||||||
|
*
|
||||||
|
* For example, given the input:
|
||||||
|
* [
|
||||||
|
* { key: 'spam.protection.delegation.min.tokens', value: '10' },
|
||||||
|
* { key: 'spam.protection.voting.min.tokens', value: '5' },
|
||||||
|
* { key: 'reward.staking.delegation.minimumValidatorStake', value: '2' }
|
||||||
|
* { key: 'reward.asset', value: 'fc7fd956078fb1fc9db5c19b88f0874c4299b2a7639ad05a47a28c0aef291b55' }
|
||||||
|
* ]
|
||||||
|
*
|
||||||
|
* The output will be:
|
||||||
|
* {
|
||||||
|
* spam: {
|
||||||
|
* protection: {
|
||||||
|
* delegation: {
|
||||||
|
* min: {
|
||||||
|
* tokens: '10'
|
||||||
|
* }
|
||||||
|
* },
|
||||||
|
* voting: {
|
||||||
|
* min: {
|
||||||
|
* tokens: '5'
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* },
|
||||||
|
* reward: {
|
||||||
|
* asset: 'fc7fd956078fb1fc9db5c19b88f0874c4299b2a7639ad05a47a28c0aef291b55',
|
||||||
|
* staking: {
|
||||||
|
* delegation: {
|
||||||
|
* minimumValidatorStake: '2'
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* @param {Array} params - An array of key-value pairs to categorize and sort.
|
||||||
|
* @returns {GroupedParams} - A nested object that groups the key-value pairs.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export type GroupedParams = {
|
||||||
|
[key: string]: string | GroupedParams;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const structureParams = (
|
||||||
|
params: { key: string; value: string }[]
|
||||||
|
): GroupedParams => {
|
||||||
|
const grouped: GroupedParams = {};
|
||||||
|
|
||||||
|
params.forEach(({ key, value }) => {
|
||||||
|
const parts = key.split('.');
|
||||||
|
let node: GroupedParams = grouped;
|
||||||
|
|
||||||
|
parts.forEach((part, i) => {
|
||||||
|
if (typeof node[part] === 'undefined') {
|
||||||
|
node[part] = i === parts.length - 1 ? value : {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof node[part] === 'object') {
|
||||||
|
node = node[part] as GroupedParams;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return grouped;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const sortGroupedParams = (
|
||||||
|
groupedParams: GroupedParams
|
||||||
|
): GroupedParams => {
|
||||||
|
const sorted: GroupedParams = {};
|
||||||
|
|
||||||
|
// Sort top-level keys first
|
||||||
|
Object.entries(groupedParams).forEach(([key, value]) => {
|
||||||
|
if (typeof value === 'string') {
|
||||||
|
sorted[key] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Object.entries(groupedParams).forEach(([key, value]) => {
|
||||||
|
if (typeof value === 'object') {
|
||||||
|
sorted[key] = sortGroupedParams(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return sorted;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const structureNetworkParams = (
|
||||||
|
params: { key: string; value: string }[]
|
||||||
|
) => {
|
||||||
|
const grouped = structureParams(params);
|
||||||
|
return sortGroupedParams(grouped);
|
||||||
|
};
|
||||||
@@ -49,6 +49,37 @@ fragment ExplorerOracleDataSource on OracleSpec {
|
|||||||
}
|
}
|
||||||
... on DataSourceDefinitionExternal {
|
... on DataSourceDefinitionExternal {
|
||||||
sourceType {
|
sourceType {
|
||||||
|
... on EthCallSpec {
|
||||||
|
abi
|
||||||
|
args
|
||||||
|
method
|
||||||
|
requiredConfirmations
|
||||||
|
address
|
||||||
|
normalisers {
|
||||||
|
name
|
||||||
|
expression
|
||||||
|
}
|
||||||
|
trigger {
|
||||||
|
trigger {
|
||||||
|
... on EthTimeTrigger {
|
||||||
|
initial
|
||||||
|
every
|
||||||
|
until
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
filters {
|
||||||
|
key {
|
||||||
|
name
|
||||||
|
type
|
||||||
|
numberDecimalPlaces
|
||||||
|
}
|
||||||
|
conditions {
|
||||||
|
value
|
||||||
|
operator
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
... on DataSourceSpecConfiguration {
|
... on DataSourceSpecConfiguration {
|
||||||
signers {
|
signers {
|
||||||
signer {
|
signer {
|
||||||
|
|||||||
@@ -11,6 +11,14 @@ fragment ExplorerOracleForMarketsMarket on Market {
|
|||||||
id
|
id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
... on Perpetual {
|
||||||
|
dataSourceSpecForSettlementData {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
dataSourceSpecForSettlementSchedule {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+34
-3
@@ -5,19 +5,19 @@ import * as Apollo from '@apollo/client';
|
|||||||
const defaultOptions = {} as const;
|
const defaultOptions = {} as const;
|
||||||
export type ExplorerOracleDataConnectionFragment = { __typename?: 'OracleSpec', dataConnection: { __typename?: 'OracleDataConnection', edges?: Array<{ __typename?: 'OracleDataEdge', node: { __typename?: 'OracleData', externalData: { __typename?: 'ExternalData', data: { __typename?: 'Data', matchedSpecIds?: Array<string> | null, broadcastAt: any, signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, data?: Array<{ __typename?: 'Property', name: string, value: string }> | null } } } } | null> | null } };
|
export type ExplorerOracleDataConnectionFragment = { __typename?: 'OracleSpec', dataConnection: { __typename?: 'OracleDataConnection', edges?: Array<{ __typename?: 'OracleDataEdge', node: { __typename?: 'OracleData', externalData: { __typename?: 'ExternalData', data: { __typename?: 'Data', matchedSpecIds?: Array<string> | null, broadcastAt: any, signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, data?: Array<{ __typename?: 'Property', name: string, value: string }> | null } } } } | null> | null } };
|
||||||
|
|
||||||
export type ExplorerOracleDataSourceFragment = { __typename?: 'OracleSpec', dataSourceSpec: { __typename?: 'ExternalDataSourceSpec', spec: { __typename?: 'DataSourceSpec', id: string, createdAt: any, updatedAt?: any | null, status: Types.DataSourceSpecStatus, data: { __typename?: 'DataSourceDefinition', sourceType: { __typename?: 'DataSourceDefinitionExternal', sourceType: { __typename?: 'DataSourceSpecConfiguration', signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, filters?: Array<{ __typename?: 'Filter', key: { __typename?: 'PropertyKey', name?: string | null, type: Types.PropertyKeyType, numberDecimalPlaces?: number | null }, conditions?: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator }> | null }> | null } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator } | null> } } } } }, dataConnection: { __typename?: 'OracleDataConnection', edges?: Array<{ __typename?: 'OracleDataEdge', node: { __typename?: 'OracleData', externalData: { __typename?: 'ExternalData', data: { __typename?: 'Data', matchedSpecIds?: Array<string> | null, broadcastAt: any, signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, data?: Array<{ __typename?: 'Property', name: string, value: string }> | null } } } } | null> | null } };
|
export type ExplorerOracleDataSourceFragment = { __typename?: 'OracleSpec', dataSourceSpec: { __typename?: 'ExternalDataSourceSpec', spec: { __typename?: 'DataSourceSpec', id: string, createdAt: any, updatedAt?: any | null, status: Types.DataSourceSpecStatus, data: { __typename?: 'DataSourceDefinition', sourceType: { __typename?: 'DataSourceDefinitionExternal', sourceType: { __typename?: 'DataSourceSpecConfiguration', signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, filters?: Array<{ __typename?: 'Filter', key: { __typename?: 'PropertyKey', name?: string | null, type: Types.PropertyKeyType, numberDecimalPlaces?: number | null }, conditions?: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator }> | null }> | null } | { __typename?: 'EthCallSpec', abi?: Array<string> | null, args?: Array<string> | null, method: string, requiredConfirmations: number, address: string, normalisers?: Array<{ __typename?: 'Normaliser', name: string, expression: string }> | null, trigger: { __typename?: 'EthCallTrigger', trigger: { __typename?: 'EthTimeTrigger', initial?: any | null, every?: number | null, until?: any | null } }, filters?: Array<{ __typename?: 'Filter', key: { __typename?: 'PropertyKey', name?: string | null, type: Types.PropertyKeyType, numberDecimalPlaces?: number | null }, conditions?: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator }> | null }> | null } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator } | null> } | { __typename?: 'DataSourceSpecConfigurationTimeTrigger' } } } } }, dataConnection: { __typename?: 'OracleDataConnection', edges?: Array<{ __typename?: 'OracleDataEdge', node: { __typename?: 'OracleData', externalData: { __typename?: 'ExternalData', data: { __typename?: 'Data', matchedSpecIds?: Array<string> | null, broadcastAt: any, signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, data?: Array<{ __typename?: 'Property', name: string, value: string }> | null } } } } | null> | null } };
|
||||||
|
|
||||||
export type ExplorerOracleSpecsQueryVariables = Types.Exact<{ [key: string]: never; }>;
|
export type ExplorerOracleSpecsQueryVariables = Types.Exact<{ [key: string]: never; }>;
|
||||||
|
|
||||||
|
|
||||||
export type ExplorerOracleSpecsQuery = { __typename?: 'Query', oracleSpecsConnection?: { __typename?: 'OracleSpecsConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean }, edges?: Array<{ __typename?: 'OracleSpecEdge', node: { __typename?: 'OracleSpec', dataSourceSpec: { __typename?: 'ExternalDataSourceSpec', spec: { __typename?: 'DataSourceSpec', id: string, createdAt: any, updatedAt?: any | null, status: Types.DataSourceSpecStatus, data: { __typename?: 'DataSourceDefinition', sourceType: { __typename?: 'DataSourceDefinitionExternal', sourceType: { __typename?: 'DataSourceSpecConfiguration', signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, filters?: Array<{ __typename?: 'Filter', key: { __typename?: 'PropertyKey', name?: string | null, type: Types.PropertyKeyType, numberDecimalPlaces?: number | null }, conditions?: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator }> | null }> | null } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator } | null> } } } } }, dataConnection: { __typename?: 'OracleDataConnection', edges?: Array<{ __typename?: 'OracleDataEdge', node: { __typename?: 'OracleData', externalData: { __typename?: 'ExternalData', data: { __typename?: 'Data', matchedSpecIds?: Array<string> | null, broadcastAt: any, signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, data?: Array<{ __typename?: 'Property', name: string, value: string }> | null } } } } | null> | null } } } | null> | null } | null };
|
export type ExplorerOracleSpecsQuery = { __typename?: 'Query', oracleSpecsConnection?: { __typename?: 'OracleSpecsConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean }, edges?: Array<{ __typename?: 'OracleSpecEdge', node: { __typename?: 'OracleSpec', dataSourceSpec: { __typename?: 'ExternalDataSourceSpec', spec: { __typename?: 'DataSourceSpec', id: string, createdAt: any, updatedAt?: any | null, status: Types.DataSourceSpecStatus, data: { __typename?: 'DataSourceDefinition', sourceType: { __typename?: 'DataSourceDefinitionExternal', sourceType: { __typename?: 'DataSourceSpecConfiguration', signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, filters?: Array<{ __typename?: 'Filter', key: { __typename?: 'PropertyKey', name?: string | null, type: Types.PropertyKeyType, numberDecimalPlaces?: number | null }, conditions?: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator }> | null }> | null } | { __typename?: 'EthCallSpec', abi?: Array<string> | null, args?: Array<string> | null, method: string, requiredConfirmations: number, address: string, normalisers?: Array<{ __typename?: 'Normaliser', name: string, expression: string }> | null, trigger: { __typename?: 'EthCallTrigger', trigger: { __typename?: 'EthTimeTrigger', initial?: any | null, every?: number | null, until?: any | null } }, filters?: Array<{ __typename?: 'Filter', key: { __typename?: 'PropertyKey', name?: string | null, type: Types.PropertyKeyType, numberDecimalPlaces?: number | null }, conditions?: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator }> | null }> | null } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator } | null> } | { __typename?: 'DataSourceSpecConfigurationTimeTrigger' } } } } }, dataConnection: { __typename?: 'OracleDataConnection', edges?: Array<{ __typename?: 'OracleDataEdge', node: { __typename?: 'OracleData', externalData: { __typename?: 'ExternalData', data: { __typename?: 'Data', matchedSpecIds?: Array<string> | null, broadcastAt: any, signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, data?: Array<{ __typename?: 'Property', name: string, value: string }> | null } } } } | null> | null } } } | null> | null } | null };
|
||||||
|
|
||||||
export type ExplorerOracleSpecByIdQueryVariables = Types.Exact<{
|
export type ExplorerOracleSpecByIdQueryVariables = Types.Exact<{
|
||||||
id: Types.Scalars['ID'];
|
id: Types.Scalars['ID'];
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
|
||||||
export type ExplorerOracleSpecByIdQuery = { __typename?: 'Query', oracleSpec?: { __typename?: 'OracleSpec', dataSourceSpec: { __typename?: 'ExternalDataSourceSpec', spec: { __typename?: 'DataSourceSpec', id: string, createdAt: any, updatedAt?: any | null, status: Types.DataSourceSpecStatus, data: { __typename?: 'DataSourceDefinition', sourceType: { __typename?: 'DataSourceDefinitionExternal', sourceType: { __typename?: 'DataSourceSpecConfiguration', signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, filters?: Array<{ __typename?: 'Filter', key: { __typename?: 'PropertyKey', name?: string | null, type: Types.PropertyKeyType, numberDecimalPlaces?: number | null }, conditions?: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator }> | null }> | null } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator } | null> } } } } }, dataConnection: { __typename?: 'OracleDataConnection', edges?: Array<{ __typename?: 'OracleDataEdge', node: { __typename?: 'OracleData', externalData: { __typename?: 'ExternalData', data: { __typename?: 'Data', matchedSpecIds?: Array<string> | null, broadcastAt: any, signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, data?: Array<{ __typename?: 'Property', name: string, value: string }> | null } } } } | null> | null } } | null };
|
export type ExplorerOracleSpecByIdQuery = { __typename?: 'Query', oracleSpec?: { __typename?: 'OracleSpec', dataSourceSpec: { __typename?: 'ExternalDataSourceSpec', spec: { __typename?: 'DataSourceSpec', id: string, createdAt: any, updatedAt?: any | null, status: Types.DataSourceSpecStatus, data: { __typename?: 'DataSourceDefinition', sourceType: { __typename?: 'DataSourceDefinitionExternal', sourceType: { __typename?: 'DataSourceSpecConfiguration', signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, filters?: Array<{ __typename?: 'Filter', key: { __typename?: 'PropertyKey', name?: string | null, type: Types.PropertyKeyType, numberDecimalPlaces?: number | null }, conditions?: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator }> | null }> | null } | { __typename?: 'EthCallSpec', abi?: Array<string> | null, args?: Array<string> | null, method: string, requiredConfirmations: number, address: string, normalisers?: Array<{ __typename?: 'Normaliser', name: string, expression: string }> | null, trigger: { __typename?: 'EthCallTrigger', trigger: { __typename?: 'EthTimeTrigger', initial?: any | null, every?: number | null, until?: any | null } }, filters?: Array<{ __typename?: 'Filter', key: { __typename?: 'PropertyKey', name?: string | null, type: Types.PropertyKeyType, numberDecimalPlaces?: number | null }, conditions?: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator }> | null }> | null } } | { __typename?: 'DataSourceDefinitionInternal', sourceType: { __typename?: 'DataSourceSpecConfigurationTime', conditions: Array<{ __typename?: 'Condition', value?: string | null, operator: Types.ConditionOperator } | null> } | { __typename?: 'DataSourceSpecConfigurationTimeTrigger' } } } } }, dataConnection: { __typename?: 'OracleDataConnection', edges?: Array<{ __typename?: 'OracleDataEdge', node: { __typename?: 'OracleData', externalData: { __typename?: 'ExternalData', data: { __typename?: 'Data', matchedSpecIds?: Array<string> | null, broadcastAt: any, signers?: Array<{ __typename?: 'Signer', signer: { __typename?: 'ETHAddress', address?: string | null } | { __typename?: 'PubKey', key?: string | null } }> | null, data?: Array<{ __typename?: 'Property', name: string, value: string }> | null } } } } | null> | null } } | null };
|
||||||
|
|
||||||
export const ExplorerOracleDataConnectionFragmentDoc = gql`
|
export const ExplorerOracleDataConnectionFragmentDoc = gql`
|
||||||
fragment ExplorerOracleDataConnection on OracleSpec {
|
fragment ExplorerOracleDataConnection on OracleSpec {
|
||||||
@@ -72,6 +72,37 @@ export const ExplorerOracleDataSourceFragmentDoc = gql`
|
|||||||
}
|
}
|
||||||
... on DataSourceDefinitionExternal {
|
... on DataSourceDefinitionExternal {
|
||||||
sourceType {
|
sourceType {
|
||||||
|
... on EthCallSpec {
|
||||||
|
abi
|
||||||
|
args
|
||||||
|
method
|
||||||
|
requiredConfirmations
|
||||||
|
address
|
||||||
|
normalisers {
|
||||||
|
name
|
||||||
|
expression
|
||||||
|
}
|
||||||
|
trigger {
|
||||||
|
trigger {
|
||||||
|
... on EthTimeTrigger {
|
||||||
|
initial
|
||||||
|
every
|
||||||
|
until
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
filters {
|
||||||
|
key {
|
||||||
|
name
|
||||||
|
type
|
||||||
|
numberDecimalPlaces
|
||||||
|
}
|
||||||
|
conditions {
|
||||||
|
value
|
||||||
|
operator
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
... on DataSourceSpecConfiguration {
|
... on DataSourceSpecConfiguration {
|
||||||
signers {
|
signers {
|
||||||
signer {
|
signer {
|
||||||
|
|||||||
@@ -3,12 +3,12 @@ import * as Types from '@vegaprotocol/types';
|
|||||||
import { gql } from '@apollo/client';
|
import { gql } from '@apollo/client';
|
||||||
import * as Apollo from '@apollo/client';
|
import * as Apollo from '@apollo/client';
|
||||||
const defaultOptions = {} as const;
|
const defaultOptions = {} as const;
|
||||||
export type ExplorerOracleForMarketsMarketFragment = { __typename?: 'Market', id: string, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', product: { __typename?: 'Future', dataSourceSpecForSettlementData: { __typename?: 'DataSourceSpec', id: string }, dataSourceSpecForTradingTermination: { __typename?: 'DataSourceSpec', id: string } } } } };
|
export type ExplorerOracleForMarketsMarketFragment = { __typename?: 'Market', id: string, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', product: { __typename?: 'Future', dataSourceSpecForSettlementData: { __typename?: 'DataSourceSpec', id: string }, dataSourceSpecForTradingTermination: { __typename?: 'DataSourceSpec', id: string } } | { __typename?: 'Perpetual', dataSourceSpecForSettlementData: { __typename?: 'DataSourceSpec', id: string }, dataSourceSpecForSettlementSchedule: { __typename?: 'DataSourceSpec', id: string } } | { __typename?: 'Spot' } } } };
|
||||||
|
|
||||||
export type ExplorerOracleFormMarketsQueryVariables = Types.Exact<{ [key: string]: never; }>;
|
export type ExplorerOracleFormMarketsQueryVariables = Types.Exact<{ [key: string]: never; }>;
|
||||||
|
|
||||||
|
|
||||||
export type ExplorerOracleFormMarketsQuery = { __typename?: 'Query', marketsConnection?: { __typename?: 'MarketConnection', edges: Array<{ __typename?: 'MarketEdge', node: { __typename?: 'Market', id: string, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', product: { __typename?: 'Future', dataSourceSpecForSettlementData: { __typename?: 'DataSourceSpec', id: string }, dataSourceSpecForTradingTermination: { __typename?: 'DataSourceSpec', id: string } } } } } }> } | null };
|
export type ExplorerOracleFormMarketsQuery = { __typename?: 'Query', marketsConnection?: { __typename?: 'MarketConnection', edges: Array<{ __typename?: 'MarketEdge', node: { __typename?: 'Market', id: string, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', product: { __typename?: 'Future', dataSourceSpecForSettlementData: { __typename?: 'DataSourceSpec', id: string }, dataSourceSpecForTradingTermination: { __typename?: 'DataSourceSpec', id: string } } | { __typename?: 'Perpetual', dataSourceSpecForSettlementData: { __typename?: 'DataSourceSpec', id: string }, dataSourceSpecForSettlementSchedule: { __typename?: 'DataSourceSpec', id: string } } | { __typename?: 'Spot' } } } } }> } | null };
|
||||||
|
|
||||||
export const ExplorerOracleForMarketsMarketFragmentDoc = gql`
|
export const ExplorerOracleForMarketsMarketFragmentDoc = gql`
|
||||||
fragment ExplorerOracleForMarketsMarket on Market {
|
fragment ExplorerOracleForMarketsMarket on Market {
|
||||||
@@ -24,6 +24,14 @@ export const ExplorerOracleForMarketsMarketFragmentDoc = gql`
|
|||||||
id
|
id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
... on Perpetual {
|
||||||
|
dataSourceSpecForSettlementData {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
dataSourceSpecForSettlementSchedule {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ interface OracleMarketsProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Slightly misleadlingly names, OracleMarkets lists the market (almost always singular)
|
* Slightly misleading names, OracleMarkets lists the market (almost always singular)
|
||||||
* to which an oracle is attached. It also checks what it triggers, by checking on the
|
* to which an oracle is attached. It also checks what it triggers, by checking on the
|
||||||
* market whether it is attached to the dataSourceSpecForSettlementData or ..TradingTermination
|
* market whether it is attached to the dataSourceSpecForSettlementData or ..TradingTermination
|
||||||
*/
|
*/
|
||||||
@@ -27,8 +27,10 @@ export function OracleMarkets({ id }: OracleMarketsProps) {
|
|||||||
const m = markets.find((m) => {
|
const m = markets.find((m) => {
|
||||||
const p = m.tradableInstrument.instrument.product;
|
const p = m.tradableInstrument.instrument.product;
|
||||||
if (
|
if (
|
||||||
p?.dataSourceSpecForSettlementData?.id === id ||
|
((p.__typename === 'Future' || p.__typename === 'Perpetual') &&
|
||||||
p?.dataSourceSpecForTradingTermination?.id === id
|
p.dataSourceSpecForSettlementData.id === id) ||
|
||||||
|
('dataSourceSpecForTradingTermination' in p &&
|
||||||
|
p.dataSourceSpecForTradingTermination.id === id)
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -61,8 +63,32 @@ export function getLabel(
|
|||||||
m: ExplorerOracleForMarketsMarketFragment | null
|
m: ExplorerOracleForMarketsMarketFragment | null
|
||||||
): string {
|
): string {
|
||||||
const settlementId =
|
const settlementId =
|
||||||
m?.tradableInstrument?.instrument?.product?.dataSourceSpecForSettlementData
|
((m?.tradableInstrument?.instrument?.product?.__typename === 'Future' ||
|
||||||
?.id || null;
|
m?.tradableInstrument?.instrument?.product?.__typename === 'Perpetual') &&
|
||||||
|
m?.tradableInstrument?.instrument?.product
|
||||||
|
?.dataSourceSpecForSettlementData?.id) ||
|
||||||
|
null;
|
||||||
|
|
||||||
return id === settlementId ? 'Settlement for' : 'Termination for';
|
const terminationId =
|
||||||
|
(m?.tradableInstrument?.instrument?.product?.__typename === 'Future' &&
|
||||||
|
m?.tradableInstrument?.instrument?.product
|
||||||
|
?.dataSourceSpecForTradingTermination?.id) ||
|
||||||
|
null;
|
||||||
|
|
||||||
|
const settlementScheduleId =
|
||||||
|
(m?.tradableInstrument?.instrument?.product?.__typename === 'Perpetual' &&
|
||||||
|
m?.tradableInstrument?.instrument?.product
|
||||||
|
?.dataSourceSpecForSettlementSchedule?.id) ||
|
||||||
|
null;
|
||||||
|
|
||||||
|
switch (id) {
|
||||||
|
case settlementId:
|
||||||
|
return 'Settlement for';
|
||||||
|
case terminationId:
|
||||||
|
return 'Termination for';
|
||||||
|
case settlementScheduleId:
|
||||||
|
return 'Settlement schedule for';
|
||||||
|
default:
|
||||||
|
return 'Unknown';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,6 +67,9 @@ export function OracleSigners({ sourceType }: OracleDetailsSignersProps) {
|
|||||||
if (sourceType.__typename !== 'DataSourceDefinitionExternal') {
|
if (sourceType.__typename !== 'DataSourceDefinitionExternal') {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
if (!('signers' in sourceType.sourceType)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
const signers = sourceType.sourceType.signers;
|
const signers = sourceType.sourceType.signers;
|
||||||
|
|
||||||
if (!signers || signers.length === 0) {
|
if (!signers || signers.length === 0) {
|
||||||
|
|||||||
@@ -8,7 +8,9 @@ import { useScrollToLocation } from '../../../hooks/scroll-to-location';
|
|||||||
import filter from 'recursive-key-filter';
|
import filter from 'recursive-key-filter';
|
||||||
|
|
||||||
const Oracles = () => {
|
const Oracles = () => {
|
||||||
const { data, loading, error } = useExplorerOracleSpecsQuery();
|
const { data, loading, error } = useExplorerOracleSpecsQuery({
|
||||||
|
errorPolicy: 'ignore',
|
||||||
|
});
|
||||||
|
|
||||||
useDocumentTitle(['Oracles']);
|
useDocumentTitle(['Oracles']);
|
||||||
useScrollToLocation();
|
useScrollToLocation();
|
||||||
@@ -38,7 +40,12 @@ const Oracles = () => {
|
|||||||
const dataConnection = o?.node.dataConnection;
|
const dataConnection = o?.node.dataConnection;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div id={id} key={id} className="mb-10">
|
<div
|
||||||
|
id={id}
|
||||||
|
key={id}
|
||||||
|
className="mb-10"
|
||||||
|
data-testid="oracle-details"
|
||||||
|
>
|
||||||
<OracleDetails
|
<OracleDetails
|
||||||
id={id}
|
id={id}
|
||||||
dataSource={o?.node}
|
dataSource={o?.node}
|
||||||
|
|||||||
@@ -23,6 +23,9 @@ fragment ExplorerPartyAssetsAccounts on AccountBalance {
|
|||||||
... on Future {
|
... on Future {
|
||||||
quoteName
|
quoteName
|
||||||
}
|
}
|
||||||
|
... on Perpetual {
|
||||||
|
quoteName
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,14 +3,14 @@ import * as Types from '@vegaprotocol/types';
|
|||||||
import { gql } from '@apollo/client';
|
import { gql } from '@apollo/client';
|
||||||
import * as Apollo from '@apollo/client';
|
import * as Apollo from '@apollo/client';
|
||||||
const defaultOptions = {} as const;
|
const defaultOptions = {} as const;
|
||||||
export type ExplorerPartyAssetsAccountsFragment = { __typename?: 'AccountBalance', type: Types.AccountType, balance: string, asset: { __typename?: 'Asset', name: string, id: string, decimals: number, symbol: string, source: { __typename: 'BuiltinAsset' } | { __typename: 'ERC20', contractAddress: string } }, market?: { __typename?: 'Market', id: string, decimalPlaces: number, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', name: string, product: { __typename?: 'Future', quoteName: string } } } } | null };
|
export type ExplorerPartyAssetsAccountsFragment = { __typename?: 'AccountBalance', type: Types.AccountType, balance: string, asset: { __typename?: 'Asset', name: string, id: string, decimals: number, symbol: string, source: { __typename: 'BuiltinAsset' } | { __typename: 'ERC20', contractAddress: string } }, market?: { __typename?: 'Market', id: string, decimalPlaces: number, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', name: string, product: { __typename?: 'Future', quoteName: string } | { __typename?: 'Perpetual', quoteName: string } | { __typename?: 'Spot' } } } } | null };
|
||||||
|
|
||||||
export type ExplorerPartyAssetsQueryVariables = Types.Exact<{
|
export type ExplorerPartyAssetsQueryVariables = Types.Exact<{
|
||||||
partyId: Types.Scalars['ID'];
|
partyId: Types.Scalars['ID'];
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
|
||||||
export type ExplorerPartyAssetsQuery = { __typename?: 'Query', partiesConnection?: { __typename?: 'PartyConnection', edges: Array<{ __typename?: 'PartyEdge', node: { __typename?: 'Party', id: string, delegationsConnection?: { __typename?: 'DelegationsConnection', edges?: Array<{ __typename?: 'DelegationEdge', node: { __typename?: 'Delegation', amount: string, epoch: number, node: { __typename?: 'Node', id: string, name: string } } } | null> | null } | null, stakingSummary: { __typename?: 'StakingSummary', currentStakeAvailable: string, linkings: { __typename?: 'StakesConnection', edges?: Array<{ __typename?: 'StakeLinkingEdge', node: { __typename?: 'StakeLinking', type: Types.StakeLinkingType, status: Types.StakeLinkingStatus, amount: string } } | null> | null } }, accountsConnection?: { __typename?: 'AccountsConnection', edges?: Array<{ __typename?: 'AccountEdge', node: { __typename?: 'AccountBalance', type: Types.AccountType, balance: string, asset: { __typename?: 'Asset', name: string, id: string, decimals: number, symbol: string, source: { __typename: 'BuiltinAsset' } | { __typename: 'ERC20', contractAddress: string } }, market?: { __typename?: 'Market', id: string, decimalPlaces: number, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', name: string, product: { __typename?: 'Future', quoteName: string } } } } | null } } | null> | null } | null } }> } | null };
|
export type ExplorerPartyAssetsQuery = { __typename?: 'Query', partiesConnection?: { __typename?: 'PartyConnection', edges: Array<{ __typename?: 'PartyEdge', node: { __typename?: 'Party', id: string, delegationsConnection?: { __typename?: 'DelegationsConnection', edges?: Array<{ __typename?: 'DelegationEdge', node: { __typename?: 'Delegation', amount: string, epoch: number, node: { __typename?: 'Node', id: string, name: string } } } | null> | null } | null, stakingSummary: { __typename?: 'StakingSummary', currentStakeAvailable: string, linkings: { __typename?: 'StakesConnection', edges?: Array<{ __typename?: 'StakeLinkingEdge', node: { __typename?: 'StakeLinking', type: Types.StakeLinkingType, status: Types.StakeLinkingStatus, amount: string } } | null> | null } }, accountsConnection?: { __typename?: 'AccountsConnection', edges?: Array<{ __typename?: 'AccountEdge', node: { __typename?: 'AccountBalance', type: Types.AccountType, balance: string, asset: { __typename?: 'Asset', name: string, id: string, decimals: number, symbol: string, source: { __typename: 'BuiltinAsset' } | { __typename: 'ERC20', contractAddress: string } }, market?: { __typename?: 'Market', id: string, decimalPlaces: number, tradableInstrument: { __typename?: 'TradableInstrument', instrument: { __typename?: 'Instrument', name: string, product: { __typename?: 'Future', quoteName: string } | { __typename?: 'Perpetual', quoteName: string } | { __typename?: 'Spot' } } } } | null } } | null> | null } | null } }> } | null };
|
||||||
|
|
||||||
export const ExplorerPartyAssetsAccountsFragmentDoc = gql`
|
export const ExplorerPartyAssetsAccountsFragmentDoc = gql`
|
||||||
fragment ExplorerPartyAssetsAccounts on AccountBalance {
|
fragment ExplorerPartyAssetsAccounts on AccountBalance {
|
||||||
@@ -38,6 +38,9 @@ export const ExplorerPartyAssetsAccountsFragmentDoc = gql`
|
|||||||
... on Future {
|
... on Future {
|
||||||
quoteName
|
quoteName
|
||||||
}
|
}
|
||||||
|
... on Perpetual {
|
||||||
|
quoteName
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ export const ValidatorsPage = () => {
|
|||||||
const [vegaDialog, setVegaDialog] = useState<boolean>(false);
|
const [vegaDialog, setVegaDialog] = useState<boolean>(false);
|
||||||
const [tmDialog, setTmDialog] = useState<boolean>(false);
|
const [tmDialog, setTmDialog] = useState<boolean>(false);
|
||||||
|
|
||||||
const tokenLink = useLinks(DApp.Token);
|
const tokenLink = useLinks(DApp.Governance);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
-10
@@ -1453,11 +1453,6 @@ export interface components {
|
|||||||
readonly liquidityMonitoringParameters?: components['schemas']['vegaLiquidityMonitoringParameters'];
|
readonly liquidityMonitoringParameters?: components['schemas']['vegaLiquidityMonitoringParameters'];
|
||||||
/** @description Log normal risk model parameters, valid only if MODEL_LOG_NORMAL is selected. */
|
/** @description Log normal risk model parameters, valid only if MODEL_LOG_NORMAL is selected. */
|
||||||
readonly logNormal?: components['schemas']['vegaLogNormalRiskModel'];
|
readonly logNormal?: components['schemas']['vegaLogNormalRiskModel'];
|
||||||
/**
|
|
||||||
* @description Percentage move up and down from the mid price which specifies the range of
|
|
||||||
* price levels over which automated liquidity provision orders will be deployed.
|
|
||||||
*/
|
|
||||||
readonly lpPriceRange?: string;
|
|
||||||
/** @description Optional new futures market metadata, tags. */
|
/** @description Optional new futures market metadata, tags. */
|
||||||
readonly metadata?: readonly string[];
|
readonly metadata?: readonly string[];
|
||||||
/**
|
/**
|
||||||
@@ -1853,11 +1848,6 @@ export interface components {
|
|||||||
readonly liquidityMonitoringParameters?: components['schemas']['vegaLiquidityMonitoringParameters'];
|
readonly liquidityMonitoringParameters?: components['schemas']['vegaLiquidityMonitoringParameters'];
|
||||||
/** @description Log normal risk model parameters, valid only if MODEL_LOG_NORMAL is selected. */
|
/** @description Log normal risk model parameters, valid only if MODEL_LOG_NORMAL is selected. */
|
||||||
readonly logNormal?: components['schemas']['vegaLogNormalRiskModel'];
|
readonly logNormal?: components['schemas']['vegaLogNormalRiskModel'];
|
||||||
/**
|
|
||||||
* @description Percentage move up and down from the mid price which specifies the range of
|
|
||||||
* price levels over which automated liquidity provision orders will be deployed.
|
|
||||||
*/
|
|
||||||
readonly lpPriceRange?: string;
|
|
||||||
/** @description Optional futures market metadata, tags. */
|
/** @description Optional futures market metadata, tags. */
|
||||||
readonly metadata?: readonly string[];
|
readonly metadata?: readonly string[];
|
||||||
/** @description Price monitoring parameters. */
|
/** @description Price monitoring parameters. */
|
||||||
|
|||||||
@@ -14,11 +14,19 @@ NX_ETH_LOCAL_PROVIDER_URL=http://localhost:8545/
|
|||||||
NX_VEGA_WALLET_URL=http://localhost:1789
|
NX_VEGA_WALLET_URL=http://localhost:1789
|
||||||
NX_VEGA_DOCS_URL=https://docs.vega.xyz/mainnet
|
NX_VEGA_DOCS_URL=https://docs.vega.xyz/mainnet
|
||||||
NX_TRANCHES_SERVICE_URL=https://tranches-stagnet1-k8s.ops.vega.xyz
|
NX_TRANCHES_SERVICE_URL=https://tranches-stagnet1-k8s.ops.vega.xyz
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/test/announcements.json
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
||||||
NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72
|
NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72
|
||||||
NX_VEGA_REST_URL=http://localhost:3008/api/v2/
|
NX_VEGA_REST_URL=http://localhost:3008/api/v2/
|
||||||
NX_SUCCESSOR_MARKETS=true
|
NX_SUCCESSOR_MARKETS=true
|
||||||
|
NX_PRODUCT_PERPETUALS=true
|
||||||
|
NX_REFERRALS=true
|
||||||
|
NX_UPDATE_MARKET_STATE=true
|
||||||
|
NX_GOVERNANCE_TRANSFERS=true
|
||||||
|
NX_VOLUME_DISCOUNTS=true
|
||||||
|
|
||||||
|
|
||||||
NX_VEGA_EXPLORER_URL=https://explorer.fairground.wtf
|
NX_VEGA_EXPLORER_URL=https://explorer.fairground.wtf
|
||||||
NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn
|
NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn
|
||||||
|
|||||||
@@ -3,3 +3,8 @@ NX_VEGA_ENV=DEVNET
|
|||||||
NX_VEGA_URL=https://api.n04.d.vega.xyz/graphql
|
NX_VEGA_URL=https://api.n04.d.vega.xyz/graphql
|
||||||
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
NX_ETHEREUM_PROVIDER_URL=https://sepolia.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
||||||
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
NX_ETHERSCAN_URL=https://sepolia.etherscan.io
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
NX_PRODUCT_PERPETUALS=true
|
||||||
|
NX_UPDATE_MARKET_STATE=true
|
||||||
|
NX_REFERRALS=true
|
||||||
|
NX_VOLUME_DISCOUNTS=true
|
||||||
|
|||||||
@@ -3,3 +3,8 @@ NX_VEGA_ENV=MAINNET
|
|||||||
NX_VEGA_URL=https://api.vega.community/graphql
|
NX_VEGA_URL=https://api.vega.community/graphql
|
||||||
NX_ETHEREUM_PROVIDER_URL=https://mainnet.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
NX_ETHEREUM_PROVIDER_URL=https://mainnet.infura.io/v3/4f846e79e13f44d1b51bbd7ed9edefb8
|
||||||
NX_ETHERSCAN_URL=https://etherscan.io
|
NX_ETHERSCAN_URL=https://etherscan.io
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
NX_PRODUCT_PERPETUALS=false
|
||||||
|
NX_UPDATE_MARKET_STATE=false
|
||||||
|
NX_REFERRALS=false
|
||||||
|
NX_VOLUME_DISCOUNTS=false
|
||||||
|
|||||||
@@ -3,3 +3,8 @@ NX_VEGA_ENV=TESTNET
|
|||||||
NX_VEGA_URL=https://api.n07.testnet.vega.xyz/graphql
|
NX_VEGA_URL=https://api.n07.testnet.vega.xyz/graphql
|
||||||
NX_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_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
NX_PRODUCT_PERPETUALS=true
|
||||||
|
NX_UPDATE_MARKET_STATE=true
|
||||||
|
NX_REFERRALS=true
|
||||||
|
NX_VOLUME_DISCOUNTS=true
|
||||||
|
|||||||
@@ -19,7 +19,22 @@ export const upgradeProposalsData = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
node: {
|
node: {
|
||||||
upgradeBlockHeight: '1955065',
|
upgradeBlockHeight: '10001',
|
||||||
|
vegaReleaseTag: 'v0.71.0+dev-12156-bca1d57e',
|
||||||
|
approvers: [
|
||||||
|
'02a6531716b7a6d82779b7793c3ad2fcb47290ea2ff0912c56f61219bd9675ff',
|
||||||
|
'121934387281812a2d5e6913e5d57c0f85a8f169e2752347ee2e23b52d46623c',
|
||||||
|
'65c80e2f5f84e2109eec30810f137ba04cbbecaba8f27706c146cc6c6f90db29',
|
||||||
|
'bd6339d2428c79ac3bc9011771236d17bac92bcb1806423388d52fb440043aef',
|
||||||
|
],
|
||||||
|
status: 'PROTOCOL_UPGRADE_PROPOSAL_STATUS_APPROVED',
|
||||||
|
__typename: 'ProtocolUpgradeProposal',
|
||||||
|
},
|
||||||
|
__typename: 'ProtocolUpgradeProposalEdge',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
node: {
|
||||||
|
upgradeBlockHeight: '20',
|
||||||
vegaReleaseTag: 'v0.71.0+dev-12156-bca1d57e',
|
vegaReleaseTag: 'v0.71.0+dev-12156-bca1d57e',
|
||||||
approvers: [
|
approvers: [
|
||||||
'02a6531716b7a6d82779b7793c3ad2fcb47290ea2ff0912c56f61219bd9675ff',
|
'02a6531716b7a6d82779b7793c3ad2fcb47290ea2ff0912c56f61219bd9675ff',
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"rationale": {
|
|
||||||
"title": "Add USDT Coin (USDT)",
|
|
||||||
"description": "Proposal to add USDT Coin (USDT) as an asset"
|
|
||||||
},
|
|
||||||
"terms": {
|
|
||||||
"newAsset": {
|
|
||||||
"changes": {
|
|
||||||
"name": "USDT Coin",
|
|
||||||
"symbol": "USDT",
|
|
||||||
"decimals": "18",
|
|
||||||
"quantum": "1",
|
|
||||||
"erc20": {
|
|
||||||
"contractAddress": "0xb404c51bbc10dcbe948077f18a4b8e553d160084"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"closingTimestamp": 1662374250,
|
|
||||||
"enactmentTimestamp": 1662460650
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"rationale": {
|
||||||
|
"title": "Governance cancel transfer proposal",
|
||||||
|
"description": "Rejected cancel transfer proposal"
|
||||||
|
},
|
||||||
|
"terms": {
|
||||||
|
"cancelTransfer": {
|
||||||
|
"changes": {
|
||||||
|
"transferId": "invalid transfer id"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"closingTimestamp": 0,
|
||||||
|
"enactmentTimestamp": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
{
|
||||||
|
"rationale": {
|
||||||
|
"description": "## Summary\n\nThis proposal requests to list BTC PERPS Incentive as a market with USD-P as a settlement asset on the Vega Network as discussed in: https://community.vega.xyz/.\n\n## Rationale\n\n- BTC is the largest Crypto asset with the highest volume and Marketcap.\n- Given the price, 1 decimal places will be used for price due to the number of valid digits in asset price. \n- Position decimal places will be set to 4 considering the value per contract\n- USDT is chosen as settlement asset due to its stability.",
|
||||||
|
"title": "perpetual market proposal"
|
||||||
|
},
|
||||||
|
"terms": {
|
||||||
|
"closingTimestamp": 0,
|
||||||
|
"enactmentTimestamp": 0,
|
||||||
|
"newMarket": {
|
||||||
|
"changes": {
|
||||||
|
"instrument": {
|
||||||
|
"name": "Token test market",
|
||||||
|
"code": "TEST.24h",
|
||||||
|
"perpetual": {
|
||||||
|
"clampLowerBound": "0",
|
||||||
|
"clampUpperBound": "0",
|
||||||
|
"interestRate": "0",
|
||||||
|
"marginFundingFactor": "0.1",
|
||||||
|
"settlementAsset": "73174a6fb1d5802ba0ac7bd7ab79e0a3a4837b262de0a4e80815a55442692bd0",
|
||||||
|
"quoteName": "fBTC",
|
||||||
|
"dataSourceSpecForSettlementData": {
|
||||||
|
"external": {
|
||||||
|
"ethOracle": {
|
||||||
|
"address": "0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43",
|
||||||
|
"abi": "[{\"inputs\":[],\"name\":\"latestAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
|
||||||
|
"method": "latestAnswer",
|
||||||
|
"normalisers": [
|
||||||
|
{
|
||||||
|
"name": "btc.price",
|
||||||
|
"expression": "$[0]"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"requiredConfirmations": 3,
|
||||||
|
"trigger": {
|
||||||
|
"timeTrigger": {
|
||||||
|
"every": 30
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"filters": [
|
||||||
|
{
|
||||||
|
"key": {
|
||||||
|
"name": "btc.price",
|
||||||
|
"type": "TYPE_INTEGER",
|
||||||
|
"numberDecimalPlaces": 8
|
||||||
|
},
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"operator": "OPERATOR_GREATER_THAN_OR_EQUAL",
|
||||||
|
"value": "0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dataSourceSpecForSettlementSchedule": {
|
||||||
|
"internal": {
|
||||||
|
"timeTrigger": {
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"operator": "OPERATOR_GREATER_THAN_OR_EQUAL",
|
||||||
|
"value": "0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"triggers": [
|
||||||
|
{
|
||||||
|
"every": 1800
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dataSourceSpecBinding": {
|
||||||
|
"settlementDataProperty": "btc.price",
|
||||||
|
"settlementScheduleProperty": "vegaprotocol.builtin.timetrigger"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"metadata": [
|
||||||
|
"base:BTC",
|
||||||
|
"quote:USD-P",
|
||||||
|
"class:fx/crypto",
|
||||||
|
"quarterly",
|
||||||
|
"sector:defi",
|
||||||
|
"enactment:2023-06-15T14:00:00Z",
|
||||||
|
"settlement:2023-09-30T08:00:00Z"
|
||||||
|
],
|
||||||
|
"priceMonitoringParameters": {
|
||||||
|
"triggers": [
|
||||||
|
{
|
||||||
|
"horizon": "3600",
|
||||||
|
"probability": "0.9999",
|
||||||
|
"auctionExtension": "120"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"horizon": "14400",
|
||||||
|
"probability": "0.9999",
|
||||||
|
"auctionExtension": "180"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"horizon": "43200",
|
||||||
|
"probability": "0.9999",
|
||||||
|
"auctionExtension": "300"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"liquidityMonitoringParameters": {
|
||||||
|
"targetStakeParameters": {
|
||||||
|
"timeWindow": "3600",
|
||||||
|
"scalingFactor": 1
|
||||||
|
},
|
||||||
|
"triggeringRatio": "0.7",
|
||||||
|
"auctionExtension": "1"
|
||||||
|
},
|
||||||
|
|
||||||
|
"liquiditySlaParameters": {
|
||||||
|
"priceRange": "0.05",
|
||||||
|
"commitmentMinTimeFraction": "0.95",
|
||||||
|
"performanceHysteresisEpochs": 1,
|
||||||
|
"slaCompetitionFactor": "0.95"
|
||||||
|
},
|
||||||
|
|
||||||
|
"logNormal": {
|
||||||
|
"riskAversionParameter": 0.000001,
|
||||||
|
"tau": 0.0001140771161,
|
||||||
|
"params": {
|
||||||
|
"sigma": 1.5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"decimalPlaces": "1",
|
||||||
|
"positionDecimalPlaces": "4",
|
||||||
|
"linearSlippageFactor": "0.001",
|
||||||
|
"quadraticSlippageFactor": "0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,7 +10,6 @@
|
|||||||
"positionDecimalPlaces": "5",
|
"positionDecimalPlaces": "5",
|
||||||
"linearSlippageFactor": "0.001",
|
"linearSlippageFactor": "0.001",
|
||||||
"quadraticSlippageFactor": "0",
|
"quadraticSlippageFactor": "0",
|
||||||
"lpPriceRange": "10",
|
|
||||||
"instrument": {
|
"instrument": {
|
||||||
"name": "Token test market",
|
"name": "Token test market",
|
||||||
"code": "TEST.24h",
|
"code": "TEST.24h",
|
||||||
@@ -104,6 +103,12 @@
|
|||||||
"r": 0.016,
|
"r": 0.016,
|
||||||
"sigma": 0.5
|
"sigma": 0.5
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"liquiditySlaParameters": {
|
||||||
|
"priceRange": "0.95",
|
||||||
|
"commitmentMinTimeFraction": "0.5",
|
||||||
|
"performanceHysteresisEpochs": 2,
|
||||||
|
"slaCompetitionFactor": "0.75"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
"positionDecimalPlaces": "5",
|
"positionDecimalPlaces": "5",
|
||||||
"linearSlippageFactor": "0.001",
|
"linearSlippageFactor": "0.001",
|
||||||
"quadraticSlippageFactor": "0",
|
"quadraticSlippageFactor": "0",
|
||||||
"lpPriceRange": "10",
|
|
||||||
"instrument": {
|
"instrument": {
|
||||||
"name": "Token test market",
|
"name": "Token test market",
|
||||||
"code": "Token.24h",
|
"code": "Token.24h",
|
||||||
@@ -98,6 +97,12 @@
|
|||||||
"r": 0.016,
|
"r": 0.016,
|
||||||
"sigma": 0.8
|
"sigma": 0.8
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"liquiditySlaParameters": {
|
||||||
|
"priceRange": "0.95",
|
||||||
|
"commitmentMinTimeFraction": "0.5",
|
||||||
|
"performanceHysteresisEpochs": 2,
|
||||||
|
"slaCompetitionFactor": "0.75"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"rationale": {
|
||||||
|
"title": "Market resume test",
|
||||||
|
"description": "E2E test for market resume proposal"
|
||||||
|
},
|
||||||
|
"terms": {
|
||||||
|
"updateMarketState": {
|
||||||
|
"changes": {
|
||||||
|
"marketId": "b33bb4157e12355db22e41f277ddd0c10104dec29a4d6960bbcb96d186c40cbd",
|
||||||
|
"updateType": "MARKET_STATE_UPDATE_TYPE_RESUME"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"closingTimestamp": 0,
|
||||||
|
"enactmentTimestamp": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,7 +4,6 @@
|
|||||||
"positionDecimalPlaces": "5",
|
"positionDecimalPlaces": "5",
|
||||||
"linearSlippageFactor": "0.001",
|
"linearSlippageFactor": "0.001",
|
||||||
"quadraticSlippageFactor": "0",
|
"quadraticSlippageFactor": "0",
|
||||||
"lpPriceRange": "10",
|
|
||||||
"instrument": {
|
"instrument": {
|
||||||
"name": "Token test market",
|
"name": "Token test market",
|
||||||
"code": "Token.24h",
|
"code": "Token.24h",
|
||||||
@@ -99,6 +98,12 @@
|
|||||||
"sigma": 0.8
|
"sigma": 0.8
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"liquiditySlaParameters": {
|
||||||
|
"priceRange": "0.95",
|
||||||
|
"commitmentMinTimeFraction": "0.5",
|
||||||
|
"performanceHysteresisEpochs": 2,
|
||||||
|
"slaCompetitionFactor": "0.75"
|
||||||
|
},
|
||||||
"successor": {
|
"successor": {
|
||||||
"parentMarketId": "",
|
"parentMarketId": "",
|
||||||
"insurancePoolFraction": "0.75"
|
"insurancePoolFraction": "0.75"
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"rationale": {
|
||||||
|
"title": "Market suspended test",
|
||||||
|
"description": "E2E test for market suspended proposal"
|
||||||
|
},
|
||||||
|
"terms": {
|
||||||
|
"updateMarketState": {
|
||||||
|
"changes": {
|
||||||
|
"marketId": "",
|
||||||
|
"updateType": "MARKET_STATE_UPDATE_TYPE_SUSPEND"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"closingTimestamp": 0,
|
||||||
|
"enactmentTimestamp": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"rationale": {
|
||||||
|
"title": "Market terminate test",
|
||||||
|
"description": "E2E test for market terminate proposal"
|
||||||
|
},
|
||||||
|
"terms": {
|
||||||
|
"updateMarketState": {
|
||||||
|
"changes": {
|
||||||
|
"marketId": "",
|
||||||
|
"updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE",
|
||||||
|
"price": "100"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"closingTimestamp": 0,
|
||||||
|
"enactmentTimestamp": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
{
|
|
||||||
"lpPriceRange": "11",
|
|
||||||
"instrument": {
|
|
||||||
"code": "Token.24h",
|
|
||||||
"future": {
|
|
||||||
"quoteName": "fBTC",
|
|
||||||
"dataSourceSpecForSettlementData": {
|
|
||||||
"external": {
|
|
||||||
"oracle": {
|
|
||||||
"signers": [
|
|
||||||
{
|
|
||||||
"pubKey": {
|
|
||||||
"key": "70d14a321e02e71992fd115563df765000ccc4775cbe71a0e2f9ff5a3b9dc680"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"filters": [
|
|
||||||
{
|
|
||||||
"key": {
|
|
||||||
"name": "prices.BTC.value",
|
|
||||||
"type": "TYPE_INTEGER"
|
|
||||||
},
|
|
||||||
"conditions": [
|
|
||||||
{
|
|
||||||
"operator": "OPERATOR_GREATER_THAN",
|
|
||||||
"value": "0"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dataSourceSpecForTradingTermination": {
|
|
||||||
"external": {
|
|
||||||
"oracle": {
|
|
||||||
"signers": [
|
|
||||||
{
|
|
||||||
"pubKey": {
|
|
||||||
"key": "70d14a321e02e71992fd115563df765000ccc4775cbe71a0e2f9ff5a3b9dc680"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"filters": [
|
|
||||||
{
|
|
||||||
"key": {
|
|
||||||
"name": "trading.terminated.ETH5",
|
|
||||||
"type": "TYPE_BOOLEAN"
|
|
||||||
},
|
|
||||||
"conditions": [
|
|
||||||
{
|
|
||||||
"operator": "OPERATOR_GREATER_THAN_OR_EQUAL",
|
|
||||||
"value": "1648684800000000000"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dataSourceSpecBinding": {
|
|
||||||
"settlementDataProperty": "prices.BTC.value",
|
|
||||||
"tradingTerminationProperty": "trading.terminated.ETH5"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"metadata": ["sector:energy", "sector:food", "source:docs.vega.xyz"],
|
|
||||||
"priceMonitoringParameters": {
|
|
||||||
"triggers": [
|
|
||||||
{
|
|
||||||
"horizon": "43200",
|
|
||||||
"probability": "0.9999999",
|
|
||||||
"auctionExtension": "600"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"logNormal": {
|
|
||||||
"tau": 0.0001140771161,
|
|
||||||
"riskAversionParameter": 0.001,
|
|
||||||
"params": {
|
|
||||||
"mu": 0,
|
|
||||||
"r": 0.016,
|
|
||||||
"sigma": 0.3
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
{
|
{
|
||||||
"lpPriceRange": "10",
|
|
||||||
"linearSlippageFactor": "0.001",
|
"linearSlippageFactor": "0.001",
|
||||||
"quadraticSlippageFactor": "0",
|
"quadraticSlippageFactor": "0",
|
||||||
"instrument": {
|
"instrument": {
|
||||||
@@ -98,5 +97,11 @@
|
|||||||
"r": 0.016,
|
"r": 0.016,
|
||||||
"sigma": 0.3
|
"sigma": 0.3
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"liquiditySlaParameters": {
|
||||||
|
"priceRange": "0.95",
|
||||||
|
"commitmentMinTimeFraction": "0.5",
|
||||||
|
"performanceHysteresisEpochs": 2,
|
||||||
|
"slaCompetitionFactor": "0.75"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import {
|
|||||||
createTenDigitUnixTimeStampForSpecifiedDays,
|
createTenDigitUnixTimeStampForSpecifiedDays,
|
||||||
generateFreeFormProposalTitle,
|
generateFreeFormProposalTitle,
|
||||||
getDateFormatForSpecifiedDays,
|
getDateFormatForSpecifiedDays,
|
||||||
|
getProposalDetailsValue,
|
||||||
getProposalFromTitle,
|
getProposalFromTitle,
|
||||||
getProposalInformationFromTable,
|
getProposalInformationFromTable,
|
||||||
goToMakeNewProposal,
|
goToMakeNewProposal,
|
||||||
@@ -26,29 +27,36 @@ import {
|
|||||||
} from '../../../../governance-e2e/src/support/staking.functions';
|
} from '../../../../governance-e2e/src/support/staking.functions';
|
||||||
import { ethereumWalletConnect } from '../../../../governance-e2e/src/support/wallet-eth.functions';
|
import { ethereumWalletConnect } from '../../../../governance-e2e/src/support/wallet-eth.functions';
|
||||||
import {
|
import {
|
||||||
|
depositAsset,
|
||||||
switchVegaWalletPubKey,
|
switchVegaWalletPubKey,
|
||||||
vegaWalletSetSpecifiedApprovalAmount,
|
vegaWalletSetSpecifiedApprovalAmount,
|
||||||
} from '../../support/wallet-functions';
|
} from '../../support/wallet-functions';
|
||||||
import type { testFreeformProposal } from '../../support/common-interfaces';
|
import type { testFreeformProposal } from '../../support/common-interfaces';
|
||||||
import { formatDateWithLocalTimezone } from '@vegaprotocol/utils';
|
import { formatDateWithLocalTimezone } from '@vegaprotocol/utils';
|
||||||
import { createSuccessorMarketProposalTxBody } from '../../support/proposal.functions';
|
import {
|
||||||
|
createGovernanceTransferProposalTxBody,
|
||||||
|
createSuccessorMarketProposalTxBody,
|
||||||
|
} from '../../support/proposal.functions';
|
||||||
|
|
||||||
const proposalListItem = '[data-testid="proposals-list-item"]';
|
const proposalListItem = '[data-testid="proposals-list-item"]';
|
||||||
const proposalVoteProgressForPercentage =
|
const participationNotMet = 'token-participation-not-met';
|
||||||
'vote-progress-indicator-percentage-for';
|
const voteStatus = 'vote-status';
|
||||||
const proposalVoteProgressAgainstPercentage =
|
const voteMajorityNotMet = 'token-majority-not-met';
|
||||||
'vote-progress-indicator-percentage-against';
|
const numberOfVotesFor = 'num-votes-for';
|
||||||
const proposalVoteProgressForTokens = 'vote-progress-indicator-tokens-for';
|
const votesForPercentage = 'votes-for-percentage';
|
||||||
const proposalVoteProgressAgainstTokens =
|
const numberOfVotesAgainst = 'num-votes-against';
|
||||||
'vote-progress-indicator-tokens-against';
|
const votesAgainstPercentage = 'votes-against-percentage';
|
||||||
|
const totalVotedNumber = 'total-voted';
|
||||||
|
const totalVotedPercentage = 'total-voted-percentage';
|
||||||
const changeVoteButton = 'change-vote-button';
|
const changeVoteButton = 'change-vote-button';
|
||||||
const proposalDetailsTitle = 'proposal-title';
|
const proposalDetailsTitle = 'proposal-title';
|
||||||
const proposalDetailsDescription = 'proposal-description';
|
const proposalDetailsDescription = 'proposal-description';
|
||||||
const openProposals = 'open-proposals';
|
const openProposals = 'open-proposals';
|
||||||
const viewProposalButton = 'view-proposal-btn';
|
const viewProposalButton = 'view-proposal-btn';
|
||||||
const voteBreakdownToggle = 'vote-breakdown-toggle';
|
|
||||||
const proposalTermsToggle = 'proposal-json-toggle';
|
const proposalTermsToggle = 'proposal-json-toggle';
|
||||||
const marketDataToggle = 'proposal-market-data-toggle';
|
const marketDataToggle = 'proposal-market-data-toggle';
|
||||||
|
const governanceTransferToggle = 'proposal-transfer-details';
|
||||||
|
const marketProposalType = 'proposal-type';
|
||||||
|
|
||||||
describe(
|
describe(
|
||||||
'Governance flow for proposal details',
|
'Governance flow for proposal details',
|
||||||
@@ -57,6 +65,17 @@ describe(
|
|||||||
before('connect wallets and set approval limit', function () {
|
before('connect wallets and set approval limit', function () {
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
ethereumWalletConnect();
|
ethereumWalletConnect();
|
||||||
|
cy.createMarket();
|
||||||
|
navigateTo(navigation.proposals);
|
||||||
|
cy.getByTestId('closed-proposals').within(() => {
|
||||||
|
cy.contains('Add Lorem Ipsum market')
|
||||||
|
.parentsUntil(proposalListItem)
|
||||||
|
.last()
|
||||||
|
.within(() => {
|
||||||
|
cy.getByTestId(viewProposalButton).click();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
getProposalInformationFromTable('ID').invoke('text').as('parentMarketId');
|
||||||
});
|
});
|
||||||
|
|
||||||
beforeEach('visit proposals tab', function () {
|
beforeEach('visit proposals tab', function () {
|
||||||
@@ -150,29 +169,32 @@ describe(
|
|||||||
// 3001-VOTE-037
|
// 3001-VOTE-037
|
||||||
// 3001-VOTE-040
|
// 3001-VOTE-040
|
||||||
// 3001-VOTE-067
|
// 3001-VOTE-067
|
||||||
|
// 3001-VOTE-023
|
||||||
createRawProposal();
|
createRawProposal();
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
||||||
cy.getByTestId(viewProposalButton).click()
|
cy.getByTestId(viewProposalButton).click()
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
cy.contains('Participation: Not Met 0.00 0.00%(0.00% Required)').should(
|
cy.getByTestId(participationNotMet).should(
|
||||||
'be.visible'
|
'have.text',
|
||||||
|
'0.000000000000000000000015% participation threshold not met'
|
||||||
|
);
|
||||||
|
cy.getByTestId(voteMajorityNotMet).should(
|
||||||
|
'have.text',
|
||||||
|
'66% majority threshold not met'
|
||||||
|
);
|
||||||
|
cy.getByTestId(voteStatus).should(
|
||||||
|
'have.text',
|
||||||
|
'Currently expected to fail'
|
||||||
);
|
);
|
||||||
cy.getByTestId(voteBreakdownToggle).click();
|
|
||||||
getProposalInformationFromTable('Expected to pass')
|
|
||||||
.contains('👎')
|
|
||||||
.should('be.visible');
|
|
||||||
// 3001-VOTE-062
|
// 3001-VOTE-062
|
||||||
// 3001-VOTE-040
|
// 3001-VOTE-040
|
||||||
// 3001-VOTE-070
|
// 3001-VOTE-070
|
||||||
getProposalInformationFromTable('Token majority met')
|
|
||||||
.contains('👎')
|
|
||||||
.should('be.visible');
|
|
||||||
// 3001-VOTE-068
|
// 3001-VOTE-068
|
||||||
getProposalInformationFromTable('Token participation met')
|
cy.getByTestId(numberOfVotesFor).should('have.text', '0.0M');
|
||||||
.contains('👎')
|
cy.getByTestId(numberOfVotesAgainst).should('have.text', '0.0M');
|
||||||
.should('be.visible');
|
cy.getByTestId(totalVotedNumber).should('have.text', '0.0M');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 3001-VOTE-080 3001-VOTE-090 3001-VOTE-069 3001-VOTE-072 3001-VOTE-073
|
// 3001-VOTE-080 3001-VOTE-090 3001-VOTE-069 3001-VOTE-072 3001-VOTE-073
|
||||||
@@ -197,43 +219,16 @@ describe(
|
|||||||
.contains(votedDate)
|
.contains(votedDate)
|
||||||
.should('be.visible');
|
.should('be.visible');
|
||||||
});
|
});
|
||||||
cy.getByTestId(proposalVoteProgressForPercentage) // 3001-VOTE-072
|
cy.getByTestId(votesForPercentage) // 3001-VOTE-072
|
||||||
.contains('100.00%')
|
.should('have.text', '100%');
|
||||||
.and('be.visible');
|
cy.getByTestId(votesAgainstPercentage).should('have.text', '0%');
|
||||||
cy.getByTestId(proposalVoteProgressAgainstPercentage)
|
cy.getByTestId('token-majority-progress')
|
||||||
.contains('0.00%')
|
.should('have.attr', 'style')
|
||||||
.and('be.visible');
|
.and('eq', 'width: 100%;'); // 3001-VOTE-024
|
||||||
cy.getByTestId(proposalVoteProgressForTokens)
|
|
||||||
.contains('1.00')
|
|
||||||
.and('be.visible');
|
|
||||||
cy.getByTestId(proposalVoteProgressAgainstTokens)
|
|
||||||
.contains('0.00')
|
|
||||||
.and('be.visible');
|
|
||||||
cy.getByTestId(voteBreakdownToggle).click();
|
|
||||||
getProposalInformationFromTable('Tokens for proposal')
|
|
||||||
.should('have.text', (1).toFixed(2))
|
|
||||||
.and('be.visible');
|
|
||||||
getProposalInformationFromTable('Tokens against proposal')
|
|
||||||
.should('have.text', '0.00')
|
|
||||||
.and('be.visible');
|
|
||||||
// 3001-VOTE-061
|
|
||||||
getProposalInformationFromTable('Participation required')
|
|
||||||
.contains('0.00%')
|
|
||||||
.should('be.visible');
|
|
||||||
// 3001-VOTE-066
|
|
||||||
getProposalInformationFromTable('Majority Required') // 3001-VOTE-073
|
|
||||||
.contains(`${(66).toFixed(2)}%`)
|
|
||||||
.should('be.visible');
|
|
||||||
getProposalInformationFromTable('Number of voting parties')
|
|
||||||
.should('have.text', '1')
|
|
||||||
.and('be.visible');
|
|
||||||
cy.getByTestId(changeVoteButton).should('be.visible').click();
|
cy.getByTestId(changeVoteButton).should('be.visible').click();
|
||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
// 3001-VOTE-064
|
// 3001-VOTE-064
|
||||||
cy.getByTestId('user-voted-yes').should('exist');
|
cy.getByTestId('user-voted-yes').should('exist');
|
||||||
getProposalInformationFromTable('Tokens for proposal')
|
|
||||||
.should('have.text', (1).toFixed(2))
|
|
||||||
.and('be.visible');
|
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() => {
|
getProposalFromTitle(rawProposal.rationale.title).within(() => {
|
||||||
@@ -244,16 +239,7 @@ describe(
|
|||||||
});
|
});
|
||||||
cy.getByTestId(changeVoteButton).should('be.visible').click();
|
cy.getByTestId(changeVoteButton).should('be.visible').click();
|
||||||
voteForProposal('against');
|
voteForProposal('against');
|
||||||
cy.getByTestId(proposalVoteProgressAgainstPercentage)
|
cy.getByTestId(votesAgainstPercentage).should('have.text', '100%');
|
||||||
.contains('100.00%')
|
|
||||||
.and('be.visible');
|
|
||||||
cy.getByTestId(voteBreakdownToggle).click();
|
|
||||||
getProposalInformationFromTable('Tokens against proposal')
|
|
||||||
.should('have.text', (1).toFixed(2))
|
|
||||||
.and('be.visible');
|
|
||||||
getProposalInformationFromTable('Number of voting parties')
|
|
||||||
.should('have.text', '1')
|
|
||||||
.and('be.visible');
|
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() => {
|
getProposalFromTitle(rawProposal.rationale.title).within(() => {
|
||||||
@@ -265,6 +251,7 @@ describe(
|
|||||||
|
|
||||||
// 3001-VOTE-042, 3001-VOTE-057, 3001-VOTE-058, 3001-VOTE-059, 3001-VOTE-060
|
// 3001-VOTE-042, 3001-VOTE-057, 3001-VOTE-058, 3001-VOTE-059, 3001-VOTE-060
|
||||||
it('Newly created proposal details - ability to increase associated tokens - by voting again after association', function () {
|
it('Newly created proposal details - ability to increase associated tokens - by voting again after association', function () {
|
||||||
|
ensureSpecifiedUnstakedTokensAreAssociated('1');
|
||||||
vegaWalletSetSpecifiedApprovalAmount('1000');
|
vegaWalletSetSpecifiedApprovalAmount('1000');
|
||||||
createRawProposal();
|
createRawProposal();
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
@@ -275,69 +262,28 @@ describe(
|
|||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
// 3001-VOTE-079
|
// 3001-VOTE-079
|
||||||
cy.contains('You voted: For').should('be.visible');
|
cy.contains('You voted: For').should('be.visible');
|
||||||
cy.getByTestId(proposalVoteProgressForTokens)
|
cy.getByTestId(numberOfVotesFor).should('have.text', '0.0M');
|
||||||
.contains('1')
|
cy.getByTestId(votesForPercentage).should('have.text', '100%');
|
||||||
.and('be.visible');
|
cy.getByTestId(totalVotedNumber).should('have.text', '0.0M');
|
||||||
cy.getByTestId(voteBreakdownToggle).click();
|
cy.getByTestId(totalVotedPercentage).should('have.text', '(0.00%)');
|
||||||
getProposalInformationFromTable('Total Supply')
|
ethereumWalletConnect();
|
||||||
.invoke('text')
|
stakingPageAssociateTokens('1000000', { approve: true });
|
||||||
.then((totalSupply) => {
|
navigateTo(navigation.proposals);
|
||||||
const tokensRequiredToAchieveResult = (
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
(Number(totalSupply.replace(/,/g, '')) * 0.001) /
|
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
||||||
100
|
cy.getByTestId(viewProposalButton).click()
|
||||||
).toFixed(2);
|
);
|
||||||
ethereumWalletConnect();
|
});
|
||||||
ensureSpecifiedUnstakedTokensAreAssociated(
|
cy.getByTestId(votesForPercentage).should('have.text', '100%');
|
||||||
tokensRequiredToAchieveResult
|
cy.getByTestId(numberOfVotesFor).should('have.text', '0.0M');
|
||||||
);
|
cy.getByTestId(totalVotedNumber).should('have.text', '0.0M');
|
||||||
navigateTo(navigation.proposals);
|
cy.getByTestId(totalVotedPercentage).should('have.text', '(0.00%)');
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
// 3001-VOTE-065
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
cy.getByTestId(changeVoteButton).should('be.visible').click();
|
||||||
cy.getByTestId(viewProposalButton).click()
|
voteForProposal('for');
|
||||||
);
|
cy.getByTestId(numberOfVotesFor).should('have.text', '1.0M');
|
||||||
});
|
cy.getByTestId(totalVotedNumber).should('have.text', '1.0M');
|
||||||
cy.getByTestId(proposalVoteProgressForPercentage)
|
cy.getByTestId(totalVotedPercentage).should('have.text', '(1.54%)');
|
||||||
.contains('100.00%')
|
|
||||||
.and('be.visible');
|
|
||||||
cy.getByTestId(proposalVoteProgressAgainstPercentage)
|
|
||||||
.contains('0.00%')
|
|
||||||
.and('be.visible');
|
|
||||||
// 3001-VOTE-065
|
|
||||||
cy.getByTestId(changeVoteButton).should('be.visible').click();
|
|
||||||
voteForProposal('for');
|
|
||||||
cy.getByTestId(proposalVoteProgressForTokens)
|
|
||||||
.contains(tokensRequiredToAchieveResult)
|
|
||||||
.and('be.visible');
|
|
||||||
cy.getByTestId(proposalVoteProgressAgainstTokens)
|
|
||||||
.contains('0.00')
|
|
||||||
.and('be.visible');
|
|
||||||
cy.getByTestId(voteBreakdownToggle).click();
|
|
||||||
getProposalInformationFromTable('Total tokens voted percentage')
|
|
||||||
.should('have.text', '0.00%')
|
|
||||||
.and('be.visible');
|
|
||||||
getProposalInformationFromTable('Tokens for proposal')
|
|
||||||
.should('have.text', tokensRequiredToAchieveResult)
|
|
||||||
.and('be.visible');
|
|
||||||
getProposalInformationFromTable('Tokens against proposal')
|
|
||||||
.should('have.text', '0.00')
|
|
||||||
.and('be.visible');
|
|
||||||
getProposalInformationFromTable('Number of voting parties')
|
|
||||||
.should('have.text', '1')
|
|
||||||
.and('be.visible');
|
|
||||||
getProposalInformationFromTable('Expected to pass')
|
|
||||||
.contains('👍')
|
|
||||||
.should('be.visible');
|
|
||||||
// 3001-VOTE-062
|
|
||||||
getProposalInformationFromTable('Token majority met')
|
|
||||||
.contains('👍')
|
|
||||||
.should('be.visible');
|
|
||||||
getProposalInformationFromTable('Token participation met')
|
|
||||||
.contains('👍')
|
|
||||||
.should('be.visible');
|
|
||||||
getProposalInformationFromTable('Tokens for proposal')
|
|
||||||
.contains(tokensRequiredToAchieveResult)
|
|
||||||
.and('be.visible');
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Able to vote for proposal twice by switching public key', function () {
|
it('Able to vote for proposal twice by switching public key', function () {
|
||||||
@@ -360,10 +306,6 @@ describe(
|
|||||||
voteForProposal('against');
|
voteForProposal('against');
|
||||||
cy.contains('You voted: Against').should('be.visible');
|
cy.contains('You voted: Against').should('be.visible');
|
||||||
switchVegaWalletPubKey();
|
switchVegaWalletPubKey();
|
||||||
cy.getByTestId(proposalVoteProgressForTokens).should(
|
|
||||||
'contain.text',
|
|
||||||
'1.00'
|
|
||||||
);
|
|
||||||
// Checking vote status for different public keys is displayed correctly
|
// Checking vote status for different public keys is displayed correctly
|
||||||
cy.contains('You voted: For').should('be.visible');
|
cy.contains('You voted: For').should('be.visible');
|
||||||
});
|
});
|
||||||
@@ -372,9 +314,6 @@ describe(
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('Able to see successor market details with new and updated values', function () {
|
it('Able to see successor market details with new and updated values', function () {
|
||||||
cy.createMarket();
|
|
||||||
cy.reload();
|
|
||||||
waitForSpinner();
|
|
||||||
cy.getByTestId('closed-proposals').within(() => {
|
cy.getByTestId('closed-proposals').within(() => {
|
||||||
cy.contains('Add Lorem Ipsum market')
|
cy.contains('Add Lorem Ipsum market')
|
||||||
.parentsUntil(proposalListItem)
|
.parentsUntil(proposalListItem)
|
||||||
@@ -383,14 +322,9 @@ describe(
|
|||||||
cy.getByTestId(viewProposalButton).click();
|
cy.getByTestId(viewProposalButton).click();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
getProposalInformationFromTable('ID')
|
cy.VegaWalletSubmitProposal(
|
||||||
.invoke('text')
|
createSuccessorMarketProposalTxBody(this.parentMarketId)
|
||||||
.as('parentMarketId')
|
);
|
||||||
.then(() => {
|
|
||||||
cy.VegaWalletSubmitProposal(
|
|
||||||
createSuccessorMarketProposalTxBody(this.parentMarketId)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
cy.reload();
|
cy.reload();
|
||||||
getProposalFromTitle('Test successor market proposal details').within(
|
getProposalFromTitle('Test successor market proposal details').within(
|
||||||
@@ -448,19 +382,221 @@ describe(
|
|||||||
});
|
});
|
||||||
|
|
||||||
// 3003-PMAN-011
|
// 3003-PMAN-011
|
||||||
cy.get('.underline').contains('Parent Market ID').realHover();
|
cy.contains('Parent Market ID').realHover();
|
||||||
cy.getByTestId('tooltip-content', { timeout: 8000 }).should(
|
cy.getByTestId('tooltip-content', { timeout: 8000 }).should(
|
||||||
'contain.text',
|
'contain.text',
|
||||||
'The ID of the market this market succeeds.'
|
'The ID of the market this market succeeds.'
|
||||||
);
|
);
|
||||||
cy.get('.underline')
|
cy.contains('Insurance Pool Fraction').realMouseUp().realHover();
|
||||||
.contains('Insurance Pool Fraction')
|
|
||||||
.realMouseUp()
|
|
||||||
.realHover();
|
|
||||||
cy.getByTestId('tooltip-content', { timeout: 8000 }).should(
|
cy.getByTestId('tooltip-content', { timeout: 8000 }).should(
|
||||||
'contain.text',
|
'contain.text',
|
||||||
'The fraction of the insurance pool balance that is carried over from the parent market to the successor.'
|
'The fraction of the insurance pool balance that is carried over from the parent market to the successor.'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('Able to see perpetual market', function () {
|
||||||
|
const proposalPath =
|
||||||
|
'src/fixtures/proposals/new-market-perpetual-raw.json';
|
||||||
|
const enactmentTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(3);
|
||||||
|
const closingTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(2);
|
||||||
|
submitUniqueRawProposal({
|
||||||
|
proposalBody: proposalPath,
|
||||||
|
enactmentTimestamp: enactmentTimestamp,
|
||||||
|
closingTimestamp: closingTimestamp,
|
||||||
|
});
|
||||||
|
getProposalFromTitle('perpetual market proposal').within(() => {
|
||||||
|
cy.getByTestId(marketProposalType).should(
|
||||||
|
'have.text',
|
||||||
|
'New market - perpetual'
|
||||||
|
);
|
||||||
|
cy.getByTestId(viewProposalButton).click();
|
||||||
|
});
|
||||||
|
cy.getByTestId(marketDataToggle).click();
|
||||||
|
getProposalDetailsValue('Product Type').should(
|
||||||
|
'contain.text',
|
||||||
|
'Perpetual'
|
||||||
|
);
|
||||||
|
cy.getByTestId(marketProposalType).should(
|
||||||
|
'have.text',
|
||||||
|
'New market - perpetual'
|
||||||
|
);
|
||||||
|
// Liquidity SLA protocols
|
||||||
|
getProposalDetailsValue('Performance Hysteresis Epochs').should(
|
||||||
|
'contain.text',
|
||||||
|
'1'
|
||||||
|
);
|
||||||
|
getProposalDetailsValue('SLA Competition Factor').should(
|
||||||
|
'contain.text',
|
||||||
|
'95.00%'
|
||||||
|
);
|
||||||
|
getProposalDetailsValue('Epoch Length').should('contain.text', '5s');
|
||||||
|
getProposalDetailsValue('Non Performance Bond Penalty Max').should(
|
||||||
|
'contain.text',
|
||||||
|
'0.05'
|
||||||
|
);
|
||||||
|
getProposalDetailsValue('Stake To CCY Volume').should(
|
||||||
|
'contain.text',
|
||||||
|
'0.3'
|
||||||
|
);
|
||||||
|
getProposalDetailsValue('Min Probability Of Trading LP Orders').should(
|
||||||
|
'contain.text',
|
||||||
|
'1e-8'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Able to see suspended market proposal', function () {
|
||||||
|
const proposalPath = 'src/fixtures/proposals/suspend-market-raw.json';
|
||||||
|
const enactmentTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(3);
|
||||||
|
const closingTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(2);
|
||||||
|
submitUniqueRawProposal({
|
||||||
|
proposalBody: proposalPath,
|
||||||
|
updateMarketId: this.parentMarketId,
|
||||||
|
enactmentTimestamp: enactmentTimestamp,
|
||||||
|
closingTimestamp: closingTimestamp,
|
||||||
|
});
|
||||||
|
getProposalFromTitle('Market suspended test').within(() => {
|
||||||
|
cy.getByTestId(marketProposalType).should(
|
||||||
|
'have.text',
|
||||||
|
'Suspend market'
|
||||||
|
);
|
||||||
|
cy.getByTestId(viewProposalButton).click();
|
||||||
|
});
|
||||||
|
cy.getByTestId(marketProposalType).should('have.text', 'Suspend market');
|
||||||
|
cy.getByTestId(marketDataToggle).click();
|
||||||
|
cy.getByTestId('proposal-update-market-state').within(() => {
|
||||||
|
getProposalInformationFromTable('Market ID')
|
||||||
|
.invoke('text')
|
||||||
|
.and('eq', this.parentMarketId);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Able to see resume market proposal', function () {
|
||||||
|
const proposalPath = 'src/fixtures/proposals/resume-market-raw.json';
|
||||||
|
const enactmentTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(3);
|
||||||
|
const closingTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(2);
|
||||||
|
submitUniqueRawProposal({
|
||||||
|
proposalBody: proposalPath,
|
||||||
|
updateMarketId: this.parentMarketId,
|
||||||
|
enactmentTimestamp: enactmentTimestamp,
|
||||||
|
closingTimestamp: closingTimestamp,
|
||||||
|
});
|
||||||
|
getProposalFromTitle('Market resume test').within(() => {
|
||||||
|
cy.getByTestId(marketProposalType).should('have.text', 'Resume market');
|
||||||
|
cy.getByTestId(viewProposalButton).click();
|
||||||
|
});
|
||||||
|
cy.getByTestId(marketProposalType).should('have.text', 'Resume market');
|
||||||
|
cy.getByTestId(marketDataToggle).click();
|
||||||
|
cy.getByTestId('proposal-update-market-state').within(() => {
|
||||||
|
getProposalInformationFromTable('Market ID')
|
||||||
|
.invoke('text')
|
||||||
|
.and('eq', this.parentMarketId);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Able to see terminate market proposal', function () {
|
||||||
|
const proposalPath = 'src/fixtures/proposals/terminate-market-raw.json';
|
||||||
|
const enactmentTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(3);
|
||||||
|
const closingTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(2);
|
||||||
|
submitUniqueRawProposal({
|
||||||
|
proposalBody: proposalPath,
|
||||||
|
updateMarketId: this.parentMarketId,
|
||||||
|
enactmentTimestamp: enactmentTimestamp,
|
||||||
|
closingTimestamp: closingTimestamp,
|
||||||
|
});
|
||||||
|
getProposalFromTitle('Market terminate test').within(() => {
|
||||||
|
cy.getByTestId(marketProposalType).should(
|
||||||
|
'have.text',
|
||||||
|
'Terminate market'
|
||||||
|
);
|
||||||
|
cy.getByTestId(viewProposalButton).click();
|
||||||
|
});
|
||||||
|
cy.getByTestId(marketProposalType).should(
|
||||||
|
'have.text',
|
||||||
|
'Terminate market'
|
||||||
|
);
|
||||||
|
cy.getByTestId(marketDataToggle).click();
|
||||||
|
cy.getByTestId('proposal-update-market-state').within(() => {
|
||||||
|
getProposalInformationFromTable('Market ID')
|
||||||
|
.invoke('text')
|
||||||
|
.and('eq', this.parentMarketId);
|
||||||
|
getProposalDetailsValue('Termination Price').should(
|
||||||
|
'contain.text',
|
||||||
|
'0.001 fUSDC'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Able to see governance transfer proposal', function () {
|
||||||
|
const vegaAssetAddress = '0x67175Da1D5e966e40D11c4B2519392B2058373de';
|
||||||
|
depositAsset(vegaAssetAddress, '1000', 18);
|
||||||
|
cy.getByTestId('currency-title', Cypress.env('txTimeout')).should(
|
||||||
|
'contain.text',
|
||||||
|
'Collateral'
|
||||||
|
);
|
||||||
|
cy.VegaWalletTopUpNetworkAccount('100');
|
||||||
|
cy.VegaWalletSubmitProposal(createGovernanceTransferProposalTxBody());
|
||||||
|
cy.reload();
|
||||||
|
getProposalFromTitle('Governance transfer proposal').within(() => {
|
||||||
|
cy.getByTestId(marketProposalType).should('have.text', 'NewTransfer');
|
||||||
|
cy.getByTestId(viewProposalButton).click();
|
||||||
|
});
|
||||||
|
cy.getByTestId(marketProposalType).should('have.text', 'NewTransfer');
|
||||||
|
cy.getByTestId(governanceTransferToggle).click();
|
||||||
|
cy.getByTestId('proposal-transfer-details-table').within(() => {
|
||||||
|
getProposalInformationFromTable('Source Type')
|
||||||
|
.invoke('text')
|
||||||
|
.and('eq', 'Network Treasury');
|
||||||
|
getProposalInformationFromTable('Destination')
|
||||||
|
.invoke('text')
|
||||||
|
.and('eq', Cypress.env('vegaWalletPublicKey'));
|
||||||
|
getProposalInformationFromTable('Asset')
|
||||||
|
.invoke('text')
|
||||||
|
.and('eq', 'VEGA');
|
||||||
|
getProposalInformationFromTable('Fraction Of Balance')
|
||||||
|
.invoke('text')
|
||||||
|
.and('eq', '50%');
|
||||||
|
getProposalInformationFromTable('Amount')
|
||||||
|
.invoke('text')
|
||||||
|
.and('eq', '100.00');
|
||||||
|
getProposalInformationFromTable('Transfer Type')
|
||||||
|
.invoke('text')
|
||||||
|
.and('eq', 'All or nothing');
|
||||||
|
getProposalInformationFromTable('Kind')
|
||||||
|
.invoke('text')
|
||||||
|
.and('eq', 'One off');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it(' Able to see cancel transfer proposal - rejected', function () {
|
||||||
|
const proposalPath = 'src/fixtures/proposals/cancel-transfer-raw.json';
|
||||||
|
const enactmentTimestamp =
|
||||||
|
createTenDigitUnixTimeStampForSpecifiedDays(11);
|
||||||
|
const closingTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(10);
|
||||||
|
submitUniqueRawProposal({
|
||||||
|
proposalBody: proposalPath,
|
||||||
|
enactmentTimestamp: enactmentTimestamp,
|
||||||
|
closingTimestamp: closingTimestamp,
|
||||||
|
submit: false,
|
||||||
|
});
|
||||||
|
cy.getByTestId('proposal-submit').should('be.visible').click();
|
||||||
|
cy.getByTestId('dialog-title').should('have.text', 'Proposal rejected');
|
||||||
|
cy.getByTestId('icon-cross').last().click();
|
||||||
|
navigateTo(navigation.proposals);
|
||||||
|
cy.get('[href="/proposals/rejected"]').click();
|
||||||
|
getProposalFromTitle('Governance cancel transfer proposal').within(() => {
|
||||||
|
cy.getByTestId(marketProposalType).should(
|
||||||
|
'have.text',
|
||||||
|
'CancelTransfer'
|
||||||
|
);
|
||||||
|
cy.getByTestId(viewProposalButton).click();
|
||||||
|
});
|
||||||
|
cy.getByTestId(marketProposalType).should('have.text', 'CancelTransfer');
|
||||||
|
getProposalInformationFromTable('Error details')
|
||||||
|
.invoke('text')
|
||||||
|
.and('eq', 'Governance transfer invalid transfer id not found');
|
||||||
|
getProposalInformationFromTable('transferId')
|
||||||
|
.invoke('text')
|
||||||
|
.and('eq', 'invalid transfer id');
|
||||||
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -22,12 +22,10 @@ const proposalListItem = '[data-testid="proposals-list-item"]';
|
|||||||
const closedProposals = 'closed-proposals';
|
const closedProposals = 'closed-proposals';
|
||||||
const proposalStatus = 'proposal-status';
|
const proposalStatus = 'proposal-status';
|
||||||
const viewProposalButton = 'view-proposal-btn';
|
const viewProposalButton = 'view-proposal-btn';
|
||||||
const votesTable = 'votes-table';
|
const votesTable = 'user-vote';
|
||||||
const openProposals = 'open-proposals';
|
const openProposals = 'open-proposals';
|
||||||
const proposalVoteProgressForPercentage =
|
const majorityVoteReached = 'token-majority-met';
|
||||||
'vote-progress-indicator-percentage-for';
|
const minParticipationReached = 'token-participation-met';
|
||||||
const majorityVoteReached = 'majority-reached';
|
|
||||||
const minParticipationReached = 'participation-reached';
|
|
||||||
const proposalTimeout = { timeout: 8000 };
|
const proposalTimeout = { timeout: 8000 };
|
||||||
|
|
||||||
context(
|
context(
|
||||||
@@ -67,10 +65,12 @@ context(
|
|||||||
cy.getByTestId(viewProposalButton).click();
|
cy.getByTestId(viewProposalButton).click();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.getByTestId('proposal-type').should('have.text', 'New market');
|
cy.getByTestId('proposal-type').should(
|
||||||
|
'have.text',
|
||||||
|
'New market - future'
|
||||||
|
);
|
||||||
cy.getByTestId(proposalStatus).should('have.text', 'Enacted');
|
cy.getByTestId(proposalStatus).should('have.text', 'Enacted');
|
||||||
cy.getByTestId(votesTable).within(() => {
|
cy.getByTestId(votesTable).within(() => {
|
||||||
cy.contains('Vote passed.').should('be.visible');
|
|
||||||
cy.contains('Voting has ended.').should('be.visible');
|
cy.contains('Voting has ended.').should('be.visible');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -92,7 +92,7 @@ context(
|
|||||||
// 3001-VOTE-019 time to vote is highlighted red
|
// 3001-VOTE-019 time to vote is highlighted red
|
||||||
cy.getByTestId('vote-details')
|
cy.getByTestId('vote-details')
|
||||||
.find('span')
|
.find('span')
|
||||||
.should('have.class', 'text-vega-pink');
|
.should('have.class', 'text-vega-orange');
|
||||||
cy.getByTestId(viewProposalButton).click();
|
cy.getByTestId(viewProposalButton).click();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -109,12 +109,9 @@ context(
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
cy.getByTestId(votesTable).within(() => {
|
cy.getByTestId(votesTable).within(() => {
|
||||||
cy.contains('Vote passed.').should('be.visible');
|
|
||||||
cy.contains('Voting has ended.').should('be.visible');
|
cy.contains('Voting has ended.').should('be.visible');
|
||||||
});
|
});
|
||||||
cy.getByTestId(proposalVoteProgressForPercentage)
|
cy.getByTestId('votes-for-percentage').should('have.text', '100%');
|
||||||
.contains('100.00%')
|
|
||||||
.and('be.visible');
|
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
cy.contains(proposalTitle)
|
cy.contains(proposalTitle)
|
||||||
.parentsUntil(proposalListItem)
|
.parentsUntil(proposalListItem)
|
||||||
|
|||||||
@@ -298,9 +298,6 @@ context(
|
|||||||
getProposalFromTitle(proposalTitle).within(() =>
|
getProposalFromTitle(proposalTitle).within(() =>
|
||||||
cy.getByTestId(viewProposalButton).click()
|
cy.getByTestId(viewProposalButton).click()
|
||||||
);
|
);
|
||||||
cy.contains('Vote breakdown').should('be.visible', {
|
|
||||||
timeout: 10000,
|
|
||||||
});
|
|
||||||
cy.getByTestId(voteButtons).should('not.exist');
|
cy.getByTestId(voteButtons).should('not.exist');
|
||||||
cy.getByTestId('min-proposal-requirements').should(
|
cy.getByTestId('min-proposal-requirements').should(
|
||||||
'have.text',
|
'have.text',
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ const proposalType = 'proposal-type';
|
|||||||
const proposalDetails = 'proposal-details';
|
const proposalDetails = 'proposal-details';
|
||||||
const newProposalSubmitButton = 'proposal-submit';
|
const newProposalSubmitButton = 'proposal-submit';
|
||||||
const proposalVoteDeadline = 'proposal-vote-deadline';
|
const proposalVoteDeadline = 'proposal-vote-deadline';
|
||||||
|
const proposalEnactmentDeadline = 'proposal-enactment-deadline';
|
||||||
const proposalParameterSelect = 'proposal-parameter-select';
|
const proposalParameterSelect = 'proposal-parameter-select';
|
||||||
const proposalMarketSelect = 'proposal-market-select';
|
const proposalMarketSelect = 'proposal-market-select';
|
||||||
const newProposalTitle = 'proposal-title';
|
const newProposalTitle = 'proposal-title';
|
||||||
@@ -52,8 +53,6 @@ const enactmentDeadlineError = 'enactment-before-voting-deadline';
|
|||||||
const proposalDownloadBtn = 'proposal-download-json';
|
const proposalDownloadBtn = 'proposal-download-json';
|
||||||
const feedbackError = '[data-testid="Error"]';
|
const feedbackError = '[data-testid="Error"]';
|
||||||
const viewProposalBtn = 'view-proposal-btn';
|
const viewProposalBtn = 'view-proposal-btn';
|
||||||
const liquidityVoteStatus = 'liquidity-votes-status';
|
|
||||||
const tokenVoteStatus = 'token-votes-status';
|
|
||||||
const proposalJsonToggle = 'proposal-json-toggle';
|
const proposalJsonToggle = 'proposal-json-toggle';
|
||||||
const proposalJsonSection = 'proposal-json';
|
const proposalJsonSection = 'proposal-json';
|
||||||
const vegaWalletPublicKey = Cypress.env('vegaWalletPublicKey');
|
const vegaWalletPublicKey = Cypress.env('vegaWalletPublicKey');
|
||||||
@@ -229,6 +228,8 @@ context(
|
|||||||
parseSpecialCharSequences: false,
|
parseSpecialCharSequences: false,
|
||||||
delay: 2,
|
delay: 2,
|
||||||
});
|
});
|
||||||
|
cy.getByTestId(proposalVoteDeadline).clear().type('2');
|
||||||
|
cy.getByTestId(proposalEnactmentDeadline).clear().type('3');
|
||||||
});
|
});
|
||||||
cy.getByTestId(proposalDownloadBtn)
|
cy.getByTestId(proposalDownloadBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
@@ -421,27 +422,28 @@ context(
|
|||||||
cy.getByTestId(viewProposalBtn).click();
|
cy.getByTestId(viewProposalBtn).click();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.getByTestId(liquidityVoteStatus).should(
|
cy.getByTestId('lp-majority-not-met').should(
|
||||||
'contain.text',
|
'have.text',
|
||||||
'Currently expected to fail'
|
'66% majority threshold not met'
|
||||||
);
|
);
|
||||||
cy.getByTestId(tokenVoteStatus).should(
|
|
||||||
'contain.text',
|
cy.getByTestId('token-majority-not-met').should(
|
||||||
'Currently expected to fail'
|
'have.text',
|
||||||
|
'66% majority threshold not met'
|
||||||
);
|
);
|
||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
cy.getByTestId(liquidityVoteStatus).should(
|
cy.getByTestId('lp-majority-met').should(
|
||||||
'contain.text',
|
'have.text',
|
||||||
'Currently expected to pass'
|
'66% majority threshold met'
|
||||||
);
|
);
|
||||||
cy.getByTestId(tokenVoteStatus).should(
|
cy.getByTestId('token-majority-met').should(
|
||||||
'contain.text',
|
'have.text',
|
||||||
'Currently expected to pass'
|
'66% majority threshold met'
|
||||||
|
);
|
||||||
|
cy.getByTestId('vote-status').should(
|
||||||
|
'have.text',
|
||||||
|
'Currently expected to pass by token vote'
|
||||||
);
|
);
|
||||||
cy.getByTestId('vote-breakdown-toggle').click();
|
|
||||||
getProposalInformationFromTable('Expected to pass')
|
|
||||||
.contains('👍 by token vote')
|
|
||||||
.should('be.visible');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 3001-VOTE-026 3001-VOTE-027 3001-VOTE-028 3001-VOTE-095 3001-VOTE-096 3005-PASN-001
|
// 3001-VOTE-026 3001-VOTE-027 3001-VOTE-028 3001-VOTE-095 3001-VOTE-096 3005-PASN-001
|
||||||
@@ -635,6 +637,8 @@ context(
|
|||||||
parseSpecialCharSequences: false,
|
parseSpecialCharSequences: false,
|
||||||
delay: 2,
|
delay: 2,
|
||||||
});
|
});
|
||||||
|
cy.getByTestId(proposalVoteDeadline).clear().type('2');
|
||||||
|
cy.getByTestId(proposalEnactmentDeadline).clear().type('3');
|
||||||
});
|
});
|
||||||
cy.getByTestId(proposalDownloadBtn)
|
cy.getByTestId(proposalDownloadBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import {
|
|||||||
enterRawProposalBody,
|
enterRawProposalBody,
|
||||||
generateFreeFormProposalTitle,
|
generateFreeFormProposalTitle,
|
||||||
getProposalFromTitle,
|
getProposalFromTitle,
|
||||||
getProposalInformationFromTable,
|
|
||||||
goToMakeNewProposal,
|
goToMakeNewProposal,
|
||||||
governanceProposalType,
|
governanceProposalType,
|
||||||
submitUniqueRawProposal,
|
submitUniqueRawProposal,
|
||||||
@@ -30,7 +29,9 @@ const proposalType = 'proposal-type';
|
|||||||
const proposalStatus = 'proposal-status';
|
const proposalStatus = 'proposal-status';
|
||||||
const proposalClosingDate = 'vote-details';
|
const proposalClosingDate = 'vote-details';
|
||||||
const viewProposalButton = 'view-proposal-btn';
|
const viewProposalButton = 'view-proposal-btn';
|
||||||
const voteBreakDownToggle = 'vote-breakdown-toggle';
|
const voteMajorityNotMet = 'token-majority-not-met';
|
||||||
|
const voteMajorityMet = 'token-majority-met';
|
||||||
|
const votesForPercentage = 'votes-for-percentage';
|
||||||
|
|
||||||
describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
||||||
before('connect wallets and set approval limit', function () {
|
before('connect wallets and set approval limit', function () {
|
||||||
@@ -88,11 +89,12 @@ describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
|||||||
|
|
||||||
it('Newly created proposals list - shows title and portion of summary', function () {
|
it('Newly created proposals list - shows title and portion of summary', function () {
|
||||||
const proposalPath = 'src/fixtures/proposals/new-market-raw.json';
|
const proposalPath = 'src/fixtures/proposals/new-market-raw.json';
|
||||||
const proposalTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(3);
|
const enactmentTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(3);
|
||||||
|
const closingTimestamp = createTenDigitUnixTimeStampForSpecifiedDays(2);
|
||||||
submitUniqueRawProposal({
|
submitUniqueRawProposal({
|
||||||
proposalBody: proposalPath,
|
proposalBody: proposalPath,
|
||||||
enactmentTimestamp: proposalTimestamp,
|
enactmentTimestamp: enactmentTimestamp,
|
||||||
closingTimestamp: proposalTimestamp,
|
closingTimestamp: closingTimestamp,
|
||||||
}); // 3001-VOTE-052
|
}); // 3001-VOTE-052
|
||||||
// 3001-VOTE-008
|
// 3001-VOTE-008
|
||||||
// 3001-VOTE-034
|
// 3001-VOTE-034
|
||||||
@@ -121,10 +123,15 @@ describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
|||||||
submitUniqueRawProposal({ proposalTitle: proposalTitle });
|
submitUniqueRawProposal({ proposalTitle: proposalTitle });
|
||||||
getProposalFromTitle(proposalTitle).within(() => {
|
getProposalFromTitle(proposalTitle).within(() => {
|
||||||
// 3001-VOTE-039
|
// 3001-VOTE-039
|
||||||
cy.getByTestId('participation-not-reached').should(
|
cy.getByTestId(voteMajorityNotMet).should(
|
||||||
'have.text',
|
'have.text',
|
||||||
'Min. participation not reached'
|
'66% majority threshold not met'
|
||||||
);
|
);
|
||||||
|
cy.getByTestId('token-participation-not-met').should(
|
||||||
|
'have.text',
|
||||||
|
'0.000000000000000000000015% participation threshold not met'
|
||||||
|
);
|
||||||
|
cy.getByTestId(votesForPercentage).should('have.text', '0%');
|
||||||
cy.getByTestId(viewProposalButton).click();
|
cy.getByTestId(viewProposalButton).click();
|
||||||
});
|
});
|
||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
@@ -134,16 +141,15 @@ describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
|||||||
'have.text',
|
'have.text',
|
||||||
'Currently expected to pass'
|
'Currently expected to pass'
|
||||||
);
|
);
|
||||||
cy.getByTestId('user-voted-yes').should('exist');
|
cy.getByTestId(voteMajorityMet).should(
|
||||||
cy.getByTestId('participation-reached').should(
|
|
||||||
'have.text',
|
'have.text',
|
||||||
'Min. participation reached'
|
'66% majority threshold met'
|
||||||
|
);
|
||||||
|
cy.getByTestId(votesForPercentage).should('have.text', '100%');
|
||||||
|
cy.getByTestId('token-participation-met').should(
|
||||||
|
'have.text',
|
||||||
|
'0.000000000000000000000015% participation threshold met'
|
||||||
);
|
);
|
||||||
cy.getByTestId(viewProposalButton).click();
|
|
||||||
});
|
});
|
||||||
cy.getByTestId(voteBreakDownToggle).click();
|
|
||||||
getProposalInformationFromTable('Token participation met')
|
|
||||||
.contains('👍')
|
|
||||||
.should('be.visible');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ context(
|
|||||||
closeStakingDialog();
|
closeStakingDialog();
|
||||||
navigateTo(navigation.validators);
|
navigateTo(navigation.validators);
|
||||||
cy.get(`[row-id="${0}"]`)
|
cy.get(`[row-id="${0}"]`)
|
||||||
.eq(1)
|
.first()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.getByTestId(stakeValidatorListTotalStake)
|
cy.getByTestId(stakeValidatorListTotalStake)
|
||||||
.should('have.text', '3,002.00')
|
.should('have.text', '3,002.00')
|
||||||
@@ -222,7 +222,7 @@ context(
|
|||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
});
|
});
|
||||||
cy.get(`[row-id="${1}"]`)
|
cy.get(`[row-id="${1}"]`)
|
||||||
.eq(1)
|
.first()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.getByTestId(stakeValidatorListTotalStake)
|
cy.getByTestId(stakeValidatorListTotalStake)
|
||||||
.scrollIntoView()
|
.scrollIntoView()
|
||||||
@@ -262,10 +262,10 @@ context(
|
|||||||
'2'
|
'2'
|
||||||
);
|
);
|
||||||
waitForBeginningOfEpoch();
|
waitForBeginningOfEpoch();
|
||||||
cy.getByTestId(stakeValidatorListStakePercentage).should(
|
cy.getByTestId(
|
||||||
'have.text',
|
stakeValidatorListStakePercentage,
|
||||||
'50.02%'
|
epochTimeout
|
||||||
);
|
).should('have.text', '50.02%');
|
||||||
navigateTo(navigation.validators);
|
navigateTo(navigation.validators);
|
||||||
validateValidatorListTotalStakeAndShare('0', '3,002.00', '50.02%');
|
validateValidatorListTotalStakeAndShare('0', '3,002.00', '50.02%');
|
||||||
}
|
}
|
||||||
@@ -310,7 +310,9 @@ context(
|
|||||||
closeStakingDialog();
|
closeStakingDialog();
|
||||||
navigateTo(navigation.validators);
|
navigateTo(navigation.validators);
|
||||||
clickOnValidatorFromList(0);
|
clickOnValidatorFromList(0);
|
||||||
cy.getByTestId(stakeRemoveStakeRadioButton, txTimeout).click();
|
cy.getByTestId(stakeRemoveStakeRadioButton, txTimeout).click({
|
||||||
|
force: true,
|
||||||
|
});
|
||||||
cy.getByTestId(stakeTokenAmountInputBox).type('-0.1');
|
cy.getByTestId(stakeTokenAmountInputBox).type('-0.1');
|
||||||
cy.contains('Waiting for next epoch to start', epochTimeout);
|
cy.contains('Waiting for next epoch to start', epochTimeout);
|
||||||
cy.getByTestId(stakeTokenSubmitButton)
|
cy.getByTestId(stakeTokenSubmitButton)
|
||||||
@@ -331,7 +333,7 @@ context(
|
|||||||
closeStakingDialog();
|
closeStakingDialog();
|
||||||
navigateTo(navigation.validators);
|
navigateTo(navigation.validators);
|
||||||
clickOnValidatorFromList(0);
|
clickOnValidatorFromList(0);
|
||||||
cy.getByTestId(stakeRemoveStakeRadioButton).click();
|
cy.getByTestId(stakeRemoveStakeRadioButton).click({ force: true });
|
||||||
cy.getByTestId(stakeTokenAmountInputBox).type('4');
|
cy.getByTestId(stakeTokenAmountInputBox).type('4');
|
||||||
cy.contains('Waiting for next epoch to start', epochTimeout);
|
cy.contains('Waiting for next epoch to start', epochTimeout);
|
||||||
cy.getByTestId(stakeTokenSubmitButton)
|
cy.getByTestId(stakeTokenSubmitButton)
|
||||||
@@ -422,7 +424,7 @@ context(
|
|||||||
validateValidatorListTotalStakeAndShare('0', '3,002.00', '50.02%');
|
validateValidatorListTotalStakeAndShare('0', '3,002.00', '50.02%');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Associating wallet tokens - when some already staked - auto stakes tokens to staked validator', function () {
|
it.skip('Associating wallet tokens - when some already staked - auto stakes tokens to staked validator', function () {
|
||||||
// 1002-STKE-004
|
// 1002-STKE-004
|
||||||
stakingPageAssociateTokens('3');
|
stakingPageAssociateTokens('3');
|
||||||
verifyUnstakedBalance(3.0);
|
verifyUnstakedBalance(3.0);
|
||||||
@@ -436,7 +438,7 @@ context(
|
|||||||
verifyStakedBalance(7.0);
|
verifyStakedBalance(7.0);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Associating vesting contract tokens - when some already staked - auto stakes tokens to staked validator', function () {
|
it.skip('Associating vesting contract tokens - when some already staked - auto stakes tokens to staked validator', function () {
|
||||||
// 1002-STKE-004
|
// 1002-STKE-004
|
||||||
stakingPageAssociateTokens('3', { type: 'contract' });
|
stakingPageAssociateTokens('3', { type: 'contract' });
|
||||||
verifyUnstakedBalance(3.0);
|
verifyUnstakedBalance(3.0);
|
||||||
@@ -450,7 +452,7 @@ context(
|
|||||||
verifyStakedBalance(7.0);
|
verifyStakedBalance(7.0);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Associating vesting contract tokens - when wallet tokens already staked - auto stakes tokens to staked validator', function () {
|
it.skip('Associating vesting contract tokens - when wallet tokens already staked - auto stakes tokens to staked validator', function () {
|
||||||
// 1002-STKE-004
|
// 1002-STKE-004
|
||||||
stakingPageAssociateTokens('3', { type: 'wallet' });
|
stakingPageAssociateTokens('3', { type: 'wallet' });
|
||||||
verifyUnstakedBalance(3.0);
|
verifyUnstakedBalance(3.0);
|
||||||
@@ -464,7 +466,7 @@ context(
|
|||||||
verifyStakedBalance(7.0);
|
verifyStakedBalance(7.0);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Associating tokens - with multiple validators already staked - auto stakes to staked validators - abiding by existing stake ratio', function () {
|
it.skip('Associating tokens - with multiple validators already staked - auto stakes to staked validators - abiding by existing stake ratio', function () {
|
||||||
// 1002-STKE-004
|
// 1002-STKE-004
|
||||||
stakingPageAssociateTokens('6');
|
stakingPageAssociateTokens('6');
|
||||||
verifyUnstakedBalance(6.0);
|
verifyUnstakedBalance(6.0);
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ context('Home Page - verify elements on page', { tags: '@smoke' }, function () {
|
|||||||
cy.getByTestId('subscription-cell').should('have.text', 'Yes');
|
cy.getByTestId('subscription-cell').should('have.text', 'Yes');
|
||||||
});
|
});
|
||||||
cy.getByTestId('connect').should('be.disabled');
|
cy.getByTestId('connect').should('be.disabled');
|
||||||
cy.getByTestId('node-url-custom').click();
|
cy.getByTestId('node-url-custom').click({ force: true });
|
||||||
cy.get('input').should('exist');
|
cy.get('input').should('exist');
|
||||||
cy.getByTestId('connect').should('be.disabled');
|
cy.getByTestId('connect').should('be.disabled');
|
||||||
cy.getByTestId('icon-cross').click();
|
cy.getByTestId('icon-cross').click();
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ const proposalDocumentationLink = 'proposal-documentation-link';
|
|||||||
const connectToVegaWalletButton = 'connect-to-vega-wallet-btn';
|
const connectToVegaWalletButton = 'connect-to-vega-wallet-btn';
|
||||||
const governanceDocsUrl = 'https://vega.xyz/governance';
|
const governanceDocsUrl = 'https://vega.xyz/governance';
|
||||||
const networkUpgradeProposalListItem = 'protocol-upgrade-proposals-list-item';
|
const networkUpgradeProposalListItem = 'protocol-upgrade-proposals-list-item';
|
||||||
|
const proposalUpgradeBlockHeight = 'protocol-upgrade-proposal-block-height';
|
||||||
const closedProposals = 'closed-proposals';
|
const closedProposals = 'closed-proposals';
|
||||||
const closedProposalToggle = 'closed-proposals-toggle-networkUpgrades';
|
const closedProposalToggle = 'closed-proposals-toggle-networkUpgrades';
|
||||||
const protocolUpgradeTime = 'protocol-upgrade-time';
|
const protocolUpgradeTime = 'protocol-upgrade-time';
|
||||||
@@ -37,33 +38,48 @@ context(
|
|||||||
});
|
});
|
||||||
|
|
||||||
// 3002-PROP-023 3004-PMAC-002 3005-PASN-002 3006-PASC-002 3007-PNEC-002 3008-PFRO-003
|
// 3002-PROP-023 3004-PMAC-002 3005-PASN-002 3006-PASC-002 3007-PNEC-002 3008-PFRO-003
|
||||||
it('should have button for link to more information on proposals', function () {
|
it('new proposal page should have button for link to more information on proposals', function () {
|
||||||
const proposalsUrl = 'https://docs.vega.xyz/mainnet/tutorials/proposals';
|
cy.getByTestId('new-proposal-link').click();
|
||||||
cy.getByTestId('new-proposal-link')
|
cy.url().should('include', '/proposals/propose/raw');
|
||||||
.find('a')
|
cy.contains('To see Explorer data on proposals visit').within(() => {
|
||||||
.should('have.attr', 'href', proposalsUrl);
|
cy.getByTestId('external-link').should(
|
||||||
|
'have.attr',
|
||||||
|
'href',
|
||||||
|
'https://explorer.fairground.wtf/governance'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
cy.contains(
|
||||||
|
'1. Sense check your proposal with the community on the forum:'
|
||||||
|
).within(() => {
|
||||||
|
cy.getByTestId('external-link').should(
|
||||||
|
'have.attr',
|
||||||
|
'href',
|
||||||
|
'https://community.vega.xyz/c/governance/25'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
cy.contains(
|
||||||
|
'2. Use the appropriate proposal template in the docs:'
|
||||||
|
).within(() => {
|
||||||
|
cy.getByTestId('external-link').should(
|
||||||
|
'have.attr',
|
||||||
|
'href',
|
||||||
|
'https://docs.vega.xyz/mainnet/tutorials/proposals'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
cy.contains('Connect your wallet to submit a proposal').should(
|
||||||
|
'be.visible'
|
||||||
|
);
|
||||||
|
cy.getByTestId('connect-to-vega-wallet-btn').should('exist');
|
||||||
|
navigateTo(navigation.proposals);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should be able to see a working link for - find out more about Vega governance', function () {
|
it('should be able to see a working link for - find out more about Vega governance', function () {
|
||||||
// 3001-VOTE-001
|
// 3001-VOTE-001 // 3002-PROP-001
|
||||||
cy.getByTestId(proposalDocumentationLink)
|
cy.getByTestId(proposalDocumentationLink)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Find out more about Vega governance')
|
.and('have.text', 'Find out more about Vega governance')
|
||||||
.and('have.attr', 'href')
|
.and('have.attr', 'href')
|
||||||
.and('equal', governanceDocsUrl);
|
.and('equal', governanceDocsUrl);
|
||||||
|
|
||||||
// 3002-PROP-001
|
|
||||||
cy.request(governanceDocsUrl)
|
|
||||||
.its('body')
|
|
||||||
.then((body) => {
|
|
||||||
if (!body.includes('Govern the network')) {
|
|
||||||
assert.include(
|
|
||||||
body,
|
|
||||||
'Govern the network',
|
|
||||||
`Checking that governance link destination includes 'Govern the network' text`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 3007-PNE-021
|
// 3007-PNE-021
|
||||||
@@ -156,7 +172,7 @@ context(
|
|||||||
'have.text',
|
'have.text',
|
||||||
'Vega release tag: v1'
|
'Vega release tag: v1'
|
||||||
);
|
);
|
||||||
cy.getByTestId('protocol-upgrade-proposal-block-height').should(
|
cy.getByTestId(proposalUpgradeBlockHeight).should(
|
||||||
'have.text',
|
'have.text',
|
||||||
'Upgrade block height: 2015942'
|
'Upgrade block height: 2015942'
|
||||||
);
|
);
|
||||||
@@ -171,7 +187,15 @@ context(
|
|||||||
});
|
});
|
||||||
cy.getByTestId(closedProposalToggle).click();
|
cy.getByTestId(closedProposalToggle).click();
|
||||||
cy.getByTestId(closedProposals).within(() => {
|
cy.getByTestId(closedProposals).within(() => {
|
||||||
cy.getByTestId(networkUpgradeProposalListItem).should('have.length', 1);
|
cy.getByTestId(networkUpgradeProposalListItem).should('have.length', 2);
|
||||||
|
cy.getByTestId(networkUpgradeProposalListItem)
|
||||||
|
.first()
|
||||||
|
.within(() => {
|
||||||
|
cy.getByTestId(proposalUpgradeBlockHeight).should(
|
||||||
|
'contain.text',
|
||||||
|
'10001'
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -183,7 +207,7 @@ context(
|
|||||||
.first()
|
.first()
|
||||||
.find('[data-testid="view-proposal-btn"]')
|
.find('[data-testid="view-proposal-btn"]')
|
||||||
.click();
|
.click();
|
||||||
cy.url().should('contain', '/protocol-upgrades/v1');
|
cy.url().should('contain', '/protocol-upgrades/v1/2015942');
|
||||||
cy.getByTestId('protocol-upgrade-proposal').within(() => {
|
cy.getByTestId('protocol-upgrade-proposal').within(() => {
|
||||||
cy.get('h1').should('have.text', 'Vega Release v1');
|
cy.get('h1').should('have.text', 'Vega Release v1');
|
||||||
cy.getByTestId('protocol-upgrade-block-height').should(
|
cy.getByTestId('protocol-upgrade-block-height').should(
|
||||||
@@ -243,7 +267,7 @@ context(
|
|||||||
);
|
);
|
||||||
cy.getByTestId('external-link')
|
cy.getByTestId('external-link')
|
||||||
.should('have.attr', 'href')
|
.should('have.attr', 'href')
|
||||||
.and('contain', '/proposals/protocol-upgrade/v1');
|
.and('contain', '/proposals/protocol-upgrade/v1/2015942');
|
||||||
});
|
});
|
||||||
|
|
||||||
// estimate does not display possibly due to mocks or Cypress unless the proposal is clicked on several times
|
// estimate does not display possibly due to mocks or Cypress unless the proposal is clicked on several times
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import {
|
|||||||
waitForBeginningOfEpoch,
|
waitForBeginningOfEpoch,
|
||||||
} from '../../support/staking.functions';
|
} from '../../support/staking.functions';
|
||||||
import { previousEpochData } from '../../fixtures/mocks/previous-epoch';
|
import { previousEpochData } from '../../fixtures/mocks/previous-epoch';
|
||||||
import { chainIdQuery, statisticsQuery } from '@vegaprotocol/mock';
|
|
||||||
|
|
||||||
const guideLink = 'staking-guide-link';
|
const guideLink = 'staking-guide-link';
|
||||||
const validatorTitle = 'validator-node-title';
|
const validatorTitle = 'validator-node-title';
|
||||||
@@ -38,17 +37,11 @@ const txTimeout = Cypress.env('txTimeout');
|
|||||||
|
|
||||||
context('Validators Page - verify elements on page', function () {
|
context('Validators Page - verify elements on page', function () {
|
||||||
before('navigate to validators page', () => {
|
before('navigate to validators page', () => {
|
||||||
cy.mockGQL((req) => {
|
cy.mockChainId();
|
||||||
aliasGQLQuery(req, 'ChainId', chainIdQuery());
|
|
||||||
aliasGQLQuery(req, 'Statistics', statisticsQuery());
|
|
||||||
});
|
|
||||||
cy.visit('/validators');
|
cy.visit('/validators');
|
||||||
});
|
});
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
cy.mockGQL((req) => {
|
cy.mockChainId();
|
||||||
aliasGQLQuery(req, 'ChainId', chainIdQuery());
|
|
||||||
aliasGQLQuery(req, 'Statistics', statisticsQuery());
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('with wallets disconnected', { tags: '@smoke' }, function () {
|
describe('with wallets disconnected', { tags: '@smoke' }, function () {
|
||||||
@@ -189,10 +182,7 @@ context('Validators Page - verify elements on page', function () {
|
|||||||
{ tags: '@smoke' },
|
{ tags: '@smoke' },
|
||||||
function () {
|
function () {
|
||||||
before('connect wallets and click on validator', function () {
|
before('connect wallets and click on validator', function () {
|
||||||
cy.mockGQL((req) => {
|
cy.mockChainId();
|
||||||
aliasGQLQuery(req, 'ChainId', chainIdQuery());
|
|
||||||
aliasGQLQuery(req, 'Statistics', statisticsQuery());
|
|
||||||
});
|
|
||||||
cy.visit('/validators');
|
cy.visit('/validators');
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
clickOnValidatorFromList(0);
|
clickOnValidatorFromList(0);
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import {
|
|||||||
vegaWalletFaucetAssetsWithoutCheck,
|
vegaWalletFaucetAssetsWithoutCheck,
|
||||||
vegaWalletTeardown,
|
vegaWalletTeardown,
|
||||||
} from '../../support/wallet-functions';
|
} from '../../support/wallet-functions';
|
||||||
import { aliasGQLQuery } from '@vegaprotocol/cypress';
|
|
||||||
import { chainIdQuery, statisticsQuery } from '@vegaprotocol/mock';
|
|
||||||
|
|
||||||
const walletContainer = 'aside [data-testid="vega-wallet"]';
|
const walletContainer = 'aside [data-testid="vega-wallet"]';
|
||||||
const walletHeader = '[data-testid="wallet-header"] h1';
|
const walletHeader = '[data-testid="wallet-header"] h1';
|
||||||
@@ -88,10 +86,7 @@ context(
|
|||||||
|
|
||||||
describe('when vega wallet connected', function () {
|
describe('when vega wallet connected', function () {
|
||||||
before('connect vega wallet', function () {
|
before('connect vega wallet', function () {
|
||||||
cy.mockGQL((req) => {
|
cy.mockChainId();
|
||||||
aliasGQLQuery(req, 'ChainId', chainIdQuery());
|
|
||||||
aliasGQLQuery(req, 'Statistics', statisticsQuery());
|
|
||||||
});
|
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
cy.wait('@ChainId');
|
cy.wait('@ChainId');
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
@@ -276,10 +271,7 @@ context(
|
|||||||
];
|
];
|
||||||
|
|
||||||
before('faucet assets to connected vega wallet', function () {
|
before('faucet assets to connected vega wallet', function () {
|
||||||
cy.mockGQL((req) => {
|
cy.mockChainId();
|
||||||
aliasGQLQuery(req, 'ChainId', chainIdQuery());
|
|
||||||
aliasGQLQuery(req, 'Statistics', statisticsQuery());
|
|
||||||
});
|
|
||||||
for (const { id, amount } of assets) {
|
for (const { id, amount } of assets) {
|
||||||
vegaWalletFaucetAssetsWithoutCheck(id, amount, vegaWalletPublicKey);
|
vegaWalletFaucetAssetsWithoutCheck(id, amount, vegaWalletPublicKey);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ export function submitUniqueRawProposal(proposalFields: {
|
|||||||
proposalBody?: string;
|
proposalBody?: string;
|
||||||
proposalTitle?: string;
|
proposalTitle?: string;
|
||||||
proposalDescription?: string;
|
proposalDescription?: string;
|
||||||
|
updateMarketId?: string;
|
||||||
closingTimestamp?: number;
|
closingTimestamp?: number;
|
||||||
enactmentTimestamp?: number;
|
enactmentTimestamp?: number;
|
||||||
submit?: boolean;
|
submit?: boolean;
|
||||||
@@ -71,6 +72,10 @@ export function submitUniqueRawProposal(proposalFields: {
|
|||||||
if (proposalFields.proposalDescription) {
|
if (proposalFields.proposalDescription) {
|
||||||
rawProposal.rationale.description = proposalFields.proposalDescription;
|
rawProposal.rationale.description = proposalFields.proposalDescription;
|
||||||
}
|
}
|
||||||
|
if (proposalFields.updateMarketId) {
|
||||||
|
rawProposal.terms.updateMarketState.changes.marketId =
|
||||||
|
proposalFields.updateMarketId;
|
||||||
|
}
|
||||||
if (proposalFields.closingTimestamp) {
|
if (proposalFields.closingTimestamp) {
|
||||||
rawProposal.terms.closingTimestamp = proposalFields.closingTimestamp;
|
rawProposal.terms.closingTimestamp = proposalFields.closingTimestamp;
|
||||||
} else if (
|
} else if (
|
||||||
@@ -146,7 +151,7 @@ export function getProposalInformationFromTable(heading: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function voteForProposal(vote: string) {
|
export function voteForProposal(vote: string) {
|
||||||
cy.contains('Vote breakdown').should('be.visible', { timeout: 10000 });
|
cy.get(voteButtons).should('be.visible', { timeout: 10000 });
|
||||||
cy.get(voteButtons).contains(vote).click();
|
cy.get(voteButtons).contains(vote).click();
|
||||||
cy.get(dialogTitle, proposalTimeout).should(
|
cy.get(dialogTitle, proposalTimeout).should(
|
||||||
'have.text',
|
'have.text',
|
||||||
@@ -232,21 +237,25 @@ export function getDownloadedProposalJsonPath(proposalType: string) {
|
|||||||
return filepath;
|
return filepath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getProposalDetailsValue(RowName: string) {
|
||||||
|
return cy
|
||||||
|
.contains(RowName)
|
||||||
|
.parentsUntil(proposalInformationTableRows)
|
||||||
|
.parent()
|
||||||
|
.first();
|
||||||
|
}
|
||||||
|
|
||||||
export function validateProposalDetailsDiff(
|
export function validateProposalDetailsDiff(
|
||||||
RowName: string,
|
RowName: string,
|
||||||
changeType: proposalChangeType,
|
changeType: proposalChangeType,
|
||||||
newValue: string,
|
newValue: string,
|
||||||
oldValue?: string
|
oldValue?: string
|
||||||
) {
|
) {
|
||||||
cy.contains(RowName)
|
getProposalDetailsValue(RowName).within(() => {
|
||||||
.parentsUntil(proposalInformationTableRows)
|
cy.contains(changeType).should('be.visible');
|
||||||
.parent()
|
cy.contains(newValue).should('be.visible');
|
||||||
.first()
|
if (oldValue) cy.contains(oldValue).should('have.class', 'line-through');
|
||||||
.within(() => {
|
});
|
||||||
cy.contains(changeType).should('be.visible');
|
|
||||||
cy.contains(newValue).should('be.visible');
|
|
||||||
if (oldValue) cy.contains(oldValue).should('have.class', 'line-through');
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getFormattedTime() {
|
function getFormattedTime() {
|
||||||
|
|||||||
@@ -9,8 +9,6 @@ import './wallet-functions.ts';
|
|||||||
import './proposal.functions.ts';
|
import './proposal.functions.ts';
|
||||||
import 'cypress-mochawesome-reporter/register';
|
import 'cypress-mochawesome-reporter/register';
|
||||||
import registerCypressGrep from '@cypress/grep';
|
import registerCypressGrep from '@cypress/grep';
|
||||||
import { aliasGQLQuery } from '@vegaprotocol/cypress';
|
|
||||||
import { chainIdQuery, statisticsQuery } from '@vegaprotocol/mock';
|
|
||||||
import { turnTelemetryOff } from './common.functions.ts';
|
import { turnTelemetryOff } from './common.functions.ts';
|
||||||
registerCypressGrep();
|
registerCypressGrep();
|
||||||
|
|
||||||
@@ -29,10 +27,7 @@ before(() => {
|
|||||||
// // Ensuring the telemetry modal doesn't disrupt the tests
|
// // Ensuring the telemetry modal doesn't disrupt the tests
|
||||||
turnTelemetryOff();
|
turnTelemetryOff();
|
||||||
// Mock chainId fetch which happens on every page for wallet connection
|
// Mock chainId fetch which happens on every page for wallet connection
|
||||||
cy.mockGQL((req) => {
|
cy.mockChainId();
|
||||||
aliasGQLQuery(req, 'ChainId', chainIdQuery());
|
|
||||||
aliasGQLQuery(req, 'Statistics', statisticsQuery());
|
|
||||||
});
|
|
||||||
// Self stake validators so they are displayed
|
// Self stake validators so they are displayed
|
||||||
cy.validatorsSelfDelegate();
|
cy.validatorsSelfDelegate();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import { addSeconds, millisecondsToSeconds } from 'date-fns';
|
import { addDays, addSeconds, millisecondsToSeconds } from 'date-fns';
|
||||||
import type { ProposalSubmissionBody } from '@vegaprotocol/wallet';
|
import type { ProposalSubmissionBody } from '@vegaprotocol/wallet';
|
||||||
import { aliasGQLQuery } from '@vegaprotocol/cypress';
|
import { aliasGQLQuery } from '@vegaprotocol/cypress';
|
||||||
import { upgradeProposalsData } from '../fixtures/mocks/network-upgrade';
|
import { upgradeProposalsData } from '../fixtures/mocks/network-upgrade';
|
||||||
import { proposalsData } from '../fixtures/mocks/proposals';
|
import { proposalsData } from '../fixtures/mocks/proposals';
|
||||||
import { nodeData } from '../fixtures/mocks/nodes';
|
import { nodeData } from '../fixtures/mocks/nodes';
|
||||||
|
import { AccountType, GovernanceTransferType } from '@vegaprotocol/types';
|
||||||
|
|
||||||
export function createUpdateNetworkProposalTxBody(): ProposalSubmissionBody {
|
export function createUpdateNetworkProposalTxBody(): ProposalSubmissionBody {
|
||||||
const MIN_CLOSE_SEC = 5;
|
const MIN_CLOSE_SEC = 5;
|
||||||
@@ -105,8 +106,13 @@ export function createNewMarketProposalTxBody(): ProposalSubmissionBody {
|
|||||||
decimalPlaces: '5',
|
decimalPlaces: '5',
|
||||||
positionDecimalPlaces: '5',
|
positionDecimalPlaces: '5',
|
||||||
linearSlippageFactor: '0.001',
|
linearSlippageFactor: '0.001',
|
||||||
|
liquiditySlaParameters: {
|
||||||
|
priceRange: '0.5',
|
||||||
|
commitmentMinTimeFraction: '0.1',
|
||||||
|
performanceHysteresisEpochs: 2,
|
||||||
|
slaCompetitionFactor: '0.1',
|
||||||
|
},
|
||||||
quadraticSlippageFactor: '0',
|
quadraticSlippageFactor: '0',
|
||||||
lpPriceRange: '10',
|
|
||||||
instrument: {
|
instrument: {
|
||||||
name: 'Token test market',
|
name: 'Token test market',
|
||||||
code: 'TEST.24h',
|
code: 'TEST.24h',
|
||||||
@@ -235,7 +241,12 @@ export function createSuccessorMarketProposalTxBody(
|
|||||||
positionDecimalPlaces: '5',
|
positionDecimalPlaces: '5',
|
||||||
linearSlippageFactor: '0.001',
|
linearSlippageFactor: '0.001',
|
||||||
quadraticSlippageFactor: '0',
|
quadraticSlippageFactor: '0',
|
||||||
lpPriceRange: '10',
|
liquiditySlaParameters: {
|
||||||
|
priceRange: '0.5',
|
||||||
|
commitmentMinTimeFraction: '0.1',
|
||||||
|
performanceHysteresisEpochs: 2,
|
||||||
|
slaCompetitionFactor: '0.1',
|
||||||
|
},
|
||||||
instrument: {
|
instrument: {
|
||||||
name: 'Token test market',
|
name: 'Token test market',
|
||||||
code: 'TEST.24h',
|
code: 'TEST.24h',
|
||||||
@@ -348,6 +359,46 @@ export function createSuccessorMarketProposalTxBody(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function createGovernanceTransferProposalTxBody(): ProposalSubmissionBody {
|
||||||
|
const MIN_CLOSE_SEC = 5;
|
||||||
|
const MIN_ENACT_SEC = 7;
|
||||||
|
|
||||||
|
const closingDate = addDays(new Date(), MIN_CLOSE_SEC);
|
||||||
|
const enactmentDate = addDays(closingDate, MIN_ENACT_SEC);
|
||||||
|
const closingTimestamp = millisecondsToSeconds(closingDate.getTime());
|
||||||
|
const enactmentTimestamp = millisecondsToSeconds(enactmentDate.getTime());
|
||||||
|
const destination = Cypress.env('vegaWalletPublicKey');
|
||||||
|
return {
|
||||||
|
proposalSubmission: {
|
||||||
|
rationale: {
|
||||||
|
title: 'Governance transfer proposal',
|
||||||
|
description: 'E2E test for transfer proposal test',
|
||||||
|
},
|
||||||
|
terms: {
|
||||||
|
newTransfer: {
|
||||||
|
changes: {
|
||||||
|
fractionOfBalance: '0.5',
|
||||||
|
amount: '100' + '0'.repeat(18),
|
||||||
|
sourceType: AccountType.ACCOUNT_TYPE_NETWORK_TREASURY,
|
||||||
|
source: '',
|
||||||
|
transferType:
|
||||||
|
GovernanceTransferType.GOVERNANCE_TRANSFER_TYPE_ALL_OR_NOTHING,
|
||||||
|
destinationType: AccountType.ACCOUNT_TYPE_GENERAL,
|
||||||
|
destination,
|
||||||
|
asset:
|
||||||
|
'b4f2726571fbe8e33b442dc92ed2d7f0d810e21835b7371a7915a365f07ccd9b',
|
||||||
|
oneOff: {
|
||||||
|
deliverOn: '0',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
closingTimestamp,
|
||||||
|
enactmentTimestamp,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export function mockNetworkUpgradeProposal() {
|
export function mockNetworkUpgradeProposal() {
|
||||||
cy.mockGQL((req) => {
|
cy.mockGQL((req) => {
|
||||||
aliasGQLQuery(req, 'Nodes', nodeData);
|
aliasGQLQuery(req, 'Nodes', nodeData);
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ export function stakingValidatorPageAddStake(stake: string) {
|
|||||||
|
|
||||||
export function stakingValidatorPageRemoveStake(stake: string) {
|
export function stakingValidatorPageRemoveStake(stake: string) {
|
||||||
cy.highlight(`Removing a stake of ${stake}`);
|
cy.highlight(`Removing a stake of ${stake}`);
|
||||||
cy.get(removeStakeRadioButton, epochTimeout).click();
|
cy.get(removeStakeRadioButton, epochTimeout).click({ force: true });
|
||||||
cy.get(tokenAmountInputBox).type(stake);
|
cy.get(tokenAmountInputBox).type(stake);
|
||||||
waitForBeginningOfEpoch();
|
waitForBeginningOfEpoch();
|
||||||
cy.get(tokenSubmitButton)
|
cy.get(tokenSubmitButton)
|
||||||
@@ -70,9 +70,13 @@ export function stakingPageAssociateTokens(
|
|||||||
cy.highlight(`Associating ${amount} tokens from ${type}`);
|
cy.highlight(`Associating ${amount} tokens from ${type}`);
|
||||||
cy.get(ethWalletAssociateButton).first().click();
|
cy.get(ethWalletAssociateButton).first().click();
|
||||||
if (type === 'wallet') {
|
if (type === 'wallet') {
|
||||||
cy.get(associateWalletRadioButton, { timeout: 30000 }).click();
|
cy.get(associateWalletRadioButton, { timeout: 30000 }).click({
|
||||||
|
force: true,
|
||||||
|
});
|
||||||
} else if (type === 'contract') {
|
} else if (type === 'contract') {
|
||||||
cy.get(associateContractRadioButton, { timeout: 30000 }).click();
|
cy.get(associateContractRadioButton, { timeout: 30000 }).click({
|
||||||
|
force: true,
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
cy.highlight(`${type} is not association option`);
|
cy.highlight(`${type} is not association option`);
|
||||||
}
|
}
|
||||||
@@ -170,21 +174,20 @@ export function clickOnValidatorFromList(
|
|||||||
validatorName = null
|
validatorName = null
|
||||||
) {
|
) {
|
||||||
cy.contains('Loading...', epochTimeout).should('not.exist');
|
cy.contains('Loading...', epochTimeout).should('not.exist');
|
||||||
waitForBeginningOfEpoch();
|
|
||||||
// below is to ensure validator list is shown
|
// below is to ensure validator list is shown
|
||||||
cy.get(stakeValidatorListName, { timeout: 10000 }).should('exist');
|
cy.get(stakeValidatorListName, { timeout: 10000 }).should('exist');
|
||||||
cy.get(stakeValidatorListPendingStake, txTimeout).should(
|
cy.get(stakeValidatorListPendingStake, txTimeout).should(
|
||||||
'not.contain',
|
'not.contain',
|
||||||
'2,000,000,000,000,000,000.00' // number due to bug #936
|
'2,000,000,000,000,000,000.00' // number due to bug #936
|
||||||
);
|
);
|
||||||
|
waitForBeginningOfEpoch();
|
||||||
if (validatorName) {
|
if (validatorName) {
|
||||||
cy.contains(validatorName).click();
|
cy.contains(validatorName).click();
|
||||||
} else {
|
} else {
|
||||||
cy.get(`[row-id="${validatorNumber}"]`)
|
cy.get(`[row-id="${validatorNumber}"]`)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.first()
|
.first()
|
||||||
.as('validatorOnList');
|
.click();
|
||||||
cy.get('@validatorOnList').click();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,7 +199,7 @@ export function validateValidatorListTotalStakeAndShare(
|
|||||||
cy.contains('Loading...', epochTimeout).should('not.exist');
|
cy.contains('Loading...', epochTimeout).should('not.exist');
|
||||||
waitForBeginningOfEpoch();
|
waitForBeginningOfEpoch();
|
||||||
cy.get(`[row-id="${positionOnList}"]`)
|
cy.get(`[row-id="${positionOnList}"]`)
|
||||||
.eq(1)
|
.first()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.getByTestId(stakeValidatorListTotalStake, epochTimeout).should(
|
cy.getByTestId(stakeValidatorListTotalStake, epochTimeout).should(
|
||||||
'have.text',
|
'have.text',
|
||||||
@@ -219,7 +222,9 @@ export function ensureSpecifiedUnstakedTokensAreAssociated(
|
|||||||
.eq(1)
|
.eq(1)
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.then((unstakedBalance) => {
|
.then((unstakedBalance) => {
|
||||||
if (parseFloat(unstakedBalance) != parseFloat(tokenAmount)) {
|
const tokenFloat = parseFloat(tokenAmount);
|
||||||
|
const unstakedFloat = parseFloat(unstakedBalance.replace(/,/g, ''));
|
||||||
|
if (tokenFloat != unstakedFloat) {
|
||||||
vegaWalletTeardown();
|
vegaWalletTeardown();
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).contains(
|
cy.get(vegaWalletAssociatedBalance, txTimeout).contains(
|
||||||
'0.00',
|
'0.00',
|
||||||
|
|||||||
@@ -41,6 +41,9 @@ export async function depositAsset(
|
|||||||
) {
|
) {
|
||||||
// Approve asset
|
// Approve asset
|
||||||
const faucet = new Token(assetEthAddress, signer);
|
const faucet = new Token(assetEthAddress, signer);
|
||||||
|
// Wait needed to allow Eth chain to catch up
|
||||||
|
// eslint-disable-next-line cypress/no-unnecessary-waiting
|
||||||
|
cy.wait(4000);
|
||||||
cy.wrap(
|
cy.wrap(
|
||||||
faucet.approve(Erc20BridgeAddress, amount + '0'.repeat(decimalPlaces + 1)),
|
faucet.approve(Erc20BridgeAddress, amount + '0'.repeat(decimalPlaces + 1)),
|
||||||
transactionTimeout
|
transactionTimeout
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ NX_FAIRGROUND=false
|
|||||||
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.governance.vega.xyz","STAGNET1":"https://governance.stagnet1.vega.rocks","TESTNET":"https://governance.fairground.wtf","MAINNET":"https://governance.vega.xyz"}'
|
NX_VEGA_NETWORKS='{"DEVNET":"https://dev.governance.vega.xyz","STAGNET1":"https://governance.stagnet1.vega.rocks","TESTNET":"https://governance.fairground.wtf","MAINNET":"https://governance.vega.xyz"}'
|
||||||
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
NX_GITHUB_FEEDBACK_URL=https://github.com/vegaprotocol/feedback/discussions
|
||||||
NX_VEGA_WALLET_URL=http://localhost:1789
|
NX_VEGA_WALLET_URL=http://localhost:1789
|
||||||
|
NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72
|
||||||
NX_VEGA_EXPLORER_URL=https://explorer.stagnet1.vega.rocks
|
NX_VEGA_EXPLORER_URL=https://explorer.stagnet1.vega.rocks
|
||||||
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|
||||||
@@ -32,3 +33,8 @@ LC_ALL="en_US.UTF-8"
|
|||||||
# Cosmic elevator flags
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=true
|
NX_SUCCESSOR_MARKETS=true
|
||||||
NX_METAMASK_SNAPS=true
|
NX_METAMASK_SNAPS=true
|
||||||
|
NX_PRODUCT_PERPETUALS=false
|
||||||
|
NX_UPDATE_MARKET_STATE=false
|
||||||
|
NX_REFERRALS=false
|
||||||
|
NX_GOVERNANCE_TRANSFERS=false
|
||||||
|
NX_VOLUME_DISCOUNTS=false
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ NX_VEGA_REST_URL=http://localhost:3008/api/v2/
|
|||||||
NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn
|
NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn
|
||||||
NX_MOZILLA_EXTENSION_URL=https://addons.mozilla.org/firefox/addon/vega-wallet-fairground
|
NX_MOZILLA_EXTENSION_URL=https://addons.mozilla.org/firefox/addon/vega-wallet-fairground
|
||||||
|
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
@@ -31,3 +33,7 @@ CYPRESS_FAIRGROUND=false
|
|||||||
# Cosmic elevator flags
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=false
|
NX_SUCCESSOR_MARKETS=false
|
||||||
NX_METAMASK_SNAPS=false
|
NX_METAMASK_SNAPS=false
|
||||||
|
NX_PRODUCT_PERPETUALS=true
|
||||||
|
NX_UPDATE_MARKET_STATE=true
|
||||||
|
NX_REFERRALS=true
|
||||||
|
NX_VOLUME_DISCOUNTS=true
|
||||||
|
|||||||
@@ -19,7 +19,13 @@ NX_MOZILLA_EXTENSION_URL=https://addons.mozilla.org/firefox/addon/vega-wallet-fa
|
|||||||
|
|
||||||
NX_TENDERMINT_URL=https://tm.be.devnet1.vega.xyz/
|
NX_TENDERMINT_URL=https://tm.be.devnet1.vega.xyz/
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.devnet1.vega.xyz/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.devnet1.vega.xyz/websocket
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|
||||||
|
|
||||||
# Cosmic elevator flags
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=true
|
NX_SUCCESSOR_MARKETS=true
|
||||||
NX_METAMASK_SNAPS=true
|
NX_METAMASK_SNAPS=true
|
||||||
|
NX_PRODUCT_PERPETUALS=true
|
||||||
|
NX_UPDATE_MARKET_STATE=true
|
||||||
|
NX_REFERRALS=true
|
||||||
|
NX_VOLUME_DISCOUNTS=true
|
||||||
|
|||||||
@@ -16,10 +16,15 @@ NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/annou
|
|||||||
NX_VEGA_REST_URL=https://api.vega.community/api/v2/
|
NX_VEGA_REST_URL=https://api.vega.community/api/v2/
|
||||||
NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn
|
NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn
|
||||||
NX_MOZILLA_EXTENSION_URL=https://addons.mozilla.org/firefox/addon/vega-wallet-mainnet
|
NX_MOZILLA_EXTENSION_URL=https://addons.mozilla.org/firefox/addon/vega-wallet-mainnet
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72
|
||||||
NX_TENDERMINT_URL=https://be.vega.community
|
NX_TENDERMINT_URL=https://be.vega.community
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.vega.community/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.vega.community/websocket
|
||||||
|
|
||||||
# Cosmic elevator flags
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=false
|
NX_SUCCESSOR_MARKETS=false
|
||||||
NX_METAMASK_SNAPS=false
|
NX_METAMASK_SNAPS=false
|
||||||
|
NX_PRODUCT_PERPETUALS=false
|
||||||
|
NX_UPDATE_MARKET_STATE=false
|
||||||
|
NX_REFERRALS=false
|
||||||
|
NX_VOLUME_DISCOUNTS=false
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/annou
|
|||||||
NX_VEGA_REST_URL=https://api.mainnet-mirror.vega.rocks/api/v2/
|
NX_VEGA_REST_URL=https://api.mainnet-mirror.vega.rocks/api/v2/
|
||||||
NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn
|
NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn
|
||||||
NX_MOZILLA_EXTENSION_URL=https://addons.mozilla.org/firefox/addon/vega-wallet-mainnet
|
NX_MOZILLA_EXTENSION_URL=https://addons.mozilla.org/firefox/addon/vega-wallet-mainnet
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|
||||||
NX_TENDERMINT_URL=https://be.mainnet-mirror.vega.rocks
|
NX_TENDERMINT_URL=https://be.mainnet-mirror.vega.rocks
|
||||||
NX_TENDERMINT_WEBSOCKET_URL=wss://be.mainnet-mirror.vega.rocks/websocket
|
NX_TENDERMINT_WEBSOCKET_URL=wss://be.mainnet-mirror.vega.rocks/websocket
|
||||||
@@ -22,3 +23,7 @@ NX_TENDERMINT_WEBSOCKET_URL=wss://be.mainnet-mirror.vega.rocks/websocket
|
|||||||
# Cosmic elevator flags
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=false
|
NX_SUCCESSOR_MARKETS=false
|
||||||
NX_METAMASK_SNAPS=false
|
NX_METAMASK_SNAPS=false
|
||||||
|
NX_PRODUCT_PERPETUALS=false
|
||||||
|
NX_UPDATE_MARKET_STATE=false
|
||||||
|
NX_REFERRALS=false
|
||||||
|
NX_VOLUME_DISCOUNTS=false
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ NX_DELEGATIONS_PAGINATION=50
|
|||||||
NX_TRANCHES_SERVICE_URL=https://tranches-stagnet1-k8s.ops.vega.xyz
|
NX_TRANCHES_SERVICE_URL=https://tranches-stagnet1-k8s.ops.vega.xyz
|
||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
||||||
NX_VEGA_REST_URL=https://api.n00.stagnet1.vega.xyz/api/v2/
|
NX_VEGA_REST_URL=https://api.n00.stagnet1.vega.xyz/api/v2/
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72
|
||||||
|
|
||||||
NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn
|
NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn
|
||||||
NX_MOZILLA_EXTENSION_URL=https://addons.mozilla.org/firefox/addon/vega-wallet-fairground
|
NX_MOZILLA_EXTENSION_URL=https://addons.mozilla.org/firefox/addon/vega-wallet-fairground
|
||||||
@@ -19,3 +21,8 @@ NX_TENDERMINT_WEBSOCKET_URL=wss://tm.n01.stagnet1.vega.xyz/websocket
|
|||||||
# Cosmic elevator flags
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=true
|
NX_SUCCESSOR_MARKETS=true
|
||||||
NX_METAMASK_SNAPS=true
|
NX_METAMASK_SNAPS=true
|
||||||
|
NX_PRODUCT_PERPETUALS=true
|
||||||
|
NX_UPDATE_MARKET_STATE=true
|
||||||
|
NX_REFERRALS=true
|
||||||
|
NX_GOVERNANCE_TRANSFERS=true
|
||||||
|
NX_VOLUME_DISCOUNTS=true
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ NX_TRANCHES_SERVICE_URL=https://tranches-testnet-k8s.ops.vega.xyz
|
|||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
||||||
NX_VEGA_REST_URL=https://api.n07.testnet.vega.xyz/api/v2/
|
NX_VEGA_REST_URL=https://api.n07.testnet.vega.xyz/api/v2/
|
||||||
NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/5882996
|
NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/5882996
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
NX_WALLETCONNECT_PROJECT_ID=fe8091dc35738863e509fc4947525c72
|
||||||
|
|
||||||
NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn
|
NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn
|
||||||
NX_MOZILLA_EXTENSION_URL=https://addons.mozilla.org/firefox/addon/vega-wallet-fairground
|
NX_MOZILLA_EXTENSION_URL=https://addons.mozilla.org/firefox/addon/vega-wallet-fairground
|
||||||
@@ -24,3 +26,7 @@ NX_TENDERMINT_WEBSOCKET_URL=wss://be.testnet.vega.xyz/websocket
|
|||||||
# Cosmic elevator flags
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=true
|
NX_SUCCESSOR_MARKETS=true
|
||||||
NX_METAMASK_SNAPS=true
|
NX_METAMASK_SNAPS=true
|
||||||
|
NX_PRODUCT_PERPETUALS=true
|
||||||
|
NX_UPDATE_MARKET_STATE=true
|
||||||
|
NX_REFERRALS=true
|
||||||
|
NX_VOLUME_DISCOUNTS=true
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ NX_VEGA_EXPLORER_URL=https://explorer.validators-testnet.vega.rocks/
|
|||||||
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
NX_ANNOUNCEMENTS_CONFIG_URL=https://raw.githubusercontent.com/vegaprotocol/announcements/fairground/announcements.json
|
||||||
NX_VEGA_REST_URL=https://api-validators-testnet.vega.rocks/api/v2/
|
NX_VEGA_REST_URL=https://api-validators-testnet.vega.rocks/api/v2/
|
||||||
NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/5882996
|
NX_SENTRY_DSN=https://4b8c8a8ba07742648aa4dfe1b8d17e40@o286262.ingest.sentry.io/5882996
|
||||||
|
NX_ORACLE_PROOFS_URL=https://raw.githubusercontent.com/vegaprotocol/well-known/main/__generated__/oracle-proofs.json
|
||||||
|
|
||||||
NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn
|
NX_CHROME_EXTENSION_URL=https://chrome.google.com/webstore/detail/vega-wallet-fairground/nmmjkiafpmphlikhefgjbblebfgclikn
|
||||||
NX_MOZILLA_EXTENSION_URL=https://addons.mozilla.org/firefox/addon/vega-wallet-fairground
|
NX_MOZILLA_EXTENSION_URL=https://addons.mozilla.org/firefox/addon/vega-wallet-fairground
|
||||||
@@ -21,3 +22,7 @@ NX_TENDERMINT_WEBSOCKET_URL=wss://be.validators-testnet.vega.
|
|||||||
# Cosmic elevator flags
|
# Cosmic elevator flags
|
||||||
NX_SUCCESSOR_MARKETS=false
|
NX_SUCCESSOR_MARKETS=false
|
||||||
NX_METAMASK_SNAPS=false
|
NX_METAMASK_SNAPS=false
|
||||||
|
NX_PRODUCT_PERPETUALS=false
|
||||||
|
NX_UPDATE_MARKET_STATE=false
|
||||||
|
NX_REFERRALS=false
|
||||||
|
NX_VOLUME_DISCOUNTS=false
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
|
process.env.TZ = 'GMT';
|
||||||
export default {
|
export default {
|
||||||
displayName: 'governance',
|
displayName: 'governance',
|
||||||
preset: '../../jest.preset.js',
|
preset: '../../jest.preset.js',
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user