Skip to content

Commit 0076bfd

Browse files
author
tiltom
authored
ERC20 bridge maintenance mode (#1118)
* ERC20 bridge maintenance mode * Create tasty-scissors-joke.md
1 parent c75b67b commit 0076bfd

10 files changed

Lines changed: 126 additions & 54 deletions

File tree

.changeset/tasty-scissors-joke.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"frontend": patch
3+
---
4+
5+
ERC20 bridge maintenance mode

apps/frontend/src/app/3_organisms/ERC20BridgeDialog/components/ReceiveFlow/components/AmountScreen.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
} from '../../../contexts/receiveflow';
3131
import { useBridgeService } from '../../../hooks/useBridgeService';
3232
import { useBridgeValidation } from '../../../hooks/useBridgeValidation';
33+
import { useERC20BridgeLocked } from '../../../hooks/useERC20BridgeLocked';
3334
import { useTokenBalance } from '../../../hooks/useTokenBalance';
3435

3536
export const AmountScreen: React.FC = () => {
@@ -79,6 +80,8 @@ export const AmountScreen: React.FC = () => {
7980
receiver,
8081
});
8182

83+
const isBridgeLocked = useERC20BridgeLocked();
84+
8285
return (
8386
<div>
8487
{chainId && (
@@ -141,7 +144,12 @@ export const AmountScreen: React.FC = () => {
141144
}))}
142145
/>
143146

