diff --git a/ops_boba/api/watcher-api/serverless-mainnet.yml b/ops_boba/api/watcher-api/serverless-mainnet.yml index 3800e9320d..17931e431e 100644 --- a/ops_boba/api/watcher-api/serverless-mainnet.yml +++ b/ops_boba/api/watcher-api/serverless-mainnet.yml @@ -201,3 +201,20 @@ functions: cors: true layers: - ${file(env-mainnet.yml):LAYERS} + watcher_getLayerZeroTransactions: + handler: watcher_getLayerZeroTransactions.watcher_getLayerZeroTransactions + memorySize: 10240 # optional, in MB, default is 1024 + timeout: 60 # optional, in seconds, default is 6 + vpc: + securityGroupIds: + - ${file(env-mainnet.yml):SECURITY_GROUPS} + subnetIds: + - ${file(env-mainnet.yml):SUBNET_ID_1} + - ${file(env-mainnet.yml):SUBNET_ID_2} + events: + - http: + path: get.layerzero.transactions + method: post + cors: true + layers: + - ${file(env-mainnet.yml):LAYERS} diff --git a/ops_boba/api/watcher-api/watcher_getLayerZeroTransactions.py b/ops_boba/api/watcher-api/watcher_getLayerZeroTransactions.py index a0a8456947..6c5d14904f 100644 --- a/ops_boba/api/watcher-api/watcher_getLayerZeroTransactions.py +++ b/ops_boba/api/watcher-api/watcher_getLayerZeroTransactions.py @@ -3,7 +3,7 @@ import pymysql -def watcher_getLayerZeroTransaction(event, context): +def watcher_getLayerZeroTransactions(event, context): # Parse incoming event body = json.loads(event["body"]) address = body.get("address") diff --git a/packages/boba/gateway/src/containers/modals/deposit/steps/InputStepMultiChain.js b/packages/boba/gateway/src/containers/modals/deposit/steps/InputStepMultiChain.js index 457df10f73..5b9bb676ca 100644 --- a/packages/boba/gateway/src/containers/modals/deposit/steps/InputStepMultiChain.js +++ b/packages/boba/gateway/src/containers/modals/deposit/steps/InputStepMultiChain.js @@ -22,9 +22,10 @@ import { useTheme } from '@emotion/react' import { WrapperActionsModal } from 'components/modal/Modal.styles' import BN from 'bignumber.js' +import parse from 'html-react-parser' import Select from 'components/select/Select' -import { selectAltL1DepositCost } from 'selectors/balanceSelector' -import { fetchAltL1DepositFee } from 'actions/balanceAction' +import { selectAltL1DepositCost, selectL1FeeBalance } from 'selectors/balanceSelector' +import { fetchAltL1DepositFee, fetchL1FeeBalance } from 'actions/balanceAction' import networkService from 'services/networkService' @@ -58,6 +59,7 @@ function InputStepMultiChain({ handleClose, token, isBridge, openTokenPicker }) const signatureStatus = useSelector(selectSignatureStatus_depositTRAD) const lookupPrice = useSelector(selectLookupPrice) const depositFees = useSelector(selectAltL1DepositCost) + const feeBalance = useSelector(selectL1FeeBalance) //amount of ETH on L1 to pay gas const maxValue = logAmount(token.balance, token.decimals) @@ -96,6 +98,7 @@ function InputStepMultiChain({ handleClose, token, isBridge, openTokenPicker }) const isMobile = useMediaQuery(theme.breakpoints.down('md')) useEffect(() => { + dispatch(fetchL1FeeBalance()) //ETH balance for paying gas dispatch(fetchAltL1DepositFee()) },[dispatch]) @@ -150,6 +153,16 @@ function InputStepMultiChain({ handleClose, token, isBridge, openTokenPicker }) }), } + let ETHstring = '' + let warning = false + + if (depositFees[altL1Bridge]) { + if(Number(depositFees[altL1Bridge].fee) > Number(feeBalance)) { + warning = true + ETHstring = `WARNING: your L1 ${networkService.L1NativeTokenSymbol} balance of ${Number(feeBalance).toFixed(4)} is not sufficient to cover this transaction.` + } + } + return ( <> @@ -204,6 +217,12 @@ function InputStepMultiChain({ handleClose, token, isBridge, openTokenPicker }) )} + {warning && ( + + {parse(ETHstring)} + + )} +