diff --git a/.github/workflows/publish-dist.yml b/.github/workflows/publish-dist.yml
index 8ac8886cf..6f2e0f05d 100644
--- a/.github/workflows/publish-dist.yml
+++ b/.github/workflows/publish-dist.yml
@@ -155,10 +155,10 @@ jobs:
- name: Sanity check docker image
run: |
echo "Check ipfs-hash"
- docker run --rm --entrypoint /bin/sh ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local -c 'cat /ipfs-hash'
- docker run --rm --entrypoint /bin/sh ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local -c 'cat /ipfs-hash' > ${{ matrix.app }}-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 /bin/sh -c 'cat /ipfs-hash' > ${{ matrix.app }}-ipfs-hash
echo "List html directory"
- docker run --rm --entrypoint /bin/sh ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local -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)
uses: docker/build-push-action@v3
@@ -329,7 +329,9 @@ jobs:
fi
# create commit
- commit_msg="Automated hash update from ${{ github.ref }}"
- git commit -m "$commit_msg"
- git push -u origin "main"
+ if ! git diff --cached --exit-code; then
+ commit_msg="Automated hash update from ${{ github.ref }}"
+ git commit -m "$commit_msg"
+ git push -u origin "main"
+ fi
)
diff --git a/README.md b/README.md
index 3ad469c9a..57c165cd6 100644
--- a/README.md
+++ b/README.md
@@ -118,7 +118,7 @@ On top of that there are two possible scenarios for running docker image - using
to run ipfs on port 3000:
```bash
-docker run -p 3000:80 [TAG] ipfs
+docker run -p 3000:80 [TAG] /run-ipfs.sh
```
to run nginx on port 3000:
diff --git a/apps/trading/.env b/apps/trading/.env
index fc93d40cb..7f273cac4 100644
--- a/apps/trading/.env
+++ b/apps/trading/.env
@@ -24,3 +24,6 @@ NX_STOP_ORDERS=true
NX_ICEBERG_ORDERS=true
# NX_PRODUCT_PERPETUALS
NX_METAMASK_SNAPS=true
+
+NX_TENDERMINT_URL=https://tm.be.testnet.vega.xyz
+NX_TENDERMINT_WEBSOCKET_URL=wss://be.testnet.vega.xyz/websocket
diff --git a/apps/trading/client-pages/deposit/index.ts b/apps/trading/client-pages/deposit/index.ts
index aa1922157..5cc938c9d 100644
--- a/apps/trading/client-pages/deposit/index.ts
+++ b/apps/trading/client-pages/deposit/index.ts
@@ -1,3 +1 @@
-import { Deposit } from './deposit';
-
-export default Deposit;
+export { Deposit } from './deposit';
diff --git a/apps/trading/client-pages/transfer/index.ts b/apps/trading/client-pages/transfer/index.ts
new file mode 100644
index 000000000..46ea59654
--- /dev/null
+++ b/apps/trading/client-pages/transfer/index.ts
@@ -0,0 +1 @@
+export { Transfer } from './transfer';
diff --git a/apps/trading/client-pages/transfer/transfer.spec.tsx b/apps/trading/client-pages/transfer/transfer.spec.tsx
new file mode 100644
index 000000000..b756b448e
--- /dev/null
+++ b/apps/trading/client-pages/transfer/transfer.spec.tsx
@@ -0,0 +1,38 @@
+import { render, screen } from '@testing-library/react';
+import { MemoryRouter } from 'react-router-dom';
+import { Transfer } from './transfer';
+
+jest.mock('@vegaprotocol/accounts', () => ({
+ TransferContainer: ({ assetId }: { assetId?: string }) => (
+
{assetId}
+ ),
+}));
+
+jest.mock('../../components/welcome-dialog/get-started.ts', () => ({
+ GetStarted: () => GetStarted
,
+}));
+
+const renderJsx = (route = '/transfer') => {
+ render(
+
+
+
+ );
+};
+
+describe('Transfer page', () => {
+ it('properly rendered', () => {
+ renderJsx();
+ expect(
+ screen.getByRole('heading', { level: 1, name: 'Transfer' })
+ ).toBeInTheDocument();
+ expect(screen.getByTestId('assetId')).toBeEmptyDOMElement();
+ });
+
+ it('assetId should be passed down', () => {
+ const assetId = 'foo';
+ const route = '/transfer?assetId=' + assetId;
+ renderJsx(route);
+ expect(screen.getByTestId('assetId')).toHaveTextContent(assetId);
+ });
+});
diff --git a/apps/trading/client-pages/transfer/transfer.tsx b/apps/trading/client-pages/transfer/transfer.tsx
new file mode 100644
index 000000000..073513fef
--- /dev/null
+++ b/apps/trading/client-pages/transfer/transfer.tsx
@@ -0,0 +1,23 @@
+import { useSearchParams } from 'react-router-dom';
+import { t } from '@vegaprotocol/i18n';
+import { TransferContainer } from '@vegaprotocol/accounts';
+import { GetStarted } from '../../components/welcome-dialog';
+
+export const Transfer = () => {
+ const [searchParams] = useSearchParams();
+ const assetId = searchParams.get('assetId') || undefined;
+
+ return (
+
+
+
+ {t('Transfer')}
+
+
+
+
+
+
+
+ );
+};
diff --git a/apps/trading/client-pages/withdraw/index.ts b/apps/trading/client-pages/withdraw/index.ts
new file mode 100644
index 000000000..2da1a51ea
--- /dev/null
+++ b/apps/trading/client-pages/withdraw/index.ts
@@ -0,0 +1 @@
+export { Withdraw } from './withdraw';
diff --git a/apps/trading/client-pages/withdraw/withdraw.spec.tsx b/apps/trading/client-pages/withdraw/withdraw.spec.tsx
new file mode 100644
index 000000000..d102e0a1c
--- /dev/null
+++ b/apps/trading/client-pages/withdraw/withdraw.spec.tsx
@@ -0,0 +1,41 @@
+import { render, screen } from '@testing-library/react';
+import { MemoryRouter } from 'react-router-dom';
+import { Withdraw } from './withdraw';
+
+jest.mock('../../components/withdraw-container', () => ({
+ WithdrawContainer: ({ assetId }: { assetId?: string }) => (
+ {assetId}
+ ),
+}));
+
+jest.mock('../../components/welcome-dialog/get-started.ts', () => ({
+ GetStarted: () => GetStarted
,
+}));
+
+const renderJsx = (route = '/withdraw') => {
+ render(
+
+
+
+ );
+};
+
+describe('Withdraw page', () => {
+ it('should be properly rendered', () => {
+ renderJsx();
+ expect(
+ screen.getByRole('heading', { level: 1, name: 'Withdraw' })
+ ).toBeInTheDocument();
+ expect(screen.getByTestId('assetId')).toBeEmptyDOMElement();
+ });
+
+ it('assetId should be passed down', () => {
+ const assetId = 'foo';
+ const route = '/withdraw?assetId=' + assetId;
+ renderJsx(route);
+ expect(
+ screen.getByRole('heading', { level: 1, name: 'Withdraw' })
+ ).toBeInTheDocument();
+ expect(screen.getByTestId('assetId')).toHaveTextContent(assetId);
+ });
+});
diff --git a/apps/trading/client-pages/withdraw/withdraw.tsx b/apps/trading/client-pages/withdraw/withdraw.tsx
new file mode 100644
index 000000000..f513077f7
--- /dev/null
+++ b/apps/trading/client-pages/withdraw/withdraw.tsx
@@ -0,0 +1,22 @@
+import { useSearchParams } from 'react-router-dom';
+import { t } from '@vegaprotocol/i18n';
+import { GetStarted } from '../../components/welcome-dialog';
+import { WithdrawContainer } from '../../components/withdraw-container';
+
+export const Withdraw = () => {
+ const [searchParams] = useSearchParams();
+ const assetId = searchParams.get('assetId') || undefined;
+ return (
+
+
+
+ {t('Withdraw')}
+
+
+
+
+
+
+
+ );
+};
diff --git a/apps/trading/pages/client-router.tsx b/apps/trading/pages/client-router.tsx
index fae9c7665..7932db72a 100644
--- a/apps/trading/pages/client-router.tsx
+++ b/apps/trading/pages/client-router.tsx
@@ -6,6 +6,9 @@ import { t } from '@vegaprotocol/i18n';
import { Loader, Splash } from '@vegaprotocol/ui-toolkit';
import trimEnd from 'lodash/trimEnd';
import { LayoutWithSidebar } from '../components/layouts';
+import { Deposit } from '../client-pages/deposit';
+import { Withdraw } from '../client-pages/withdraw';
+import { Transfer } from '../client-pages/transfer';
const LazyHome = dynamic(() => import('../client-pages/home'), {
ssr: false,
@@ -31,10 +34,6 @@ const LazyDisclaimer = dynamic(() => import('../client-pages/disclaimer'), {
ssr: false,
});
-const LazyDeposit = dynamic(() => import('../client-pages/deposit'), {
- ssr: false,
-});
-
export enum Routes {
HOME = '/',
MARKET = '/markets/:marketId',
@@ -43,6 +42,8 @@ export enum Routes {
LIQUIDITY = '/liquidity/:marketId',
DISCLAIMER = '/disclaimer',
DEPOSIT = '/deposit',
+ WITHDRAW = '/withdraw',
+ TRANSFER = '/transfer',
}
type ConsoleLinks = { [r in Routes]: (...args: string[]) => string };
@@ -57,6 +58,8 @@ export const Links: ConsoleLinks = {
trimEnd(Routes.LIQUIDITY.replace(':marketId', marketId)),
[Routes.DISCLAIMER]: () => Routes.DISCLAIMER,
[Routes.DEPOSIT]: () => Routes.DEPOSIT,
+ [Routes.WITHDRAW]: () => Routes.WITHDRAW,
+ [Routes.TRANSFER]: () => Routes.TRANSFER,
};
export const routerConfig: RouteObject[] = [
@@ -108,7 +111,9 @@ export const routerConfig: RouteObject[] = [
path: Routes.DISCLAIMER,
element: ,
},
- { path: Routes.DEPOSIT, element: },
+ { path: Routes.DEPOSIT, element: },
+ { path: Routes.WITHDRAW, element: },
+ { path: Routes.TRANSFER, element: },
{
path: '*',
element: (
@@ -124,7 +129,7 @@ export const ClientRouter = () => {
return (
+
}
diff --git a/docker/node-inside-docker.Dockerfile b/docker/node-inside-docker.Dockerfile
index 93b5fa4b2..b47523103 100644
--- a/docker/node-inside-docker.Dockerfile
+++ b/docker/node-inside-docker.Dockerfile
@@ -20,8 +20,7 @@ RUN sh docker/docker-build.sh
FROM --platform=amd64 nginx:1.23-alpine@sha256:6318314189b40e73145a48060bff4783a116c34cc7241532d0d94198fb2c9629
# configuration of system
EXPOSE 80
-COPY docker/entrypoint.sh /entrypoint.sh
-ENTRYPOINT [ "/entrypoint.sh" ]
+COPY docker/run-ipfs.sh /run-ipfs.sh
# Copy dist
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
RUN rm -rf /usr/share/nginx/html/*
diff --git a/docker/node-outside-docker.Dockerfile b/docker/node-outside-docker.Dockerfile
index d5aacba93..a125a180c 100644
--- a/docker/node-outside-docker.Dockerfile
+++ b/docker/node-outside-docker.Dockerfile
@@ -1,7 +1,6 @@
FROM --platform=amd64 nginx:1.23-alpine@sha256:6318314189b40e73145a48060bff4783a116c34cc7241532d0d94198fb2c9629
EXPOSE 80
-COPY docker/entrypoint.sh /entrypoint.sh
-ENTRYPOINT [ "/entrypoint.sh" ]
+COPY docker/run-ipfs.sh /run-ipfs.sh
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
RUN rm -rf /usr/share/nginx/html/*
COPY ./dist-result/ /usr/share/nginx/html/
diff --git a/docker/run-ipfs.sh b/docker/run-ipfs.sh
new file mode 100755
index 000000000..4cf684617
--- /dev/null
+++ b/docker/run-ipfs.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+ipfs config profile apply server
+ipfs config --json Addresses.Gateway '"/ip4/127.0.0.1/tcp/80"'
+ipfs daemon
diff --git a/libs/accounts/src/lib/transfer-container.tsx b/libs/accounts/src/lib/transfer-container.tsx
index df41a6f21..b8dca4110 100644
--- a/libs/accounts/src/lib/transfer-container.tsx
+++ b/libs/accounts/src/lib/transfer-container.tsx
@@ -49,7 +49,7 @@ export const TransferContainer = ({ assetId }: { assetId?: string }) => {
return (
<>
-
+
{t('Transfer funds to another Vega key')}
{pubKey && (
<>
diff --git a/libs/accounts/src/lib/transfer-form.tsx b/libs/accounts/src/lib/transfer-form.tsx
index f0adcba94..1f112e828 100644
--- a/libs/accounts/src/lib/transfer-form.tsx
+++ b/libs/accounts/src/lib/transfer-form.tsx
@@ -21,7 +21,7 @@ import type { Transfer } from '@vegaprotocol/wallet';
import { normalizeTransfer } from '@vegaprotocol/wallet';
import BigNumber from 'bignumber.js';
import type { ReactNode } from 'react';
-import { useCallback, useMemo, useState } from 'react';
+import { useCallback, useEffect, useMemo, useState } from 'react';
import { Controller, useForm } from 'react-hook-form';
import { AssetOption, Balance } from '@vegaprotocol/assets';
@@ -124,6 +124,13 @@ export const TransferForm = ({
return maxAmount;
}, [asset]);
+ // reset for placeholder workaround https://github.com/radix-ui/primitives/issues/1569
+ useEffect(() => {
+ if (!pubKey) {
+ setValue('asset', '');
+ }
+ }, [setValue, pubKey]);
+
return (