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)}
+
+ )}
+