144-
{isWrongChain ? (
147+
{isBridgeLocked ? (
148+
<ErrorBadge
149+
level={ErrorLevel.Warning}
150+
message={t(translations.maintenanceMode.erc20Bridge)}
151+
/>
152+
) : isWrongChain ? (
145153
<Button
146154
onClick={() => chainId && setCurrentChainId(chainId)}
147155
text={t(translations.erc20Bridge.confirmationScreens.switchNetwork)}
@@ -157,7 +165,7 @@ export const AmountScreen: React.FC = () => {
157165
className="w-full mt-6"
158166
style={ButtonStyle.secondary}
159167
dataAttribute="funding-receive-instructions-confirm"
160-
disabled={!isValid}
168+
disabled={!isValid || isBridgeLocked}
161169
/>
162170
)}
163171
</div>

apps/frontend/src/app/3_organisms/ERC20BridgeDialog/components/ReceiveFlow/components/InitialScreen.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@ import {
1010
ReceiveFlowContext,
1111
ReceiveFlowStep,
1212
} from '../../../contexts/receiveflow';
13+
import { useERC20BridgeLocked } from '../../../hooks/useERC20BridgeLocked';
1314
import { Instructions } from '../../Instructions';
1415

1516
export const InitialScreen: React.FC = () => {
1617
const { account } = useAccount();
1718
const { set } = useContext(ReceiveFlowContext);
18-
const erc20BridgeLocked = false;
19+
const isBridgeLocked = useERC20BridgeLocked();
1920
const onContinueClick = useCallback(() => {
2021
set(prevState => ({ ...prevState, step: ReceiveFlowStep.MAIN }));
2122
}, [set]);
@@ -24,7 +25,7 @@ export const InitialScreen: React.FC = () => {
2425
<div>
2526
<Instructions />
2627

27-
{erc20BridgeLocked ? (
28+
{isBridgeLocked ? (
2829
<ErrorBadge
2930
level={ErrorLevel.Warning}
3031
message={t(translations.maintenanceMode.erc20Bridge)}

apps/frontend/src/app/3_organisms/ERC20BridgeDialog/components/ReceiveFlow/components/MainScreen.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {
77
AmountInput,
88
Button,
99
ButtonStyle,
10+
ErrorBadge,
11+
ErrorLevel,
1012
Paragraph,
1113
Select,
1214
} from '@sovryn/ui';
@@ -22,6 +24,7 @@ import {
2224
ReceiveFlowStep,
2325
} from '../../../contexts/receiveflow';
2426
import { useAssetsByTargetChain } from '../../../hooks/useBridgeAssets';
27+
import { useERC20BridgeLocked } from '../../../hooks/useERC20BridgeLocked';
2528
import { useTokenBalance } from '../../../hooks/useTokenBalance';
2629
import { Limits } from '../../Limits';
2730
import { NetworkRenderer } from '../../NetworkRenderer';
@@ -34,6 +37,7 @@ export const MainScreen: React.FC = () => {
3437
const isWrongChain = currentChainId !== chainId;
3538
const { data: tokenBalance } = useTokenBalance(token, chainId);
3639
const assetDetails = useTokenDetailsByAsset(token, chainId);
40+
const isBridgeLocked = useERC20BridgeLocked();
3741

3842
const balance = formatUnits(tokenBalance || '0', assetDetails?.decimals);
3943

@@ -119,7 +123,12 @@ export const MainScreen: React.FC = () => {
119123
/>
120124
</div>
121125

122-
{isWrongChain ? (
126+
{isBridgeLocked ? (
127+
<ErrorBadge
128+
level={ErrorLevel.Warning}
129+
message={t(translations.maintenanceMode.erc20Bridge)}
130+
/>
131+
) : isWrongChain ? (
123132
<Button
124133
onClick={() => chainId && setCurrentChainId(chainId)}
125134
text={t(translations.erc20Bridge.confirmationScreens.switchNetwork)}
@@ -132,7 +141,7 @@ export const MainScreen: React.FC = () => {
132141
<>
133142
<AmountInput
134143
className="w-full max-w-full mb-6"
135-
label="Avaiaible Balance"
144+
label="Available Balance"
136145
value={balance}
137146
readOnly
138147
unit={token}
@@ -150,7 +159,9 @@ export const MainScreen: React.FC = () => {
150159
className="w-full mt-12"
151160
style={ButtonStyle.secondary}
152161
dataAttribute="funding-receive-instructions-confirm"
153-
disabled={!token || !chainId || Number(balance) <= 0}
162+
disabled={
163+
!token || !chainId || Number(balance) <= 0 || isBridgeLocked
164+
}
154165
/>
155166
</>
156167
)}

apps/frontend/src/app/3_organisms/ERC20BridgeDialog/components/ReceiveFlow/components/ReviewScreen.tsx

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { formatUnits, parseUnits } from 'ethers/lib/utils';
55
import { t } from 'i18next';
66

77
import { TxStep } from '@sovryn/sdk';
8-
import { Button } from '@sovryn/ui';
8+
import { Button, ErrorBadge, ErrorLevel } from '@sovryn/ui';
99

1010
import { RSK_CHAIN_ID } from '../../../../../../config/chains';
1111

@@ -25,6 +25,7 @@ import {
2525
import { useBridge } from '../../../hooks/useBridge';
2626
import { useBridgeLimits } from '../../../hooks/useBridgeLimits';
2727
import { useBridgeService } from '../../../hooks/useBridgeService';
28+
import { useERC20BridgeLocked } from '../../../hooks/useERC20BridgeLocked';
2829
import { TxStatusTitle } from '../../TxStatusTitle';
2930

3031
const translation = translations.erc20Bridge.confirmationScreens;
@@ -184,6 +185,8 @@ export const ReviewScreen: React.FC = () => {
184185
].includes(transaction.step);
185186
const isConfirmed = transaction.step === TxStep.CONFIRMED;
186187

188+
const isBridgeLocked = useERC20BridgeLocked();
189+
187190
return (
188191
<div className="text-center">
189192
<TxStatusTitle step={transaction.step} />
@@ -197,22 +200,29 @@ export const ReviewScreen: React.FC = () => {
197200
))}
198201
</div>
199202

200-
<div className="mt-12">
201-
<Button
202-
text={
203-
isConfirmed
204-
? t(translations.common.buttons.done)
205-
: [TxStep.USER_DENIED, TxStep.FAILED].includes(transaction.step)
206-
? t(translations.common.buttons.retry)
207-
: t(translations.common.buttons.confirm)
208-
}
209-
onClick={isConfirmed ? handleErc20BridgeDialogClose : handleSubmit}
210-
loading={isLoading}
211-
disabled={isLoading}
212-
className="w-full"
213-
dataAttribute="erc20-receive-confirm"
203+
{isBridgeLocked ? (
204+
<ErrorBadge
205+
level={ErrorLevel.Warning}
206+
message={t(translations.maintenanceMode.erc20Bridge)}
214207
/>
215-
</div>
208+
) : (
209+
<div className="mt-12">
210+
<Button
211+
text={
212+
isConfirmed
213+
? t(translations.common.buttons.done)
214+
: [TxStep.USER_DENIED, TxStep.FAILED].includes(transaction.step)
215+
? t(translations.common.buttons.retry)
216+
: t(translations.common.buttons.confirm)
217+
}
218+
onClick={isConfirmed ? handleErc20BridgeDialogClose : handleSubmit}
219+
loading={isLoading}
220+
disabled={isLoading || isBridgeLocked}
221+
className="w-full"
222+
dataAttribute="erc20-receive-confirm"
223+
/>
224+
</div>
225+
)}
216226
</div>
217227
);
218228
};

apps/frontend/src/app/3_organisms/ERC20BridgeDialog/components/SendFlow/components/AmountScreen.tsx

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { translations } from '../../../../../../locales/i18n';
2727
import { SendFlowContext, SendFlowStep } from '../../../contexts/sendflow';
2828
import { useBridgeService } from '../../../hooks/useBridgeService';
2929
import { useBridgeValidation } from '../../../hooks/useBridgeValidation';
30+
import { useERC20BridgeLocked } from '../../../hooks/useERC20BridgeLocked';
3031
import { useTokenBalance } from '../../../hooks/useTokenBalance';
3132

3233
export const AmountScreen: React.FC = () => {
@@ -35,6 +36,7 @@ export const AmountScreen: React.FC = () => {
3536
const bridgeService = useBridgeService();
3637
const assetDetails = useTokenDetailsByAsset(token, RSK_CHAIN_ID);
3738
const { data: tokenBalance } = useTokenBalance(token, RSK_CHAIN_ID);
39+
const isBridgeLocked = useERC20BridgeLocked();
3840

3941
const balance = formatUnits(tokenBalance || '0', assetDetails?.decimals);
4042

@@ -139,14 +141,21 @@ export const AmountScreen: React.FC = () => {
139141
}))}
140142
/>
141143

142-
<Button
143-
onClick={onContinueClick}
144-
text={t(translations.common.buttons.continue)}
145-
className="w-full mt-6"
146-
style={ButtonStyle.secondary}
147-
dataAttribute="funding-send-instructions-confirm"
148-
disabled={!isValid}
149-
/>
144+
{isBridgeLocked ? (
145+
<ErrorBadge
146+
level={ErrorLevel.Warning}
147+
message={t(translations.maintenanceMode.erc20Bridge)}
148+
/>
149+
) : (
150+
<Button
151+
onClick={onContinueClick}
152+
text={t(translations.common.buttons.continue)}
153+
className="w-full mt-6"
154+
style={ButtonStyle.secondary}
155+
dataAttribute="funding-send-instructions-confirm"
156+
disabled={!isValid || isBridgeLocked}
157+
/>
158+
)}
150159
</div>
151160
);
152161
};

apps/frontend/src/app/3_organisms/ERC20BridgeDialog/components/SendFlow/components/InitialScreen.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@ import { Button, ButtonStyle, ErrorBadge, ErrorLevel } from '@sovryn/ui';
77
import { useAccount } from '../../../../../../hooks/useAccount';
88
import { translations } from '../../../../../../locales/i18n';
99
import { SendFlowContext, SendFlowStep } from '../../../contexts/sendflow';
10+
import { useERC20BridgeLocked } from '../../../hooks/useERC20BridgeLocked';
1011
import { Instructions } from '../../Instructions';
1112

1213
export const InitialScreen: React.FC = () => {
1314
const { account } = useAccount();
1415
const { set } = useContext(SendFlowContext);
15-
const erc20BridgeLocked = false;
16+
const isBridgeLocked = useERC20BridgeLocked();
1617
const onContinueClick = useCallback(
1718
() => set(prevState => ({ ...prevState, step: SendFlowStep.MAIN })),
1819
[set],
@@ -22,7 +23,7 @@ export const InitialScreen: React.FC = () => {
2223
<div>
2324
<Instructions />
2425

25-
{erc20BridgeLocked ? (
26+
{isBridgeLocked ? (
2627
<ErrorBadge
2728
level={ErrorLevel.Warning}
2829
message={t(translations.maintenanceMode.erc20Bridge)}

apps/frontend/src/app/3_organisms/ERC20BridgeDialog/components/SendFlow/components/MainScreen.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {
77
AmountInput,
88
Button,
99
ButtonStyle,
10+
ErrorBadge,
11+
ErrorLevel,
1012
Paragraph,
1113
Select,
1214
} from '@sovryn/ui';
@@ -19,6 +21,7 @@ import { translations } from '../../../../../../locales/i18n';
1921
import { SendFlowContext, SendFlowStep } from '../../../contexts/sendflow';
2022
import { useBridgeAggregatorBalance } from '../../../hooks/useBridgeAggregatorBalance';
2123
import { useAssetsBySourceChain } from '../../../hooks/useBridgeAssets';
24+
import { useERC20BridgeLocked } from '../../../hooks/useERC20BridgeLocked';
2225
import { Limits } from '../../Limits';
2326
import { NetworkRenderer } from '../../NetworkRenderer';
2427

@@ -32,6 +35,7 @@ export const MainScreen: React.FC = () => {
3235
);
3336
const { currentChainId, setCurrentChainId } = useChainStore();
3437
const isWrongChain = currentChainId !== RSK_CHAIN_ID;
38+
const isBridgeLocked = useERC20BridgeLocked();
3539

3640
const uniqueAssets = assets.filter(
3741
(asset, index, arr) =>
@@ -128,7 +132,12 @@ export const MainScreen: React.FC = () => {
128132

129133
<Limits sourceChain={RSK_CHAIN_ID} targetChain={chainId} asset={token} />
130134

131-
{isWrongChain ? (
135+
{isBridgeLocked ? (
136+
<ErrorBadge
137+
level={ErrorLevel.Warning}
138+
message={t(translations.maintenanceMode.erc20Bridge)}
139+
/>
140+
) : isWrongChain ? (
132141
<Button
133142
onClick={() => setCurrentChainId(RSK_CHAIN_ID)}
134143
text={t(translations.erc20Bridge.confirmationScreens.switchNetwork)}
@@ -145,6 +154,7 @@ export const MainScreen: React.FC = () => {
145154
style={ButtonStyle.secondary}
146155
dataAttribute="funding-send-instructions-confirm"
147156
disabled={
157+
isBridgeLocked ||
148158
!token ||
149159
!chainId ||
150160
!aggregatorBalance ||

apps/frontend/src/app/3_organisms/ERC20BridgeDialog/components/SendFlow/components/ReviewScreen.tsx

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { formatUnits, parseUnits } from 'ethers/lib/utils';
55
import { t } from 'i18next';
66

77
import { TxStep } from '@sovryn/sdk';
8-
import { Button } from '@sovryn/ui';
8+
import { Button, ErrorBadge, ErrorLevel } from '@sovryn/ui';
99

1010
import { RSK_CHAIN_ID } from '../../../../../../config/chains';
1111

@@ -22,6 +22,7 @@ import { SendFlowContext, SendFlowStep } from '../../../contexts/sendflow';
2222
import { useBridge } from '../../../hooks/useBridge';
2323
import { useBridgeLimits } from '../../../hooks/useBridgeLimits';
2424
import { useBridgeService } from '../../../hooks/useBridgeService';
25+
import { useERC20BridgeLocked } from '../../../hooks/useERC20BridgeLocked';
2526
import { TxStatusTitle } from '../../TxStatusTitle';
2627

2728
const translation = translations.erc20Bridge.confirmationScreens;
@@ -178,6 +179,8 @@ export const ReviewScreen: React.FC = () => {
178179
TxStep.PENDING,
179180
].includes(transaction.step);
180181

182+
const isBridgeLocked = useERC20BridgeLocked();
183+
181184
return (
182185
<div className="text-center">
183186
<TxStatusTitle step={transaction.step} />
@@ -191,26 +194,33 @@ export const ReviewScreen: React.FC = () => {
191194
))}
192195
</div>
193196

194-
<div className="mt-12">
195-
<Button
196-
text={
197-
transaction.step === TxStep.CONFIRMED
198-
? t(translations.common.buttons.done)
199-
: [TxStep.USER_DENIED, TxStep.FAILED].includes(transaction.step)
200-
? t(translations.common.buttons.retry)
201-
: t(translations.common.buttons.confirm)
202-
}
203-
onClick={
204-
transaction.step === TxStep.CONFIRMED
205-
? handleErc20BridgeDialogClose
206-
: handleSubmit
207-
}
208-
loading={isLoading}
209-
disabled={isLoading}
210-
className="w-full"
211-
dataAttribute="erc20-send-confirm"
197+
{isBridgeLocked ? (
198+
<ErrorBadge
199+
level={ErrorLevel.Warning}
200+
message={t(translations.maintenanceMode.erc20Bridge)}
212201
/>
213-
</div>
202+
) : (
203+
<div className="mt-12">
204+
<Button
205+
text={
206+
transaction.step === TxStep.CONFIRMED
207+
? t(translations.common.buttons.done)
208+
: [TxStep.USER_DENIED, TxStep.FAILED].includes(transaction.step)
209+
? t(translations.common.buttons.retry)
210+
: t(translations.common.buttons.confirm)
211+
}
212+
onClick={
213+
transaction.step === TxStep.CONFIRMED
214+
? handleErc20BridgeDialogClose
215+
: handleSubmit
216+
}
217+
loading={isLoading}
218+
disabled={isLoading || isBridgeLocked}
219+
className="w-full"
220+
dataAttribute="erc20-send-confirm"
221+
/>
222+
</div>
223+
)}
214224
</div>
215225
);
216226
};

0 commit comments

Comments
 (0)