+
+ {t('swapGasFeesSplit')}
+
+ >
+ )}
+
+ {
+ await dispatch(prepareToLeaveSwaps());
+ // Go to the default route and then to the build quote route in order to clean up
+ // the `inputValue` local state in `pages/swaps/index.js`
+ history.push(DEFAULT_ROUTE);
+ history.push(BUILD_QUOTE_ROUTE);
+ }}
+ submitText={t('cancel')}
+ hideCancel
+ />
+
+ );
+}
diff --git a/ui/pages/swaps/awaiting-signatures/awaiting-signatures.test.js b/ui/pages/swaps/awaiting-signatures/awaiting-signatures.test.js
new file mode 100644
index 000000000..c8e466ec2
--- /dev/null
+++ b/ui/pages/swaps/awaiting-signatures/awaiting-signatures.test.js
@@ -0,0 +1,17 @@
+import React from 'react';
+import configureMockStore from 'redux-mock-store';
+
+import {
+ renderWithProvider,
+ createSwapsMockStore,
+} from '../../../../test/jest';
+import AwaitingSignatures from '.';
+
+describe('AwaitingSignatures', () => {
+ it('renders the component with initial props for 1 confirmation', () => {
+ const store = configureMockStore()(createSwapsMockStore());
+ const { getByText } = renderWithProvider(, store);
+ expect(getByText('Confirm with your hardware wallet')).toBeInTheDocument();
+ expect(document.querySelector('.swaps-footer')).toMatchSnapshot();
+ });
+});
diff --git a/ui/pages/swaps/awaiting-signatures/index.js b/ui/pages/swaps/awaiting-signatures/index.js
new file mode 100644
index 000000000..3950ca6bf
--- /dev/null
+++ b/ui/pages/swaps/awaiting-signatures/index.js
@@ -0,0 +1 @@
+export { default } from './awaiting-signatures';
diff --git a/ui/pages/swaps/awaiting-signatures/index.scss b/ui/pages/swaps/awaiting-signatures/index.scss
new file mode 100644
index 000000000..9c847236c
--- /dev/null
+++ b/ui/pages/swaps/awaiting-signatures/index.scss
@@ -0,0 +1,34 @@
+.awaiting-signatures {
+ display: flex;
+ flex-flow: column;
+ align-items: center;
+ flex: 1;
+ width: 100%;
+
+ &__content {
+ flex-flow: column;
+ }
+
+ div {
+ text-align: center;
+ display: flex;
+ justify-content: center;
+ }
+
+ &__steps {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ margin: 16px auto 12px auto;
+
+ li {
+ margin-bottom: 4px;
+ display: flex;
+ align-items: center;
+
+ svg {
+ margin-right: 4px;
+ }
+ }
+ }
+}
diff --git a/ui/pages/swaps/awaiting-signatures/swap-step-icon.js b/ui/pages/swaps/awaiting-signatures/swap-step-icon.js
new file mode 100644
index 000000000..3e5d50665
--- /dev/null
+++ b/ui/pages/swaps/awaiting-signatures/swap-step-icon.js
@@ -0,0 +1,40 @@
+import React from 'react';
+
+export default function SwapStepIcon({ stepNumber = 1 }) {
+ switch (stepNumber) {
+ case 1:
+ return (
+
+ );
+ case 2:
+ return (
+
+ );
+ default:
+ return undefined; // Don't return any SVG if a step number is not supported.
+ }
+}
diff --git a/ui/pages/swaps/awaiting-signatures/swap-step-icon.test.js b/ui/pages/swaps/awaiting-signatures/swap-step-icon.test.js
new file mode 100644
index 000000000..47c92d7aa
--- /dev/null
+++ b/ui/pages/swaps/awaiting-signatures/swap-step-icon.test.js
@@ -0,0 +1,11 @@
+import React from 'react';
+
+import { renderWithProvider } from '../../../../test/jest';
+import SwapStepIcon from './swap-step-icon';
+
+describe('SwapStepIcon', () => {
+ it('renders the component', () => {
+ const { container } = renderWithProvider();
+ expect(container).toMatchSnapshot();
+ });
+});
diff --git a/ui/pages/swaps/index.js b/ui/pages/swaps/index.js
index bf5dfb17f..a53c8527a 100644
--- a/ui/pages/swaps/index.js
+++ b/ui/pages/swaps/index.js
@@ -33,6 +33,7 @@ import {
fetchSwapsLiveness,
} from '../../ducks/swaps/swaps';
import {
+ AWAITING_SIGNATURES_ROUTE,
AWAITING_SWAP_ROUTE,
BUILD_QUOTE_ROUTE,
VIEW_QUOTE_ROUTE,
@@ -66,6 +67,7 @@ import {
getSwapsTokensReceivedFromTxMeta,
fetchAggregatorMetadata,
} from './swaps.util';
+import AwaitingSignatures from './awaiting-signatures';
import AwaitingSwap from './awaiting-swap';
import LoadingQuote from './loading-swaps-quotes';
import BuildQuote from './build-quote';
@@ -78,6 +80,7 @@ export default function Swap() {
const { pathname } = useLocation();
const isAwaitingSwapRoute = pathname === AWAITING_SWAP_ROUTE;
+ const isAwaitingSignaturesRoute = pathname === AWAITING_SIGNATURES_ROUTE;
const isSwapsErrorRoute = pathname === SWAPS_ERROR_ROUTE;
const isLoadingQuotesRoute = pathname === LOADING_QUOTES_ROUTE;
@@ -243,7 +246,7 @@ export default function Swap() {