Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 22 additions & 12 deletions src/components/Transactions/TransactionSimulationCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ interface TransactionSimulationCardProps {
isLoading: boolean;
txSimulationApiError: unknown;
isPersonalSignRequest: boolean;
isTypedDataRequest: boolean;
noChanges: boolean;
simulation: TransactionSimulationResult | undefined;
simulationError: TransactionErrorType | undefined;
Expand All @@ -51,6 +52,7 @@ export const TransactionSimulationCard = ({
isLoading,
txSimulationApiError,
isPersonalSignRequest,
isTypedDataRequest,
noChanges,
simulation,
simulationError,
Expand All @@ -60,6 +62,7 @@ export const TransactionSimulationCard = ({
const cardHeight = useSharedValue(COLLAPSED_CARD_HEIGHT);
const contentHeight = useSharedValue(COLLAPSED_CARD_HEIGHT - CARD_BORDER_WIDTH * 2);
const spinnerRotation = useSharedValue(0);
const isSimulationUnavailable = isPersonalSignRequest || isTypedDataRequest;

const listStyle = useAnimatedStyle(() => ({
opacity: noChanges
Expand All @@ -81,18 +84,18 @@ export const TransactionSimulationCard = ({
});

useAnimatedReaction(
() => ({ isLoading, isPersonalSignRequest }),
({ isLoading, isPersonalSignRequest }, previous = { isLoading: false, isPersonalSignRequest: false }) => {
() => ({ isLoading, isSimulationUnavailable }),
({ isLoading, isSimulationUnavailable }, previous = { isLoading: false, isSimulationUnavailable: false }) => {
if (isLoading && !previous?.isLoading) {
spinnerRotation.value = withRepeat(withTiming(360, rotationConfig), -1, false);
} else if (
(!isLoading && previous?.isLoading) ||
(isPersonalSignRequest && !previous?.isPersonalSignRequest && previous?.isLoading)
(isSimulationUnavailable && !previous?.isSimulationUnavailable && previous?.isLoading)
) {
spinnerRotation.value = withTiming(360, timingConfig);
}
},
[isLoading, isPersonalSignRequest]
[isLoading, isSimulationUnavailable]
);
const renderSimulationEventRows = useMemo(() => {
if (isBalanceEnough === false) return null;
Expand Down Expand Up @@ -142,7 +145,7 @@ export const TransactionSimulationCard = ({
if (isBalanceEnough === false) {
return 'blue';
}
if (noChanges || isPersonalSignRequest || txSimulationApiError) {
if (noChanges || isSimulationUnavailable || txSimulationApiError) {
return 'labelQuaternary';
}
if (simulationScanResult === TransactionScanResultType.Warning) {
Expand All @@ -152,7 +155,7 @@ export const TransactionSimulationCard = ({
return 'red';
}
return 'label';
}, [isBalanceEnough, isLoading, noChanges, simulationError, simulationScanResult, isPersonalSignRequest, txSimulationApiError]);
}, [isBalanceEnough, isLoading, noChanges, simulationError, simulationScanResult, isSimulationUnavailable, txSimulationApiError]);

const titleText = useMemo(() => {
if (isLoading) {
Expand All @@ -161,7 +164,7 @@ export const TransactionSimulationCard = ({
if (isBalanceEnough === false) {
return i18n.t(i18n.l.walletconnect.simulation.simulation_card.titles.not_enough_native_balance, { symbol: nativeAsset.symbol });
}
if (txSimulationApiError || isPersonalSignRequest) {
if (txSimulationApiError || isSimulationUnavailable) {
return i18n.t(i18n.l.walletconnect.simulation.simulation_card.titles.simulation_unavailable);
}
if (simulationScanResult === TransactionScanResultType.Warning) {
Expand All @@ -181,20 +184,20 @@ export const TransactionSimulationCard = ({
isLoading,
isBalanceEnough,
txSimulationApiError,
isPersonalSignRequest,
isSimulationUnavailable,
simulationScanResult,
noChanges,
simulationError,
nativeAsset.symbol,
]);

const isExpanded = useMemo(() => {
if (isLoading || isPersonalSignRequest) {
if (isLoading || isSimulationUnavailable) {
return false;
}
const shouldExpandOnLoad = isBalanceEnough === false || (!isEmpty(simulation) && !noChanges) || !!simulationError;
return shouldExpandOnLoad;
}, [isBalanceEnough, isLoading, isPersonalSignRequest, noChanges, simulation, simulationError]);
}, [isBalanceEnough, isLoading, isSimulationUnavailable, noChanges, simulation, simulationError]);

return (
<FadedScrollCard
Expand All @@ -219,7 +222,7 @@ export const TransactionSimulationCard = ({
/>
) : (
<IconContainer>
{!isLoading && noChanges && !isPersonalSignRequest ? (
{!isLoading && noChanges && !isSimulationUnavailable ? (
<Text align="center" color="labelQuaternary" size="icon 17px" weight="bold">
{/* The extra space avoids icon clipping */}
{'􀻾 '}
Expand All @@ -228,7 +231,7 @@ export const TransactionSimulationCard = ({
<Animated.View style={spinnerStyle}>
<Text
align="center"
color={isLoading ? 'label' : isPersonalSignRequest ? 'labelQuaternary' : 'label'}
color={isLoading ? 'label' : isSimulationUnavailable ? 'labelQuaternary' : 'label'}
size="icon 15px"
weight="bold"
>
Expand Down Expand Up @@ -278,6 +281,13 @@ export const TransactionSimulationCard = ({
</Text>
</Box>
)}
{isTypedDataRequest && (
<Box style={{ opacity: 0.6 }}>
<Text color="labelQuaternary" size="13pt" weight="semibold">
{i18n.t(i18n.l.walletconnect.simulation.simulation_card.messages.unavailable_typed_data)}
</Text>
</Box>
)}
{txSimulationApiError && (
<Text color="labelQuaternary" size="13pt" weight="semibold">
{i18n.t(i18n.l.walletconnect.simulation.simulation_card.messages.tx_api_error)}
Expand Down
1 change: 1 addition & 0 deletions src/languages/en_US.json
Original file line number Diff line number Diff line change
Expand Up @@ -3320,6 +3320,7 @@
"no_changes": "No Changes Detected",
"need_more_native": "You’ll need more %{symbol} on %{network} to pay for this transaction. Get some %{symbol} below to continue with this request.",
"unavailable_personal_sign": "Simulation for personal signs is not yet supported",
"unavailable_typed_data": "Simulation for typed data signing is not yet supported",
"unavailable_zora_network": "Simulation on Zora is not yet supported",
"failed_to_simulate": "The simulation failed, which suggests your transaction is likely to fail. This may be an issue with the app you’re using.",
"tx_api_error": "We are unable to determine whether or not your transaction will succeed or fail. Proceed with caution.",
Expand Down
1 change: 1 addition & 0 deletions src/languages/zh_CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -3338,6 +3338,7 @@
"no_changes": "未检测到任何更改",
"need_more_native": "你需要更多的 %{symbol} 在 %{network} 上支付这笔交易。获得下面的 %{symbol} 继续进行这个请求。",
"unavailable_personal_sign": "尚不支持个人签名的模拟",
"unavailable_typed_data": "尚不支持类型数据签名的模拟",
"unavailable_zora_network": "尚不支持Zora的模拟",
"failed_to_simulate": "模拟失败,您的交易可能会失败。这可能与您正在使用的应用有关。",
"tx_api_error": "我们无法确定您的交易是否会成功或失败。请谨慎进行。",
Expand Down
5 changes: 4 additions & 1 deletion src/screens/SignTransactionSheet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
SIGN_TYPED_DATA_V4,
isMessageDisplayType,
isPersonalSign,
isSignTypedData,
} from '@/utils/signingMethods';
import { Transaction } from '@ethersproject/transactions';
import { RouteProp, useRoute } from '@react-navigation/native';
Expand Down Expand Up @@ -160,6 +161,8 @@ export const SignTransactionSheet = () => {

const isMessageRequest = isMessageDisplayType(transactionDetails.payload.method);
const isPersonalSignRequest = isPersonalSign(transactionDetails.payload.method);
const isTypedDataRequest = isSignTypedData(transactionDetails.payload.method);
const isSimulationUnavailable = isPersonalSignRequest || isTypedDataRequest;

const label = useForegroundColor('label');
const surfacePrimary = useBackgroundColor('surfacePrimary');
Expand Down Expand Up @@ -235,7 +238,7 @@ export const SignTransactionSheet = () => {
transactionDetails,
},
{
enabled: !isPersonalSignRequest,
enabled: !isSimulationUnavailable,
}
);

Expand Down