diff --git a/apps/trading/components/chart-container/chart-container.tsx b/apps/trading/components/chart-container/chart-container.tsx index ed3ddec00..d6eaa8659 100644 --- a/apps/trading/components/chart-container/chart-container.tsx +++ b/apps/trading/components/chart-container/chart-container.tsx @@ -30,8 +30,6 @@ export const ChartContainer = ({ marketId }: { marketId: string }) => { setStudies, setStudySizes, setOverlays, - state, - setState, } = useChartSettings(); const pennantChart = ( @@ -68,10 +66,6 @@ export const ChartContainer = ({ marketId }: { marketId: string }) => { onIntervalChange={(newInterval) => { setInterval(fromTradingViewResolution(newInterval)); }} - onAutoSaveNeeded={(data) => { - setState(data); - }} - state={state} /> ); } diff --git a/apps/trading/components/chart-container/use-chart-settings.ts b/apps/trading/components/chart-container/use-chart-settings.ts index 1f827b5a2..f2819679f 100644 --- a/apps/trading/components/chart-container/use-chart-settings.ts +++ b/apps/trading/components/chart-container/use-chart-settings.ts @@ -9,7 +9,6 @@ type StudySizes = { [S in Study]?: number }; export type Chartlib = 'pennant' | 'tradingview'; interface StoredSettings { - state: object | undefined; // Don't see a better type provided from TradingView type definitions chartlib: Chartlib; // For interval we use the enum from @vegaprotocol/types, this is to make mapping between different // chart types easier and more consistent @@ -30,7 +29,6 @@ const STUDY_ORDER: Study[] = [ ]; export const DEFAULT_CHART_SETTINGS = { - state: undefined, chartlib: 'pennant' as const, interval: Interval.INTERVAL_I15M, type: ChartType.CANDLE, @@ -47,7 +45,6 @@ export const useChartSettingsStore = create< setStudies: (studies?: Study[]) => void; setStudySizes: (sizes: number[]) => void; setChartlib: (lib: Chartlib) => void; - setState: (state: object) => void; } >()( persist( @@ -95,9 +92,6 @@ export const useChartSettingsStore = create< state.chartlib = lib; }); }, - setState: (state) => { - set({ state }); - }, })), { name: 'vega_candles_chart_store', @@ -151,7 +145,5 @@ export const useChartSettings = () => { setOverlays: settings.setOverlays, setStudySizes: settings.setStudySizes, setChartlib: settings.setChartlib, - state: settings.state, - setState: settings.setState, }; }; diff --git a/libs/assets/src/lib/constants.ts b/libs/assets/src/lib/constants.ts index 503e4e460..825df45e1 100644 --- a/libs/assets/src/lib/constants.ts +++ b/libs/assets/src/lib/constants.ts @@ -62,3 +62,10 @@ export const DENY_LIST: Record = { 'fdf0ec118d98393a7702cf72e46fc87ad680b152f64b2aac59e093ac2d688fbb', ], }; + +// We need a record of USDT on mainnet as it needs special handling for +// deposits and approvals due to the contract not conforming exactly +// to ERC20 +export const USDT_ID = { + MAINNET: 'bf1e88d19db4b3ca0d1d5bdb73718a01686b18cf731ca26adedf3c8b83802bba', +} as const; diff --git a/libs/deposits/src/lib/approve-notification.tsx b/libs/deposits/src/lib/approve-notification.tsx index 9f03c3812..8d4a9499b 100644 --- a/libs/deposits/src/lib/approve-notification.tsx +++ b/libs/deposits/src/lib/approve-notification.tsx @@ -1,5 +1,9 @@ -import type { Asset } from '@vegaprotocol/assets'; -import { EtherscanLink } from '@vegaprotocol/environment'; +import { USDT_ID, type Asset } from '@vegaprotocol/assets'; +import { + EtherscanLink, + Networks, + useEnvironment, +} from '@vegaprotocol/environment'; import { Intent, Notification } from '@vegaprotocol/ui-toolkit'; import { formatNumber, @@ -15,7 +19,7 @@ import { useT } from './use-t'; interface ApproveNotificationProps { isActive: boolean; selectedAsset?: Asset; - onApprove: () => void; + onApprove: (amount?: string) => void; approved: boolean; balances: DepositBalances | null; amount: string; @@ -33,6 +37,7 @@ export const ApproveNotification = ({ approveTxId, intent = Intent.Warning, }: ApproveNotificationProps) => { + const { VEGA_ENV } = useEnvironment(); const t = useT(); const tx = useEthTransactionStore((state) => { return state.transactions.find((t) => t?.id === approveTxId); @@ -64,28 +69,45 @@ export const ApproveNotification = ({ text: t('Approve {{assetSymbol}}', { assetSymbol: selectedAsset?.symbol, }), - action: onApprove, + action: () => onApprove(), dataTestId: 'approve-submit', }} /> ); + + let message = t('Approve again to deposit more than {{allowance}}', { + allowance: formatNumber(balances.allowance.toString()), + }); + const buttonProps = { + size: 'small' as const, + text: t('Approve {{assetSymbol}}', { + assetSymbol: selectedAsset?.symbol, + }), + action: () => onApprove(), + dataTestId: 'reapprove-submit', + }; + + if (VEGA_ENV === Networks.MAINNET && selectedAsset.id === USDT_ID[VEGA_ENV]) { + message = t( + 'USDT approved amount cannot be changed, only revoked. Revoke and reapprove to deposit more than {{allowance}}.', + { + allowance: formatNumber(balances.allowance.toString()), + } + ); + buttonProps.text = t('Revoke {{assetSymbol}} approval', { + assetSymbol: selectedAsset?.symbol, + }); + buttonProps.action = () => onApprove('0'); + } + const reApprovePrompt = (
); diff --git a/libs/deposits/src/lib/deposit-form.tsx b/libs/deposits/src/lib/deposit-form.tsx index ebf21ae1c..c5d85477c 100644 --- a/libs/deposits/src/lib/deposit-form.tsx +++ b/libs/deposits/src/lib/deposit-form.tsx @@ -58,7 +58,7 @@ export interface DepositFormProps { onSelectAsset: (assetId: string) => void; handleAmountChange: (amount: string) => void; onDisconnect: () => void; - submitApprove: () => void; + submitApprove: (amount?: string) => void; approveTxId: number | null; submitFaucet: () => void; faucetTxId: number | null; @@ -423,8 +423,8 @@ export const DepositForm = ({ isActive={isActive} approveTxId={approveTxId} selectedAsset={selectedAsset} - onApprove={() => { - submitApprove(); + onApprove={(amount) => { + submitApprove(amount); setApproveNotificationIntent(Intent.Warning); }} balances={balances} diff --git a/libs/deposits/src/lib/use-submit-approval.ts b/libs/deposits/src/lib/use-submit-approval.ts index 81290155f..e24a76da6 100644 --- a/libs/deposits/src/lib/use-submit-approval.ts +++ b/libs/deposits/src/lib/use-submit-approval.ts @@ -35,11 +35,11 @@ export const useSubmitApproval = ( reset: () => { setId(null); }, - perform: () => { + perform: (amount?: string) => { if (!asset || !config) return; const id = createEthTransaction(contract, 'approve', [ config?.collateral_bridge_contract.address, - MaxUint256.toString(), + amount ? amount : MaxUint256.toString(), ]); setId(id); }, diff --git a/libs/i18n/src/locales/en/deposits.json b/libs/i18n/src/locales/en/deposits.json index c1c5d6dc8..c360e195e 100644 --- a/libs/i18n/src/locales/en/deposits.json +++ b/libs/i18n/src/locales/en/deposits.json @@ -4,6 +4,7 @@ "Approval failed": "Approval failed", "Approve {{assetSymbol}}": "Approve {{assetSymbol}}", "Approve again to deposit more than {{allowance}}": "Approve again to deposit more than {{allowance}}", + "USDT approved amount cannot be changed, only revoked. Revoke and reapprove to deposit more than {{allowance}}.": "USDT approved amount cannot be changed, only revoked. Revoke and reapprove to deposit more than {{allowance}}.", "Asset": "Asset", "Balance available": "Balance available", "Before you can make a deposit of your chosen asset, {{assetSymbol}}, you need to approve its use in your Ethereum wallet": "Before you can make a deposit of your chosen asset, {{assetSymbol}}, you need to approve its use in your Ethereum wallet", @@ -23,6 +24,7 @@ "Please select": "Please select", "Please select an asset": "Please select an asset", "Remaining deposit allowance": "Remaining deposit allowance", + "Revoke {{assetSymbol}} approval": "Revoke {{assetSymbol}} approval", "Select from wallet": "Select from wallet", "The {{symbol}} faucet is not available at this time": "The {{symbol}} faucet is not available at this time", "The deposit cap is set when you approve an asset for use with this app. To increase this cap, approve {{assetSymbol}} again and choose a higher cap. Check the documentation for your Ethereum wallet app for details.": "The deposit cap is set when you approve an asset for use with this app. To increase this cap, approve {{assetSymbol}} again and choose a higher cap. Check the documentation for your Ethereum wallet app for details.", diff --git a/libs/trading-view/src/lib/trading-view-container.tsx b/libs/trading-view/src/lib/trading-view-container.tsx index e85a42579..44743ff4b 100644 --- a/libs/trading-view/src/lib/trading-view-container.tsx +++ b/libs/trading-view/src/lib/trading-view-container.tsx @@ -1,7 +1,7 @@ import { useScript } from '@vegaprotocol/react-helpers'; import { Splash } from '@vegaprotocol/ui-toolkit'; import { useT } from './use-t'; -import { TradingView, type OnAutoSaveNeededCallback } from './trading-view'; +import { TradingView } from './trading-view'; import { CHARTING_LIBRARY_FILE, type ResolutionString } from './constants'; export const TradingViewContainer = ({ @@ -10,16 +10,12 @@ export const TradingViewContainer = ({ marketId, interval, onIntervalChange, - onAutoSaveNeeded, - state, }: { libraryPath: string; libraryHash: string; marketId: string; interval: ResolutionString; onIntervalChange: (interval: string) => void; - onAutoSaveNeeded: OnAutoSaveNeededCallback; - state: object | undefined; }) => { const t = useT(); const scriptState = useScript( @@ -49,8 +45,6 @@ export const TradingViewContainer = ({ marketId={marketId} interval={interval} onIntervalChange={onIntervalChange} - onAutoSaveNeeded={onAutoSaveNeeded} - state={state} /> ); }; diff --git a/libs/trading-view/src/lib/trading-view.tsx b/libs/trading-view/src/lib/trading-view.tsx index 846794945..4c79eaf36 100644 --- a/libs/trading-view/src/lib/trading-view.tsx +++ b/libs/trading-view/src/lib/trading-view.tsx @@ -25,15 +25,11 @@ export const TradingView = ({ libraryPath, interval, onIntervalChange, - onAutoSaveNeeded, - state, }: { marketId: string; libraryPath: string; interval: ResolutionString; onIntervalChange: (interval: string) => void; - onAutoSaveNeeded: OnAutoSaveNeededCallback; - state: object | undefined; }) => { const { isMobile } = useScreenDimensions(); const { theme } = useThemeSwitcher(); @@ -108,7 +104,6 @@ export const TradingView = ({ backgroundColor: overrides['paneProperties.background'], }, auto_save_delay: 1, - saved_data: state, }; widgetRef.current = new window.TradingView.widget(widgetOptions); @@ -117,25 +112,12 @@ export const TradingView = ({ if (!widgetRef.current) return; const activeChart = widgetRef.current.activeChart(); - - if (!state) { - // If chart has loaded with no state, create a volume study - activeChart.createStudy('Volume'); - } + activeChart.createStudy('Volume'); // Subscribe to interval changes so it can be persisted in chart settings activeChart.onIntervalChanged().subscribe(null, onIntervalChange); }); - - widgetRef.current.subscribe('onAutoSaveNeeded', () => { - if (!widgetRef.current) return; - - widgetRef.current.save((newState) => { - onAutoSaveNeeded(newState); - }); - }); }, [ - state, datafeed, interval, prevTheme, @@ -145,7 +127,6 @@ export const TradingView = ({ language, libraryPath, isMobile, - onAutoSaveNeeded, onIntervalChange, ]); diff --git a/libs/web3/src/lib/use-ethereum-transaction-manager.tsx b/libs/web3/src/lib/use-ethereum-transaction-manager.tsx index 8bcc136ae..501bc93cc 100644 --- a/libs/web3/src/lib/use-ethereum-transaction-manager.tsx +++ b/libs/web3/src/lib/use-ethereum-transaction-manager.tsx @@ -27,6 +27,7 @@ export const useEthTransactionManager = () => { confirmations: 0, notify: true, }); + const { contract, methodName, @@ -44,6 +45,7 @@ export const useEthTransactionManager = () => { ) { throw new Error('method not found on contract'); } + await contract.contract.callStatic[methodName](...args); } catch (err) { update(transaction.id, {