From f06419858cf854191a4158e0cf974ebc2e64a133 Mon Sep 17 00:00:00 2001 From: DMY <147dmy@gmail.com> Date: Wed, 15 May 2024 14:29:58 +0800 Subject: [PATCH] feat: gasless --- apps/mobile/package.json | 2 +- apps/mobile/src/assets/icons/sign/tx/bg.png | Bin 0 -> 36715 bytes apps/mobile/src/assets/icons/sign/tx/bg.svg | 24 ++ .../src/assets/icons/sign/tx/gas-dark.svg | 27 ++ .../src/assets/icons/sign/tx/gas-light.svg | 27 ++ .../mobile/src/assets/icons/sign/tx/rabby.svg | 36 ++ .../src/assets/locales/en/messages.json | 8 +- .../components/FooterBar/ActionsContainer.tsx | 1 + .../components/FooterBar/FooterBar.tsx | 31 +- .../FooterBar/GasLessComponents.tsx | 385 ++++++++++++++++++ .../components/FooterBar/ProcessActions.tsx | 35 +- .../components/FooterBar/SubmitActions.tsx | 25 +- .../Approval/components/SignTx/SignTx.tsx | 227 ++++++----- .../Approval/components/SignTx/calc.ts | 128 ++---- apps/mobile/src/core/controllers/provider.ts | 4 + yarn.lock | 10 +- 16 files changed, 757 insertions(+), 213 deletions(-) create mode 100644 apps/mobile/src/assets/icons/sign/tx/bg.png create mode 100644 apps/mobile/src/assets/icons/sign/tx/bg.svg create mode 100644 apps/mobile/src/assets/icons/sign/tx/gas-dark.svg create mode 100644 apps/mobile/src/assets/icons/sign/tx/gas-light.svg create mode 100644 apps/mobile/src/assets/icons/sign/tx/rabby.svg create mode 100644 apps/mobile/src/components/Approval/components/FooterBar/GasLessComponents.tsx diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 977a65502..8af888826 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -55,7 +55,7 @@ "@rabby-wallet/eth-walletconnect-keyring": "2.1.3", "@rabby-wallet/object-multiplex": "workspace:^", "@rabby-wallet/persist-store": "workspace:^", - "@rabby-wallet/rabby-api": "0.7.12", + "@rabby-wallet/rabby-api": "0.7.14", "@rabby-wallet/rabby-security-engine": "^1.1.17", "@rabby-wallet/rabby-swap": "0.0.36", "@rabby-wallet/service-address": "workspace:^", diff --git a/apps/mobile/src/assets/icons/sign/tx/bg.png b/apps/mobile/src/assets/icons/sign/tx/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..ff99d3f88832bd158b7fbf9bbef9ed87cc5e5e5e GIT binary patch literal 36715 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 literal 0 HcmV?d00001 diff --git a/apps/mobile/src/assets/icons/sign/tx/bg.svg b/apps/mobile/src/assets/icons/sign/tx/bg.svg new file mode 100644 index 000000000..bde5afc38 --- /dev/null +++ b/apps/mobile/src/assets/icons/sign/tx/bg.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/mobile/src/assets/icons/sign/tx/gas-dark.svg b/apps/mobile/src/assets/icons/sign/tx/gas-dark.svg new file mode 100644 index 000000000..fd37eff34 --- /dev/null +++ b/apps/mobile/src/assets/icons/sign/tx/gas-dark.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/mobile/src/assets/icons/sign/tx/gas-light.svg b/apps/mobile/src/assets/icons/sign/tx/gas-light.svg new file mode 100644 index 000000000..7aedae140 --- /dev/null +++ b/apps/mobile/src/assets/icons/sign/tx/gas-light.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/mobile/src/assets/icons/sign/tx/rabby.svg b/apps/mobile/src/assets/icons/sign/tx/rabby.svg new file mode 100644 index 000000000..21bfa4e1e --- /dev/null +++ b/apps/mobile/src/assets/icons/sign/tx/rabby.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/mobile/src/assets/locales/en/messages.json b/apps/mobile/src/assets/locales/en/messages.json index 89ba1f70d..d3f045eac 100644 --- a/apps/mobile/src/assets/locales/en/messages.json +++ b/apps/mobile/src/assets/locales/en/messages.json @@ -34,7 +34,7 @@ "gasLimitNotEnough": "Gas limit is less than 21000. Transaction can't be submitted", "gasLimitLessThanExpect": "Gas limit is low. There is 1% chance that the transaction may fail.", "gasLimitLessThanGasUsed": "Gas limit is too low. There is 95% chance that the transaction may fail.", - "nativeTokenNotEngouthForGas": "You do not have enough gas in your wallet", + "nativeTokenNotEngouthForGas": "Gas balance is not enough for transaction", "nonceLowerThanExpect": "Nonce is too low, the minimum should be {{0}}", "canOnlyUseImportedAddress": "You can only use imported addresses to sign", "multiSigChainNotMatch": "Multi-signature addresses are not on this chain and cannot initiate transactions", @@ -298,6 +298,12 @@ "ledgerConnected": "Ledger is connected", "importedByLedger": "Imported by Ledger", "signAndSubmitButton": "Sign and Create", + "gasless": { + "unavailable": "Gas balance is not enough for this transaction", + "notEnough": "Gas balance is not enough", + "GetFreeGasToSign": "Get Free Gas to sign", + "rabbyPayGas": "Rabby'll pay for the gas needed – just sign on" + }, "walletConnect": { "connectedButCantSign": "Connected but unable to sign.", "switchToCorrectAddress": "Please switch to the correct address in mobile wallet", diff --git a/apps/mobile/src/components/Approval/components/FooterBar/ActionsContainer.tsx b/apps/mobile/src/components/Approval/components/FooterBar/ActionsContainer.tsx index 5c19ba2cb..5a427c1c7 100644 --- a/apps/mobile/src/components/Approval/components/FooterBar/ActionsContainer.tsx +++ b/apps/mobile/src/components/Approval/components/FooterBar/ActionsContainer.tsx @@ -50,6 +50,7 @@ export interface Props { children?: React.ReactNode; chain?: Chain; submitText?: string; + gasLess?: boolean; } export const ActionsContainer: React.FC< diff --git a/apps/mobile/src/components/Approval/components/FooterBar/FooterBar.tsx b/apps/mobile/src/components/Approval/components/FooterBar/FooterBar.tsx index a2de31a39..abd869789 100644 --- a/apps/mobile/src/components/Approval/components/FooterBar/FooterBar.tsx +++ b/apps/mobile/src/components/Approval/components/FooterBar/FooterBar.tsx @@ -19,6 +19,7 @@ import { useApprovalSecurityEngine } from '../../hooks/useApprovalSecurityEngine import SecurityLevelTagNoText from '../SecurityEngine/SecurityLevelTagNoText'; import { AccountInfo } from './AccountInfo'; import { ActionGroup, Props as ActionGroupProps } from './ActionGroup'; +import { GasLessNotEnough, GasLessToSign } from './GasLessComponents'; interface Props extends Omit { chain?: Chain; @@ -31,6 +32,10 @@ interface Props extends Omit { isTestnet?: boolean; engineResults?: Result[]; onIgnoreAllRules(): void; + useGasLess?: boolean; + showGasLess?: boolean; + enableGasLess?: () => void; + canUseGasLess?: boolean; } const getStyles = (colors: AppColorsVariants) => @@ -159,7 +164,12 @@ export const FooterBar: React.FC = ({ engineResults = [], hasUnProcessSecurityResult, hasShadow = false, + showGasLess = false, + useGasLess = false, + canUseGasLess = false, onIgnoreAllRules, + enableGasLess, + ...props }) => { const [account, setAccount] = React.useState(); @@ -317,7 +327,13 @@ export const FooterBar: React.FC = ({ account={account} isTestnet={props.isTestnet} /> - + {securityLevel && hasUnProcessSecurityResult && ( = ({ )} + + {showGasLess && + (!securityLevel || !hasUnProcessSecurityResult) && + (canUseGasLess ? ( + { + enableGasLess?.(); + }} + /> + ) : ( + + ))} ); diff --git a/apps/mobile/src/components/Approval/components/FooterBar/GasLessComponents.tsx b/apps/mobile/src/components/Approval/components/FooterBar/GasLessComponents.tsx new file mode 100644 index 000000000..9e70be5b8 --- /dev/null +++ b/apps/mobile/src/components/Approval/components/FooterBar/GasLessComponents.tsx @@ -0,0 +1,385 @@ +import React, { PropsWithChildren, useEffect, useMemo } from 'react'; +import { default as RcIconGasLight } from '@/assets/icons/sign/tx/gas-light.svg'; +import { default as RcIconGasDark } from '@/assets/icons/sign/tx/gas-dark.svg'; + +import { useTranslation } from 'react-i18next'; +import { default as RcIconLogo } from '@/assets/icons/sign/tx/rabby.svg'; + +import { createGetStyles } from '@/utils/styles'; +import { useThemeColors } from '@/hooks/theme'; + +const RcIconGas = makeThemeIcon(RcIconGasLight, RcIconGasDark); + +import { + View, + Text, + ImageBackground, + TouchableOpacity, + TextStyle, + ViewStyle, + DimensionValue, + StyleSheet, +} from 'react-native'; +import { makeThemeIcon } from '@/hooks/makeThemeIcon'; +import LinearGradient from 'react-native-linear-gradient'; +import { StyleProp } from 'react-native'; +import Animated, { + Easing, + interpolate, + useAnimatedStyle, + useSharedValue, + withDelay, + withRepeat, + withSequence, + withTiming, +} from 'react-native-reanimated'; +import { renderText } from '@/utils/renderNode'; + +export function GasLessNotEnough() { + const { t } = useTranslation(); + const colors = useThemeColors(); + const styles = useMemo(() => getStyles(colors), [colors]); + return ( + + + + + {t('page.signFooterBar.gasless.unavailable')} + + + ); +} + +function FreeGasReady() { + const { t } = useTranslation(); + const colors = useThemeColors(); + const styles = useMemo(() => getStyles(colors), [colors]); + + return ( + + + + + {t('page.signFooterBar.gasless.rabbyPayGas')} + + + + ); +} + +export function GasLessToSign({ + handleFreeGas, + gasLessEnable, +}: { + handleFreeGas: () => void; + gasLessEnable: boolean; +}) { + const { t } = useTranslation(); + const colors = useThemeColors(); + const styles = useMemo(() => getStyles(colors), [colors]); + + const hiddenAnimated = useSharedValue(0); + + const toSignStyle = useAnimatedStyle(() => ({ + display: hiddenAnimated.value !== 1 ? 'flex' : 'none', + })); + + const confirmedStyled = useAnimatedStyle(() => ({ + display: hiddenAnimated.value === 1 ? 'flex' : 'none', + })); + + const startAnimation = React.useCallback(() => { + hiddenAnimated.value = withDelay( + 900, + withTiming(1, { + duration: 0, + }), + ); + }, [hiddenAnimated]); + + useEffect(() => { + if (gasLessEnable) { + startAnimation(); + } + }, [gasLessEnable, startAnimation]); + + return ( + <> + + + + + + {t('page.signFooterBar.gasless.notEnough')} + + + + + {t('page.signFooterBar.gasless.GetFreeGasToSign')} + + + + + + + + + + ); +} + +export const GasLessAnimatedWrapper = ( + props: PropsWithChildren<{ + gasLess?: boolean; + title: string; + titleStyle: StyleProp; + buttonStyle: StyleProp; + showOrigin: boolean; + type?: 'submit' | 'process'; + }>, +) => { + const colors = useThemeColors(); + + const blueBgXValue = useSharedValue(-200); + + const logoXValue = useSharedValue(-10); + + const logoYValue = useSharedValue(0); + + const hiddenAnimated = useSharedValue(0); + + const overlayStyle = useAnimatedStyle(() => ({ + position: 'absolute', + opacity: 0.5, + width: '100%', + height: '100%', + top: 0, + backgroundColor: 'white', + left: (interpolate(logoXValue.value, [-10, 100], [0, 105]) + + '%') as DimensionValue, //(overlayValue.value + '%') as DimensionValue, + })); + + const logoStyle = useAnimatedStyle(() => ({ + alignItems: 'center', + justifyContent: 'center', + width: 16, + position: 'absolute', + top: 0, + right: 0, + bottom: 0, + left: (logoXValue.value + '%') as DimensionValue, + transform: [{ translateY: logoYValue.value }], + })); + + const blueBgStyle = useAnimatedStyle(() => ({ + width: '200%', + height: '100%', + position: 'absolute', + top: 0, + right: 0, + bottom: 0, + backgroundColor: colors['blue-default'], + left: (blueBgXValue.value + '%') as DimensionValue, + })); + + const start = React.useCallback(() => { + blueBgXValue.value = withTiming(-100, { + duration: 900, + easing: Easing.linear, + }); + + logoXValue.value = withTiming(100, { + duration: 900, + easing: Easing.linear, + }); + + const config = { + duration: 75, + easing: Easing.linear, + }; + + logoYValue.value = withRepeat( + withSequence( + withTiming(-16, config), + withTiming(0, config), + withTiming(16, config), + withTiming(0, config), + ), + 3, + true, + ); + + hiddenAnimated.value = withDelay( + 910, + withTiming(1, { + duration: 0, + }), + ); + }, [blueBgXValue, hiddenAnimated, logoXValue, logoYValue]); + + const showOriginButtonStyle = useAnimatedStyle(() => ({ + display: hiddenAnimated.value === 1 ? 'flex' : 'none', + })); + + const showAnimatedButtonStyle = useAnimatedStyle(() => ({ + display: hiddenAnimated.value === 1 ? 'none' : 'flex', + })); + + useEffect(() => { + if (props.gasLess) { + start(); + } + }, [start, props.gasLess]); + + if (props.showOrigin) { + return <>{props.children}; + } + + return ( + <> + + {props.children} + + + + + + + + + {renderText(props.title, { + style: StyleSheet.flatten([ + props.titleStyle, + props.gasLess ? { color: colors['neutral-title-2'] } : {}, + ]), + })} + + + + + ); +}; + +const getStyles = createGetStyles(colors => ({ + securityLevelTip: { + flexDirection: 'row', + alignItems: 'center', + marginTop: 15, + backgroundColor: colors['neutral-card-2'], + color: colors['neutral-card-2'], + paddingHorizontal: 16, + paddingVertical: 8, + borderRadius: 4, + position: 'relative', + }, + tipTriangle: { + position: 'absolute', + top: -13, + left: 110, + width: 0, + height: 0, + backgroundColor: 'transparent', + borderStyle: 'solid', + borderLeftWidth: 5, + borderRightWidth: 5, + borderTopWidth: 5, + borderBottomWidth: 8, + borderLeftColor: 'transparent', + borderRightColor: 'transparent', + borderTopColor: 'transparent', + borderBottomColor: colors['neutral-card-2'], + }, + text: { + flex: 1, + color: colors['neutral-title-1'], + fontSize: 13, + fontWeight: '500', + }, + imageBackground: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + paddingHorizontal: 16, + backgroundColor: 'pink', + }, + image: { + resizeMode: 'contain', + width: 100, + }, + container: { + flexDirection: 'row', + alignItems: 'center', + }, + gasToSign: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + paddingHorizontal: 16, + backgroundColor: colors['neutral-card-2'], + color: colors['neutral-card-2'], + }, + gasText: { + color: colors['neutral-title-1'], + }, + linearGradient: { + marginHorizontal: 'auto', + paddingHorizontal: 10, + paddingVertical: 7, + borderRadius: 6, + }, + linearGradientText: { + fontSize: 12, + color: colors['neutral-title-2'], + cursor: 'pointer', + }, +})); diff --git a/apps/mobile/src/components/Approval/components/FooterBar/ProcessActions.tsx b/apps/mobile/src/components/Approval/components/FooterBar/ProcessActions.tsx index 8eb12be1c..ac1ddee10 100644 --- a/apps/mobile/src/components/Approval/components/FooterBar/ProcessActions.tsx +++ b/apps/mobile/src/components/Approval/components/FooterBar/ProcessActions.tsx @@ -6,6 +6,7 @@ import { StyleSheet, View } from 'react-native'; import { Button } from '@/components'; import { AppColorsVariants } from '@/constant/theme'; import { useThemeColors } from '@/hooks/theme'; +import { GasLessAnimatedWrapper } from './GasLessComponents'; const getStyles = (colors: AppColorsVariants) => StyleSheet.create({ @@ -26,12 +27,13 @@ const getStyles = (colors: AppColorsVariants) => }, }); -export const ProcessActions: React.FC = ({ +export const SubmitActions: React.FC = ({ onSubmit, onCancel, disabledProcess, tooltipContent, submitText, + gasLess, }) => { const { t } = useTranslation(); const colors = useThemeColors(); @@ -43,15 +45,30 @@ export const ProcessActions: React.FC = ({ // @ts-expect-error content={tooltipContent}> -